Merge branch 'master' of git://github.com/bsag/tracks into bsag

This commit is contained in:
Hans de Graaff 2011-03-12 09:08:27 +01:00
commit 10bdb8f7d8
438 changed files with 29571 additions and 1133 deletions

15
README
View file

@ -9,19 +9,16 @@
* Mailing list: http://lists.rousette.org.uk/mailman/listinfo/tracks-discuss
* Original developer: bsag (http://www.rousette.org.uk/)
* Contributors: http://getontracks.org/wiki/Contributors
* Version: 2.0RC1
* Version: 2.0devel
* Copyright: (cc) 2004-2010 rousette.org.uk.
* License: GNU GPL
All the documentation for Tracks can be found within the /doc directory. It contains a manual in HTML (manual.html) or PDF format (manual.pdf), and this includes full instructions for both new installations and upgrades from older installations of Tracks. The instructions might appear long and intimidatingly complex, but that is mostly because of the number of different platforms supported, and the different configurations which can be used (e.g. running Tracks on your local computer or on a remote server). If you choose the appropriate section for your situation (installation vs. upgrade), and use the easiest (recommended) method, you should find the instructions easy to follow. If you encounter problems, try searching the wiki, forum or mailing list (URLs above), and ask a question if you cannot find a solution to your problem.
All the documentation for Tracks can be found within the /doc directory and at http://bsag.github.com/tracks/
The latter includes full instructions for both new installations and upgrades from older installations of Tracks.
The instructions might appear long and intimidatingly complex, but that is mostly because of the number of different platforms supported, and the different configurations which can be used (e.g. running Tracks on your local computer or on a remote server). If you choose the appropriate section for your situation (installation vs. upgrade), and use the easiest (recommended) method, you should find the instructions easy to follow. If you encounter problems, try searching the wiki, forum or mailing list (URLs above), and ask a question if you cannot find a solution to your problem.
If you checked out Tracks from the GitHub repository, the manual is not provided by default and is in its own git submodule. To checkout the manual's source files, type "git submodule init doc/manual & git submodule update doc/manual". From then on, you should be able to issue the command "git pull" in the doc/manual directory to update the manual with the latest changes.
The latest version of the manual can be found at http://bsag.github.com/tracks/
For those upgrading, change notes are available in /doc/CHANGELOG. If you are thinking about contributing towards the development of Tracks, please read /doc/README_DEVELOPERS for general information, or /doc/tracks_api_wrapper.rb for information on Tracks' API.
If you are thinking about contributing towards the development of Tracks, please read /doc/README_DEVELOPERS for general information, or /doc/tracks_api_wrapper.rb for information on Tracks' API.
While fully usable for everyday use, Tracks is still a work in progress. Make sure that you take sensible precautions and back up all your data frequently, taking particular care when you are upgrading.
Enjoy being productive!
Enjoy being productive!

View file

@ -4,19 +4,6 @@
require_dependency "login_system"
require_dependency "tracks/source_view"
require "redcloth"
require 'date'
require 'time'
# Commented the following line because of #744. It prevented rake db:migrate to
# run because this tag went looking for the taggings table that did not exist
# when you feshly create a new database Old comment: We need this in development
# mode, or you get 'method missing' errors
#
# Tag
class CannotAccessContext < RuntimeError; end
class ApplicationController < ActionController::Base
@ -24,26 +11,19 @@ class ApplicationController < ActionController::Base
helper :application
include LoginSystem
helper_method :current_user, :prefs
helper_method :current_user, :prefs, :format_date, :markdown
layout proc{ |controller| controller.mobile? ? "mobile" : "standard" }
exempt_from_layout /\.js\.erb$/
before_filter :set_session_expiration
before_filter :set_time_zone
before_filter :set_zindex_counter
before_filter :set_locale
prepend_before_filter :login_required
prepend_before_filter :enable_mobile_content_negotiation
# after_filter :set_locale
after_filter :set_charset
include ActionView::Helpers::TextHelper
include ActionView::Helpers::SanitizeHelper
extend ActionView::Helpers::SanitizeHelper::ClassMethods
helper_method :format_date, :markdown
# By default, sets the charset to UTF-8 if it isn't already set
def set_charset
headers["Content-Type"] ||= "text/html; charset=UTF-8"
@ -60,7 +40,7 @@ class ApplicationController < ActionController::Base
def set_session_expiration
# http://wiki.rubyonrails.com/rails/show/HowtoChangeSessionOptions
unless session == nil
return if @controller_name == 'feed' or session['noexpiry'] == "on"
return if self.controller_name == 'feed' or session['noexpiry'] == "on"
# If the method is called by the feed controller (which we don't have
# under session control) or if we checked the box to keep logged in on
# login don't set the session expiry time.
@ -137,8 +117,8 @@ class ApplicationController < ActionController::Base
end
end
def auto_complete_result2(entries, phrase = nil)
json_elems = "[{" + entries.map {|item| "\"id\" : \"#{item.id}\", \"value\" : \"#{item.specification()}\""}.join("},{") + "}]"
def format_dependencies_as_json_for_auto_complete(entries)
json_elems = "[{" + entries.map {|item| "\"value\" : \"#{item.id}\", \"label\" : \"#{item.specification()}\""}.join("},{") + "}]"
return json_elems == "[{}]" ? "" : json_elems
end
@ -150,7 +130,7 @@ class ApplicationController < ActionController::Base
def markdown(text)
RedCloth.new(text).to_html
end
# Here's the concept behind this "mobile content negotiation" hack: In
# addition to the main, AJAXy Web UI, Tracks has a lightweight low-feature
# 'mobile' version designed to be suitablef or use from a phone or PDA. It

View file

@ -1,3 +1,5 @@
class CannotAccessContext < RuntimeError; end
class BackendController < ApplicationController
wsdl_service_name 'Backend'
web_service_api TodoApi

View file

@ -6,6 +6,9 @@ class LoginController < ApplicationController
skip_before_filter :login_required
before_filter :login_optional
before_filter :get_current_user
protect_from_forgery :except => :check_expiry
if ( SITE_CONFIG['authentication_schemes'].include? 'cas')
# This will allow the user to view the index page without authentication
# but will process CAS authentication data if the user already

View file

@ -47,10 +47,11 @@ class ProjectsController < ApplicationController
init_data_for_sidebar unless mobile?
@page_title = t('projects.page_title', :project => @project.name)
@not_done = @project.todos.active_or_hidden
@deferred = @project.deferred_todos
@pending = @project.pending_todos
@done = @project.todos.find_in_state(:all, :completed, :order => "todos.completed_at DESC", :limit => current_user.prefs.show_number_completed, :include => [:context])
@not_done = @project.todos.active_or_hidden(:include => [:tags, :context, :predecessors])
@deferred = @project.deferred_todos(:include => [:tags, :context, :predecessors])
@pending = @project.pending_todos(:include => [:tags, :context, :predecessors])
@done = @project.todos.find_in_state(:all, :completed,
:order => "todos.completed_at DESC", :limit => current_user.prefs.show_number_completed, :include => [:context, :tags, :predecessors])
@count = @not_done.size
@down_count = @count + @deferred.size + @pending.size
@ -59,6 +60,7 @@ class ProjectsController < ApplicationController
@default_tags = @project.default_tags
@new_note = current_user.notes.new
@new_note.project_id = @project.id
@contexts = current_user.contexts
respond_to do |format|
format.html
format.m &render_project_mobile
@ -237,9 +239,9 @@ class ProjectsController < ApplicationController
def render_projects_mobile
lambda do
@active_projects = @projects.active
@hidden_projects = @projects.hidden
@completed_projects = @projects.completed
@active_projects = current_user.projects.active
@hidden_projects = current_user.projects.hidden
@completed_projects = current_user.projects.completed
@down_count = @active_projects.size + @hidden_projects.size + @completed_projects.size
cookies[:mobile_url]= {:value => request.request_uri, :secure => SITE_CONFIG['secure_cookies']}
render :action => 'index_mobile'

View file

@ -112,17 +112,17 @@ class RecurringTodosController < ApplicationController
end
if @saved
@status_message = "The recurring todo was saved"
@status_message = t('todos.recurring_action_saved')
@todo_saved = create_todo_from_recurring_todo(@recurring_todo).nil? == false
if @todo_saved
@status_message += " / created a new todo"
@status_message += " / " + t('todos.new_related_todo_created_short')
else
@status_message += " / did not create todo"
@status_message += " / " + t('todos.new_related_todo_not_created_short')
end
@down_count = current_user.recurring_todos.active.count
@new_recurring_todo = RecurringTodo.new
else
@status_message = "Error saving recurring todo"
@status_message = t('todos.error_saving_recurring')
end
respond_to do |format|
@ -151,10 +151,10 @@ class RecurringTodosController < ApplicationController
format.html do
if @saved
notify :notice, "Successfully deleted recurring action", 2.0
notify :notice, t('todos.recurring_deleted_success'), 2.0
redirect_to :action => 'index'
else
notify :error, "Failed to delete the recurring action", 2.0
notify :error, t('todos.error_deleting_recurring', :description => @recurring_todo.description), 2.0
redirect_to :action => 'index'
end
end
@ -251,11 +251,17 @@ class RecurringTodosController < ApplicationController
private
def init
@days_of_week = [ ['Sunday',0], ['Monday',1], ['Tuesday', 2], ['Wednesday',3], ['Thursday',4], ['Friday',5], ['Saturday',6]]
@months_of_year = [
['January',1], ['Februari',2], ['March', 3], ['April',4], ['May',5], ['June',6],
['July',7], ['August',8], ['September',9], ['October', 10], ['November', 11], ['December',12]]
@xth_day = [['first',1],['second',2],['third',3],['fourth',4],['last',5]]
@days_of_week = []
0.upto 6 do |i|
@days_of_week << [t('date.day_names')[i], i]
end
@months_of_year = []
1.upto 12 do |i|
@months_of_year << [t('date.month_names')[i], i]
end
@xth_day = [[t('common.first'),1],[t('common.second'),2],[t('common.third'),3],[t('common.fourth'),4],[t('common.last'),5]]
@projects = current_user.projects.find(:all, :include => [:default_context])
@contexts = current_user.contexts.find(:all)
end

View file

@ -11,6 +11,12 @@ class TodosController < ApplicationController
:completed_archive, :check_deferred, :toggle_check, :toggle_star,
:edit, :update, :defer, :create, :calendar, :auto_complete_for_predecessor, :remove_predecessor, :add_predecessor]
protect_from_forgery :except => :check_deferred
# these are needed for todo_feed_content. TODO: remove this view stuff from controller
include ActionView::Helpers::SanitizeHelper
extend ActionView::Helpers::SanitizeHelper::ClassMethods
def index
@projects = current_user.projects.find(:all, :include => [:default_context])
@contexts = current_user.contexts.find(:all)
@ -49,7 +55,7 @@ class TodosController < ApplicationController
def create
@source_view = params['_source_view'] || 'todo'
@default_context = current_user.contexts.find_by_name(params['default_context_name'])
@default_project = current_user.projects.find_by_name(params['default_project_name'])
@default_project = current_user.projects.find_by_name(params['default_project_name']) unless params['default_project_name'].blank?
@tag_name = params['_tag_name']
@ -248,6 +254,7 @@ class TodosController < ApplicationController
end
def remove_predecessor
puts "@@@ start remove_predecessor"
@source_view = params['_source_view'] || 'todo'
@todo = current_user.todos.find(params['id'])
@predecessor = current_user.todos.find(params['predecessor'])
@ -440,7 +447,7 @@ class TodosController < ApplicationController
format.js do
if @saved
determine_down_count
if source_view_is_one_of(:todo, :deferred)
if source_view_is_one_of(:todo, :deferred, :project)
determine_remaining_in_context_count(@context_id)
elsif source_view_is :calendar
@original_item_due_id = get_due_id_for_calendar(@original_item_due)
@ -510,7 +517,7 @@ class TodosController < ApplicationController
def tag
init_data_for_sidebar unless mobile?
@source_view = params['_source_view'] || 'tag'
@tag_name = params[:name]
@tag_name = sanitize(params[:name]) # sanitize to prevent XSS vunerability!
@page_title = t('todos.tagged_page_title', :tag_name => @tag_name)
# mobile tags are routed with :name ending on .m. So we need to chomp it
@ -648,7 +655,7 @@ class TodosController < ApplicationController
get_todo_from_params
# Begin matching todos in current project
@items = current_user.todos.find(:all,
:select => 'description, project_id, context_id, created_at',
:include => [:context, :project],
:conditions => [ '(todos.state = ? OR todos.state = ? OR todos.state = ?) AND ' +
'NOT (id = ?) AND lower(description) LIKE ? AND project_id = ?',
'active', 'pending', 'deferred',
@ -660,7 +667,7 @@ class TodosController < ApplicationController
)
if @items.empty? # Match todos in other projects
@items = current_user.todos.find(:all,
:select => 'description, project_id, context_id, created_at',
:include => [:context, :project],
:conditions => [ '(todos.state = ? OR todos.state = ? OR todos.state = ?) AND ' +
'NOT (id = ?) AND lower(description) LIKE ?',
'active', 'pending', 'deferred',
@ -672,7 +679,7 @@ class TodosController < ApplicationController
else
# New todo - TODO: Filter on project
@items = current_user.todos.find(:all,
:select => 'description, project_id, context_id, created_at',
:include => [:context, :project],
:conditions => [ '(todos.state = ? OR todos.state = ? OR todos.state = ?) AND lower(description) LIKE ?',
'active', 'pending', 'deferred',
'%' + params[:term].downcase + '%' ],
@ -680,7 +687,7 @@ class TodosController < ApplicationController
:limit => 10
)
end
render :inline => auto_complete_result2(@items)
render :inline => format_dependencies_as_json_for_auto_complete(@items)
end
def convert_to_project
@ -822,13 +829,13 @@ class TodosController < ApplicationController
# current_users.todos.find but that broke with_scope for :limit
# Exclude hidden projects from count on home page
@todos = current_user.todos.find(:all, :include => [ :project, :context, :tags ])
@todos = current_user.todos.find(:all, :include => [ :project, :context, :tags, :pending_successors, :recurring_todo ])
# Exclude hidden projects from the home page
@not_done_todos = current_user.todos.find(:all,
:conditions => ['contexts.hide = ? AND (projects.state = ? OR todos.project_id IS NULL)', false, 'active'],
:order => "todos.due IS NULL, todos.due ASC, todos.created_at ASC",
:include => [ :project, :context, :tags ])
:include => [ :project, :context, :tags, :pending_successors, :recurring_todo ])
end
end
@ -891,12 +898,13 @@ class TodosController < ApplicationController
@remaining_hidden_count = current_user.todos.hidden.with_tag(tag).count
}
from.project {
@remaining_deferred_or_pending_count = current_user.projects.find(@todo.project_id).todos.deferred_or_blocked.count
@remaining_in_context = current_user.projects.find(@todo.project_id).todos.active.count
@target_context_count = current_user.projects.find(@todo.project_id).todos.active.count
project_id = @project_changed ? @original_item_project_id : @todo.project_id
@remaining_deferred_or_pending_count = current_user.projects.find(project_id).todos.deferred_or_blocked.count
@remaining_in_context = current_user.projects.find(project_id).todos.active.count
@target_context_count = current_user.projects.find(project_id).todos.active.count
}
from.calendar {
@target_context_count = count_old_due_empty(@new_due_id)
@target_context_count = @new_due_id.blank? ? 0 : count_old_due_empty(@new_due_id)
}
end
@remaining_in_context = current_user.contexts.find(context_id).todos(true).active.not_hidden.count if !@remaining_in_context
@ -978,6 +986,7 @@ class TodosController < ApplicationController
end
def todo_feed_content
# TODO: move view stuff into view, also the includes at the top
lambda do |i|
item_notes = sanitize(markdown( i.notes )) if i.notes?
due = "<div>#{t('todos.feeds.due', :date => format_date(i.due))}</div>\n" if i.due?
@ -1325,4 +1334,4 @@ class TodosController < ApplicationController
end
end
end

View file

@ -240,7 +240,7 @@ module ApplicationHelper
end
def generate_i18n_strings
js = ""
js = "i18n_locale='#{I18n.locale}';\n"
js << "i18n = new Array();\n"
%w{
shared.toggle_multi shared.toggle_multi_title
@ -259,4 +259,12 @@ module ApplicationHelper
return js
end
def javascript_tag_for_i18n_datepicker
locale = I18n.locale
# do not include en as locale since this the available by default
if locale and locale != :en
javascript_include_tag("i18n/jquery.ui.datepicker-#{locale}.js")
end
end
end

View file

@ -11,6 +11,7 @@ module TodosHelper
image_tag("blank.png", :alt => t('todos.edit'), :align => "absmiddle", :id => 'edit_icon_todo_'+todo.id.to_s, :class => 'edit_item'),
{:controller => 'todos', :action => 'edit', :id => todo.id},
:class => "icon edit_item",
:id => "icon_edit_todo_#{todo.id}",
:title => t('todos.edit_action_with_description', :description => todo.description))
end
@ -29,11 +30,13 @@ module TodosHelper
:_source_view => (@source_view.underscore.gsub(/\s+/,'_') rescue "")}
url[:_tag_name] = @tag_name if @source_view == 'tag'
futuredate = (todo.show_from || todo.user.date) + days.days
options = {:x_defer_alert => false, :class => "icon_defer_item" }
if todo.due && futuredate > todo.due
options[:x_defer_alert] = true
options[:x_defer_date_after_due_date] = t('todos.defer_date_after_due_date')
if todo.due
futuredate = (todo.show_from || todo.user.date) + days.days
if futuredate > todo.due
options[:x_defer_alert] = true
options[:x_defer_date_after_due_date] = t('todos.defer_date_after_due_date')
end
end
return link_to(image_tag_for_defer(days), url, options)
@ -87,7 +90,7 @@ module TodosHelper
end
def remote_toggle_checkbox(todo=@todo)
check_box_tag('item_id', toggle_check_todo_path(todo), todo.completed?, :class => 'item-checkbox',
check_box_tag("mark_complete_#{todo.id}", toggle_check_todo_path(todo), todo.completed?, :class => 'item-checkbox',
:title => todo.pending? ? t('todos.blocked_by', :predecessors => todo.uncompleted_predecessors.map(&:description).join(', ')) : "", :readonly => todo.pending?)
end
@ -139,10 +142,6 @@ module TodosHelper
if tag_list.empty? then "" else "<span class=\"tags\">#{tag_list}</span>" end
end
def predecessor_list_text(todo=@todo)
todo.predecessors.map{|t| t.specification}.join(', ')
end
def deferred_due_date(todo=@todo)
if todo.deferred? && todo.due
t('todos.action_due_on', :date => format_date(todo.due))
@ -225,7 +224,6 @@ module TodosHelper
page.todo { return !@todo.hidden? }
page.deferred { return @todo.deferred? || @todo.pending? }
page.context {
logger.debug "ci=#{@todo.context_id} dci=#{@default_context.id} th=#{@todo.hidden?} tch=#{@todo.context.hidden?}"
return @todo.context_id==@default_context.id && ( (@todo.hidden? && @todo.context.hidden?) || (!@todo.hidden?) )
}
page.tag {
@ -266,7 +264,7 @@ module TodosHelper
end
def default_contexts_for_autocomplete
projects = current_user.projects.find(:all, :conditions => ['default_context_id is not null'])
projects = current_user.projects.find(:all, :include => [:context], :conditions => ['default_context_id is not null'])
Hash[*projects.map{ |p| [p.name, p.default_context.name] }.flatten].to_json
end
@ -289,7 +287,7 @@ module TodosHelper
end
def date_field_tag(name, id, value = nil, options = {})
text_field_tag name, value, {"size" => 12, "id" => id, "class" => "Date", "onfocus" => "Calendar.setup", "autocomplete" => "off"}.update(options.stringify_keys)
text_field_tag name, value, {"size" => 12, "id" => id, "class" => "Date", "autocomplete" => "off"}.update(options.stringify_keys)
end
def update_needs_to_hide_context
@ -297,7 +295,7 @@ module TodosHelper
(@remaining_in_context == 0 && @todo_was_deferred_from_active_state) ||
(@remaining_in_context == 0 && @todo.completed? && !(@original_item_was_deferred || @original_item_was_hidden)) if source_view_is(:tag)
return false if source_view_is(:project)
return false if source_view_is_one_of(:project, :calendar)
return (@remaining_in_context == 0) && !source_view_is(:context)
end
@ -305,7 +303,7 @@ module TodosHelper
def update_needs_to_remove_todo_from_container
source_view do |page|
page.context { return @context_changed || @todo.deferred? || @todo.pending? }
page.project { return @todo_deferred_state_changed || @todo_pending_state_changed }
page.project { return @todo_deferred_state_changed || @todo_pending_state_changed || @project_changed}
page.deferred { return @context_changed || !(@todo.deferred? || @todo.pending?) }
page.calendar { return @due_date_changed || !@todo.due }
page.stats { return @todo.completed? }
@ -379,8 +377,8 @@ module TodosHelper
container_id = "p#{@original_item_project_id}empty-nd" if @remaining_in_context == 0
container_id = "tickler-empty-nd" if (
( (@todo_was_activated_from_deferred_state || @todo_was_activated_from_pending_state) && @remaining_deferred_or_pending_count == 0) ||
(@original_item_was_deferred && @remaining_deferred_or_pending_count == 0 && @todo.completed?) )
container_id = "empty-d" if @completed_count && @completed_count == 0 && !@todo.completed?
(@original_item_was_deferred && @remaining_deferred_or_pending_count == 0 && @todo.completed?) )
container_id = "empty-d" if @completed_count && @completed_count == 0 && !@todo.completed?
}
page.deferred { container_id = "c#{@original_item_context_id}empty-nd" if @remaining_in_context == 0 }
page.calendar { container_id = "empty_#{@original_item_due_id}" if @old_due_empty }
@ -405,7 +403,7 @@ module TodosHelper
end
end
html += "}}) " * animation.count
return html
return html + ";"
end
private

View file

@ -108,84 +108,41 @@ class Todo < ActiveRecord::Base
# Returns a string with description <context, project>
def specification
project_name = project.is_a?(NullProject) ? "(none)" : project.name
return "\'#{description}\' <\'#{context.title}\'; \'#{project_name}\'>"
project_name = self.project.is_a?(NullProject) ? "(none)" : self.project.name
return "\'#{self.description}\' <\'#{self.context.title}\'; \'#{project_name}\'>"
end
def todo_from_specification(specification)
# Split specification into parts: description <context, project>
parts = specification.scan(RE_PARTS)
return nil unless parts.length == 1
return nil unless parts[0].length == 3
todo_description = parts[0][0]
context_name = parts[0][1]
project_name = parts[0][2]
# find the project
project_id = nil;
unless project_name == "(none)"
project = Project.first(:conditions => {
:user_id => self.user.id,
:name => project_name
})
project_id = project.id unless project.nil?
end
todos = Todo.all(
:joins => :context,
:conditions => {
:description => todo_description,
:user_id => self.user.id,
:contexts => {:name => context_name},
:project_id => project_id
}
)
return nil if todos.empty?
# TODO: what todo if there are more than one todo that fit the specification
return todos[0]
end
def validate
if !show_from.blank? && show_from < user.date
errors.add("show_from", I18n.t('models.todo.error_date_must_be_future'))
end
errors.add(:description, "may not contain \" characters") if /\"/.match(description)
errors.add(:description, "may not contain \" characters") if /\"/.match(self.description)
unless @predecessor_array.nil? # Only validate predecessors if they changed
@predecessor_array.each do |specification|
t = todo_from_specification(specification)
if t.nil?
errors.add("Depends on:", "Could not find action '#{h(specification)}'")
else
errors.add("Depends on:", "Adding '#{h(specification)}' would create a circular dependency") if is_successor?(t)
end
@predecessor_array.each do |todo|
errors.add("Depends on:", "Adding '#{h(todo.specification)}' would create a circular dependency") if is_successor?(todo)
end
end
end
def save_predecessors
unless @predecessor_array.nil? # Only save predecessors if they changed
current_array = predecessors.map{|p| p.specification}
current_array = self.predecessors
remove_array = current_array - @predecessor_array
add_array = @predecessor_array - current_array
@removed_predecessors = []
# This is probably a bit naive code...
remove_array.each do |specification|
t = todo_from_specification(specification)
unless t.nil?
@removed_predecessors << t
self.predecessors.delete(t)
remove_array.each do |todo|
unless todo.nil?
@removed_predecessors << todo
self.predecessors.delete(todo)
end
end
# ... as is this?
add_array.each do |specification|
t = todo_from_specification(specification)
unless t.nil?
self.predecessors << t unless self.predecessors.include?(t)
add_array.each do |todo|
unless todo.nil?
self.predecessors << todo unless self.predecessors.include?(todo)
else
logger.error "Could not find #{specification}" # Unexpected since validation passed
logger.error "Could not find #{todo.description}" # Unexpected since validation passed
end
end
end
@ -196,20 +153,22 @@ class Todo < ActiveRecord::Base
end
def remove_predecessor(predecessor)
puts "@@@ before delete"
# remove predecessor and activate myself
predecessors.delete(predecessor)
self.predecessors.delete(predecessor)
puts "@@@ before activate"
self.activate!
end
# Returns true if t is equal to self or a successor of self
def is_successor?(t)
if self == t
def is_successor?(todo)
if self == todo
return true
elsif self.successors.empty?
return false
else
self.successors.each do |item|
if item.is_successor?(t)
if item.is_successor?(todo)
return true
end
end
@ -314,13 +273,21 @@ class Todo < ActiveRecord::Base
def add_predecessor_list(predecessor_list)
return unless predecessor_list.kind_of? String
@predecessor_array = predecessor_list.scan(RE_SPEC)
@predecessor_array=[]
predecessor_ids_array = predecessor_list.split(",")
predecessor_ids_array.each do |todo_id|
predecessor = self.user.todos.find_by_id( todo_id.to_i ) unless todo_id.blank?
@predecessor_array << predecessor unless predecessor.nil?
end
return @predecessor_array
end
def add_predecessor(t)
@predecessor_array = predecessors.map{|p| p.specification}
@predecessor_array << t.specification
@predecessor_array = predecessors
@predecessor_array << t
end
# Return todos that should be activated if the current todo is completed

View file

@ -100,8 +100,12 @@
If Tracks is running on the same server as your mail server, you can use the integrated mail handler built into tracks. Steps to set it up:
</p>
<ul>
<li>Go to <%= link_to "Preferences", preferences_url %> and set your "From email" and "default email context" for todos sent in via email (which could come from an SMS message)</li>
<li>In sendmail/qmail/postfix/whatever, set up an email address alias to pipe messages to <pre >/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
<li>Go to <%= link_to t('layouts.navigation.preferences'), preferences_url %>
and set your "<%= Preference.human_attribute_name('sms_email') %>" and
"<%= Preference.human_attribute_name('sms_context') %>" for todos sent in
via email (which could come from an SMS message)</li>
<li>In sendmail/qmail/postfix/whatever, set up an email address alias
to pipe messages to <pre>/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
<li>Send an email to your newly configured address!</li>
</ul>
<p>You can also use the Rich Todo API to send in tasks like "do laundry @ Home"

View file

@ -100,8 +100,12 @@
If Tracks is running on the same server as your mail server, you can use the integrated mail handler built into tracks. Steps to set it up:
</p>
<ul>
<li>Go to <%= link_to "Preferences", preferences_url %> and set your "From email" and "default email context" for todos sent in via email (which could come from an SMS message)</li>
<li>In sendmail/qmail/postfix/whatever, set up an email address alias to pipe messages to <pre >/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
<li>Go to <%= link_to t('layouts.navigation.preferences'), preferences_url %> and
set your "<%= Preference.human_attribute_name('sms_email') %>" and
"<%= Preference.human_attribute_name('sms_context') %>" for todos sent in
via email (which could come from an SMS message)</li>
<li>In sendmail/qmail/postfix/whatever, set up an email address
alias to pipe messages to <pre>/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
<li>Send an email to your newly configured address!</li>
</ul>
<p>You can also use the Rich Todo API to send in tasks like "do laundry @ Home"

View file

@ -0,0 +1,134 @@
<% has_contexts = !current_user.contexts.empty? -%>
<h1>Integratie</h1>
<p>Tracks kan met een aantal tools worden geïntegreerd...
Alles om je te helpen om dingen gedaan te krijgen!
Deze pagina heeft informatie over het tot stand brengen van sommige integratievormen.
Deze voorbeelden zijn niet altijd voor alle platformen van toepassing en
sommige voorbeelden vragen meer technische kennis dan anderen
Zie ook <%= link_to "de documentatie voor ontwikkelaars met Tracks' REST API", url_for(:action => 'rest_api') %>.</p>
<br/><p>Inhoud:</p>
<ul>
<li><a href="#applescript1-section">Voeg een actie toe met Applescript</a></li>
<li><a href="#applescript2-section">Voeg een acties toe met Applescript op basis van de huidig geselecteerde e-mail in Mail.app</a></li>
<li><a href="#quicksilver-applescript-section">Voeg acties toe met Quicksilver en Applescript</a></li>
<li><a href="#email-cron-section">Email jezelf automatisch de acties met een aflopende deadline</a></li>
<li><a href="#message_gateway">Integreer Tracks met een email server om een actie via email naar Tracks te sturen</a></li>
<li><a href="#google_gadget">Voeg tracks toe als een Google Gmail gadget</a></li>
</ul><br/>
<p>Heb je een tip om hier toe te voegen?
<a href="http://www.getontracks.org/forums/viewforum/10/" title="Tracks | Tips and Tricks">Vertel ons er over in onze
Tips and Tricks forum</a> en misschien voegen we jouw tip toe op deze pagina in een toekomstige versie van Tracks.
</p>
<a name="applescript1-section"> </a>
<h2>Voeg een actie toe met Applescript</h2>
<p>Dit is een eenvoudig script die een dialog box toont om jou om een beschrijving te vragen en vervolgens die op te sturen naar Tracks
met een hard-coded context.</p>
<% if has_contexts -%>
<ol>
<li>Kies de context waar de je acties aan toe wilt laten voegen: <select name="applescript1-contexts" id="applescript1-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
</li>
<li>Kopieer de volgende Applescript naar het klembord.<br />
<textarea id="applescript1" name="applescript1" rows="15"><%= render :partial => 'applescript1', :locals => { :context => current_user.contexts.first } %></textarea>
</li>
<li>Open de Script Editor en plak het script in een nieuw document.</li>
<li>Compileer en bewaar het script. Voert het uit wanneer nodig.</li>
</ol>
<% else %>
<br/><p id="no_context_msg"><i>Je hebt nog geen context(en). Het script komt beschikbaar als je het eerste context hebt toegevoegd.</i></p>
<% end %>
<a name="applescript2-section"> </a>
<h2>Voeg een acties toe met Applescript op basis van de huidig geselecteerde e-mail in Mail.app</h2>
<p>Dit script neemt de verstuurder en het onderwerp van de geselecteerde email(s)
van Mail over en maakt een nieuwe acties voor elke email met de beschrijving
"Email [sender] about [subject]". De beschrijving wordt, als nodig, na 100 karakters afgebroken
(dit is de limiet voor een beschrijving). Het heeft ook Growl notificaties mocht je Growl geïnstalleerd hebben.</p>
<% if has_contexts -%>
<ol>
<li>Kies de context waar de je acties aan toe wilt laten voegen: <select name="applescript2-contexts" id="applescript2-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
</li>
<li>Kopieer de volgende Applescript naar het klembord.<br />
<textarea id="applescript2" name="applescript2" rows="15"><%= render :partial => 'applescript2', :locals => { :context => current_user.contexts.first } %></textarea>
</li>
<li>Open de Script Editor en plak het script in een nieuw document.</li>
<li>Compileer en bewaar het script in de directory ~/Library/Scripts/Mail Scripts.</li>
<li>Voor meer informatie over het gebruiken van AppleScript met Mail.app, zie
<a href="http://www.apple.com/applescript/mail/" title="Scriptable Applications: Mail">dit overzicht</a>.</li>
</ol>
<% else %>
<br/><p><i>Je hebt nog geen context(en). Het script komt beschikbaar als je het eerste context hebt toegevoegd.</i></p>
<% end %>
<a name="quicksilver-applescript-section"></a>
<h2>Voeg acties toe met Quicksilver en Applescript</h2>
<p>Dit integratievoorbeeld laat je acties toevoegen aan Tracks via <a href="http://quicksilver.blacktree.com/">Quicksilver</a>.</p>
<% if has_contexts -%>
<ol>
<li>Kies de context waar de je acties aan toe wilt laten voegen: <select name="quicksilver-contexts" id="quicksilver-contexts"><%= options_from_collection_for_select(current_user.contexts, "id", "name", current_user.contexts.first.id) %></select>
</li>
<li>Kopieer de volgende Applescript naar het klembord.<br/>
<textarea id="quicksilver" name="quicksilver" rows="15"><%= render :partial => 'quicksilver_applescript', :locals => { :context => current_user.contexts.first } %></textarea>
</li>
<li>Open de Script Editor en plak het script in een nieuw document.</li>
<li>Compileer en bewaar het script als "Add to Tracks.scpt" in ~/Library/Application Support/Quicksilver/Actions/
(mogelijk moet je eerst de Actions directory aanmaken)</li>
<li>Herstart Quicksilver</li>
<li>Activeer Quicksilver (Standaard via Ctrl+Space)</li>
<li>Toets "." om quicksilver in text mode te brengen</li>
<li>Voer de gewenste beschrijving van de actie in.</li>
<li>Toets tab om naar de action pane te gaan.</li>
<li>Via typen of bladeren, kies de "Add to Tracks" actie.</li>
</ol>
<% else %>
<br/><p><i>Je hebt nog geen context(en). Het script komt beschikbaar als je het eerste context hebt toegevoegd.</i></p>
<% end %>
<a name="email-cron-section"> </a>
<h2>Email jezelf automatisch de acties met een aflopende deadline</h2>
<p>Als je de volgende regel toevoegd aan jouw crontab, dat ontvang je een e-mail op elke dag rond 05:00 met een lijst met acties waarvan de deadline afloopt binnen de komende 7 dagen.</p>
<textarea id="cron" name="cron">0 5 * * * /usr/bin/curl -0 "<%= home_url %>todos.txt?due=6&token=<%= current_user.token %>" | /usr/bin/mail -e -s 'Tracks actions due in the next 7 days' youremail@yourdomain.com</textarea>
<p>Uiteraard kan je ook een andere <%= link_to 'text feed gebruiken die Tracks biedt', feeds_path %> -- bijvoorbeeld een email met een lijst van acties voor een specifiek project naar een groep collega's die werken aan dat project?</p>
<a name="message_gateway"> </a>
<h2>Integreer Tracks met een email server om een actie via email naar Tracks te sturen</h2>
<p>
Als Tracks draait op dezelfde server als jouw mailserver, dan kan je de geïntegreerde mail handler gebruiken van Tracks. Om dit in te stellen:
</p>
<ul>
<li>Ga naar <%= link_to t('layouts.navigation.preferences'), preferences_url %>
en stel in "<%= Preference.human_attribute_name('sms_email') %>" en
"<%= Preference.human_attribute_name('sms_context') %>" voor acties die
verzonden zijn via email (die bijv. komen via een SMS message)</li>
<li>In sendmail/qmail/postfix/whatever, stel een email address
alias in om berichten door te sturen naar
<pre>/PATH/TO/RUBY/ruby /PATH/TO/TRACKS/script/runner -e production 'MessageGateway.receive(STDIN.read)'</pre></li>
<li>Verstuur een email naar het net geconfigureerde e-mail adres!</li>
</ul>
<p>Je kan ook de Rich Todo API gebruiken om acties te maken zoals "do laundry @ Home"
of "Call Bill > project X". Het onderwerp van het bericht zal de bijschrijving van de actie vullen,
de context, en het project, terwijl de body van het bericht de notities van de actie zal vullen.
</p>
<a name="google_gadget"> </a>
<h2>Voeg tracks toe als een Google Gmail gadget</h2>
<p>
Je kan nu ook jouw projects/actions beheren in Gmail met de Tracks Gmail Gadget.
Voeg Tracks Gmail gadget toe aan de sidebar van Gmail en volg jouw acties
of voeg een nieuwe actie toe zonder apart een nieuw browser tab/scherm te openen
voor Tracks. Om dit in te stellen:
</p>
<ul>
<li>Log bij Gmail in en kies Settings in de rechter-bovenkant van jouw Gmail pagina. In de Gmail setting pagina, kies de Labs tab</li>
<li>Zet de "Add any gadget by URL" feature aan. Deze kan je onderop de lijst vinden. Kies voor Enable and kies Save Changes.</li>
<li>Nu zie je dat de Gadgets tab is toegevoegd aan de Gmail Settings. Ga nu naar de Gadgets tab</li>
<li>Knip en plak de volgende link in de Add a gadget by its URL: en klik dan op de Add button:<br/>
<pre><%= integrations_url + "/google_gadget" %></pre></li>
</ul>

View file

@ -3,7 +3,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<%= stylesheet_link_tag "scaffold" %>
<%= javascript_include_tag 'jquery-1.5.min', 'jquery.cookie' %>
<%= javascript_include_tag 'jquery-1.5.1.min', 'jquery.cookie' %>
<title><%= @page_title -%></title>

View file

@ -12,8 +12,8 @@
<title><%= @page_title %></title>
</head><body>
<% if !(@new_mobile || @edit_mobile)
if !current_user.prefs.nil? -%>
<h1><span class="count"><%= @down_count %></span> <%=
if current_user && !current_user.prefs.nil? -%>
<h1><span class="count" id="badge_count"><%= @down_count %></span> <%=
l(Date.today, :format => current_user.prefs.title_date_format) -%></h1>
<div class="nav">
<%= (link_to(t('layouts.mobile_navigation.new_action'), new_todo_path(new_todo_params))+" | ") unless @new_mobile -%>
@ -25,7 +25,7 @@
end -%><%= render_flash -%>
</div>
<%= yield -%>
<hr/><% if !current_user.prefs.nil? -%>
<hr/><% if current_user && !current_user.prefs.nil? -%>
<div class="nav">
<%= (link_to(t('layouts.mobile_navigation.logout'), logout_path(:format => 'm')) +" | ") -%>
<%= (link_to(t('layouts.mobile_navigation.new_action'), new_todo_path(new_todo_params), {:accesskey => "0"})+" | ") unless @new_mobile -%>

View file

@ -2,12 +2,13 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<%= stylesheet_link_tag 'standard','superfish','niftyCorners', 'jquery-ui-1.8.9.custom', :cache => 'tracks-cached' %>
<%= stylesheet_link_tag 'standard','superfish','niftyCorners', 'jquery-ui-1.8.10.custom', :cache => 'tracks-cached' %>
<%= stylesheet_link_tag "print", :media => "print" %>
<%= javascript_include_tag 'jquery-1.5.min', 'jquery-ui-1.8.9.custom.min',
<%= javascript_include_tag 'jquery-1.5.1.min', 'jquery-ui-1.8.10.custom.min',
'jquery.truncator','jquery.jeditable.mini', 'jquery.cookie', 'jquery.blockUI',
'jquery.form','jquery.ui.autocomplete.selectFirst',
:cache => 'jquery-cached' %>
<%= javascript_tag_for_i18n_datepicker %>
<%= javascript_include_tag 'hoverIntent','superfish','application',
'accesskey-hints','niftycube','swfobject',
:cache => 'tracks-cached' %>
@ -24,7 +25,7 @@
<% if current_user.prefs.refresh != 0 -%>
setup_auto_refresh(<%= current_user.prefs["refresh"].to_i*60000 %>);
<% end -%>
<% unless @controller_name == 'feed' or session['noexpiry'] == "on" -%>
<% unless controller.controller_name == 'feed' or session['noexpiry'] == "on" -%>
setup_periodic_check("<%=url_for(:controller => "login", :action => "check_expiry")%>", 5*60);
<% end -%>
setup_periodic_check("<%=check_deferred_todos_path(:format => 'js')%>", 10*60, 'POST');

View file

@ -30,7 +30,7 @@
table_row(pref_name, nowrap_label) { text_field('prefs', pref_name) }
end
%>
<%= row_with_select_field('locale', I18n.available_locales) %>
<%= row_with_select_field('locale', I18n.available_locales.map {|l| l.to_s}) %>
<%= row_with_text_field('date_format') %>
<%= row_with_text_field('title_date_format') %>
<%= table_row('time_zone', false) { time_zone_select('prefs','time_zone') } %>

View file

@ -4,16 +4,16 @@
<a href="#" class="container_toggle" id="toggle_p<%= project.id %>"><%= image_tag("collapse.png") %></a>
<% end -%>
<%= project.name -%></h2>
<div id="<%= dom_id(project, "container")%>">
<div id="<%= dom_id(project, "container")%>" class="list"><%-# list needs to be here for edit form to work -%>
<%= render :partial => "projects/project_settings", :object => project, :locals => { :collapsible => collapsible } %>
</div>
</div>
<div class="container">
<h2>Actions in this project</h2>
<h2><%= t('projects.actions_in_project_title') %></h2>
<div id="p<%= project.id %>items" class="items toggle_target">
<div id="p<%= project.id %>empty-nd" style="display:<%= @not_done.empty? ? 'block' : 'none'%>;">
<div class="message"><p>Currently there are no incomplete actions in this project</p></div>
<div class="message"><p><%= t('projects.no_actions_in_project') %></p></div>
</div>
<%= render :partial => "todos/todo", :collection => @not_done, :locals => { :parent_container_type => "project" } %>
</div>

View file

@ -1,25 +1,26 @@
<% project = project_settings -%>
<div id="<%= dom_id(project) %>" class="project">
<div class="project_settings">This project
<% if project.completed? -%>has been marked as completed
<% elsif project.hidden? -%>has been marked as hidden
<% else -%>is active
<div class="project_settings"><%= t('projects.this_project') %>
<% if project.completed? -%><%= t('projects.was_marked_complete') %>
<% elsif project.hidden? -%><%= t('projects.was_marked_hidden') %>
<% else -%><%= t('projects.is_active') %>
<% end -%>
with <% if project.default_context.nil? -%>
no default context
<% if project.default_context.nil? -%>
<%= t('projects.with_no_default_context') %>
<% else -%>
a default context of <%= project.default_context.name -%>
<%= t('projects.with_default_context', :context_name => project.default_context.name) %>
<% end -%>
and with <% if project.default_tags.nil? || project.default_tags.blank? -%>
no default tags.
<% if project.default_tags.nil? || project.default_tags.blank? -%>
<%= t('projects.with_no_default_tags') %>.
<% else -%>
'<%= project.default_tags -%>' as the default tags.
<%= t('projects.with_default_tags', :tags => project.default_tags) %>.
<% end -%>
<%= link_to_edit_project(project, "Edit Project Settings") %>
<%= link_to_edit_project(project, t('projects.edit_project_settings')) %>
</div>
<% unless project.description.blank? -%>
<div class="project_description"><%= format_note(project.description) %></div>
<% end -%>
</div>
<div id="<%= dom_id(project, 'edit') %>" class="edit-form" style="display:none;">
<div class="placeholder"> </div>
</div>

View file

@ -4,6 +4,7 @@ function replace_project_with_edit_form() {
$('div#<%=dom_id(@project)%>').fadeOut(250, function() {
show_edit_form();
set_focus();
enable_rich_interaction();
});
}

View file

@ -12,7 +12,7 @@
<div class="container">
<div id="notes">
<div class="add_note_link"><%= link_to t('projects.add_note'), '#' %> </div>
<h2>Notes</h2>
<h2><%= t('projects.notes') %></h2>
<div id="empty-n" style="display:<%= @project.notes.empty? ? 'block' : 'none'%>;">
<%= render :partial => "shared/empty",
:locals => { :message => t('projects.no_notes_attached')} %>

View file

@ -40,7 +40,10 @@ function update_project_page() {
}
function remove_project_edit_form() {
$('#<%=dom_id(@project, 'edit')%>').hide(500, function() {$('#<%=dom_id(@project, 'edit')%>').remove();} );
<%-
# do not remove() edit form as this will remove the DIV that is needed to replace with the new form, so only empty the DIV
-%>
$('#<%=dom_id(@project, 'edit')%>').hide(500, function() {$('#<%=dom_id(@project, 'edit')%>').html("<!- empty ->");} );
}
function update_and_show_project_settings() {

View file

@ -11,101 +11,104 @@
<div id="recurring_todo_form_container">
<div id="recurring_todo">
<label for="recurring_todo_description">Description</label><%=
<label for="recurring_todo_description"><%= Todo.human_attribute_name('description') %></label><%=
text_field_tag( "recurring_todo[description]", @recurring_todo.description, "size" => 30, "tabindex" => 1, "maxlength" => 100, :id => "edit_recurring_todo_description") -%>
<label for="recurring_todo_notes">Notes</label><%=
<label for="recurring_todo_notes"><%= Todo.human_attribute_name('notes') %></label><%=
text_area_tag( "recurring_todo[notes]", @recurring_todo.notes, {:cols => 29, :rows => 6, :tabindex => 2}) -%>
<label for="edit_recurring_todo_project_name">Project</label>
<label for="edit_recurring_todo_project_name"><%= Todo.human_attribute_name('project') %></label>
<input id="edit_recurring_todo_project_name" name="project_name" autocomplete="off" tabindex="3" size="30" type="text" value="<%= @recurring_todo.project.nil? ? 'None' : @recurring_todo.project.name.gsub(/"/,"&quot;") %>" />
<div class="page_name_auto_complete" id="edit_project_list" style="display:none"></div>
<label for="edit_recurring_todo_context_name">Context</label>
<label for="edit_recurring_todo_context_name"><%= Todo.human_attribute_name('context') %></label>
<input id="edit_recurring_todo_context_name" name="context_name" autocomplete="off" tabindex="4" size="30" type="text" value="<%= @recurring_todo.context.name %>" />
<div class="page_name_auto_complete" id="edit_context_list" style="display:none"></div>
<label for="edit_recurring_todo_tag_list">Tags (separate with commas)</label>
<label for="edit_recurring_todo_tag_list"><%= "#{Todo.human_attribute_name('tags')} #{t('shared.separate_tags_with_commas')}"%></label>
<%= text_field_tag "edit_recurring_todo_tag_list", @recurring_todo.tag_list, :size => 30, :tabindex => 5 -%>
</div>
</div>
<div id="recurring_edit_period_id">
<div id="recurring_edit_period">
<label>Recurrence period</label><br/>
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'daily', @recurring_todo.recurring_period == 'daily')%> Daily<br/>
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'weekly', @recurring_todo.recurring_period == 'weekly')%> Weekly<br/>
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'monthly', @recurring_todo.recurring_period == 'monthly')%> Monthly<br/>
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'yearly', @recurring_todo.recurring_period == 'yearly')%> Yearly<br/>
<% #behaviour is set in index because behaviours in partials are not generated -%>
<label><%= t('todos.recurrence_period') %></label><br/>
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'daily', @recurring_todo.recurring_period == 'daily')%> <%= t('todos.recurrence.daily') %><br/>
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'weekly', @recurring_todo.recurring_period == 'weekly')%> <%= t('todos.recurrence.weekly') %><br/>
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'monthly', @recurring_todo.recurring_period == 'monthly')%> <%= t('todos.recurrence.monthly') %><br/>
<%= radio_button_tag('recurring_edit_todo[recurring_period]', 'yearly', @recurring_todo.recurring_period == 'yearly')%> <%= t('todos.recurrence.yearly') %><br/>
<%- #behaviour is set in index because behaviours in partials are not generated -%>
</div>
<div id="recurring_timespan">
<br/>
<label for="recurring_todo[start_from]">Starts on </label><%=
<label for="recurring_todo[start_from]"><%= t('todos.recurrence.starts_on') %>: </label><%=
text_field_tag("recurring_todo_edit_start_from", format_date(@recurring_todo.start_from), "size" => 12, "class" => "Date", "tabindex" => 6, "autocomplete" => "off") %><br/>
<br/>
<label for="recurring_todo[ends_on]">Ends on:</label><br/>
<%= radio_button_tag('recurring_todo[ends_on]', 'no_end_date', @recurring_todo.ends_on == 'no_end_date')%> No end date<br/>
<%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_number_of_times', @recurring_todo.ends_on == 'ends_on_number_of_times')%> Ends after <%= text_field_tag("recurring_todo[number_of_occurences]", @recurring_todo.number_of_occurences, "size" => 3, "tabindex" => 7) %> times<br/>
<%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_end_date', @recurring_todo.ends_on == 'ends_on_end_date')%> Ends on <%=
text_field_tag('recurring_todo_edit_end_date', format_date(@recurring_todo.end_date), "size" => 12, "class" => "Date", "tabindex" => 8, "autocomplete" => "off") %><br/>
<label for="recurring_todo[ends_on]"><%= t('todos.recurrence.ends_on') %>:</label><br/>
<%= radio_button_tag('recurring_todo[ends_on]', 'no_end_date', @recurring_todo.ends_on == 'no_end_date')%> <%= t('todos.recurrence.no_end_date') %><br/>
<%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_number_of_times', @recurring_todo.ends_on == 'ends_on_number_of_times')%>
<%= t('todos.recurrence.ends_on_number_times', :number => text_field( :recurring_todo, :number_of_occurences, "size" => 3, "tabindex" => 7)) %><br/>
<%= radio_button_tag('recurring_todo[ends_on]', 'ends_on_end_date', @recurring_todo.ends_on == 'ends_on_end_date')%>
<%= t('todos.recurrence.ends_on_date', :date => text_field_tag('recurring_todo_edit_end_date', format_date(@recurring_todo.end_date), "size" => 12, "class" => "Date", "tabindex" => 8, "autocomplete" => "off")) %><br/>
</div></div>
<div id="recurring_edit_daily" style="display:<%= @recurring_todo.recurring_period == 'daily' ? 'block' : 'none' %> ">
<label>Settings for daily recurring actions</label><br/>
<%= radio_button_tag('recurring_todo[daily_selector]', 'daily_every_x_day', !@recurring_todo.only_work_days)%> Every <%=
text_field_tag( 'recurring_todo[daily_every_x_days]', @recurring_todo.daily_every_x_days, {"size" => 3, "tabindex" => 9}) %> day(s)<br/>
<%= radio_button_tag('recurring_todo[daily_selector]', 'daily_every_work_day', @recurring_todo.only_work_days)%> Every work day<br/>
<label><%= t('todos.recurrence.daily_options') %></label><br/>
<%= radio_button_tag('recurring_todo[daily_selector]', 'daily_every_x_day', !@recurring_todo.only_work_days)%>
<%= t('todos.recurrence.daily_every_number_day', :number=> text_field_tag( 'recurring_todo[daily_every_x_days]', @recurring_todo.daily_every_x_days, {"size" => 3, "tabindex" => 9})) %><br/>
<%= radio_button_tag('recurring_todo[daily_selector]', 'daily_every_work_day', @recurring_todo.only_work_days)%> <%= t('todos.recurrence.every_work_day') %><br/>
</div>
<div id="recurring_edit_weekly" style="display:<%= @recurring_todo.recurring_period == 'weekly' ? 'block' : 'none' %>">
<label>Settings for weekly recurring actions</label><br/>
Returns every <%= text_field_tag('recurring_todo[weekly_every_x_week]', @recurring_todo.weekly_every_x_week, {"size" => 3, "tabindex" => 9}) %> week on<br/>
<%= check_box_tag('recurring_todo[weekly_return_monday]', 'm', @recurring_todo.on_monday ) %> Monday
<%= check_box_tag('recurring_todo[weekly_return_tuesday]', 't', @recurring_todo.on_tuesday) %> Tuesday
<%= check_box_tag('recurring_todo[weekly_return_wednesday]', 'w', @recurring_todo.on_wednesday) %> Wednesday
<%= check_box_tag('recurring_todo[weekly_return_thursday]', 't', @recurring_todo.on_thursday) %> Thursday<br/>
<%= check_box_tag('recurring_todo[weekly_return_friday]', 'f', @recurring_todo.on_friday) %> Friday
<%= check_box_tag('recurring_todo[weekly_return_saturday]', 's', @recurring_todo.on_saturday) %> Saturday
<%= check_box_tag('recurring_todo[weekly_return_sunday]', 's', @recurring_todo.on_sunday) %> Sunday<br/>
<label><%= t('todos.recurrence.weekly_options') %></label><br/>
<%= t('todos.recurrence.weekly_every_number_week', :number => text_field_tag('recurring_todo[weekly_every_x_week]', @recurring_todo.weekly_every_x_week, {"size" => 3, "tabindex" => 9})) %><br/>
<%= check_box_tag('recurring_todo[weekly_return_monday]', 'm', @recurring_todo.on_monday ) %> <%= t('date.day_names')[1] %>
<%= check_box_tag('recurring_todo[weekly_return_tuesday]', 't', @recurring_todo.on_tuesday) %> <%= t('date.day_names')[2] %>
<%= check_box_tag('recurring_todo[weekly_return_wednesday]', 'w', @recurring_todo.on_wednesday) %> <%= t('date.day_names')[3] %>
<%= check_box_tag('recurring_todo[weekly_return_thursday]', 't', @recurring_todo.on_thursday) %> <%= t('date.day_names')[4] %><br/>
<%= check_box_tag('recurring_todo[weekly_return_friday]', 'f', @recurring_todo.on_friday) %> <%= t('date.day_names')[5] %>
<%= check_box_tag('recurring_todo[weekly_return_saturday]', 's', @recurring_todo.on_saturday) %> <%= t('date.day_names')[6] %>
<%= check_box_tag('recurring_todo[weekly_return_sunday]', 's', @recurring_todo.on_sunday) %> <%= t('date.day_names')[0] %><br/>
</div>
<div id="recurring_edit_monthly" style="display:<%= @recurring_todo.recurring_period == 'monthly' ? 'block' : 'none' %>">
<label>Settings for monthly recurring actions</label><br/>
<%= radio_button_tag('recurring_todo[monthly_selector]', 'monthly_every_x_day', @recurring_todo.is_monthly_every_x_day || @recurring_todo.recurring_period == 'weekly')%> Day <%=
text_field_tag('recurring_todo[monthly_every_x_day]', @recurring_todo.monthly_every_x_day, {"size" => 3, "tabindex" => 9}) %> on every <%=
text_field_tag('recurring_todo[monthly_every_x_month]', @recurring_todo.monthly_every_x_month, {"size" => 3, "tabindex" => 10}) %> month<br/>
<%= radio_button_tag('recurring_todo[monthly_selector]', 'monthly_every_xth_day', @recurring_todo.is_monthly_every_xth_day)%> The <%=
select_tag('recurring_todo[monthly_every_xth_day]', options_for_select(@xth_day, @xth_day[@recurring_todo.monthly_every_xth_day(1)-1][1])) %> <%=
select_tag('recurring_todo[monthly_day_of_week]' , options_for_select(@days_of_week, @recurring_todo.monthly_day_of_week), {}) %> of every <%=
text_field_tag('recurring_todo[monthly_every_x_month2]', @recurring_todo.monthly_every_x_month2, {"size" => 3, "tabindex" => 11}) %> month<br/>
<label><%= t('todos.recurrence.monthly_options') %></label><br/>
<%= radio_button_tag('recurring_todo[monthly_selector]', 'monthly_every_x_day', @recurring_todo.is_monthly_every_x_day || @recurring_todo.recurring_period == 'weekly')%>
<%= t('todos.recurrence.day_x_on_every_x_month',
:day => text_field_tag('recurring_todo[monthly_every_x_day]', @recurring_todo.monthly_every_x_day, {"size" => 3, "tabindex" => 9}),
:month => text_field_tag('recurring_todo[monthly_every_x_month]', @recurring_todo.monthly_every_x_month, {"size" => 3, "tabindex" => 10})) %><br/>
<%= radio_button_tag('recurring_todo[monthly_selector]', 'monthly_every_xth_day', @recurring_todo.is_monthly_every_xth_day)%>
<%= t('todos.recurrence.monthly_every_xth_day',
:day => select_tag('recurring_todo[monthly_every_xth_day]', options_for_select(@xth_day, @xth_day[@recurring_todo.monthly_every_xth_day(1)-1][1])),
:day_of_week => select_tag('recurring_todo[monthly_day_of_week]' , options_for_select(@days_of_week, @recurring_todo.monthly_day_of_week), {}),
:month => text_field_tag('recurring_todo[monthly_every_x_month2]', @recurring_todo.monthly_every_x_month2, {"size" => 3, "tabindex" => 11})) %><br/>
</div>
<div id="recurring_edit_yearly" style="display:<%= @recurring_todo.recurring_period == 'yearly' ? 'block' : 'none' %>">
<label>Settings for yearly recurring actions</label><br/>
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_x_day', @recurring_todo.recurrence_selector == 0)%> Every <%=
select_tag('recurring_todo[yearly_month_of_year]', options_for_select(@months_of_year, @recurring_todo.yearly_month_of_year), {}) %> <%=
text_field_tag('recurring_todo[yearly_every_x_day]', @recurring_todo.yearly_every_x_day, "size" => 3, "tabindex" => 9) %><br/>
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_xth_day', @recurring_todo.recurrence_selector == 1)%> The <%=
select_tag('recurring_todo[yearly_every_xth_day]', options_for_select(@xth_day, @recurring_todo.yearly_every_xth_day), {}) %> <%=
select_tag('recurring_todo[yearly_day_of_week]', options_for_select(@days_of_week, @recurring_todo.yearly_day_of_week), {}) %> of <%=
select_tag('recurring_todo[yearly_month_of_year2]', options_for_select(@months_of_year, @recurring_todo.yearly_month_of_year2), {}) %><br/>
<label><%= t('todos.recurrence.yearly_options') %></label><br/>
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_x_day', @recurring_todo.recurrence_selector == 0)%>
<%= t('todos.recurrence.yearly_every_x_day',
:month => select_tag('recurring_todo[yearly_month_of_year]', options_for_select(@months_of_year, @recurring_todo.yearly_month_of_year), {}),
:day => text_field_tag('recurring_todo[yearly_every_x_day]', @recurring_todo.yearly_every_x_day, "size" => 3, "tabindex" => 9)) %><br/>
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_xth_day', @recurring_todo.recurrence_selector == 1)%>
<%= t('todos.recurrence.yearly_every_xth_day',
:day => select_tag('recurring_todo[yearly_every_xth_day]', options_for_select(@xth_day, @recurring_todo.yearly_every_xth_day), {}),
:day_of_week => select_tag('recurring_todo[yearly_day_of_week]', options_for_select(@days_of_week, @recurring_todo.yearly_day_of_week), {}),
:month => select_tag('recurring_todo[yearly_month_of_year2]', options_for_select(@months_of_year, @recurring_todo.yearly_month_of_year2), {})) %><br/>
</div>
<div id="recurring_target">
<label>Set recurrence on</label><br/>
<%= radio_button_tag('recurring_todo[recurring_target]', 'due_date', @recurring_todo.target == 'due_date')%> the date that the todo is due. Show the todo:
<%= radio_button_tag('recurring_todo[recurring_show_always]', '1', @recurring_todo.show_always?)%> always
<label><%= t('todos.recurrence.recurrence_on_options') %></label><br/>
<%= radio_button_tag('recurring_todo[recurring_target]', 'due_date', @recurring_todo.target == 'due_date')%> <%= t('todos.recurrence.recurrence_on_due_date') %>. <%= t('todos.recurrence.show_options') %>:
<%= radio_button_tag('recurring_todo[recurring_show_always]', '1', @recurring_todo.show_always?)%> <%= t('todos.recurrence.show_option_always') %>
<%= radio_button_tag('recurring_todo[recurring_show_always]', '0', !@recurring_todo.show_always?)%>
<%= text_field_tag( 'recurring_todo[recurring_show_days_before]', @recurring_todo.show_from_delta, {"size" => 3, "tabindex" => 12}) %>
days before the todo is due
<br/>
<%= radio_button_tag('recurring_todo[recurring_target]', 'show_from_date', @recurring_todo.target == 'show_from_date')%> the date todo comes from tickler (no due date set)<br/>
<%= t('todos.recurrence.show_days_before', :days => text_field_tag( 'recurring_todo[recurring_show_days_before]', @recurring_todo.show_from_delta, {"size" => 3, "tabindex" => 12})) %><br/>
<%= radio_button_tag('recurring_todo[recurring_target]', 'show_from_date', @recurring_todo.target == 'show_from_date')%> <%= t('todos.recurrence.from_tickler') %><br/>
<br/>
</div>
<div class="recurring_submit_box">
<div class="widgets">
<button type="submit" class="positive" id="recurring_todo_edit_action_submit" tabindex="15">
<%=image_tag("accept.png", :alt => "") %>
Update
<%= t('common.update') %>
</button>
<button type="button" class="positive" id="recurring_todo_edit_action_cancel" tabindex="15">
<%=image_tag("cancel.png", :alt => "") %>
Cancel
<%= t('common.cancel') %>
</button>
</div>
</div>

View file

@ -1,10 +1,6 @@
<div class="recurring_container">
<%
form_for(@new_recurring_todo, :html=> { :id=>'recurring-todo-form-new-action', :name=>'recurring_todo', :class => 'inline-form' }) do
#form_remote_tag(
# :url => recurring_todos_path, :method => :post,
# :html=> { :id=>'recurring-todo-form-new-action', :name=>'recurring_todo', :class => 'inline-form' },
# :before => "$('#recurring_todo_new_action_submit').block({message: null})") do
-%>
<div id="error_status"><%= error_messages_for("item", :object_name => 'action') %></div>
@ -76,7 +72,7 @@
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_x_day', true)%> <%= t('todos.recurrence.yearly_every_x_day',
:month => select_tag('recurring_todo[yearly_month_of_year]', options_for_select(@months_of_year, Time.zone.now.month), {}),
:day => text_field_tag('recurring_todo[yearly_every_x_day]', Time.zone.now.day, "size" => 3, "tabindex" => 9)) %><br/>
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_xth_day')%><%= t('todos.recurrence.yearly_every_xth_day',
<%= radio_button_tag('recurring_todo[yearly_selector]', 'yearly_every_xth_day')%> <%= t('todos.recurrence.yearly_every_xth_day',
:day => select_tag('recurring_todo[yearly_every_xth_day]', options_for_select(@xth_day), {}),
:day_of_week => select_tag('recurring_todo[yearly_day_of_week]', options_for_select(@days_of_week, Time.zone.now.wday), {}),
:month => select_tag('recurring_todo[yearly_month_of_year2]', options_for_select(@months_of_year, Time.zone.now.month), {})) %><br/>

View file

@ -1,7 +1,7 @@
<%
@initial_context_name = @context.name unless @context.nil?
@initial_context_name ||= @project.default_context.name unless @project.nil? || @project.default_context.nil?
@initial_context_name ||= current_user.contexts.first.name unless current_user.contexts.first.nil?
@initial_context_name ||= @contexts.first.name unless @contexts.first.nil?
@initial_project_name = @project.name unless @project.nil?
-%>
<div id="todo_new_action_container">

View file

@ -1,3 +1,8 @@
<div id="footer">
<p>Send feedback on <%= TRACKS_VERSION %>: <a href="http://www.assembla.com/spaces/tracks-tickets/tickets">Bugs</a> | <a href="http://www.getontracks.org/forums/">Forum</a> | <a href="http://www.getontracks.org/wiki/">Wiki</a> | <a href="mailto:butshesagirl@rousette.org.uk?subject=Tracks feedback">Email</a> | <a href="http://www.getontracks.org/">Website</a> | <a href="http://getontracks.org/tracks/contribute">Contribute</a></p>
<p><%= t('footer.send_feedback', :version => TRACKS_VERSION) %>: <a href="http://www.assembla.com/spaces/tracks-tickets/tickets"><%= t('common.bugs')%></a> |
<a href="http://www.getontracks.org/forums/"><%= t('common.forum')%></a> |
<a href="http://www.getontracks.org/wiki/"><%= t('common.wiki')%></a> |
<a href="mailto:butshesagirl@rousette.org.uk?subject=Tracks feedback"><%= t('common.email')%></a> |
<a href="http://www.getontracks.org/"><%= t('common.website')%></a> |
<a href="http://getontracks.org/tracks/contribute"><%= t('common.contribute')%></a></p>
</div>

View file

@ -42,8 +42,17 @@ form_for(todo, :html=> { :name=>'todo', :id => dom_id(@todo, 'form'), :class =>
</a>
</div>
<label class="predecessor_list_label" for="<%= dom_id(@todo, 'predecessor_list') %>"><%= t('todos.depends_on_separate_with_commas') %></label>
<%= text_field_tag 'predecessor_list', predecessor_list_text, :id => dom_id(@todo, 'predecessor_list'), :size => 30, :tabindex => 15 %>
<div class="depends_on">
<label for="predecessor_ul"><%= Todo.human_attribute_name('predecessors')%></label>
<div class="selected_predecessors">
<ul class="predecessor_list" id="predecessor_ul" style="display:<%= @todo.predecessors.empty? ? "none" : "block"%>">
</ul>
</div>
<label id="label_for_predecessor_input" for="predecessor_input" style="display:none"><%= t('todos.add_another_dependency')%></label>
<%= text_field_tag "predecessor_input", nil, :size => 30, :tabindex => 8 %>
<%= hidden_field_tag "predecessor_list", @todo.predecessors.map{|t| t.id.to_s}.join(', ') %>
</div>
<div class="submit_box">
<div class="widgets">

View file

@ -5,7 +5,7 @@
</span>
<% this_year = current_user.time.to_date.strftime("%Y").to_i
if parent_container_type == 'show_mobile' -%>
<p><label for="todo_done"><%= t('todos.done') %></label>&nbsp;<%= check_box_tag("done", 1, @todo && @todo.completed?, "tabindex" => 1) %></p>
<p><label for="todo_done"><%= t('todos.done') %></label>&nbsp;<%= check_box_tag("done", 1, @todo && @todo.completed?, "tabindex" => 1, "onClick" => "document.mobileEdit.submit()") %></p>
<% end -%>
<h2><label for="todo_description"><%= t('common.description') %></label></h2>
<%= text_field( "todo", "description", "tabindex" => 2, "maxlength" => 100, "size" => 50) %>

View file

@ -18,7 +18,7 @@
<input id="multi_todo_context_name" name="context_name" autocomplete="off" tabindex="4" size="30" type="text" value="<%= @initial_context_name %>" />
<div class="page_name_auto_complete" id="context_list" style="display:none"></div>
<label for="tag_list"><%= t('shared.tags_for_all_actions') + ' (' + t('shared.separate_tags_with_commas') +')' %></label>
<label for="tag_list"><%= t('shared.tags_for_all_actions') %></label>
<%= text_field_tag "multi_tag_list", @default_tags, :name=>:tag_list, :size => 30, :tabindex => 5 %>
<%= content_tag("div", "", :id => "tag_list_auto_complete", :class => "auto_complete") %>

View file

@ -1,7 +1,7 @@
<%- todo = new_todo_form -%>
<div id="todo_new_action">
<% form_for(todo, :html=> { :id=>'todo-form-new-action', :name=>'todo', :class => 'inline-form' }) do |t|%>
<% form_for(todo, :html=> { :id=>'todo-form-new-action', :name=>'todo', :class => 'inline-form new_todo_form' }) do |t|%>
<input id="default_project_name_id" name="default_project_name" type="hidden" value="<%=@initial_project_name-%>" />
<input id="default_context_name_id" name="default_context_name" type="hidden" value="<%=@initial_context_name-%>" />
@ -34,8 +34,17 @@
<%= t.text_field("show_from", "size" => 12, "class" => "Date", "tabindex" => 7, "autocomplete" => "off") %>
</div>
<label for="predecessor_list"><%= Todo.human_attribute_name('predecessors')%></label>
<%= text_field_tag "predecessor_list", nil, :size => 30, :tabindex => 8 %>
<div class="depends_on">
<label for="predecessor_ul"><%= Todo.human_attribute_name('predecessors')%></label>
<div class="selected_predecessors">
<ul class="predecessor_list" id="predecessor_ul" style="display:none">
</ul>
</div>
<label id="label_for_predecessor_input" for="predecessor_input" style="display:none"><%= t('todos.add_another_dependency')%></label>
<%= text_field_tag "predecessor_input", nil, :size => 30, :tabindex => 8 %>
<%= hidden_field_tag "predecessor_list", ""%>
</div>
<%= source_view_tag( @source_view ) %>
<%= hidden_field_tag :_tag_name, @tag_name.underscore.gsub(/\s+/,'_') if source_view_is :tag %>

View file

@ -23,8 +23,8 @@ parameters += "&_tag_name=#{@tag_name}" if @source_view == 'tag'
</ul>
</li>
</ul>
<%= grip_span(todo) %>
<div class="description<%= staleness_class( todo ) %>">
<%= grip_span(todo) %>
<%= date_span(todo) -%>
<span class="todo.descr"><%= h todo.description %></span>
<%= image_tag_for_recurring_todo(todo) if todo.from_recurring_todo? %>

View file

@ -1,5 +1,5 @@
<% if @saved -%>
TracksPages.page_notify('notice', "<%=@status_message%>", 5);
TracksPages.page_notify('notice', "<%=escape_javascript @status_message%>", 5);
TracksPages.hide_errors();
TracksPages.set_page_badge(<%= @down_count %>);
<% if should_show_new_item -%>
@ -17,21 +17,22 @@
function clear_form() {
$('#todo-form-new-action').clearForm();
TracksForm.set_context_name('<%=@initial_context_name%>');
TracksForm.set_project_name('<%=@initial_project_name%>');
TracksForm.set_tag_list('<%=@default_tags%>');
$('#todo-form-new-action').clearDeps();
TracksForm.set_context_name('<%=escape_javascript @initial_context_name%>');
TracksForm.set_project_name('<%=escape_javascript @initial_project_name%>');
TracksForm.set_tag_list('<%=escape_javascript @default_tags%>');
$('#todo-form-new-action input:text:first').focus();
}
function insert_new_context_with_new_todo() {
$('#no_todos_in_tag_view').slideUp(100);
$('#no_todos_in_view').slideUp(100);
$('#display_box').prepend(html_for_new_context());
}
function add_todo_to_existing_context() {
<% if source_view_is_one_of(:todo, :deferred, :tag) -%>
$('#c<%= @todo.context_id %>').fadeIn(500, function() {});
$('#no_todos_in_tag_view').slideUp(100);
$('#no_todos_in_view').slideUp(100);
<% end -%>
$('#<%=empty_container_msg_div_id%>').hide();
$('#<%=item_container_id(@todo)%>').append(html_for_new_todo());

View file

@ -1,5 +1,5 @@
<%- if @saved -%>
TracksPages.page_notify('notice', '<%= escape_javascript("The action was deleted succesfully") %>', 5);
TracksPages.page_notify('notice', '<%= escape_javascript(t('todos.deleted_success')) %>', 5);
TracksPages.set_page_badge(<%=@down_count%>);
remove_todo_from_page();
show_new_todo_if_todo_was_recurring();
@ -19,7 +19,10 @@ function show_empty_messages() {
<% end -%>
<% if empty_container_msg_div_id && todo_container_is_empty -%>
$('#<%=empty_container_msg_div_id%>').slideDown(1000);
$('#<%=empty_container_msg_div_id%>').slideDown(1000);
<% if @down_count == 0 -%>
$('#no_todos_in_view').slideDown(1000);
<% end -%>
<% end -%>
<% if source_view_is(:deferred) && @down_count==0 -%>
@ -59,14 +62,24 @@ function show_new_todo_if_todo_was_recurring() {
}
function activate_pending_todos() {
<% # Activate pending todos that are successors of the deleted -%>
<% @pending_to_activate.each do |t| -%>
<% if source_view_is(:project) or source_view_is(:tag) %>
$('#<%=dom_id(t)%>').remove();
<% end -%>
$('#<%=item_container_id(t)%>').append("<%=escape_javascript(render(:partial => t, :locals => { :parent_container_type => parent_container_type }))%>");
$('#<%= dom_id(t, 'line')%>').effect('highlight', {}, 2000 );
<% end -%>
<% # Activate pending todos that are successors of the completed
if @saved && @pending_to_activate
# do not render the js in case of an error or if no todos to activate
@pending_to_activate.each do |t|
html = escape_javascript(render(:partial => t, :locals => { :parent_container_type => parent_container_type }))
# only project and tag view have a deferred/blocked container
if source_view_is_one_of(:project,:tag) -%>
$('#<%= dom_id(t) %>').fadeOut(400, function() {
$('#<%= dom_id(t) %>').remove();
$('#<%= item_container_id(t) %>').append("<%= html %>");
<%= "$('#tickler-empty-nd').show();" if @remaining_deferred_or_pending_count==0 -%>
});
<% else -%>
$('#<%= item_container_id(t) %>').append("<%= html%>");
<% end -%>
TodoItems.highlight_todo('#<%= dom_id(t, 'line')%>');
<% end -%>
<% end -%>
}
function html_for_new_recurring_todo() {

View file

@ -1,5 +1,6 @@
hide_todo();
replace_placeholder_with_form();
fill_dependency_array();
enable_rich_interaction();
function hide_todo() {
@ -12,6 +13,14 @@ function replace_placeholder_with_form() {
$('#<%=dom_id(@todo, 'form')%> input#todo_description').focus();
}
function fill_dependency_array() {
spec_of_todo = new Array();
<%
@todo.predecessors.each do |dep| -%>
spec_of_todo['<%=dep.id%>'] = "<%= escape_javascript(dep.specification)%>";
<% end -%>
}
function html_for_edit_form() {
return "<%= escape_javascript(render(:partial => 'todos/edit_form', :object => @todo)) %>"
}

View file

@ -1,4 +1,8 @@
<div id="display_box">
<div id="no_todos_in_view" class="container context" <%= "style=\"display:none\"" unless @not_done_todos.empty? %> >
<h2><%= t('todos.no_actions_found_title')%></h2>
<div class="message"><p><%= t('todos.no_actions_found') %></p></div>
</div>
<%= render(
:partial => "contexts/context",
:collection => @contexts_to_show,

View file

@ -1,7 +1,7 @@
<div id="display_box">
<% if @not_done_todos.empty? -%>
<div class="container context">
<h2><%= t('todos.no_actions_found') %></h2>
<h2><%= t('todos.no_actions_found_title') %></h2>
<div class="message"><%= t('todos.no_actions_with', :tag_name => @tag_name) %></div>
</div>
<% end -%>

View file

@ -31,7 +31,7 @@ function update_successor() {
<%= "show_empty_deferred_message(); " if @remaining_deferred_or_pending_count == 0 %>
<% if source_view_is_one_of(:todo, :deferred, :tag) -%>
$('#c<%= @successor.context_id %>').fadeIn(500, function() {});
$('#no_todos_in_tag_view').slideUp(100);
$('#no_todos_in_view').slideUp(100);
<% end -%>
$('#<%=item_container_id(@successor)%>').append(html_for_new_successor());
$('#<%= dom_id(@successor, 'line')%>').effect('highlight', {}, 2000 ); <%

View file

@ -1,4 +1,4 @@
<% form_tag todo_path(@todo, :format => 'm'), :method => :put do %>
<% form_tag todo_path(@todo, :format => 'm'), :name => 'mobileEdit', :method => :put do %>
<%= render :partial => 'edit_mobile', :locals => { :parent_container_type => "show_mobile" } %>
<p><input type="submit" value="<%= t('common.update') %>" tabindex="6" accesskey="#" /></p>
<% end -%>

View file

@ -1,6 +1,6 @@
<div id="display_box">
<div id="no_todos_in_tag_view" class="container context" <%= "style=\"display:none\"" unless @not_done_todos.empty? %> >
<h2><%= t('todos.no_actions_found')%></h2>
<div id="no_todos_in_view" class="container context" <%= "style=\"display:none\"" unless @not_done_todos.empty? %> >
<h2><%= t('todos.no_actions_found_title')%></h2>
<div class="message"><p><%= t('todos.no_actions_with', :tag_name=>@tag_name) %></p></div>
</div>

View file

@ -7,7 +7,7 @@
animation = []
animation << "remove_todo"
if @todo.completed?
animation << "add_to_completed_container"
animation << "add_to_completed_container" unless source_view_is(:calendar)
animation << "add_new_recurring_todo"
animation << "activate_pending_todos"
animation << "remove_source_container"
@ -15,14 +15,15 @@
animation << "add_todo_to_context"
animation << "block_predecessors"
end
animation << "update_empty_tag_container" if source_view_is(:tag) -%>
animation << "update_empty_container" if source_view_is_one_of(:tag, :todo) -%>
<%= render_animation(animation) %>
TracksPages.set_page_badge(<%= @down_count %>);
<% end -%>
<% end -%>
function redirect_after_complete() {
redirect_to("<%= project_path(@todo.project) -%>");
var path = "<%= @todo.project_id.nil? ? "/" : project_path(@todo.project) -%>";
redirect_to(path);
}
function remove_todo(next_steps) {
@ -85,42 +86,43 @@ function add_new_recurring_todo(next_steps) {
<% end -%>
}
function update_empty_tag_container(next_steps) {
function update_empty_container(next_steps) {
<% if @down_count==0 -%>
$('#no_todos_in_tag_view').slideDown(400, function(){ next_steps.go(); });
$('#no_todos_in_view').slideDown(400, function(){ next_steps.go(); });
<% else -%>
$('#no_todos_in_tag_view').fadeOut(100, function(){ next_steps.go(); });
$('#no_todos_in_view').fadeOut(100, function(){ next_steps.go(); });
<% end -%>
}
<% if @new_recurring_todo # hide js if @new_recurring_todo is not there-%>
function highlight_updated_recurring_todo(next_steps) {
highlight_todo('#<%= dom_id(@new_recurring_todo)%>');
TodoItems.highlight_todo('#<%= dom_id(@new_recurring_todo)%>');
next_steps.go();
}
<% end -%>
function highlight_updated_todo(next_steps) {
highlight_todo('#<%= dom_id(@todo)%>');
TodoItems.highlight_todo('#<%= dom_id(@todo)%>');
next_steps.go();
}
function highlight_todo(id) {
$(id).effect('highlight', {}, 2000, function(){ });
}
function activate_pending_todos(next_steps) {
<% # Activate pending todos that are successors of the completed
if @saved && @pending_to_activate
# do not render the js in case of an error or if no todos to activate
@pending_to_activate.each do |t|
html = escape_javascript(render(:partial => t, :locals => { :parent_container_type => parent_container_type }))
# only project and tag view have a deferred/blocked container
if source_view_is_one_of(:project,:tag) -%>
$('#<%= dom_id(t) %>').fadeOut(400, function() {
$('#<%= dom_id(t) %>').remove();
$('#<%= item_container_id(t) %>').append("<%= html %>");
<%= "$('#tickler-empty-nd').show();" if @remaining_deferred_or_pending_count==0 -%>
});
<% end -%>
$('#<%= item_container_id(t) %>').append("<%= escape_javascript(render(:partial => t, :locals => { :parent_container_type => parent_container_type }))%>");
highlight_todo('#<%= dom_id(t)%>');
<% else -%>
$('#<%= item_container_id(t) %>').append("<%= html%>");
<% end -%>
TodoItems.highlight_todo('#<%= dom_id(t)%>');
<% end -%>
<% end -%>
next_steps.go();
@ -135,7 +137,7 @@ function block_predecessors(next_steps) {
$('#<%= dom_id(t) %>').remove();
<% if source_view_is(:project) or source_view_is(:tag) # Insert it in deferred/pending block if existing -%>
$('#<%= item_container_id(t) %>').append("<%= escape_javascript(render(:partial => t, :locals => { :parent_container_type => parent_container_type }))%>");
highlight_todo('#<%= dom_id(t)%>');
TodoItems.highlight_todo('#<%= dom_id(t)%>');
<% end -%>
});
<% end -%>

View file

@ -15,12 +15,12 @@
end
animation << "hide_context" if update_needs_to_hide_context
animation << "highlight_updated_todo"
animation << "update_empty_tag_container" if source_view_is(:tag)
animation << "update_empty_container" if source_view_is_one_of(:tag, :todo)
animation << "update_predecessors"
%>
<%= render_animation(animation) %>
TracksPages.page_notify('notice', '<%=@status_message%>', 5);
TracksPages.page_notify('notice', '<%=escape_javascript @status_message%>', 5);
TracksPages.set_page_badge(<%= @down_count %>);
<% end %>
@ -71,11 +71,11 @@ function highlight_updated_todo(next_steps) {
next_steps.go();
}
function update_empty_tag_container(next_steps) {
function update_empty_container(next_steps) {
<% if @down_count==0 -%>
$('#no_todos_in_tag_view').slideDown(400, function(){ next_steps.go(); });
$('#no_todos_in_view').slideDown(400, function(){ next_steps.go(); });
<% else -%>
$('#no_todos_in_tag_view').fadeOut(100, function(){ next_steps.go(); });
$('#no_todos_in_view').fadeOut(100, function(){ next_steps.go(); });
<% end -%>
}

View file

@ -25,7 +25,7 @@ Rails::Initializer.run do |config|
config.gem "RedCloth"
config.gem "soap4r", :lib => false
config.gem 'datanoise-actionwebservice', :lib => 'actionwebservice'
config.gem 'sanitize'
config.gem 'sanitize', :version => '~> 1.2.1'
config.gem 'rack', :version => '1.1.0'
config.gem 'will_paginate', :version => '~> 2.3.15'
config.gem 'has_many_polymorphs'
@ -121,7 +121,7 @@ if ( SITE_CONFIG['authentication_schemes'].include? 'cas')
end
end
tracks_version='1.8devel'
tracks_version='2.0devel'
# comment out next two lines if you do not want (or can not) the date of the
# last git commit in the footer
info=`git log --pretty=format:"%ai" -1`

View file

@ -41,5 +41,5 @@ config.gem "ZenTest", :lib => "zentest", :version => ">=4.0.0"
config.gem "hpricot"
config.gem "hoe"
config.gem 'webrat', :lib => false, :version => '>=0.7.0' unless File.directory?(File.join(Rails.root, 'vendor/plugins/webrat'))
config.gem 'rspec-rails', :lib => false, :version => '<2.1.0' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec-rails'))
config.gem 'rspec-rails', :lib => false, :version => '~>1.3.3' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec-rails'))
config.gem "thoughtbot-factory_girl", :lib => "factory_girl", :source => "http://gems.github.com"

View file

@ -135,10 +135,7 @@ de:
activerecord:
attributes:
project:
name:
blank: Das Projekt muss benannt sein
taken: ist bereits vergeben
too_long: Der Projekt-Name muss k&uuml;rzer als 256 Zeichen sein
name: Name
default_tags: Standard Tags
default_context_name: Standard Kontext
description: Beschreibung
@ -441,7 +438,7 @@ de:
added_dependency: "%{dependency} als Abh&auml;ngigkeit hinzugef&uuml;gt."
no_deferred_actions: Zur Zeit sind keine zur&uuml;ckgestellten Aktionen vorhanden.
recurrence_completed: Nach dieser wiederkehrenden Aktion, die du gerade abgeschlossen hast, folgt keine mehr. Die Wiederholung endet hiermit
no_actions_found: Keine Aktionen gefunden
no_actions_found_title: Keine Aktionen gefunden
in_pending_state: und als ausstehend markiert
due: F&auml;llig
action_marked_complete_error: Die Aktion <strong>'%{description}'</strong> wurde aufgrund eines Fehlers NICHT als <strong>%{completed}</strong> markiert.

View file

@ -39,6 +39,7 @@ en:
logout: "Logout"
cancel: "Cancel"
ok: "Ok"
add: "Add"
project: "Project"
projects: "Projects"
context: "Context"
@ -65,7 +66,22 @@ en:
by_task_count: "By number of tasks"
by_task_count_title: "Sort by number of tasks"
by_task_count_title_confirm: "Are you sure that you want to sort these projects by the number of tasks? This will replace the existing sort order."
drag_handle: "DRAG"
drag_handle: DRAG
bugs: Bugs
forum: Forum
wiki: Wiki
email: Email
website: Website
contribute: Contribute
first: First
second: Second
third: Third
fourth: Fourth
last: Last
errors:
user_unauthorized: "401 Unauthorized: Only administrative users are allowed access to this function."
footer:
send_feedback: Send feedback on %{version}
contexts:
status_hidden: "Context is hidden"
status_active: "Context is active"
@ -239,13 +255,24 @@ en:
deferred_actions_empty: "There are no deferred actions for this project"
completed_actions: "Completed actions for this project"
completed_actions_empty: "There are no completed actions for this project"
no_actions_in_project: "Currently there are no incomplete actions in this project"
actions_in_project_title: "Actions in this project"
notes: "Notes"
notes_empty: "There are no notes for this project"
settings: "Settings"
state: "This project is %{state}"
this_project: "This project"
active_projects: "Active projects"
hidden_projects: "Hidden projects"
completed_projects: "Completed projects"
was_marked_complete: "has been marked as completed"
was_marked_hidden: "has been marked as hidden"
is_active: "is active"
with_no_default_context: "with no default context"
with_default_context: "with a default context of '%{context_name}'"
with_no_default_tags: "and with no default tags"
with_default_tags: "and with '%{tags}' as the default tags"
edit_project_settings: "Edit Project Settings"
page_title: "TRACKS::Project: %{project}"
list_projects: "TRACKS::List Projects"
no_default_context: "This project does not have a default context"
@ -397,9 +424,11 @@ en:
error_starring: "Could not toggle the star of this todo \'%{description}\'"
recurrence_completed: "There is no next action after the recurring action you just finished. The recurrence is completed"
tagged_with: "tagged with &lsquo;%{tag_name}&rsquo;"
no_actions_found: "No actions found"
no_actions_found_title: "No actions found"
no_actions_found: "Currently there are no incomplete actions."
no_actions_with: "Currently there are no incomplete actions with the tag '%{tag_name}'"
removed_predecessor: "Removed %{successor} as dependency from %{predecessor}."
add_another_dependency: "Add another dependency"
error_removing_dependency: "There was an error removing the dependency"
deferred_actions_with: "Deferred actions with the tag '%{tag_name}'"
no_deferred_actions_with: "No deferred actions with the tag '%{tag_name}'"
@ -407,6 +436,8 @@ en:
no_completed_actions_with: "No completed actions with the tag '%{tag_name}'"
next_action_description: "Next action description"
new_related_todo_created: "A new todo was added which belongs to this recurring todo"
new_related_todo_created_short: "created a new todo"
new_related_todo_not_created_short: "did not create todo"
error_completing_todo: "There was an error completing / activating the recurring todo %{description}"
recurring_todos: "Recurring todos"
no_recurring_todos: "Currently there are no recurring todos"
@ -414,7 +445,9 @@ en:
no_completed_recurring: "Currently there are no completed recurring todos"
add_new_recurring: "Add a new recurring action"
recurring_deleted_success: "The recurring action was deleted succesfully."
deleted_success: "The action was deleted succesfully."
error_deleting_recurring: "There was an error deleting the recurring todo \'%{description}\'"
error_saving_recurring: "There was an error saving the recurring todo \'%{description}\'"
error_starring_recurring: "Could not toggle the star of recurring todo \'%{description}\'"
recurrence_period: "Recurrence period"
action_marked_complete: "The action <strong>'%{description}'</strong> was marked as <strong>%{completed}</strong>"
@ -603,6 +636,4 @@ en:
openid_ok_pref_failed: "You have successfully verified %{url} as your identity but there was a problem saving your authentication preferences."
auth_type_updated: "Authentication type updated."
auth_type_update_error: "There was a problem updating your authentication type: %{error_messages}"
new_token_generated: "New token successfully generated"
errors:
user_unauthorized: "401 Unauthorized: Only administrative users are allowed access to this function."
new_token_generated: "New token successfully generated"

View file

@ -23,65 +23,54 @@ nl:
separator: ","
delimiter: .
dates:
month_names:
- Januari
- Februari
- Maart
- April
- Mei
- Juni
- Juli
- Augustus
- September
- Oktober
- November
- December
day_names:
- Zondag
- Maandag
- Dinsdag
- Woensdag
- Donderdag
- Vrijdag
- Zaterdag
integrations:
opensearch_description: Zoek in Tracks
gmail_description: Gadget om Tracks toe te voegen aan Gmail als een gadget
applescript_next_action_prompt: "Omschrijving van de actie:"
applescript_success_after_id: gemaakt
applescript_success_before_id: Nieuwe actie met ID
applescript_success_after_id: gemaakt
common:
third: Derde
actions: Acties
back: Terug
add: Toevoegen
logout: Log uit
go_back: Ga terug
second: Tweede
none: Geen
cancel: Annuleer
optional: optioneel
notes: Notities
server_error: Een fout heeft op de server plaatsgevonden
forum: Forum
last: Laatste
action: Actie
projects: Projecten
project: Project
ok: Ok
contribute: Bijdragen
first: Eerste
website: Website
numbered_step: Stap %{number}
fourth: Vierde
context: Context
errors_with_fields: Er waren problemen met de volgende velden
drag_handle: SLEEP
sort:
by_task_count_title: Sorteer op aantal acties
by_task_count_title_confirm: Weet u zeker dat u deze projecten alphabetisch wilt sorteren? Dat zal de huidige sorteervolgorde aanpassen.
alphabetically: Alphabetisch
sort: Sorteer
alphabetically_title: Sorteer projecten alphabetisch
sort: Sorteer
alphabetically_confirm: Weet u zeker dat u deze projecten alphabetisch wilt sorteren? Dat zal de huidige sorteervolgorde aanpassen.
by_task_count: Bij aantal acties
drag_handle: SLEEP
create: Maken
description: Beschrijving
contexts: Contexten
update: Bijwerken
wiki: Wiki
bugs: Fouten
email: E-mail
ajaxError: Er is een fout opgetreden bij het ophalen van gegevens van de server
search: Zoeken
layouts:
@ -98,13 +87,13 @@ nl:
contexts: 2-Contexten
home: 1-Start
navigation:
recurring_todos: Terugkerende todos
manage_users_title: Toevoegen of verwijderen gebruikers
recurring_todos: Terugkerende acties
api_docs: REST API Docs
feeds: Feeds
notes_title: Toon alle notities
stats: Statistieken
starred: Ster
notes_title: Toon alle notities
tickler_title: Tickler
manage_users: Beheren gebruikers
export_title: Import en export van gegevens
@ -112,12 +101,12 @@ nl:
preferences: Voorkeuren
calendar_title: Kalender met acties met deadline
feeds_title: Zie een lijst met beschikbare feeds
stats_title: Zie je statistieken
home_title: Start
starred_title: Zie je ster acties
recurring_todos_title: Beheren terugkerende acties
tickler: Tickler
completed_tasks: Gereed
stats_title: Zie je statistieken
view: Bekijk
organize: Organiseer
completed_tasks_title: Afgerond
@ -134,55 +123,52 @@ nl:
feed_description: Een overzicht van alle projecten voor %{username}
todo:
error_date_must_be_future: moet een datum in de toekomst zijn
preference:
due_styles:
- Deadline over ____ dagen
- Deadline op ____
user:
error_context_not_associated: Context %{context} niet geassocieerd met gebruikers %{user}.
error_project_not_associated: Project %{project} niet geassocieerd met gebruikers %{user}.
preference:
due_styles:
- "Deadline over ____ dagen"
- "Deadline op ____"
data:
import_successful: De import was succesvol
import_errors: Er hebben zich fouten voorgedaan bij de import
activerecord:
attributes:
project:
name:
blank: Het project moet moet een naam hebben
taken: bestaat al
too_long: De naam van het project moet korter zijn dan 256 tekens
name: Naam
default_tags: Standaard Tags
default_context_name: Standaard context
description: Beschrijving
todo:
show_from: Tonen vanaf
predecessors: Is afhankelijk van
predecessors: Afhankelijkheden
notes: Notities
project: Project
context: Context
description: Beschrijving
due: Deadline
preference:
show_hidden_projects_in_sidebar: Toon verborgen projecten in sidebar
show_hidden_contexts_in_sidebar: Toon verborgen contexten in sidebar
date_format: Datum formaat
staleness_starts: Begin van markeren openstaande actie
sms_context: Standaard context voor email
verbose_action_descriptors: Context en project uitschrijven in actielijst
mobile_todos_per_page: Acties per pagina (mobiel)
show_number_completed: Aantal te tonen afgeronde acties
title_date_format: Datum formaat in titel
refresh: Ververs interval (in minuten)
week_starts: Week start op
time_zone: Tijdzone
due_style: Deadline stijl
locale: Taal
sms_email: Van email
show_project_on_todo_done: Ga naar project pagina wanneer actie gereed is
show_completed_projects_in_sidebar: Toon afgeronde projecten in sidebar
user:
last_name: Achternaam
first_name: Voornaam
preference:
sms_context: Standaard context voor email
mobile_todos_per_page: Acties per pagina (mobiel)
refresh: Ververs interval (in minuten)
week_starts: Week start op
show_project_on_todo_done: Ga naar project pagina wanneer actie gereed is
sms_email: Van email
time_zone: Tijdzone
due_style: Deadline stijl
show_completed_projects_in_sidebar: Toon afgeronde projecten in sidebar
show_hidden_projects_in_sidebar: Toon verborgen projecten in sidebar
show_hidden_contexts_in_sidebar: Toon verborgen contexten in sidebar
staleness_starts: Begin van markeren openstaande actie
show_number_completed: Aantal te tonen afgeronde acties
verbose_action_descriptors: Context en project uitschrijven in actielijst
locale: Taal
date_format: Datum formaat
title_date_format: Datum formaat in titel
errors:
messages:
greater_than_or_equal_to: moet groter of gelijk zijn aan %{count}
@ -216,7 +202,7 @@ nl:
body: Er waren problemen met de volgende velden
header:
one: 1 fout voorkomt het kunnen bewaren van deze %{model}
other: "%{count} fout voorkomen dat dit %{model} bewaard kan worden"
other: "%{count} fouten voorkomen dat dit %{model} bewaard kan worden"
full_messages:
format: "%{attribute} %{message}"
stats:
@ -237,7 +223,6 @@ nl:
weeks: Looptijd van een actie (weken). Klik op een balk voor meer info
totals_action_count: u heeft een totaal van %{count} acties
totals_deferred_actions: waarvan %{count} uitgestelde acties in de tickler zijn
top10_longrunning: Top 10 langstlopende projecten
legend:
number_of_days: Aantal dagen geleden
actions: Acties
@ -246,12 +231,13 @@ nl:
running_time: Looptijd van een actie (weken)
percentage: Percentage
months_ago: Maanden geleden
top10_longrunning: Top 10 langstlopende projecten
top5_contexts: Top 5 contexten
actions_lastyear_title: Acties in de afgelopen 12 maanden
totals_actions_completed: "%{count} van deze zijn voltooid."
totals_incomplete_actions: U heeft %{count} onvolledige acties
totals_unique_tags: Van deze tags zijn %{count} uniek.
actions_avg_completed_30days: en voltooide een gemiddelde van %{count} acties per dag.
top5_contexts: Top 5 contexten
totals_visible_context_count: Van deze zijn %{count} zichtbare contexten
totals_blocked_actions: "%{count} zijn afhankelijk van de voltooiing van hun acties."
action_completion_time_title: Doorlooptijd (alle voltooide acties)
@ -263,6 +249,7 @@ nl:
totals_project_count: U heeft %{count} projecten.
tags: Tags
actions_min_max_completion_days: De max-/minimum dagen tot voltooiing is %{min}/%{max}.
tag_cloud_90days_description: Deze tag cloud bevat tags van acties die zijn gemaakt of voltooid in de afgelopen 90 dagen.
running_time_all: Huidige looptijd van alle onvolledige acties
totals_tag_count: U heeft %{count} tags geplaatst op acties.
time_of_day: Tijd van de dag (alle acties)
@ -272,26 +259,24 @@ nl:
top5_visible_contexts_with_incomplete_actions: Top 5 zichtbare contexten met onvolledige acties
actions_further: en verder
tod30: Tijd van de dag (laatste 30 dagen)
tag_cloud_90days_description: Deze tag cloud bevat tags van acties die zijn gemaakt of voltooid in de afgelopen 90 dagen.
totals_completed_project_count: en %{count} zijn afgeronde projecten.
click_to_return: Klik %{link} om terug te keren naar de statistieken pagina.
top10_projects_30days: Top 10 project in de laatste 30 dagen
actions_selected_from_week: Gekozen acties van week
top10_projects: Top 10 projecten
spread_of_running_actions_for_visible_contexts: Verdeling van actieve acties voor zichtbare contexten
spread_of_actions_for_all_context: Verdeling van acties voor alle contexten
actions_avg_created: In de afgelopen 12 maanden heeft u gemiddeld% {count} acties aangemaakt
actions_avg_created: In de afgelopen 12 maanden heeft u gemiddeld%{count} acties aangemaakt
click_to_show_actions_from_week: Klik %{link} om de acties van week %{week} en verder te zien.
other_actions_label: (anderen)
totals_completed_project_count: en %{count} zijn afgeronde projecten.
totals: Totalen
time_of_day_legend:
number_of_actions: Aantal acties
time_of_day: Tijd van de dag
click_to_return_link: hier
totals_hidden_context_count: en %{count} zijn verborgen contexten.
actions_avg_completed: en voltooide een gemiddelde van %{count} acties per maand.
totals: Totalen
no_actions_selected: Er zijn geen acties geselecteerd.
click_to_update_actions: Klik op een balk in de grafiek op de acties hieronder aan te passen.
labels:
month_avg_completed: "%{months} gem afgerond per maand"
completed: Afgerond
@ -299,45 +284,47 @@ nl:
avg_created: Gem gemaakt
avg_completed: Gem afgerond
created: Gemaakt
click_to_update_actions: Klik op een balk in de grafiek op de acties hieronder aan te passen.
running_time_all_legend:
actions: Acties
running_time: Looptijd van een actie (weken). Klik op een balk voor meer info
percentage: Percentage
actions_actions_avg_created_30days: In de afgelopen 30 dagen heeft u gemiddeld% {count} acties gemaakt
action_selection_title: "TRACKS:: Actie selectie"
actions_actions_avg_created_30days: In de afgelopen 30 dagen heeft u gemiddeld %{count} acties gemaakt
tod30_legend:
number_of_actions: Aantal acties
time_of_day: Tijd van de dag
action_selection_title: "TRACKS:: Actie selectie"
todos:
recurring_action_deleted: Actie werd verwijderd. Omdat deze actie herhalend is. werd een nieuwe actie toegevoegd
show_from: Toon vanaf
error_starring_recurring: Kon niet de ster van deze terugkerende actie niet omgezetten \'%{description}\'
recurring_action_deleted: Actie werd verwijderd. Omdat deze actie herhalend is. werd een nieuwe actie toegevoegd
completed_actions: Voltooide acties
completed_recurring: Afgesloten terugkerende todos
added_new_next_action: Nieuwe actie toegevoegd
completed_recurring: Afgesloten terugkerende todos
blocked_by: Geblokkeerd door %{predecessors}
star_action: Markeer deze actie met een ster
completed_recurrence_completed: Er is geen actie na de terugkerende actie die u new verwijderd heeft. De herhaling is voltooid
defer_date_after_due_date: Uitsteldatum is na de vervaldag. Gelieve vervaldag bewerken alvorens uitstedatuml aan te passen.
defer_date_after_due_date: Uitsteldatum is na de vervaldag. Gelieve vervaldag bewerken alvorens uitsteldatum aan te passen.
unable_to_add_dependency: Niet in staat om de afhankelijkheid toe te voegen
done: Voltooid?
star_action_with_description: markeer de actie'%{description}' met een ster
star_action_with_description: markeer de actie '%{description}' met een ster
tagged_with: gelabeld met &lsquo;%{tag_name}&rsquo;
completed: Afgerond
no_deferred_actions_with: Geen uitgestelde acties met de tag '%{tag_name}'
no_hidden_actions: Momenteel zijn er geen verborgen acties gevonden
action_due_on: (deadline actie op %{date})
edit_action_with_description: Bewerk de actie '%{description}'
action_due_on: (deadline actie op %{date})
archived_tasks_title: "TRACKS:: Gearchiveerde voltooide taken"
remove_dependency: Verwijder afhankelijkheid (zal niet de actie zelf verwijderen)
list_incomplete_next_actions: Toon onvoltooide acties
action_deleted_success: Actie succesvol verwijderd
tags: Tags (gescheiden door komma's)
new_related_todo_created: Een nieuwe actie is toegevoegd, die behoort bij deze terugkerende todo
context_changed: Context veranderd in %{name}
action_deleted_success: Actie succesvol verwijderd
mobile_todos_page_title: Alle acties
new_related_todo_created: Een nieuwe actie is toegevoegd, die behoort bij deze terugkerende todo
context_changed: Context veranderd in '%{name}'
add_another_dependency: Nog een afhankelijkheid toevoegen
delete_recurring_action_title: Verwijder de terugkerende actie
removed_predecessor: "%{succesor} is verwijderd als afhankelijkheid van %{predecessor}."
removed_predecessor: "'%{successor}' is verwijderd als afhankelijkheid van '%{predecessor}'."
recurring_actions_title: TRACKS::Terugkerende acties
next_action_needed: U dient ten minste een actie in te vullen
action_saved: Actie opgeslagen
@ -346,35 +333,38 @@ nl:
edit_action: Actie bewerken
added_new_context: Nieuwe context toegevoegd
next_actions_description: "Filter:"
older_completed_items: Oudere voltooide items
list_incomplete_next_actions_with_limit: Toont de laatste %{count} onvoltooide acties
set_to_pending: "%{task} als wachtend ingesteld"
set_to_pending: "'%{task}' als wachtend ingesteld"
added_new_project: Nieuw project toegevoegd
next_actions_title_additions:
completed: acties voltooid
due_today: deadline vandaag
due_within_a_week: deadline binnen een week
older_completed_items: Oudere voltooide items
task_list_title: TRACKS::Toon acties
append_in_this_project: in dit project
error_deleting_item: Er is een fout opgetreden bij het verwijderen van het item '%{description}'
task_list_title: TRACKS::Toon acties
no_actions_due_this_week: Geen acties met deadline in rest van deze week
no_recurring_todos: Momenteel zijn er geen terugkerende acties
error_completing_todo: Er was een fout bij het voltooien / activeren van de terugkerende actie '%{description}'
convert_to_project: Maak project
no_deferred_pending_actions: Momenteel zijn er geen uitgestelde of in wachtende acties
completed_last_day: Voltooid in de laatste 24 uur
no_deferred_pending_actions: Momenteel zijn er geen uitgestelde of wachtende acties
delete_recurring_action_confirm: Weet u zeker dat u wilt de terugkerende actie '%{description}' wilt verwijderen?
show_in_days: Toon over %{days} dagen
completed_last_day: Voltooid in de laatste 24 uur
error_saving_recurring: Er is een fout opgetreden het opslaan van de terugkerende actie '%{description}'
no_project: -- Geen project --
show_in_days: Toon over %{days} dagen
completed_more_than_x_days_ago: Voltooid meer dan %{count} dagen geleden
new_related_todo_created_short: een nieuwe actie gemaakt
feed_title_in_context: in context '%{context}'
older_than_days: Ouder dan %{count} dagen
edit: Bewerken
pending: Wachtend
completed_actions_with: Afgeronde acties met de tag %{tag_name}
clear_due_date: Maak deadline leeg
deleted_success: De actie werd met succes verwijderd.
completed_tasks_title: TRACKS::Voltooide taken
feed_title_in_project: In het project '%{project}'
clear_due_date: Maak deadline leeg
error_removing_dependency: Er is een fout opgetreden het verwijderen van de afhankelijke actie
hidden_actions: Verborgen acties
was_due_on_date: had deadline op %{date}
@ -391,14 +381,15 @@ nl:
calendar_page_title: TRACKS::Agenda
in_hidden_state: in verborgen toestand
show_today: Toon vandaag
no_actions_found_title: Geen acties gevonden
completed_last_x_days: Voltooid in de laatste %{count} dagen
no_actions_with: Momenteel zijn er geen onvoltooide acties met de tag '%{tag_name}'
defer_x_days:
one: Een dag uitstellen
other: "%{count} dagen uitstellen"
no_actions_with: Momenteel zijn er geen onvoltooide acties met de tag '%{tag_name}'
added_new_next_action_singular: Nieuwe actie toegevoegd
no_completed_actions: Momenteel zijn er geen voltooide acties.
deferred_pending_actions: Uitgestelde/wachtende van acties
deferred_pending_actions: Uitgestelde/wachtende acties
has_x_pending:
one: Heeft een wachtende actie
other: Heeft %{count} wachtende acties
@ -419,6 +410,7 @@ nl:
one: U heeft een actie tot nu toe vandaag voltooid.
other: U heeft %{count} acties tot nu toe vandaag voltooid.
added_new_next_action_plural: Nieuwe acties toegevoegd
new_related_todo_not_created_short: een nieuwe actie is niet gemaakt
error_starring: Kon niet de ster van deze actie niet omzetten \'%{description}\'
show_tomorrow: Toon morgen
calendar:
@ -433,9 +425,9 @@ nl:
due_this_month: Deadline in rest van %{month}
no_actions_due_this_month: Geen acties met deadline in de rest van deze maand
recurrence:
ends_on_number_times: Eindigt na %{number} keer
ends_on_date: Eindigt op %{date}
every_work_day: Elke werkdag
ends_on_number_times: Eindigt na %{number} keer
recurrence_on_due_date: de datum dat deadline van de actie is
weekly_options: Instellingen voor de wekelijkse terugkerende acties
monthly_options: Instellingen voor maandelijks terugkerende acties
@ -443,43 +435,43 @@ nl:
monthly: Maandelijks
starts_on: Begint op
daily_options: Instellingen voor dagelijks terugkerende acties
daily: Dagelijks
show_option_always: altijd
daily: Dagelijks
yearly_every_x_day: Elke %{month} %{day}
recurrence_on_options: Stel herhaling in op
daily_every_number_day: Elke %{number} dag(en)
ends_on: Eindigt op
weekly_every_number_week: Herhaalt elke %{number} weken op
ends_on: Eindigt op
show_options: Toon de actie
yearly_options: Instellingen voor jaarlijks terugkerende acties
yearly_every_xth_day: De %{day} %{day_of_week} van %{month}
show_days_before: "%{days} dagen v\xC3\xB3\xC3\xB3r de deadline van actie"
yearly_every_xth_day: De %{day} %{day_of_week} van %{month}
from_tickler: de datum dat de actie uit de tickler komt (geen deadline ingesteld)
no_end_date: Geen einddatum
day_x_on_every_x_month: Dag %{dag} op elke %{month} maand
day_x_on_every_x_month: Dag %{day} op elke %{month} maand
yearly: Jaarlijks
monthly_every_xth_day: De %{dag} %{day_of_week} van elke %{month} maand
monthly_every_xth_day: De %{day} %{day_of_week} van elke %{month} maand
tagged_page_title: TRACKS::Tagged met '%{tag_name}'
no_completed_recurring: Momenteel zijn er geen voltooide terugkerende acties
added_dependency: "%{dependency} als afhankelijkheid toegevoegd."
no_deferred_actions: Momenteel zijn er geen uitgestelde acties.
recurrence_completed: Er is geen volgende actie na de terugkerende actie die u zojuist hebt voltooid. De herhaling is voltooid
no_actions_found: Geen acties gevonden
no_actions_found: Momenteel zijn er geen onafgeronde acties.
in_pending_state: in wachtende toestand
due: Deadline
action_marked_complete_error: De actie <strong>'%{description}'</strong> is niet gemarkeerd als <strong>%{completed} vanwege een fout op de server.</strong>
add_new_recurring: Voeg een nieuwe terugkerende actie toe
next_actions_description_additions:
completed: in de afgelopen %{count} dagen
due_date: met een deadline %{due_date} of eerder
depends_on_separate_with_commas: Afhankelijk van (gescheiden door komma's)
recurring_action_saved: Terugkerende actie opgeslagen
action_saved_to_tickler: Actie opgeslagen in tickler
recurring_action_saved: Terugkerende actie opgeslagen
completed_in_archive:
one: Er is een voltooide actie in het archief.
other: Er zijn %{count} afgeronde acties in het archief.
to_tickler: naar tickler
next_actions_description_additions:
completed: in de afgelopen %{count} dagen
due_date: met een deadline %{due_date} of eerder
overdue: Achterstallig
add_new_recurring: Voeg een nieuwe terugkerende actie toe
no_incomplete_actions: Er zijn geen onvoltooide acties
notes:
delete_note_title: Verwijder de notitie '%{id}'
@ -490,8 +482,8 @@ nl:
show_note_title: Toon notitie
note_location_link: "In:"
edit_item_title: Item bewerken
no_notes_available: "Momenteel zijn er geen notities: voeg notities toe aan projecten vanaf de individuele project pagina's."
note_header: Notitie %{id}
no_notes_available: "Momenteel zijn er geen notities: voeg notities toe aan projecten vanaf de individuele project pagina's."
delete_note_confirm: Weet u zeker dat u de notitie '%{id}' wilt verwijderen?
errors:
user_unauthorized: "401 Unauthorized: Alleen administratieve gebruikers mogen deze functie gebruiken."
@ -513,8 +505,8 @@ nl:
long: "%A, %d. %B %Y, %H:%M"
pm: middag
preferences:
open_id_url: Uw OpenID URL is
staleness_starts_after: Ophopen begint na %{days} dagen
open_id_url: Uw OpenID URL is
change_identity_url: Verander uw Identity URL
page_title: "TRACKS:: Voorkeuren"
change_password: Wijzig uw wachtwoord
@ -526,54 +518,65 @@ nl:
generate_new_token: Genereer een nieuwe token
sms_context_none: Geen
token_header: Uw token
change_authentication_type: Verander uw authenticatietype
authentication_header: Uw authenticatie
current_authentication_type: Uw authenticatietype is %{auth_type}
change_authentication_type: Verander uw authenticatietype
generate_new_token_confirm: Weet u dit zeker? Het genereren van een nieuw token zal de bestaande te vervangen en dit zal het extern gebruiken van de oude token laten mislukken.
projects:
no_actions_in_project: Momenteel zijn er geen onafgeronde acties in dit project
default_tags_removed_notice: De standaard tags zijn verwijderd
was_marked_hidden: is gemarkeerd als verborgen
default_context_set: Stel project standaard context in op %{default_context}
deferred_actions: Uitgestelde acties voor dit project
edit_project_title: Bewerk project
default_tags_removed_notice: De standaard tags zijn verwijderd
page_title: "TRACKS:: Project: %{project}"
hide_form: Verberg formulier
deferred_actions_empty: Er zijn geen uitgestelde acties voor dit project
project_state: Project is %{state}.
show_form_title: Maak een nieuw project
to_new_project_page: Ga naar de nieuwe projectpagina
this_project: Dit project
no_notes_attached: Momenteel zijn er geen notities toegevoegd aan dit project
notes: Notities
todos_append: in dit project
notes_empty: Er zijn geen notities voor dit project
no_projects: Momenteel zijn er geen projecten
hide_form_title: Verberg nieuw project formulier
completed_actions_empty: Er zijn nog geen afgeronde acties voor dit project
delete_project: Project verwijderen
with_no_default_context: zonder standaard context
completed_actions_empty: Er zijn nog geen afgeronde acties voor dit project
actions_in_project_title: Acties in dit project
with_default_context: met een standaard context '%{context_name}'
show_form: Toevoegen van een project
delete_project_confirmation: Weet u zeker dat u wilt het project '%{naam} wilt verwijderen?
delete_project_confirmation: Weet u zeker dat u wilt het project '%{name} wilt verwijderen?
with_default_tags: en met '%{tags}' als de standaard tags
set_default_tags_notice: Stel project standaard tags in op %{default_tags}
add_note: Een notitie toevoegen
project_saved_status: Project opgeslagen
settings: Instellingen
completed_projects: Voltooide projecten
list_projects: "TRACKS:: Overizcht van projecten"
list_projects: "TRACKS:: Overzicht van projecten"
is_active: is actief
add_project: Voeg project toe
hidden_projects: Verborgen projecten
delete_project_title: Verwijder het project
hidden_projects: Verborgen projecten
default_context_removed: Standaard context verwijderd
completed_actions: Afgeronde acties voor dit project
add_note_submit: Notitie toevoegen
was_marked_complete: is gemarkeerd als voltooid
default_context: De standaard context voor dit project is %{context}
status_project_name_changed: Naam van het project werd gewijzigd
no_default_context: Dit project heeft geen standaard context
with_no_default_tags: en zonder standaard tags
edit_project_settings: Bewerk project instellingen
active_projects: Actieve projecten
state: Dit project is %{state}
default_context: De standaard context voor dit project is %{context}
date:
month_names:
-
date:
month_names:
-
- Januari
- Februari
- Maar
- Maart
- April
- Mei
- Juni
@ -583,11 +586,7 @@ nl:
- Oktober
- November
- December
order:
- :day
- :month
- :year
abbr_day_names:
abbr_day_names:
- Zo
- Ma
- Di
@ -595,12 +594,16 @@ nl:
- Do
- Vr
- Za
formats:
order:
- :day
- :month
- :year
formats:
only_day: "%e"
default: "%d-%m-%Y"
short: "%e %b"
long: "%e %B %Y"
day_names:
day_names:
- Zondag
- Maandag
- Dinsdag
@ -608,8 +611,8 @@ nl:
- Donderdag
- Vrijdag
- Zaterdag
abbr_month_names:
-
abbr_month_names:
-
- Jan
- Feb
- Maa
@ -629,12 +632,14 @@ nl:
two_words_connector: en
select:
prompt: Selecteer
footer:
send_feedback: Stuur reactie op %{version}
shared:
multiple_next_actions: Meerdere acties (een op elke regel)
toggle_single: Voeg een actie toe
hide_form: Verberg formulier
add_actions: Toevoegen acties
add_action: Actie toevoegen
add_actions: Toevoegen acties
tags_for_all_actions: Tags voor alle acties (scheiden met een komma)
toggle_multi: Voeg meerdere acties toe
toggle_single_title: Voeg een nieuwe actie toe
@ -643,14 +648,43 @@ nl:
separate_tags_with_commas: gescheiden door komma's
toggle_multi_title: Toggle single / multi actie formulier
hide_action_form_title: Verberg nieuwe actie formulier
dates:
month_names:
- Januari
- Februari
- Maart
- April
- Mei
- Juni
- Juli
- Augustus
- September
- Oktober
- November
- December
day_names:
- Zondag
- Maandag
- Dinsdag
- Woensdag
- Donderdag
- Vrijdag
- Zaterdag
sidebar:
list_name_active_contexts: Actieve contexten
list_name_active_projects: Actieve projecten
list_empty: Geen
list_name_completed_projects: Voltooide projecten
list_name_hidden_projects: Verborgen projecten
list_name_hidden_contexts: Verborgen contexten
users:
openid_url_verified: Je hebt %{url} met succes geverifieerd als je identiteit en uw authenticatie type OpenID opgeslagen.
destroy_successful: Gebruiker %{login} met succes verwijderd
auth_type_update_error: "Er was een probleem met het bijwerken van uw authenticatietype: %{error_messages}"
total_contexts: Totaal aantal contexten
first_user_heading: "Welkom bij TRACKS. Om te beginnen, maak dan een admin account:"
successfully_deleted_user: Succesvol gebruiker %{username} verwijderd
failed_to_delete_user: Mislukt de gebruiker %{username} te verwijderen
openid_url_verified: Je hebt %{url} met succes geverifieerd als je identiteit en uw authenticatie type OpenID opgeslagen.
destroy_successful: Gebruiker %{login} met succes verwijderd
total_projects: Totaal aantal projecten
signup_successful: Aanmelding succesvol voor gebruiker %{username}.
new_token_generated: Nieuwe token met succes gegenereerd
@ -658,20 +692,20 @@ nl:
user_created: Gebruiker aangemaakt.
change_password_submit: Wachtwoord wijzigen
account_signup: Aanmelden voor een account
manage_users: Beheren gebruikers
password_updated: Wachtwoord bijgewerkt.
manage_users: Beheren gebruikers
signup: Aanmelden
confirm_password: Bevestig wachtwoord
new_user_heading: "Registreer een nieuwe gebruiker:"
auth_type_updated: Authenticatietype bijgewerkt.
total_actions: Totaal aanal acties
desired_login: Gewenste login
confirm_password: Bevestig wachtwoord
new_user_heading: "Registreer een nieuwe gebruiker:"
change_password_title: TRACKS::Wachtwoord wijzigen
change_auth_type_title: TRACKS::Wijzig authenticatietype
change_password_prompt: Voer uw nieuwe wachtwoord in de onderstaande velden in en kies 'Wachtwoord wijzigen' om uw huidige wachtwoord met uw nieuwe te vervangen.
password_confirmation_label: Bevestig wachtwoord
destroy_error: Er is een fout opgetreden bij het verwijderen van de gebruiker '%{login}'
choose_password: Kies een wachtwoord
change_password_title: TRACKS::Wachtwoord wijzigen
change_auth_type_title: TRACKS::Wijzig authenticatietype
change_password_prompt: Voer uw nieuwe wachtwoord in de onderstaande velden in en kies 'Wachtwoord wijzigen' om uw huidige wachtwoord met uw nieuwe te vervangen.
label_auth_type: Authenticatietype
new_password_label: Nieuw wachtwoord
register_with_cas: Met uw CAS gebruikersnaam
@ -680,43 +714,12 @@ nl:
new_user_title: "TRACKS:: Aanmelden als de admin gebruiker"
destroy_confirmation: "Waarschuwing: dit zal de gebruiker '%{login} verwijderen met al zijn acties, contexten, projecten en notities. Weet u zeker dat u wilt doorgaan?"
signup_new_user: Registreer nieuwe gebruiker
identity_url: Identiteit URL
openid_ok_pref_failed: Je hebt succesvol de %{url} geverifieerd als je identiteit, maar er was een probleem met het opslaan van uw authenticatie voorkeuren.
auth_change_submit: Wijzigen authenticatietype
change_authentication_type: Wijzigen authenticatietype
select_authentication_type: Selecteer uw nieuwe authenticatie type en klik op 'Wijzigen authenticatietype' om uw huidige instellingen te vervangen.
identity_url: Identiteit URL
auth_change_submit: Wijzigen authenticatietype
openid_ok_pref_failed: Je hebt succesvol de %{url} geverifieerd als je identiteit, maar er was een probleem met het opslaan van uw authenticatie voorkeuren.
total_notes: Totaal aantal notities
feedlist:
actions_due_today: Acties die vandaag of eerder af moeten
choose_context: Kies de context waar je een feed van wilt
rss_feed: RSS Feed
ical_feed: iCal feed
legend: Legenda
all_contexts: Alle contexten
all_projects: Alle projecten
choose_project: Kies het project waar je een feed van wilt
active_projects_wo_next: Actieve projecten zonder acties
project_needed: "Er moet ten minste \xC3\xA9\xC3\xA9n project zijn voor een feed opgevraagd kan worden"
select_feed_for_project: Kies de feed voor dit project
active_starred_actions: Alle gesterde, actieve acties
context_needed: "Er moet eerst ten minste \xC3\xA9\xC3\xA9n context zijn voor je een feed kan opvragen"
select_feed_for_context: Kies de feed voor deze context
projects_and_actions: Actieve projecten met hun acties
actions_due_next_week: Acties die binnen 7 dagen afgerond moeten
notice_incomplete_only: "Merk op: alle feeds laten alleen acties zien die niet afgerond zijn, tenzij anders vermeld."
last_fixed_number: Laatste %{number} acties
all_actions: Alle acties
actions_completed_last_week: Acties afgerond in de afgelopen 7 dagen
context_centric_actions: Feeds voor onafgeronde acties in een specifieke context
plain_text_feed: Reguliere tekst feed
project_centric: Feeds voor onafgeronde acties in een specifiek project
sidebar:
list_name_active_contexts: Actieve contexten
list_name_active_projects: Actieve projecten
list_empty: Geen
list_name_completed_projects: Voltooide projecten
list_name_hidden_projects: Verborgen projecten
list_name_hidden_contexts: Verborgen contexten
select_authentication_type: Selecteer uw nieuwe authenticatie type en klik op 'Wijzigen authenticatietype' om uw huidige instellingen te vervangen.
contexts:
delete_context_title: Verwijder context
hide_form: Verberg formulier
@ -728,20 +731,44 @@ nl:
hidden_contexts: Verborgen contexten
no_contexts_active: Momenteel zijn er geen actieve contexten
context_hide: Verberg van de start pagina?
visible_contexts: Zichtbare contexten
save_status_message: Context bewaard
show_form: Maak een nieuwe context
add_context: Context toevoegen
visible_contexts: Zichtbare contexten
update_status_message: Naam van de context was veranderd
context_name: Context naam
new_context_post: "' zal ook gemaakt worden. Weet u dit zeker?"
update_status_message: Naam van de context was veranderd
status_active: Context is actief
new_context_post: "' zal ook gemaakt worden. Weet u dit zeker?"
context_deleted: De context '%{name}' is verwijderd
no_contexts_hidden: Momenteel zijn er geen verborgen contexten
new_context_pre: Nieuwe context '
no_actions: Momenteel zijn er geen onafgeronde acties in deze context
last_completed_in_context: in deze context (laatste %{number})
context_deleted: De context '%{name}' is verwijderd
no_contexts_hidden: Momenteel zijn er geen verborgen contexten
status_hidden: Context is verborgen
feedlist:
actions_due_today: Acties die vandaag of eerder af moeten
choose_context: Kies de context waar je een feed van wilt
ical_feed: iCal feed
all_contexts: Alle contexten
rss_feed: RSS Feed
legend: Legenda
all_projects: Alle projecten
choose_project: Kies het project waar je een feed van wilt
project_needed: "Er moet ten minste \xC3\xA9\xC3\xA9n project zijn voor een feed opgevraagd kan worden"
select_feed_for_project: Kies de feed voor dit project
active_projects_wo_next: Actieve projecten zonder acties
active_starred_actions: Alle gesterde, actieve acties
context_needed: "Er moet eerst ten minste \xC3\xA9\xC3\xA9n context zijn voor je een feed kan opvragen"
select_feed_for_context: Kies de feed voor deze context
projects_and_actions: Actieve projecten met hun acties
actions_due_next_week: Acties die binnen 7 dagen afgerond moeten
notice_incomplete_only: "Merk op: alle feeds laten alleen acties zien die niet afgerond zijn, tenzij anders vermeld."
context_centric_actions: Feeds voor onafgeronde acties in een specifieke context
plain_text_feed: Reguliere tekst feed
last_fixed_number: Laatste %{number} acties
all_actions: Alle acties
actions_completed_last_week: Acties afgerond in de afgelopen 7 dagen
project_centric: Feeds voor onafgeronde acties in een specifiek project
datetime:
prompts:
minute: Minuut
@ -788,34 +815,34 @@ nl:
other: over %{count} jaren
half_a_minute: halve minuut
login:
sign_in: Meld aan
openid_identity_url_not_found: Sorry, geen gebruiker met die identiteit URL bestaat (% {identity_url})
login_cas: Ga naar het CAS
user_no_expiry: Blijf ingelogd
cas_logged_in_greeting: Hallo, % {username}! U bent geauthenticeerd.
cas_no_user_found: Hallo,% {username}! Je hebt nog geen account op Tracks.
cas_login: CAS Inloggen
login_cas: Ga naar het CAS
sign_in: Meld aan
openid_identity_url_not_found: Sorry, geen gebruiker met die identiteit URL bestaat (%{identity_url})
successful_with_session_info: "Login succesvol:"
please_login: Log in om Tracks te gebruiken
cas_username_not_found: Sorry, geen gebruiker met die CAS gebruikersnaam bestaat (% {username})
cas_create_account: Als u willen vragen ga hier om %{signup_link}
cas_logged_in_greeting: Hallo, %{username}! U bent geauthenticeerd.
cas_no_user_found: Hallo,%{username}! Je hebt nog geen account op Tracks.
cas_login: CAS Inloggen
cas_username_not_found: Sorry, geen gebruiker met die CAS gebruikersnaam bestaat (%{username})
mobile_use_openid: ... if inloggen met een OpenID
cas_create_account: Als u willen vragen ga hier om %{signup_link}
account_login: Account login
cas_signup_link: Aanvragen account
successful: Succesvol aangemeld. Welkom terug!
session_will_not_expire: sessie zal niet verlopen.
session_time_out: Sessie is verlopen. Gelieve % {link}
successful: Succesvol aangemeld. Welkom terug!
session_will_expire: sessie zal verlopen na %{hours} u(u)r(en) van inactiviteit.
option_separator: of,
session_time_out: Sessie is verlopen. Gelieve %{link}
login_standard: Ga terug naar de standaard login
log_in_again: opnieuw in te loggen.
logged_out: Je bent afgemeld bij Tracks.
login_with_openid: inloggen met een OpenID
unsuccessful: Login mislukt.
log_in_again: log opnieuw in.
logged_out: Je bent afgemeld bij Tracks.
search:
contexts_matching_query: Contexten passend bij zoekopdracht
tags_matching_query: Tags passend bij zoekopdracht
no_results: Uw zoekopdracht heeft geen resultaten opgeleverd.
todos_matching_query: Todos passend bij zoekopdracht
projects_matching_query: Projecten passend bij zoekopdracht
notes_matching_query: Notities passend bij zoekopdracht
no_results: Uw zoekopdracht heeft geen resultaten opgeleverd.

View file

@ -1,57 +0,0 @@
-- Dump of table contents
-- Sample data to populate your database
-- No data is included for users: create your own users via the http://YOURURL/signup page
-- Dump of table contexts
-- ------------------------------------------------------------
INSERT INTO "contexts" VALUES(1,'agenda',1,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
INSERT INTO "contexts" VALUES(2,'call',2,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
INSERT INTO "contexts" VALUES(3,'email',3,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
INSERT INTO "contexts" VALUES(4,'errand',4,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
INSERT INTO "contexts" VALUES(5,'lab',5,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
INSERT INTO "contexts" VALUES(6,'library',6,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
INSERT INTO "contexts" VALUES(7,'freetime',7,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
INSERT INTO "contexts" VALUES(8,'office',8,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
INSERT INTO "contexts" VALUES(9,'waiting for',9,'f',1,'2008-02-25 20:21:09','2008-03-24 19:23:53');
-- Dump of table notes
-- ------------------------------------------------------------
INSERT INTO "notes" VALUES(1,1,1,'Need to collect a catalogue from Time Machines R Us','2006-06-10 14:36:02','2006-06-10 14:36:02');
INSERT INTO "notes" VALUES(2,1,1,'Should I go for a swirly effect or a whooshy one?','2006-06-10 14:36:02','2006-06-10 14:36:02');
-- Dump of table projects
-- ------------------------------------------------------------
INSERT INTO "projects" VALUES(1,'Build a working time machine',1,1,'','active','2008-02-25 20:21:09','2008-03-24 19:23:53',NULL,NULL);
INSERT INTO "projects" VALUES(2,'Make more money than Billy Gates',2,1,'','active','2008-02-25 20:21:09','2008-03-24 19:23:53',NULL,NULL);
INSERT INTO "projects" VALUES(3,'Evict dinosaurs from the garden',3,1,'','active','2008-02-25 20:21:09','2008-03-24 19:23:53',NULL,NULL);
-- Dump of table schema_info
-- ------------------------------------------------------------
INSERT INTO "schema_migrations" VALUES('44');
-- Dump of table todos
-- ------------------------------------------------------------
INSERT INTO "todos" VALUES(1,1,2,'Call Bill Gates to find out how much he makes per day',NULL,'2006-06-03 14:36:02','2006-06-23 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-03 14:36:02');
INSERT INTO "todos" VALUES(2,2,3,'Call dinosaur exterminator','Ask him if I need to hire a skip for the corpses.','2006-06-10 14:36:02','2006-06-23 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(3,4,NULL,'Buy milk',NULL,'2006-06-10 14:36:02',NULL,NULL,1,NULL,'completed',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(4,4,NULL,'Buy bread',NULL,'2006-06-10 14:36:02',NULL,NULL,1,NULL,'completed',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(5,5,1,'Construct time dilation device',NULL,'2006-06-10 14:36:02',NULL,NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(6,2,1,'Phone Grandfather to ask about the paradox','Added some _notes_.','2006-06-10 14:36:02','2006-06-02 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(7,6,3,'Get a book out of the library','Dinosaurs''R','2006-06-10 14:36:02',NULL,NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(8,4,NULL,'Upgrade to Rails 0.9.1',NULL,'2006-06-10 14:36:02','2006-06-09 23:00:00',NULL,1,NULL,'completed',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(9,1,NULL,'This should be due today',NULL,'2006-06-10 14:36:02','2006-06-09 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(10,1,NULL,'foo',NULL,'2006-06-10 14:36:02','2005-01-05 00:00:00',NULL,1,NULL,'completed',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(11,1,2,'Buy shares',NULL,'2006-06-10 14:36:02','2005-02-01 00:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(12,1,3,'Buy stegosaurus bait',NULL,'2006-06-10 14:36:02','2006-06-16 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(13,1,3,'New action in context','Some notes','2006-06-10 14:36:02','2006-06-16 23:00:00',NULL,1,NULL,'active',NULL,'2006-06-10 14:36:02');
INSERT INTO "todos" VALUES(14,2,2,'Call stock broker','tel: 12345','2006-06-03 14:36:02',NULL,NULL,1,NULL,'active',NULL,'2006-06-03 14:36:02');

View file

@ -9,16 +9,22 @@
* Mailing list: http://lists.rousette.org.uk/mailman/listinfo/tracks-discuss
* Original developer: bsag (http://www.rousette.org.uk/)
* Contributors: http://getontracks.org/wiki/Contributors
* Version: 2.0RC1
* Copyright: (cc) 2004-2010 rousette.org.uk.
* Version: 2.0devel
* Copyright: (cc) 2004-2011 rousette.org.uk.
* License: GNU GPL
== Version 2.0 (RC)
(RC1 was never release, but was mentioned in the DOCS for while. People are
referencing RC1 with bug report. So for the release we've bumped the version
to RC2)
New features:
1. Redesign of menus and introduction of a context menu per todo
2. You can now set the default tags for a project which are added automatically to a new todo in that project if no tags are supplied
3. Tracks now includes support of dependencies. Making an action dependent on another action will hide it until the dependency is completed
2. You can now set the default tags for a project which are added automatically
to a new todo in that project if no tags are supplied
3. Tracks now includes support of dependencies. Making an action dependent on
another action will hide it until the dependency is completed
4. you can now drag an action from one context to another
5. Support for entering multiple actions in one form
6. You can now promote an action to a project
@ -26,16 +32,21 @@ New features:
8. The project description supports markup
9. support for Mail.app (message://) and OneNote (onenote://) links in notes
10.The email receiver is now able to receive email from several email adresses.
In site.yml this could be set to the previous behavior (receive from one address per user)
In site.yml this could be set to the previous behavior (receive from one
address per user)
11.You can enable open signup (like in tracks.tra.in)
12.Cleanup of context page
13.Support for CAS for login
14.Support for adding Tracks as a GMail Widget with instructions on the Integrations page
14.Support for adding Tracks as a GMail Widget with instructions on the
Integrations page
15.Tracks now support internationalization. First translations are German and
Dutch. See http://www.getontracks.org/wiki/Translating-Tracks it you like to
help translating Tracks to other languages
Under the hood
1. All js is migrated to jQuery and most ui-widgets are migrated to jQuery-UI
2. Cucumber is added for integration testing. The RSpec stories are migrated to cucumber
3. Upgraded to rails 2.3.5 (newer versions unfortunately conflict with cucumber)
3. Upgraded to rails 2.3.11 and upgraded most gems/plugins
3. Bugfixes (lots of them)
== Version 1.7

View file

@ -36,7 +36,7 @@ If you want to run tests using another database, that's fine, too. Just change y
This testing style is deprecated and are being moved over to Selenium via Cucumber.
See the wiki for more information to run the tests that are not yet migrated
See the wiki for more information to run the tests that are not yet migrated: http://www.getontracks.org/wiki/Testing
6. RSPEC tests

View file

@ -1,5 +1,7 @@
require 'activeresource'
# WARNING: this is not really maintained or tested...
# Install the ActiveResource gem if you don't already have it:
#
# sudo gem install activeresource --source http://gems.rubyonrails.org --include-dependencies

View file

@ -1,4 +1,4 @@
Feature: dependencies
Feature: Show all due actions in a calendar view
As a Tracks user
In order to keep overview of my due todos
I want to manage due todos in a calendar view
@ -8,12 +8,50 @@ Feature: dependencies
| login | password | is_admin |
| testuser | secret | false |
And I have logged in as "testuser" with password "secret"
And I have a context called "@calendar"
@selenium
Scenario: Setting due date of a todo will show it in the calendar
Given this is a pending scenario
When I submit a new action with description "a new next action" in the context "@calendar"
And I go to the calendar page
Then the badge should show 0
And I should not see "a new next action"
When I go to the home page
And I edit the due date of "a new next action" to tomorrow
And I go to the calendar page
Then the badge should show 1
And I should see "a new next action"
@selenium
Scenario: Clearing the due date of a todo will remove it from the calendar
Given this is a pending scenario
When I go to the home page
And I submit a new action with description "a new next action" in the context "@calendar"
And I edit the due date of "a new next action" to tomorrow
And I go to the calendar page
Then I should see "a new next action"
When I clear the due date of "a new next action"
Then I should not see "a new next action"
@selenium
Scenario: Marking a todo complete will remove it from the calendar
Given I have a todo "a new next action" in the context "@calendar" which is due tomorrow
When I go to the calendar page
Then I should see "a new next action"
When I clear the due date of "a new next action"
Then I should not see "a new next action"
@selenium
Scenario: Deleting a todo complete will remove it from the calendar
Given I have a todo "a new next action" in the context "@calendar" which is due tomorrow
When I go to the calendar page
Then I should see "a new next action"
When I delete the action "a new next action"
Then I should not see "a new next action"
@selenium
Scenario: Changing due date of a todo will move it in the calendar
Given this is a pending scenario
Given I have a todo "a new next action" in the context "@calendar" which is due tomorrow
When I go to the calendar page
Then I should see "a new next action"
When I edit the due date of "a new next action" to next month
Then I should see "a new next action" in the due next month container

View file

@ -23,22 +23,6 @@ Feature: dependencies
When I expand the dependencies of "Todo 2"
Then I should see "Todo 3" within the dependencies of "Todo 2"
@selenium
Scenario: Adding dependency with comma to todo # for #975
Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos
| description | context |
| test,1, 2,3 | @pc |
| test me | @pc |
When I visit the "dependencies" project
And I drag "test me" to "test,1, 2,3"
Then the successors of "test,1, 2,3" should include "test me"
When I edit the dependency of "test me" to "'test,1, 2,3' <'@pc'; 'dependencies'>,'test,1, 2,3' <'@pc'; 'dependencies'>"
Then there should not be an error
Scenario: Deleting a predecessor will activate successors
Given this is a pending scenario
@selenium
Scenario: I can edit a todo to add the todo as a dependency to another
Given I have a context called "@pc"
@ -48,14 +32,14 @@ Feature: dependencies
| test 2 | @pc |
| test 3 | @pc |
When I visit the "dependencies" project
When I edit the dependency of "test 1" to "'test 2' <'@pc'; 'dependencies'>"
When I edit the dependency of "test 1" to add "test 2" as predecessor
Then I should see "test 1" within the dependencies of "test 2"
And I should see "test 1" in the deferred container
When I edit the dependency of "test 1" to "'test 2' <'@pc'; 'dependencies'>, 'test 3' <'@pc'; 'dependencies'>"
When I edit the dependency of "test 1" to add "test 3" as predecessor
Then I should see "test 1" within the dependencies of "test 2"
Then I should see "test 1" within the dependencies of "test 3"
When I edit the dependency of "test 1" to "'test 2' <'@pc'; 'dependencies'>"
And I edit the dependency of "test 2" to "'test 3' <'@pc'; 'dependencies'>"
When I edit the dependency of "test 1" to remove "test 3" as predecessor
And I edit the dependency of "test 2" to add "test 3" as predecessor
Then I should see "test 1" within the dependencies of "test 3"
Then I should see "test 2" within the dependencies of "test 3"
@ -69,12 +53,44 @@ Feature: dependencies
And "test 1" depends on "test 2"
When I visit the "dependencies" project
Then I should see "test 1" in the deferred container
When I edit the dependency of "test 1" to ""
When I edit the dependency of "test 1" to remove "test 2" as predecessor
Then I should not see "test 1" within the dependencies of "test 2"
And I should not see "test 1" in the deferred container
@selenium
Scenario: Completing a predecessor will activate successors
Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos
| description | context |
| test 1 | @pc |
| test 2 | @pc |
| test 3 | @pc |
And "test 2" depends on "test 1"
When I visit the "dependencies" project
Then I should see "test 2" in the deferred container
And I should see "test 1" in the action container
When I mark "test 1" as complete
Then I should see "test 1" in the completed container
And I should see "test 2" in the action container
And I should not see "test 2" in the deferred container
And I should see the empty message in the deferred container
@selenium
Scenario: Deleting a predecessor will activate successors
Given this is a pending scenario
Given I have a context called "@pc"
And I have a project "dependencies" that has the following todos
| description | context |
| test 1 | @pc |
| test 2 | @pc |
| test 3 | @pc |
And "test 2" depends on "test 1"
When I visit the "dependencies" project
Then I should see "test 2" in the deferred container
And I should see "test 1" in the action container
When I delete the action "test 1"
And I should see "test 2" in the action container
And I should not see "test 2" in the deferred container
And I should see the empty message in the deferred container
Scenario: Deleting a successor will update predecessor
Given this is a pending scenario
Given this is a pending scenario

View file

@ -12,12 +12,12 @@ Feature: Edit a next action from every page
Scenario: I can toggle the star of a todo
Given this is a pending scenario
@selenium @wip
@selenium
Scenario: I can delete a todo
Given I have a todo with description "delete me" in the context "@home"
Given I have a todo "delete me" in the context "@home"
When I go to the home page
Then I should see "delete me"
And I delete the todo
When I delete the action "delete me"
Then I should not see "delete me"
Scenario: Removing the last todo in context will hide context # delete, edit
@ -26,24 +26,25 @@ Feature: Edit a next action from every page
Scenario: Deleting the last todo in container will show empty message # only project, context, tag, not todo
Given this is a pending scenario
@selenium @wip
@selenium
Scenario Outline: I can mark an active todo complete and it will update empty messages
Given I have a context called "visible context"
And I have a project called "visible project"
When I go to the <page>
Then I should see "<empty message>"
When I submit a new action with description "visible todo" to project "visible project" with tags "test" in the context "visible context"
When I submit a new action with description "visible todo" to project "visible project" with tags "starred" in the context "visible context"
Then I should see "visible todo"
And I should not see "<empty message>"
When I mark the todo complete
Then I should not see "visible context"
When I mark "visible todo" as complete
And I should see "<empty message>"
And I should see "visible todo" in the completed todos container
And I should see "visible todo" in the completed container
Scenarios:
| page | empty message |
| tag page for "starred" | No actions found |
| home page | No actions found |
| context page for "visible context" | Currently there are no deferred or pending actions |
| project page for "visible project" | Currently there are no deferred or pending actions |
| page | empty message |
| "visible project" project | Currently there are no incomplete actions in this project |
| home page | Currently there are no incomplete actions |
| tag page for "starred" | No actions found |
| context page for "visible context" | Currently there are no incomplete actions in this context |
@selenium @wip
Scenario Outline: I can mark a deferred todo complete and it will update empty messages
@ -52,7 +53,7 @@ Feature: Edit a next action from every page
When I submit a new deferred action with description "visible todo" to project "visible project" with tags "test" in the context "visible context"
Then I should see "visible todo"
And I should not see "<empty message>"
When I mark the todo complete
When I mark "visible todo" complete
Then I should not see "visible context"
And I should see "<empty message>"
And I should see "visible todo" in the completed todos container
@ -63,10 +64,6 @@ Feature: Edit a next action from every page
| context page for "visible context" | Currently there are no deferred or pending actions |
| project page for "visible project" | Currently there are no deferred or pending actions |
@selenium @wip
Scenario: I can mark a deferred todo complete and it will update empty messages
Given this is a pending scenario
@selenium @wip
Scenario Outline: I can mark a completed todo active and it will update empty messages
Given I have a completed todo with description "visible todo" to project "visible project" with tags "test" in the context "visible context"

View file

@ -0,0 +1,36 @@
Feature: Add new next action from mobile page
In order to be able to add next actions from the mobile interface
As a Tracks user
I want to to be able to add a new next actions from the mobile interface and prepopulate the context and / or project of the prior page
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I am working on the mobile interface
And I have logged in as "testuser" with password "secret"
And I have a context called "a context"
And I have a project "test project" with a default context of "test context"
Scenario Outline: The new action form is prefilled with context and project
Given I am on the <page>
When I follow "0-New action"
Then the selected project should be "<project>"
And the selected context should be "<context>"
Scenarios: # empty means no selected, i.e. first in list is shown
| page | project | context |
| home page | | |
| tickler page | | |
| "test project" project | test project | |
| context page for "test context" | | test context |
| tag page for "starred" | | |
Scenario: I can add a new todo using the mobile interface
Given I am on the home page
Then the badge should show 0
When I follow "0-New action"
And I fill in "Description" with "test me"
And I press "Create"
Then I should see "test me"
And the badge should show 1

View file

@ -0,0 +1,23 @@
Feature: View the list of contexts from mobile
In order to be able to see all contexts from the mobile interface
As a Tracks user
I want to to be able to see a list of project
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I am working on the mobile interface
And I have logged in as "testuser" with password "secret"
And I have a context called "@mobile"
And I have a project "test project" that has the following todos
| context | description |
| @mobile | test action |
Scenario: I can go to a context from the mobile context list page
Given I have a todo "test mobile page" in the context "@mobile"
And I am on the contexts page
Then I should see "@mobile"
When I follow "@mobile"
Then the badge should show 2
And I should see "@mobile"

View file

@ -0,0 +1,38 @@
Feature: Edit a next action from the mobile view
In order to manage a next action
As a Tracks user
I want to to be able to edit a next action
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I am working on the mobile interface
And I have logged in as "testuser" with password "secret"
And I have a context called "@mobile"
And I have a project "test project" that has the following todos
| context | description |
| @mobile | test action |
Scenario: I can edit an action on the mobile page
When I am on the home page
Then the badge should show 1
Then I should see "test action"
When I follow "test action"
And I fill in "Description" with "changed action"
And I press "Update"
Then I should see "changed action"
And I should not see "test action"
When I follow "changed action"
And I check "done"
And I press "Update"
Then I should not see "changed action"
Scenario: Navigate from home page
move this to separate features when other scenarios are created for these features
When I am on the home page
Then the badge should show 1
When I follow "Tickler"
Then the badge should show 0
When I follow "Feeds"
Then I should see "Last 15 actions"

View file

@ -0,0 +1,22 @@
Feature: View the list of projects from mobile
In order to be able to see all project from the mobile interface
As a Tracks user
I want to to be able to see a list of project
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I am working on the mobile interface
And I have logged in as "testuser" with password "secret"
And I have a context called "@mobile"
And I have a project "test project" that has the following todos
| context | description |
| @mobile | test action |
Scenario: I can go to a project from the list of project in mobile view
Given I am on the projects page
Then I should see "test project"
When I follow "test project"
Then the badge should show 1
And I should see "test action"

View file

@ -0,0 +1,24 @@
Feature: Show the actions that are tagged on the mobile page
In order to be able to see all actions tags with a certain tag
As a Tracks user
I want to to be able to find all actions with a specific tag
Background:
Given the following user record
| login | password | is_admin |
| testuser | secret | false |
And I am working on the mobile interface
And I have logged in as "testuser" with password "secret"
And I have a context called "@mobile"
And I have a project "my project" that has the following todos
| context | description | tags |
| @mobile | first action | test, bla |
| @mobile | second action | bla |
Scenario: I can follow the tag of a action to see all actions belonging to that todo
When I go to the home page
And I follow "test"
Then the badge should show 1
When I go to the home page
And I follow "bla"
Then the badge should show 2

View file

@ -12,13 +12,13 @@ Feature: Edit a project
Scenario: I can go to the note of a project
Given I have a project "test" with 2 notes
When I visit the "test" project
When I go to the "test" project
When I click on the first note icon
Then I should go to that note page
@selenium
Scenario: I can describe the project using markup
When I visit the "manage me" project
When I go to the "manage me" project
And I edit the project description to "_successfull outcome_: project is *done*"
Then I should see the italic text "successfull outcome" in the project description
And I should see the bold text "done" in the project description
@ -26,7 +26,7 @@ Feature: Edit a project
@selenium
Scenario: I can edit the project name in place
Given I have a project "release tracks 1.8" with 1 todos
When I visit the project page for "release tracks 1.8"
When I go to the "release tracks 1.8" project
And I edit the project name in place to be "release tracks 2.0"
Then I should see the project name is "release tracks 2.0"
When I go to the projects page
@ -37,7 +37,7 @@ Feature: Edit a project
@selenium
Scenario: I can change the name of the project using the Edit Project Settings form
Given I have a project "bananas" with 1 todos
When I visit the "bananas" project
When I go to the "bananas" project
And I edit the project name to "cherries"
Then the project title should be "cherries"
@ -63,21 +63,21 @@ Feature: Edit a project
@selenium
Scenario: I can add a note to the project
Given I have a project called "test"
When I visit the "test" project
When I go to the "test" project
And I add a note "hello I'm testing" to the project
Then I should see one note in the project
@selenium
Scenario: Cancelling adding a note to the project will remove form
Given I have a project called "test"
When I visit the "test" project
When I go to the "test" project
And I cancel adding a note to the project
Then the form for adding a note should not be visible
@selenium
Scenario: Long notes in a project are shown cut off
Given I have a project called "test"
When I visit the "test" project
When I go to the "test" project
And I add a note "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890TOO LONG" to the project
Then I should not see "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890TOO LONG"
And I should see "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456"
@ -98,10 +98,11 @@ Feature: Edit a project
Given this is a pending scenario # empty message is in separate container
# Ticket #1043
@selenium @wip
@selenium
Scenario: I can move a todo out of the current project
Given I have a project "foo" with 2 todos
When I visit the "foo" project
And I have a project called "bar"
When I go to the "foo" project
And I change the project_name field of "Todo 1" to "bar"
Then I should not see the todo "Todo 1"
And I should see the todo "Todo 2"
Then I should not see "Todo 1"
And I should see "Todo 2"

View file

@ -0,0 +1,116 @@
Given /^"([^"]*)" depends on "([^"]*)"$/ do |successor_name, predecessor_name|
successor = Todo.find_by_description(successor_name)
predecessor = Todo.find_by_description(predecessor_name)
successor.add_predecessor(predecessor)
successor.state = "pending"
successor.save!
end
When /^I drag "(.*)" to "(.*)"$/ do |dragged, target|
drag_id = Todo.find_by_description(dragged).id
drop_id = Todo.find_by_description(target).id
drag_name = "xpath=//div[@id='line_todo_#{drag_id}']//img[@class='grip']"
drop_name = "xpath=//div[@id='line_todo_#{drop_id}']//div[@class='description']"
selenium.drag_and_drop_to_object(drag_name, drop_name)
arrow = "xpath=//div[@id='line_todo_#{drop_id}']/div/a[@class='show_successors']/img"
selenium.wait_for_element(arrow, :timeout_in_seconds => 5)
end
When /^I expand the dependencies of "([^\"]*)"$/ do |todo_name|
todo = Todo.find_by_description(todo_name)
todo.should_not be_nil
expand_img_locator = "xpath=//div[@id='line_todo_#{todo.id}']/div/a[@class='show_successors']/img"
selenium.click(expand_img_locator)
end
When /^I edit the dependency of "([^"]*)" to add "([^"]*)" as predecessor$/ do |todo_description, predecessor_description|
todo = @current_user.todos.find_by_description(todo_description)
todo.should_not be_nil
predecessor = @current_user.todos.find_by_description(predecessor_description)
predecessor.should_not be_nil
open_edit_form_for(todo)
input = "xpath=//form[@id='form_todo_#{todo.id}']//input[@id='predecessor_input']"
selenium.focus(input)
selenium.type_keys input, predecessor_description
# wait for auto complete
autocomplete = "xpath=//a[@id='ui-active-menuitem']"
selenium.wait_for_element(autocomplete, :timeout_in_seconds => 5)
# click first line
first_elem = "xpath=//ul/li[1]/a[@id='ui-active-menuitem']"
selenium.click(first_elem)
new_dependency_line = "xpath=//li[@id='pred_#{predecessor.id}']"
selenium.wait_for_element(new_dependency_line, :timeout_in_seconds => 5)
submit_edit_todo_form(todo)
end
When /^I edit the dependency of "([^"]*)" to remove "([^"]*)" as predecessor$/ do |todo_description, predecessor_description|
todo = @current_user.todos.find_by_description(todo_description)
todo.should_not be_nil
predecessor = @current_user.todos.find_by_description(predecessor_description)
predecessor.should_not be_nil
open_edit_form_for(todo)
delete_dep_button = "xpath=//form[@id='form_todo_#{todo.id}']//img[@id='delete_dep_#{predecessor.id}']"
selenium.click(delete_dep_button)
wait_for :timeout=>5 do
!selenium.is_element_present(delete_dep_button)
end
submit_edit_todo_form(todo)
# note that animations will be running after the ajax is completed
end
When /^I edit the dependency of "([^"]*)" to "([^"]*)"$/ do |todo_name, deps|
todo = @dep_todo = @current_user.todos.find_by_description(todo_name)
todo.should_not be_nil
open_edit_form_for(todo)
fill_in "predecessor_list_todo_#{todo.id}", :with => deps
submit_edit_todo_form(todo)
end
Then /^the successors of "(.*)" should include "(.*)"$/ do |parent_name, child_name|
parent = @current_user.todos.find_by_description(parent_name)
parent.should_not be_nil
child = parent.pending_successors.find_by_description(child_name)
child.should_not be_nil
end
Then /^I should see "([^\"]*)" within the dependencies of "([^\"]*)"$/ do |successor_description, todo_description|
todo = @current_user.todos.find_by_description(todo_description)
todo.should_not be_nil
successor = @current_user.todos.find_by_description(successor_description)
successor.should_not be_nil
# argh, webrat on selenium does not support within, so this won't work
# xpath = "//div[@id='line_todo_#{todo.id}'"
# Then "I should see \"#{successor_description}\" within \"xpath=#{xpath}\""
# let selenium look for the presence of the successor
xpath = "xpath=//div[@id='line_todo_#{todo.id}']//div[@id='successor_line_todo_#{successor.id}']//span"
selenium.wait_for_element(xpath, :timeout_in_seconds => 5)
end
Then /^I should not see "([^"]*)" within the dependencies of "([^"]*)"$/ do |successor_description, todo_description|
todo = @current_user.todos.find_by_description(todo_description)
todo.should_not be_nil
successor = @current_user.todos.find_by_description(successor_description)
successor.should_not be_nil
# let selenium look for the presence of the successor
xpath = "xpath=//div[@id='line_todo_#{todo.id}']//div[@id='successor_line_todo_#{successor.id}']//span"
wait_for :timeout => 5 do
!selenium.is_element_present(xpath)
end
end

View file

@ -31,7 +31,7 @@ Then /^I should see "([^"]*)" as the selected context$/ do |context_name|
end
Then /^I should see feeds for "([^"]*)" in list of "([^"]*)"$/ do |name, list_type|
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
wait_for_ajax
xpath= "//div[@id='feeds-for-#{list_type}']//strong"
name.should == response.selenium.get_text("xpath=#{xpath}")
end

View file

@ -2,6 +2,10 @@ Given /this is a pending scenario/ do
pending
end
Given /^I am working on the mobile interface$/ do
@mobile_interface = true
end
Then /the badge should show (.*)/ do |number|
badge = -1
xpath= "//span[@id='badge_count']"
@ -17,3 +21,16 @@ Then /the badge should show (.*)/ do |number|
badge.should == number.to_i
end
Then /^I should see the empty message in the deferred container$/ do
wait_for :timeout => 5 do
selenium.is_visible("xpath=//div[@id='tickler']//div[@id='tickler-empty-nd']")
end
end
Then /^I should not see the context "([^"]*)"$/ do |context_name|
context = @current_user.contexts.find_by_name(context_name)
wait_for :timeout => 5 do
!selenium.is_visible("xpath=//div[@id='c#{context.id}']")
end
end

View file

@ -1,5 +1,5 @@
Given /^I have logged in as "(.*)" with password "(.*)"$/ do |username, password|
visit login_path
When "I go to the login page"
fill_in "Login", :with => username
fill_in "Password", :with => password
uncheck "Stay logged in:"
@ -7,7 +7,8 @@ Given /^I have logged in as "(.*)" with password "(.*)"$/ do |username, password
if response.respond_to? :selenium
selenium.wait_for_page_to_load(5000)
end
response.should contain(/Logout \(#{username}\)/)
logout_regexp = @mobile_interface ? "Logout" : "Logout \(#{username}\)"
response.should contain(logout_regexp)
@current_user = User.find_by_login(username)
end

View file

@ -39,13 +39,13 @@ end
When /^I sort the active list alphabetically$/ do
click_link "Alphabetically"
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
wait_for_ajax
selenium.get_confirmation.should == "Are you sure that you want to sort these projects alphabetically? This will replace the existing sort order."
end
When /^I sort the list by number of tasks$/ do
click_link "By number of tasks"
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
wait_for_ajax
selenium.get_confirmation.should == "Are you sure that you want to sort these projects by the number of tasks? This will replace the existing sort order."
end

View file

@ -24,6 +24,13 @@ Given /^I have a project called "([^"]*)"$/ do |project_name|
Given "there exists a project \"#{project_name}\" for user \"#{@current_user.login}\""
end
Given /^I have a project "([^"]*)" with a default context of "([^"]*)"$/ do |project_name, context_name|
Given "there exists a project \"#{project_name}\" for user \"#{@current_user.login}\""
context = @current_user.contexts.create!(:name => context_name)
@project.default_context = context
@project.save!
end
Given /^I have the following projects:$/ do |table|
table.hashes.each do |project|
Given 'I have a project called "'+project[:project_name]+'"'
@ -189,4 +196,4 @@ end
Then /^I should see the project name is "([^"]*)"$/ do |project_name|
Then "the project title should be \"#{project_name}\""
end
end

View file

@ -35,7 +35,7 @@ When /^I edit the name of the pattern "([^\"]*)" to "([^\"]*)"$/ do |pattern_nam
pattern.should_not be_nil
click_link "link_edit_recurring_todo_#{pattern.id}"
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
wait_for_ajax
fill_in "edit_recurring_todo_description", :with => new_name
selenium.click "recurring_todo_edit_action_submit"
@ -49,7 +49,7 @@ When /^I star the pattern "([^\"]*)"$/ do |pattern_name|
pattern = @current_user.recurring_todos.find_by_description(pattern_name)
pattern.should_not be_nil
click_link "star_icon_#{pattern.id}"
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
wait_for_ajax
end
When /^I delete the pattern "([^"]*)"$/ do |pattern_name|
@ -67,7 +67,7 @@ When /^I mark the pattern "([^"]*)" as complete$/ do |pattern_name|
pattern.should_not be_nil
pattern.completed?.should be_false
selenium.click "check_#{pattern.id}"
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
wait_for_ajax
end
When /^I mark the pattern "([^"]*)" as active$/ do |pattern_name|
@ -75,7 +75,7 @@ When /^I mark the pattern "([^"]*)" as active$/ do |pattern_name|
pattern.should_not be_nil
pattern.completed?.should be_true
selenium.click "check_#{pattern.id}"
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
wait_for_ajax
end
Then /^the state list "([^"]*)" should be empty$/ do |state|

View file

@ -2,15 +2,25 @@ Given /^I have no todos$/ do
Todo.delete_all
end
Given /^I have a todo "(.*)"$/ do |description|
context = @current_user.contexts.create!(:name => "context A")
Given /^I have a todo "([^"]*)" in the context "([^"]*)"$/ do |description, context_name|
context = @current_user.contexts.find_or_create(:name => context_name)
@current_user.todos.create!(:context_id => context.id, :description => description)
end
Given /^I have a todo "([^"]*)" in the context "([^"]*)" which is due tomorrow$/ do |description, context_name|
context = @current_user.contexts.find_or_create(:name => context_name)
@todo = @current_user.todos.create!(:context_id => context.id, :description => description)
@todo.due = @todo.created_at + 1.day
@todo.save!
end
Given /^I have a todo "([^"]*)"$/ do |description|
Given "I have a todo \"#{description}\" in the context \"Context A\""
end
Given /^I have ([0-9]+) todos$/ do |count|
context = @current_user.contexts.create!(:name => "context A")
count.to_i.downto 1 do |i|
@current_user.todos.create!(:context_id => context.id, :description => "todo #{i}")
Given "I have a todo \"todo #{i}\" in the context \"Context A\""
end
end
@ -42,57 +52,29 @@ Given /^I have ([0-9]+) completed todos with a note$/ do |count|
end
end
Given /^"(.*)" depends on "(.*)"$/ do |successor_name, predecessor_name|
successor = Todo.find_by_description(successor_name)
predecessor = Todo.find_by_description(predecessor_name)
successor.add_predecessor(predecessor)
successor.state = "pending"
successor.save!
end
Given /^I have a project "([^"]*)" that has the following todos$/ do |project_name, todos|
Given "I have a project called \"#{project_name}\""
@project.should_not be_nil
todos.hashes.each do |todo|
context_id = @current_user.contexts.find_by_name(todo[:context])
context_id.should_not be_nil
@current_user.todos.create!(
context = @current_user.contexts.find_by_name(todo[:context])
context.should_not be_nil
new_todo = @current_user.todos.create!(
:description => todo[:description],
:context_id => context_id,
:context_id => context.id,
:project_id=>@project.id)
unless todo[:tags].nil?
new_todo.tag_with(todo[:tags])
end
end
end
When /^I drag "(.*)" to "(.*)"$/ do |dragged, target|
drag_id = Todo.find_by_description(dragged).id
drop_id = Todo.find_by_description(target).id
drag_name = "xpath=//div[@id='line_todo_#{drag_id}']//img[@class='grip']"
drop_name = "xpath=//div[@id='line_todo_#{drop_id}']//div[@class='description']"
selenium.drag_and_drop_to_object(drag_name, drop_name)
arrow = "xpath=//div[@id='line_todo_#{drop_id}']/div/a[@class='show_successors']/img"
selenium.wait_for_element(arrow, :timeout_in_seconds => 5)
end
When /^I expand the dependencies of "([^\"]*)"$/ do |todo_name|
todo = Todo.find_by_description(todo_name)
todo.should_not be_nil
expand_img_locator = "xpath=//div[@id='line_todo_#{todo.id}']/div/a[@class='show_successors']/img"
selenium.click(expand_img_locator)
end
When /I change the (.*) field of "([^\"]*)" to "([^\"]*)"$/ do |field, todo_name, new_value|
When /I change the (.*) field of "([^\"]*)" to "([^\"]*)"$/ do |field_name, todo_name, new_value|
todo = @current_user.todos.find_by_description(todo_name)
todo.should_not be_nil
selenium.click("//img[@id='edit_icon_todo_#{todo.id}']", :wait_for => :ajax, :javascript_framework => :jquery)
selenium.type("css=form.edit_todo_form input[name=#{field}]", new_value)
selenium.click("css=button.positive", :wait_for => :ajax, :javascript_framework => :jquery)
# TODO: change to a wait_for
sleep(5)
open_edit_form_for(todo)
selenium.type("css=form.edit_todo_form input[name=#{field_name}]", new_value)
submit_edit_todo_form(todo)
end
When /^I submit a new action with description "([^"]*)"$/ do |description|
@ -165,15 +147,52 @@ When /^I submit the new multiple actions form with$/ do |multi_line_descriptions
submit_multiple_next_action_form
end
When /^I edit the dependency of "([^"]*)" to "([^"]*)"$/ do |todo_name, deps|
todo = @dep_todo = @current_user.todos.find_by_description(todo_name)
When /^I edit the due date of "([^"]*)" to tomorrow$/ do |action_description|
todo = @current_user.todos.find_by_description(action_description)
todo.should_not be_nil
# click edit
selenium.click("//div[@id='line_todo_#{todo.id}']//img[@id='edit_icon_todo_#{todo.id}']", :wait_for => :ajax, :javascript_framework => :jquery)
fill_in "predecessor_list_todo_#{todo.id}", :with => deps
open_edit_form_for(todo)
fill_in "due_todo_#{todo.id}", :with => format_date(todo.created_at + 1.day)
submit_edit_todo_form(todo)
sleep(1) # TODO: replace with some wait_for
end
When /^I edit the due date of "([^"]*)" to next month$/ do |action_description|
todo = @current_user.todos.find_by_description(action_description)
todo.should_not be_nil
open_edit_form_for(todo)
fill_in "due_todo_#{todo.id}", :with => format_date(todo.created_at + 1.month)
submit_edit_todo_form(todo)
end
When /^I clear the due date of "([^"]*)"$/ do |action_description|
todo = @current_user.todos.find_by_description(action_description)
todo.should_not be_nil
open_edit_form_for(todo)
selenium.click("//div[@id='edit_todo_#{todo.id}']//a[@id='due_x_todo_#{todo.id}']/img", :wait_for => :ajax, :javascript_framework => :jquery)
submit_edit_todo_form(todo)
end
When /^I mark "([^"]*)" as complete$/ do |action_description|
# TODO: generalize. this currently only works for projects wrt xpath
todo = @current_user.todos.find_by_description(action_description)
todo.should_not be_nil
check "mark_complete_#{todo.id}"
wait_for :timeout => 5 do
!selenium.is_element_present("//div[@id='p#{todo.project.id}items']//div[@id='line_todo_#{todo.id}']")
end
# note that animations could be running after finishing this
end
When /^I delete the action "([^"]*)"$/ do |action_description|
todo = @current_user.todos.find_by_description(action_description)
todo.should_not be_nil
delete_todo_button = "xpath=//a[@id='delete_todo_#{todo.id}']/img"
selenium.click delete_todo_button
selenium.get_confirmation.should == "Are you sure that you want to delete the action '#{todo.description}'?"
wait_for :timeout => 5 do
!selenium.is_element_present("//div[@id='line_todo_#{todo.id}']")
end
end
Then /^I should see ([0-9]+) todos$/ do |count|
@ -185,43 +204,11 @@ end
Then /^there should not be an error$/ do
sleep(5)
# form should be gone and thus no errors visible
selenium.is_visible("edit_todo_#{@dep_todo.id}").should == false
wait_for :timeout => 5 do
!selenium.is_visible("edit_todo_#{@dep_todo.id}")
end
end
Then /^the successors of "(.*)" should include "(.*)"$/ do |parent_name, child_name|
parent = @current_user.todos.find_by_description(parent_name)
parent.should_not be_nil
child = parent.pending_successors.find_by_description(child_name)
child.should_not be_nil
end
Then /^I should see "([^\"]*)" within the dependencies of "([^\"]*)"$/ do |successor_description, todo_description|
todo = @current_user.todos.find_by_description(todo_description)
todo.should_not be_nil
successor = @current_user.todos.find_by_description(successor_description)
successor.should_not be_nil
# argh, webrat on selenium does not support within, so this won't work
# xpath = "//div[@id='line_todo_#{todo.id}'"
# Then "I should see \"#{successor_description}\" within \"xpath=#{xpath}\""
# let selenium look for the presence of the successor
xpath = "xpath=//div[@id='line_todo_#{todo.id}']//div[@id='successor_line_todo_#{successor.id}']//span"
selenium.wait_for_element(xpath, :timeout_in_seconds => 5)
end
Then /^I should not see "([^"]*)" within the dependencies of "([^"]*)"$/ do |successor_description, todo_description|
todo = @current_user.todos.find_by_description(todo_description)
todo.should_not be_nil
successor = @current_user.todos.find_by_description(successor_description)
successor.should_not be_nil
# let selenium look for the presence of the successor
xpath = "xpath=//div[@id='line_todo_#{todo.id}']//div[@id='successor_line_todo_#{successor.id}']//span"
selenium.is_element_present(xpath).should be_false
end
Then /^I should see the todo "([^\"]*)"$/ do |todo_description|
selenium.is_element_present("//span[.=\"#{todo_description}\"]").should be_true
end
@ -245,8 +232,10 @@ end
Then /^the container for the context "([^"]*)" should not be visible$/ do |context_name|
context = @current_user.contexts.find_by_name(context_name)
context.should_not be_nil
wait_for_ajax
xpath = "xpath=//div[@id=\"c#{context.id}\"]"
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
selenium.is_element_present(xpath).should be_false
end
@ -260,7 +249,31 @@ Then /^I should see "([^"]*)" in the deferred container$/ do |todo_description|
xpath = "//div[@id='tickler']//div[@id='line_todo_#{todo.id}']"
selenium.is_element_present(xpath).should be_true
wait_for :timeout => 5 do
selenium.is_element_present(xpath)
end
end
Then /^I should see "([^"]*)" in the action container$/ do |todo_description|
todo = @current_user.todos.find_by_description(todo_description)
todo.should_not be_nil
xpath = "//div[@id='p#{todo.project.id}items']//div[@id='line_todo_#{todo.id}']"
wait_for :timeout => 5 do
selenium.is_element_present(xpath)
end
end
Then /^I should see "([^"]*)" in the completed container$/ do |todo_description|
todo = @current_user.todos.find_by_description(todo_description)
todo.should_not be_nil
xpath = "//div[@id='completed_container']//div[@id='line_todo_#{todo.id}']"
wait_for :timeout => 5 do
selenium.is_element_present(xpath)
end
end
Then /^I should not see "([^"]*)" in the deferred container$/ do |todo_description|
@ -269,5 +282,28 @@ Then /^I should not see "([^"]*)" in the deferred container$/ do |todo_descripti
xpath = "//div[@id='tickler']//div[@id='line_todo_#{todo.id}']"
selenium.is_element_present(xpath).should be_false
wait_for :timeout => 5 do
!selenium.is_element_present(xpath)
end
end
Then /^I should see "([^"]*)" in the due next month container$/ do |todo_description|
todo = @current_user.todos.find_by_description(todo_description)
todo.should_not be_nil
xpath = "xpath=//div[@id='due_after_this_month']//div[@id='line_todo_#{todo.id}']"
wait_for :timeout => 5 do
!selenium.is_element_present(xpath)
end
end
Then /^the selected project should be "([^"]*)"$/ do |content|
# Works for mobile. TODO: make it work for both mobile and non-mobile
field_labeled("Project").element.search(".//option[@selected = 'selected']").inner_html.should =~ /#{content}/
end
Then /^the selected context should be "([^"]*)"$/ do |content|
# Works for mobile. TODO: make it work for both mobile and non-mobile
field_labeled("Context").element.search(".//option[@selected = 'selected']").inner_html.should =~ /#{content}/
end

View file

@ -6,53 +6,54 @@ module NavigationHelpers
# step definition in web_steps.rb
#
def path_to(page_name)
options = @mobile_interface ? {:format => :m} : {}
case page_name
when /the home\s?page/
root_path
root_path(options)
when /the statistics page/
stats_path
stats_path(options)
when /the signup page/
signup_path
signup_path(options)
when /the login page/
login_path
login_path(options)
when /the notes page/
notes_path
notes_path(options)
when /the contexts page/
contexts_path
contexts_path(options)
when /the projects page/
projects_path
projects_path(options)
when /the manage users page/
users_path
users_path(options)
when /the repeating todos page/
recurring_todos_path
recurring_todos_path(options)
when /the integrations page/
integrations_path
integrations_path(options)
when /the tickler page/
tickler_path
tickler_path(options)
when /the export page/
data_path
data_path(options)
when /the preference page/
preferences_path
preferences_path(options)
when /the rest api docs page/
rest_api_docs_path
rest_api_docs_path(options)
when /the search page/
search_path
search_path(options)
when /the starred page/
tag_path("starred")
tag_path("starred", options)
when /the feeds page/
feeds_path
feeds_path(options)
when /the context page for "([^\"]*)" for user "([^\"]*)"/i
context_path(User.find_by_login($2).contexts.find_by_name($1))
context_path(User.find_by_login($2).contexts.find_by_name($1), options)
when /the context page for "([^\"]*)"/i
context_path(@current_user.contexts.find_by_name($1))
context_path(@current_user.contexts.find_by_name($1), options)
when /the "([^\"]*)" project for user "([^\"]*)"/i
project_path(User.find_by_login($2).projects.find_by_name($1))
project_path(User.find_by_login($2).projects.find_by_name($1), options)
when /the "([^\"]*)" project/i
@project = @current_user.projects.find_by_name($1)
project_path(@project)
project_path(@project, options)
when /the tag page for "([^"]*)"/i
tag_path($1)
tag_path($1, options)
# Add more mappings here.
# Here is an example that pulls values out of the Regexp:

View file

@ -5,6 +5,7 @@ module TracksStepHelper
def submit_next_action_form
selenium.click("xpath=//form[@id='todo-form-new-action']//button[@id='todo_new_action_submit']", :wait_for => :ajax, :javascript_framework => :jquery)
sleep(1)
end
def submit_new_context_form
@ -17,6 +18,9 @@ module TracksStepHelper
def submit_edit_todo_form (todo)
selenium.click("//div[@id='edit_todo_#{todo.id}']//button[@id='submit_todo_#{todo.id}']", :wait_for => :ajax, :javascript_framework => :jquery)
wait_for do
!selenium.is_element_present("//form[@id='form_todo_#{todo.id}']")
end
end
def format_date(date)
@ -36,6 +40,20 @@ module TracksStepHelper
execute_javascript("$('#todo_project_name').val('');")
end
def open_edit_form_for(todo)
edit_button = "xpath=//div[@id='line_todo_#{todo.id}']//img[@id='edit_icon_todo_#{todo.id}']"
wait_for :timeout => 5 do
selenium.is_element_present(edit_button)
end
selenium.click(edit_button, :wait_for => :ajax, :javascript_framework => :jquery)
end
def wait_for_ajax
selenium.wait_for :wait_for => :ajax, :javascript_framework => :jquery
end
end
World(TracksStepHelper)

View file

@ -12,6 +12,10 @@ module Tracks
def nil?
yield if @source_view.nil? && block_given?
end
def context
yield if :context == @source_view && block_given?
end
def method_missing(check_source_view,*args)
yield if check_source_view == @source_view && block_given?
@ -61,4 +65,4 @@ module Tracks
end
ActionController::Base.send(:include, Tracks::SourceViewSwitching::Controller)
ActionController::Base.send(:include, Tracks::SourceViewSwitching::Controller)

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

View file

@ -87,6 +87,56 @@ var TracksForm = {
submit_with_ajax_and_block_element('form#todo-form-multi-new-action', $(this));
return false;
});
},
enable_dependency_delete: function() {
$('a[class=icon_delete_dep]').live('click', function() {
var form = $(this).parents('form').get(0);
var predecessor_list = $(form).find('input[name=predecessor_list]');
var id_list = split( predecessor_list.val() );
// remove from ul
$(form).find("li#pred_"+this.id).slideUp(500).remove();
// remove from array
var new_list = new Array();
while (id_list.length > 0) {
var elem = id_list.pop();
if (elem != this.id && elem != '' && elem != ' ') {
new_list.push ( elem );
}
}
// update id list
predecessor_list.val( new_list.join(", ") );
if (new_list.length == 0) {
$(form).find("label#label_for_predecessor_input").hide();
$(form).find("ul#predecessor_ul").hide();
}
return false; // prevent submit/follow link
})
},
generate_dependency_list: function(todo_id) {
if (spec_of_todo.length > 0) {
// find edit form
var form_selector = "#form_todo_"+todo_id;
var form = $(form_selector);
var predecessor_list = form.find('input[name=predecessor_list]');
var id_list = split( predecessor_list.val() );
var label = form.find("label#label_for_predecessor_input").first();
label.show();
while (id_list.length > 0) {
var elem = id_list.pop();
var new_li = TodoItems.generate_predecessor(elem, spec_of_todo[elem]);
var ul = form.find('ul#predecessor_ul');
ul.html(ul.html() + new_li);
form.find('li#pred_'+elem).show();
}
}
}
}
@ -130,6 +180,54 @@ var TracksPages = {
set_page_badge: function(count) {
$('#badge_count').html(count);
},
setup_autocomplete_for_tag_list: function(id) {
$(id+':not(.ac_input)')
.bind( "keydown", function( event ) { // don't navigate away from the field on tab when selecting an item
if ( event.keyCode === $.ui.keyCode.TAB &&
$( this ).data( "autocomplete" ).menu.active ) {
event.preventDefault();
}
})
.autocomplete({
minLength: 0,
source: function( request, response ) {
var last_term = extractLast( request.term );
if (last_term != "" && last_term != " ")
$.ajax( {
url: relative_to_root('tags.autocomplete'),
dataType: 'json',
data: {
term: last_term
},
success: function(data, textStatus, jqXHR) {
// remove spinner as removing the class is not always done by response
$(id).removeClass('ui-autocomplete-loading');
response(data, textStatus, jqXHR); // call jquery callback to handle data
}
})
else {
// remove spinner as typing will always add the spinner
$(id).removeClass('ui-autocomplete-loading');
}
},
focus: function() {
// prevent value inserted on focus
return false;
},
select: function( event, ui ) {
var terms = split( this.value );
// remove the current input
terms.pop();
// add the selected item
terms.push( ui.item.value );
// add placeholder to get the comma-and-space at the end
//terms.push( "" );
this.value = terms.join( ", " );
return false;
},
selectFirst: true
});
},
setup_behavior: function () {
/* main menu */
$('ul.sf-menu').superfish({
@ -168,16 +266,6 @@ var TracksPages = {
/* fade flashes and alerts in automatically */
$(".alert").fadeOut(8000);
/* for edit project form and edit todo form
* TODO: refactor to separate calls from project and todo */
$('.edit-form a.negative').live('click', function(){
$(this).parents('.edit-form').fadeOut(200, function () {
$(this).parents('.list').find('.project').fadeIn(500);
$(this).parents('.container').find('.item-show').fadeIn(500);
})
});
}
}
@ -265,7 +353,7 @@ var TodoItems = {
getContextsForAutocomplete: function (term, element_to_block) {
var allContexts = null;
var params = default_ajax_options_for_scripts('GET', relative_to_root('contexts.autocomplete'), element_to_block);
params.data = "term="+term;
params.data += "&term="+term;
params.dataType = "json";
params.async = false;
params.success = function(result){
@ -286,6 +374,68 @@ var TodoItems = {
}
return confirm(i18n['contexts.new_context_pre'] + givenContextName + i18n['contexts.new_context_post']);
},
generate_predecessor: function(todo_id, todo_spec) {
var img = "<img id=\"delete_dep_"+todo_id+"\" class=\"icon_delete_dep\" src=\""+ relative_to_root('images/blank.png') + "\">";
var anchor = "<a class=\"icon_delete_dep\" id=\""+todo_id+"\" href=\"#\">" + img + "</a>";
var li = "<li style=\"display:none\" id=\"pred_"+todo_id+"\">"+ anchor +" "+ todo_spec + "</li>";
return li;
},
highlight_todo: function(id) {
$(id).effect('highlight', {}, 2000, function(){ });
},
setup_autocomplete_for_predecessor: function() {
$('input[name=predecessor_input]:not(.ac_input)')
.bind( "keydown", function( event ) { // don't navigate away from the field on tab when selecting an item
if ( event.keyCode === $.ui.keyCode.TAB &&
$( this ).data( "autocomplete" ).menu.active ) {
event.preventDefault();
}
})
.autocomplete({
minLength: 0,
source: function( request, response ) {
var term = request.term;
if (term != "" && term != " ")
$.getJSON( relative_to_root('auto_complete_for_predecessor'), {
term: term
}, response );
},
focus: function() {
// prevent value inserted on focus
return false;
},
select: function( event, ui ) {
// retrieve values from input fields
var todo_spec = ui.item.label
var todo_id = ui.item.value
var form = $(this).parents('form').get(0);
var predecessor_list = $(form).find('input[name=predecessor_list]')
var id_list = split( predecessor_list.val() );
// add the dependency to id list
id_list.push( todo_id );
predecessor_list.val( id_list.join( ", " ) );
// show the html for the list of deps
$(form).find('ul#predecessor_ul').show();
$(form).find("label#label_for_predecessor_input").show();
if (todo_spec.length > 35 && form.id == "todo-form-new-action") {
// cut off string only in new-todo-form
todo_spec = todo_spec.substring(0,40)+"...";
}
// show the new dep in list
var html = $(form).find('ul#predecessor_ul').html();
var new_li = TodoItems.generate_predecessor(todo_id, todo_spec);
$(form).find('ul#predecessor_ul').html(html + new_li);
$(form).find('li#pred_'+todo_id).slideDown(500);
$(form).find('input[name=predecessor_input]').val('');
$(form).find('input[name=predecessor_input]').focus();
return false;
},
selectFirst: true
});
},
setup_behavior: function() {
/* show the notes of a todo */
$(".show_notes").live('click', function () {
@ -312,7 +462,12 @@ var TodoItems = {
/* set behavior for edit icon */
$(".item-container a.edit_item").live('click', function (ev){
get_with_ajax_and_block_element(this.href, $(this).parents(".item-container"));
var ajax_options = default_ajax_options_for_scripts('GET', this.href, $(this).parents('.item-container'));
var id = this.id.substr(15);
ajax_options.complete.push( function(){
TracksForm.generate_dependency_list(id);
});
$.ajax(ajax_options);
return false;
});
@ -320,7 +475,7 @@ var TodoItems = {
$('.item-container a.icon_delete_item').live('click', function(evt){
var confirm_message = $(this).attr("x_confirm_message")
if(confirm(confirm_message)){
delete_with_ajax_and_block_element(this.href, $(this).parents('.project'));
delete_with_ajax_and_block_element(this.href, $(this).parents('.item-container'));
}
return false;
});
@ -331,6 +486,14 @@ var TodoItems = {
return false;
});
// for cancelling edit todo form
$('form.edit_todo_form a.negative').live('click', function(){
$(this).parents('.edit-form').fadeOut(200, function () {
$(this).parents('.list').find('.project').fadeIn(500);
$(this).parents('.container').find('.item-show').fadeIn(500);
})
});
// defer a todo
$(".item-container a.icon_defer_item").live('click', function(ev){
if ($(this).attr("x_defer_alert") == "true")
@ -348,6 +511,26 @@ var TodoItems = {
$.ajax(ajax_options);
return false;
});
TracksForm.enable_dependency_delete();
}
}
var ContextItems = {
setup_autocomplete_for_contexts: function(id) {
$(id).autocomplete({
source: relative_to_root('contexts.autocomplete'),
selectFirst: true
});
}
}
var ProjectItems = {
setup_autocomplete_for_projects: function(id) {
$(id).autocomplete({
source: relative_to_root('projects.autocomplete'),
selectFirst: true
});
}
}
@ -444,6 +627,14 @@ var ProjectListPage = {
return false;
});
/* cancel edit project form */
$('form.edit-project-form a.negative').live('click', function(){
$(this).parents('.edit-form').fadeOut(200, function () {
$(this).parents('.list').find('.project').fadeIn(500);
$(this).parents('.container').find('.item-show').fadeIn(500);
})
});
/* submit project form after entering new project */
$("form#project_form button.positive").live('click', function (ev) {
submit_with_ajax_and_block_element('form.#project_form', $(this));
@ -735,6 +926,13 @@ function setup_auto_refresh(interval){
});
}
function split( val ) {
return val.split( /,\s*/ );
}
function extractLast( term ) {
return split( term ).pop();
}
$.fn.clearForm = function() {
return this.each(function() {
var type = this.type, tag = this.tagName.toLowerCase();
@ -749,6 +947,13 @@ $.fn.clearForm = function() {
});
};
$.fn.clearDeps = function() {
$('ul#predecessor_ul', this).hide();
$("label#label_for_predecessor_input").hide();
$('ul#predecessor_ul', this).html("");
$('input[name=predecessor_list]').val("");
}
/**************************************/
/* Tracks AJAX functions */
/**************************************/
@ -758,24 +963,27 @@ function generic_get_script_for_list(element, getter, param){
}
function default_ajax_options_for_submit(ajax_type, element_to_block) {
// the complete is not a function but an array so you can push other
// functions that will be executed after the ajax call completes
var options = {
type: ajax_type,
async: true,
context: element_to_block,
data: "_source_view=" + SOURCE_VIEW,
beforeSend: function() {
// console.debug('data: '+this.data);
if (this.context) {
$(this.context).block({
message: null
});
}
},
complete:function() {
complete: [function() {
if (this.context) {
$(this.context).unblock();
}
enable_rich_interaction();
},
}],
error: function(req, status) {
TracksPages.page_notify('error', i18n['common.ajaxError']+': '+status, 8);
}
@ -829,17 +1037,21 @@ $(document).ajaxSend(function(event, request, settings) {
}
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}
request.setRequestHeader("X-CSRF-Token", $('meta[name=csrf-token]').attr('content'));
request.setRequestHeader('X-CSRF-Token', $('meta[name=csrf-token]').attr('content'));
request.setRequestHeader("Accept", "text/javascript");
});
function setup_periodic_check(url_for_check, interval_in_sec, method) {
var ajaxMethod = (method ? method : "GET");
function check_remote() {
$.ajax(default_ajax_options_for_scripts(ajaxMethod, url_for_check, null));
}
setInterval(check_remote, interval_in_sec*1000);
setInterval(
function(){
var settings = default_ajax_options_for_scripts( method ? method : "GET", url_for_check, null);
if(typeof(AUTH_TOKEN) != 'undefined'){
settings.data += "&authenticity_token=" + encodeURIComponent( AUTH_TOKEN )
}
$.ajax(settings);
},
interval_in_sec*1000
);
}
function update_order(event, ui){
@ -894,117 +1106,27 @@ function enable_rich_interaction(){
$('input.Date').datepicker({
'dateFormat': dateFormat,
'firstDay': weekStart,
'showAnim': 'fold'
'showButtonPanel': true,
'showWeek': true,
'changeMonth': true,
'changeYear': true,
'maxDate': '+5y',
'minDate': '-1y',
'showAnim': '' /* leave empty, see #1117 */
});
/* Autocomplete */
$('input[name=context_name]').autocomplete({
source: relative_to_root('contexts.autocomplete'),
selectFirst: true
});
$('input[name=project_name]').autocomplete({
source: relative_to_root('projects.autocomplete'),
selectFirst: true
});
$('input[name="project[default_context_name]"]').autocomplete({
source: relative_to_root('contexts.autocomplete'),
selectFirst: true
});
$('input[name=tag_list]:not(.ac_input)')
.bind( "keydown", function( event ) { // don't navigate away from the field on tab when selecting an item
if ( event.keyCode === $.ui.keyCode.TAB &&
$( this ).data( "autocomplete" ).menu.active ) {
event.preventDefault();
}
})
.autocomplete({
minLength: 0,
source: function( request, response ) {
var last_term = extractLast( request.term );
if (last_term != "" && last_term != " ")
$.ajax( {
url: relative_to_root('tags.autocomplete'),
dataType: 'json',
data: {
term: last_term
},
success: function(data, textStatus, jqXHR) {
// remove spinner as removing the class is not always done by response
$('input[name=tag_list]').removeClass('ui-autocomplete-loading');
response(data, textStatus, jqXHR); // call jquery callback to handle data
}
})
else {
// remove spinner as typing will always add the spinner
$('input[name=tag_list]').removeClass('ui-autocomplete-loading');
}
},
focus: function() {
// prevent value inserted on focus
return false;
},
select: function( event, ui ) {
var terms = split( this.value );
// remove the current input
terms.pop();
// add the selected item
terms.push( ui.item.value );
// add placeholder to get the comma-and-space at the end
//terms.push( "" );
this.value = terms.join( ", " );
return false;
},
selectFirst: true
});
function split( val ) {
return val.split( /,\s*/ );
}
function extractLast( term ) {
return split( term ).pop();
}
$('input[name=predecessor_list]:not(.ac_input)')
.bind( "keydown", function( event ) { // don't navigate away from the field on tab when selecting an item
if ( event.keyCode === $.ui.keyCode.TAB &&
$( this ).data( "autocomplete" ).menu.active ) {
event.preventDefault();
}
})
.autocomplete({
minLength: 0,
source: function( request, response ) {
var last_term = extractLast( request.term );
if (last_term != "" && last_term != " ")
$.getJSON( relative_to_root('auto_complete_for_predecessor'), {
term: last_term
}, response );
},
focus: function() {
// prevent value inserted on focus
return false;
},
select: function( event, ui ) {
var terms = split( this.value );
// remove the current input
terms.pop();
// add the selected item
terms.push( ui.item.value );
// add placeholder to get the comma-and-space at the end
//terms.push( "" );
this.value = terms.join( ", " );
return false;
}
});
ProjectItems.setup_autocomplete_for_projects('input[name=project_name]');
ContextItems.setup_autocomplete_for_contexts('input[name=context_name]');
ContextItems.setup_autocomplete_for_contexts('input[id="project_default_context_name"]');
TracksPages.setup_autocomplete_for_tag_list('input[name=tag_list]');
TracksPages.setup_autocomplete_for_tag_list('input[id="project_default_tags"]');
TodoItems.setup_autocomplete_for_predecessor();
/* have to bind on keypress because of limitations of live() */
$('input[name=project_name]').live('keypress', function(){
$(this).bind('blur', project_defaults);
});
$('input[name=context_name]').live('keypress', function(){
$(this).attr('edited', 'true');
});
@ -1018,15 +1140,10 @@ function enable_rich_interaction(){
var dropped_todo = this.id.split('_')[2];
ui.draggable.remove();
$('.drop_target').hide(); // IE8 doesn't call stop() in this situation
$(this).block({
message: null
});
$.post(relative_to_root('todos/add_predecessor'),
{
successor: dragged_todo,
predecessor: dropped_todo
},
null, 'script');
ajax_options = default_ajax_options_for_scripts('POST', relative_to_root('todos/add_predecessor'), $(this));
ajax_options.data += "&predecessor="+dropped_todo + "&successor="+dragged_todo
$.ajax(ajax_options);
}
function drag_todo(){
@ -1082,7 +1199,7 @@ function enable_rich_interaction(){
field_touched = false;
/* shrink the notes on the project pages. This is not live(), so this needs
* to be run after ajax adding of a new note */
* to be run after ajax adding of a new note */
$('.note_wrapper').truncate({
max_length: 90,
more: '',

View file

@ -0,0 +1,23 @@
/* German initialisation for the jQuery UI date picker plugin. */
/* Written by Milian Wolff (mail@milianw.de). */
jQuery(function($){
$.datepicker.regional['de'] = {
closeText: 'schließen',
prevText: '&#x3c;zurück',
nextText: 'Vor&#x3e;',
currentText: 'heute',
monthNames: ['Januar','Februar','März','April','Mai','Juni',
'Juli','August','September','Oktober','November','Dezember'],
monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
'Jul','Aug','Sep','Okt','Nov','Dez'],
dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
weekHeader: 'Wo',
dateFormat: 'dd.mm.yy',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''};
$.datepicker.setDefaults($.datepicker.regional['de']);
});

View file

@ -0,0 +1,23 @@
/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
/* Written by Mathias Bynens <http://mathiasbynens.be/> */
jQuery(function($){
$.datepicker.regional['nl'] = {
closeText: 'Sluiten',
prevText: '←',
nextText: '→',
currentText: 'Vandaag',
monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun',
'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
weekHeader: 'Wk',
dateFormat: 'dd-mm-yy',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''};
$.datepicker.setDefaults($.datepicker.regional['nl']);
});

16
public/javascripts/jquery-1.5.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,5 @@
/*!
* jQuery UI 1.8.9
* jQuery UI 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -7,7 +7,7 @@
*
* http://docs.jquery.com/UI
*/
(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.9",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.10",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
@ -16,7 +16,7 @@ d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c
c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
;/*!
* jQuery UI Widget 1.8.9
* jQuery UI Widget 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -31,7 +31,7 @@ this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetNa
widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
;/*!
* jQuery UI Mouse 1.8.9
* jQuery UI Mouse 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -48,7 +48,7 @@ this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return tr
return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&c.data(a.target,this.widgetName+".preventClickEvent",
true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
;/*
* jQuery UI Position 1.8.9
* jQuery UI Position 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -64,7 +64,7 @@ d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a)
a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
;/*
* jQuery UI Draggable 1.8.9
* jQuery UI Draggable 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -96,7 +96,7 @@ f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent
if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/
b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-
this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=
this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.9"});
this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.10"});
d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable");if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=
0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=
c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,
@ -114,7 +114,7 @@ left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",
a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,
b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
;/*
* jQuery UI Droppable 1.8.9
* jQuery UI Droppable 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -133,14 +133,14 @@ a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var
this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.9"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.10"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
"none";if(c[f].visible){c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight};e=="mousedown"&&c[f]._activate.call(c[f],b)}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=
d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery);
;/*
* jQuery UI Resizable 1.8.9
* jQuery UI Resizable 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -165,29 +165,29 @@ d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop
this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;
f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",
b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=
a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,
k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"),
c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=
this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+
a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,
arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,
{version:"1.8.9"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,
function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=
(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=
false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-
a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",
b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top",
"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,
f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=
a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+
a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&
e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",
height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=
d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");
this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=
null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+
this.size.height,k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=
[c.css("borderTopWidth"),c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=
this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,
a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,
c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,
originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.10"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=
b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width",
"height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};
if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-
g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,
height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=
e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,
d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?
d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=
a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&
/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");
b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/
(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
;/*
* jQuery UI Selectable 1.8.9
* jQuery UI Selectable 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -207,9 +207,9 @@ c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){va
this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.9"})})(jQuery);
e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.10"})})(jQuery);
;/*
* jQuery UI Sortable 1.8.9
* jQuery UI Sortable 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -267,9 +267,9 @@ this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(
this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",
g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||
this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,
originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.9"})})(jQuery);
originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.10"})})(jQuery);
;/*
* jQuery UI Accordion 1.8.9
* jQuery UI Accordion 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -294,12 +294,12 @@ if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.ac
if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(),
e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight||
e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",
tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.9",animations:{slide:function(a,b){a=
tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.10",animations:{slide:function(a,b){a=
c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);f[i]={value:j[1],
unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",paddingTop:"hide",
paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
;/*
* jQuery UI Autocomplete 1.8.9
* jQuery UI Autocomplete 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -312,25 +312,25 @@ paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",
* jquery.ui.widget.js
* jquery.ui.position.js
*/
(function(d){d.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,f;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){f=false;var e=d.ui.keyCode;
switch(c.keyCode){case e.PAGE_UP:a._move("previousPage",c);break;case e.PAGE_DOWN:a._move("nextPage",c);break;case e.UP:a._move("previous",c);c.preventDefault();break;case e.DOWN:a._move("next",c);c.preventDefault();break;case e.ENTER:case e.NUMPAD_ENTER:if(a.menu.active){f=true;c.preventDefault()}case e.TAB:if(!a.menu.active)return;a.menu.select(c);break;case e.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=
null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(f){f=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||
"body",b)[0]).mousedown(function(c){var e=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(g){g.target!==a.element[0]&&g.target!==e&&!d.ui.contains(e,g.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,e){e=e.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:e})&&/^key/.test(c.originalEvent.type)&&a.element.val(e.value)},selected:function(c,e){var g=e.item.data("item.autocomplete"),
h=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=h;setTimeout(function(){a.previous=h;a.selectedItem=g},1)}false!==a._trigger("select",c,{item:g})&&a.element.val(g.value);a.term=a.element.val();a.close(c);a.selectedItem=g},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");
this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,f;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,e){e(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source===
"string"){f=this.options.source;this.source=function(c,e){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:f,data:c,dataType:"json",success:function(g,h,i){i===a.xhr&&e(g);a.xhr=null},error:function(g){g===a.xhr&&e([]);a.xhr=null}})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},_search:function(a){this.pending++;
this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==
(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){g=false;var f=d.ui.keyCode;
switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=
null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||
"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&&a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),
i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");
this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source===
"string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},
_search:function(a){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==
this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position))},
_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var f=this;d.each(b,function(c,e){f._renderItem(a,e)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);
else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(a,b){var f=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return f.test(c.label||c.value||c)})}})})(jQuery);
(function(d){d.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(d(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
-1).mouseenter(function(b){a.activate(b,d(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var f=b.offset().top-this.element.offset().top,c=this.element.attr("scrollTop"),e=this.element.height();if(f<0)this.element.attr("scrollTop",c+f);else f>=e&&this.element.attr("scrollTop",c+f-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})},
deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,f){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);
a.length?this.activate(f,a):this.activate(f,this.element.children(b))}else this.activate(f,this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active||this.last())this.activate(a,this.element.children(".ui-menu-item:first"));else{var b=this.active.offset().top,f=this.element.height(),c=this.element.children(".ui-menu-item").filter(function(){var e=d(this).offset().top-b-f+d(this).height();return e<10&&e>-10});c.length||(c=this.element.children(".ui-menu-item:last"));this.activate(a,
c)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(".ui-menu-item:last"));else{var b=this.active.offset().top,f=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-b+f-d(this).height();return c<10&&c>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
this.activate(a,result)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})})(jQuery);
_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var g=this;d.each(b,function(c,f){g._renderItem(a,f)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);
else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery);
(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.attr("scrollTop"),c=this.element.height();if(b<0)this.element.attr("scrollTop",g+b);else b>=c&&this.element.attr("scrollTop",g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},
deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);
e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,
g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(e){this._trigger("selected",e,{item:this.active})}})})(jQuery);
;/*
* jQuery UI Button 1.8.9
* jQuery UI Button 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -342,20 +342,21 @@ this.activate(a,result)}else this.activate(a,this.element.children(".ui-menu-ite
* jquery.ui.core.js
* jquery.ui.widget.js
*/
(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,e=a([]);if(c)e=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return e};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",e="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(e)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var f=b.element[0];h(f).not(f).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(f){if(c.disabled)return false;if(f.keyCode==a.ui.keyCode.SPACE||f.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(f){f.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,f=a([]);if(c)f=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return f};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",f="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(f)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var e=b.element[0];h(e).not(e).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(e){if(c.disabled)return false;if(e.keyCode==a.ui.keyCode.SPACE||e.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("label[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=
this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle||
this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary");
this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},
destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery);
c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){e.push(f?"ui-button-icons-only":"ui-button-icon-only");
b.removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,
arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");
a.Widget.prototype.destroy.call(this)}})})(jQuery);
;/*
* jQuery UI Dialog 1.8.9
* jQuery UI Dialog 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -389,13 +390,13 @@ h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c
l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");
break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e=
this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&&
this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.9",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===
this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.10",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===
0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,
function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
;/*
* jQuery UI Slider 1.8.9
* jQuery UI Slider 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -426,9 +427,9 @@ this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui
return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<=this._valueMin())return this._valueMin();if(b>=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate);
if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1,
1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.9"})})(jQuery);
1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.10"})})(jQuery);
;/*
* jQuery UI Tabs 1.8.9
* jQuery UI Tabs 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -460,10 +461,10 @@ if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this
this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.9"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.10"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
;/*
* jQuery UI Datepicker 1.8.9
* jQuery UI Datepicker 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -478,7 +479,7 @@ a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow"
"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function E(a,b){d.extend(a,b);for(var c in b)if(b[c]==
null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.9"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();
null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.10"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();
f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&
b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==
@ -502,10 +503,10 @@ c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":
d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",
function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=
-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,
"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},
_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-
g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?
b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},
"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),
parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,
b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);
this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},
_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):
0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=
false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=
@ -538,13 +539,13 @@ o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e
l)?"&#xa0;":""));a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+
a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";if(d.browser.mozilla)k+='<select class="ui-datepicker-year"><option value="'+c+'" selected="selected">'+c+"</option></select>";else{k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?"&#xa0;":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=
a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,
"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));
return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.9";window["DP_jQuery_"+y]=d})(jQuery);
function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,
[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.10";window["DP_jQuery_"+y]=d})(jQuery);
;/*
* jQuery UI Progressbar 1.8.9
* jQuery UI Progressbar 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -558,9 +559,9 @@ return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].
*/
(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*
this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.9"})})(jQuery);
this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.10"})})(jQuery);
;/*
* jQuery UI Effects 1.8.9
* jQuery UI Effects 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -577,7 +578,7 @@ a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number
211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
d){if(f.isFunction(b)){d=b;b=null}return this.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=h.splice(h.length-1,1)[0];
h.splice(1,0,l);f.dequeue(this)})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,
a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.9",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,
a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.10",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,
a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",
border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);
return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments);
@ -590,7 +591,7 @@ g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*
h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,
a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
;/*
* jQuery UI Effects Blind 1.8.9
* jQuery UI Effects Blind 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -604,7 +605,7 @@ a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(
(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,
g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
;/*
* jQuery UI Effects Bounce 1.8.9
* jQuery UI Effects Bounce 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -619,7 +620,7 @@ g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.deq
3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
;/*
* jQuery UI Effects Clip 1.8.9
* jQuery UI Effects Clip 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -633,7 +634,7 @@ b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=
(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,
c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
;/*
* jQuery UI Effects Drop 1.8.9
* jQuery UI Effects Drop 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -647,7 +648,7 @@ c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,
(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e==
"show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
;/*
* jQuery UI Effects Explode 1.8.9
* jQuery UI Effects Explode 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -662,7 +663,7 @@ c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,
0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
;/*
* jQuery UI Effects Fade 1.8.9
* jQuery UI Effects Fade 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -675,7 +676,7 @@ e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.m
*/
(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
;/*
* jQuery UI Effects Fold 1.8.9
* jQuery UI Effects Fold 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -689,7 +690,7 @@ e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.m
(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],
10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
;/*
* jQuery UI Effects Highlight 1.8.9
* jQuery UI Effects Highlight 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -703,7 +704,7 @@ e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.m
(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
;/*
* jQuery UI Effects Pulsate 1.8.9
* jQuery UI Effects Pulsate 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -717,7 +718,7 @@ this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments
(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
;/*
* jQuery UI Effects Scale 1.8.9
* jQuery UI Effects Scale 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -737,7 +738,7 @@ a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["
child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,
n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
;/*
* jQuery UI Effects Shake 1.8.9
* jQuery UI Effects Shake 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -751,7 +752,7 @@ n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a
(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=
(h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
;/*
* jQuery UI Effects Slide 1.8.9
* jQuery UI Effects Slide 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -765,7 +766,7 @@ n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a
(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);
var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
;/*
* jQuery UI Effects Transfer 1.8.9
* jQuery UI Effects Transfer 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Before After
Before After

View file

@ -1,5 +1,5 @@
/*
* jQuery UI CSS Framework 1.8.9
* jQuery UI CSS Framework 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -42,7 +42,7 @@
/*
* jQuery UI CSS Framework 1.8.9
* jQuery UI CSS Framework 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -293,7 +293,7 @@
/* Overlays */
.ui-widget-overlay { background: #5c5c5c url(images/ui-bg_flat_50_5c5c5c_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); }
.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; background: #cccccc url(images/ui-bg_flat_30_cccccc_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
* jQuery UI Resizable 1.8.9
* jQuery UI Resizable 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -312,7 +312,7 @@
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
* jQuery UI Selectable 1.8.9
* jQuery UI Selectable 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -322,7 +322,7 @@
*/
.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
/*
* jQuery UI Accordion 1.8.9
* jQuery UI Accordion 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -341,7 +341,7 @@
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
.ui-accordion .ui-accordion-content-active { display: block; }
/*
* jQuery UI Autocomplete 1.8.9
* jQuery UI Autocomplete 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -355,7 +355,7 @@
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
/*
* jQuery UI Menu 1.8.9
* jQuery UI Menu 1.8.10
*
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -394,7 +394,7 @@
margin: -1px;
}
/*
* jQuery UI Button 1.8.9
* jQuery UI Button 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -432,7 +432,7 @@ input.ui-button { padding: .4em 1em; }
/* workarounds */
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
/*
* jQuery UI Dialog 1.8.9
* jQuery UI Dialog 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -453,7 +453,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
.ui-draggable .ui-dialog-titlebar { cursor: move; }
/*
* jQuery UI Slider 1.8.9
* jQuery UI Slider 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -476,7 +476,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
* jQuery UI Tabs 1.8.9
* jQuery UI Tabs 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -494,7 +494,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
.ui-tabs .ui-tabs-hide { display: none !important; }
/*
* jQuery UI Datepicker 1.8.9
* jQuery UI Datepicker 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
@ -561,7 +561,7 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad
width: 200px; /*must have*/
height: 200px; /*must have*/
}/*
* jQuery UI Progressbar 1.8.9
* jQuery UI Progressbar 1.8.10
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.

View file

@ -16,7 +16,7 @@ img {
border:0;
}
#navcontainer, #input_box, #footer, .big-box, .refresh, .badge, h1, .icon, #minilinks, .defer-container, .menu_sort, .position, .buttons, .sf-item-menu, .container_toggle {
#navcontainer, #input_box, #footer, .big-box, .refresh, .badge, h1, .icon, #minilinks, .defer-container, .menu_sort, .position, .buttons, .sf-item-menu, .container_toggle, .grip, .show_notes, .recurring_icon {
display:none;
}
@ -48,7 +48,8 @@ a, p, blockquote, ul, li, ol, dt, dd, dl, table {
}
.description {
margin-left: 12pt;
margin-left: 18pt;
line-height: 150%
}
ul {

View file

@ -2,7 +2,7 @@
/* @override http://0.0.0.0:3000/stylesheets/standard.css?1180885851 */
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td {
div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td {
margin:0;
padding:0;
}
@ -342,10 +342,52 @@ div#input_box {
#input_box ul {list-style-type: circle; font-size: 0.9em;}
.show_from_input, .due_input, .project_input, .context_input {
#input_box ul#predecessor_ul {
list-style-type: none;
color: 0;
}
.show_from_input, .due_input, .project_input, .context_input,
.predecessor_input {
float:left;
}
#input_box input.pred_remove_button {
width:1.3em;
}
.selected_predecessors {
clear:right;
}
form.new_todo_form ul.predecessor_list,
form.edit_todo_form ul.predecessor_list {
color: #999;
font-size: 0.8em;
padding: 0 0 5pt 0;
}
form.edit_todo_form ul.predecessor_list {
color: black;
}
ul.predecessor_list li {
padding: 0 0;
}
/* deleting dependency from new form of a todo */
img.icon_delete_dep {width: 10px; background-image: url(../images/icon_delete.png); background-repeat: no-repeat; background-position: -9px 0; border: none; color:black;}
a:hover img.icon_delete_dep {width: 10px; background-image: url(../images/icon_delete.png); background-repeat: no-repeat; background-position: 0 0; border: none; color:black; background-color: black;}
a.icon_delete_dep:hover {width: 10px; background-color: black;}
/* deleting dependency from edit form of a todo */
form.edit_todo_form a.icon_delete_dep:hover { background-color: #cccccc;}
form.edit_todo_form a:hover img.icon_delete_dep { background-color: #cccccc; }
/* delete button for deleting a dep from the tree of a todo */
a.delete_dependency_button:hover {background-color: white;}
.box {
float: left;
width: 20px;
@ -379,8 +421,8 @@ input.item-checkbox {
vertical-align: middle;
}
.rec_description, .description, .stale_l1, .stale_l2, .stale_l3 {
margin-left: 60px;
.rec_description, .description {
margin-left: 80px;
position:relative;
}
@ -941,6 +983,7 @@ div.message {
.grip {
cursor: move;
float: left;
}
.drop_target {

View file

@ -7,7 +7,7 @@ describe ProjectsController do
projects = mock(:project_list, :build => project,
:active => mock(:meh, :count => 0), :size => 0)
user = mock_model(User, :projects => projects, :prefs => {},
user = mock_model(User, :projects => projects, :prefs => mock(:locale => :en),
:contexts => mock(:context_list, :find => []))
controller.stub!(:current_user).and_return(user)
controller.stub!(:login_required).and_return(true)

View file

@ -9,4 +9,13 @@ Factory.define :context do |c|
c.sequence(:name) { |n| "testcontext#{n}" }
c.hide false
c.created_at Time.now.utc
end
end
Factory.define :project do |p|
p.sequence(:name) { |n| "testproject#{n}" }
end
Factory.define :todo do |t|
t.sequence(:description) { |n| "testtodo#{n}" }
t.association :context
end

View file

@ -129,23 +129,27 @@ describe Todo do
describe 'when update_state_from_project is called' do
it "should unhide when project is active" do
project = mock_model(Project, :hidden? => false)
todo = Todo.new(:state => 'project_hidden', :project => project)
project = Factory.create(:project)
todo = Factory.create(:todo, :project => project, :state => 'project_hidden')
todo.hide!
todo.should be_project_hidden
todo.update_state_from_project
todo.should be_active
end
it "should unhide when project is null" do
todo = Todo.new(:state => 'project_hidden', :project => nil)
todo = Factory.create(:todo, :project => nil)
todo.hide!
todo.should be_project_hidden
todo.update_state_from_project
todo.should be_active
end
it "should hide when project is hidden" do
project = mock_model(Project, :hidden? => true)
todo = Todo.new(:state => 'active', :project => project)
project = Factory.create(:project)
project.hide!
todo = Factory.create(:todo, :project => project)
todo.should be_active
todo.update_state_from_project
todo.should be_project_hidden

View file

@ -1,33 +0,0 @@
require File.dirname(__FILE__) + '/../../spec_helper'
describe "/todos/_toggle_notes.rhtml" do
# include ControllerHelper
before :each do
@item = mock_model(Todo, :notes => "this is a note")
@controller.template.stub!(:set_default_external!)
end
it "should render" do
render :partial => "/todos/toggle_notes", :object => @item
response.should have_tag("div.todo_notes")
end
it "should auto-link URLs" do
@item.stub!(:notes).and_return("http://www.google.com/")
render :partial => "/todos/toggle_notes", :object => @item
response.should have_tag("a[href=\"http://www.google.com/\"]")
end
it "should auto-link embedded URLs" do
@item.stub!(:notes).and_return("this is cool: http://www.google.com/")
render :partial => "/todos/toggle_notes", :object => @item
response.should have_tag("a[href=\"http://www.google.com/\"]")
end
it "should parse Textile URLs correctly" do
@item.stub!(:notes).and_return("\"link\":http://www.google.com/")
render :partial => "/todos/toggle_notes", :object => @item
response.should have_tag("a[href=\"http://www.google.com/\"]")
end
end

View file

@ -8,4 +8,4 @@ click "submit_todo_12"
wait_for_element_not_present "css=#c1 #todo_12"
wait_for_visible "c4"
wait_for_visible "css=#c4 #todo_12"
assert_not_visible "c4empty-nd"
wait_for_not_visible "c4empty-nd"

View file

@ -5,5 +5,5 @@ assert_context_count_incremented do
type "todo_description", "a new action"
type "todo_context_name", "Brand new context"
click "css=#todo-form-new-action .submit_box button"
assert_confirmation "New context \"Brand new context\" will be also created. Are you sure?"
assert_confirmation "New context 'Brand new context' will be also created. Are you sure?"
end

View file

@ -6,5 +6,5 @@ assert_context_count_incremented do
type "todo_project_name", "pppp"
type "todo_context_name", "cccc"
click "css=#todo-form-new-action .submit_box button"
assert_confirmation "New context \"cccc\" will be also created. Are you sure?"
assert_confirmation "New context 'cccc' will be also created. Are you sure?"
end

View file

@ -5,5 +5,5 @@ assert_context_count_incremented do
type "todo_description", "a new action"
type "todo_context_name", "Brand new context"
click "css=#todo-form-new-action .submit_box button"
assert_confirmation "New context \"Brand new context\" will be also created. Are you sure?"
assert_confirmation "New context 'Brand new context' will be also created. Are you sure?"
end

View file

@ -1,8 +1,8 @@
setup :fixtures => :all
login :as => 'admin'
open "/"
wait_for_element_present '//div[@id="line_todo_5"]//img[@alt="Defer 1 day"]/..'
click '//div[@id="line_todo_5"]//img[@alt="Defer 1 day"]/..'
wait_for_element_present '//div[@id="line_todo_5"]//img[@alt="Defer one day"]/..'
click '//div[@id="line_todo_5"]//img[@alt="Defer one day"]/..'
wait_for_element_not_present "todo_5"
assert_text 'badge_count', '10'
wait_for_not_visible "c5"

View file

@ -3,4 +3,4 @@ login :as => 'admin'
open '/'
click "xpath=//div[@id='completed_container'] //div[@id='todo_3'] //input[@class='item-checkbox']"
wait_for_element_present "xpath=//div[@id='c4'] //div[@id='todo_3']"
assert_not_visible "c4empty-nd"
wait_for_not_visible "c4empty-nd"

View file

@ -1,18 +0,0 @@
setup :fixtures => :all
login :as => 'admin'
open '/m'
wait_for_text 'css=h1 span.count', '11'
click_and_wait "link=0-New action"
type "todo_notes", "test notes"
type "todo_description", "test name"
select "todo_context_id", "label=call"
select "todo_project_id", "label=Make more money than Billy Gates"
select "todo_due_3i", "label=1"
select "todo_due_2i", "label=January"
select "todo_due_1i", "label=2011"
click_and_wait "//input[@value='Create']"
wait_for_text 'css=h1 span.count', '12'

View file

@ -1,13 +0,0 @@
setup :fixtures => :all
login :as => 'admin'
open '/m'
wait_for_text 'css=h1 span.count', '11'
open '/todos/6.m'
wait_for_page_to_load 3000
click "done"
click_and_wait "//input[@value='Update']"
wait_for_text 'css=h1 span.count', '10'

View file

@ -1,35 +0,0 @@
setup :fixtures => :all
login :as => 'admin'
# open home page
open '/m'
wait_for_title "All actions"
wait_for_text 'css=h1 span.count', '11'
# open context page
click_and_wait "link=2-Contexts"
# verify_title "All actions in context agenda"
# choose agenda context
click_and_wait "link=agenda"
wait_for_text 'css=h1 span.count', '6'
# click on tag foo to go to tag page
click_and_wait "link=foo"
verify_title "TRACKS::Tagged with 'foo'"
wait_for_text 'css=h1 span.count', '2'
click_and_wait "link=3-Projects"
wait_for_text 'css=h1 span.count', '3'
click_and_wait "link=Build a working time machine"
wait_for_text 'css=h1 span.count', '3'
# follow link of action to edit form and mark done
click_and_wait "link=Select Delorean model"
click "done"
click_and_wait "//input[@value='Update']"
wait_for_text 'css=h1 span.count', '2'
# just test the navigation.
click_and_wait "link=Tickler"
wait_for_text 'css=h1 span.count', '1'
click_and_wait "link=Feeds"

View file

@ -8,5 +8,5 @@ click "submit_todo_15"
wait_for_element_not_present "css=#c6 #todo_15"
wait_for_visible "c5"
wait_for_visible "css=#c5 #todo_15"
assert_not_visible "c5empty-nd"
wait_for_not_visible "c5empty-nd"
wait_for_not_visible "c6"

View file

@ -7,7 +7,7 @@ assert_context_count_incremented do
type "todo_project_name", "None"
type "todo_show_from", "1/1/2030"
click "css=#todo-form-new-action .submit_box button"
assert_confirmation "New context \"errands\" will be also created. Are you sure?"
assert_confirmation "New context 'errands' will be also created. Are you sure?"
end
wait_for_not_visible "tickler-empty-nd"
wait_for_element_present "css=div.item-container a[title=01/01/2030]"

Some files were not shown because too many files have changed in this diff Show more