var TracksForm = { toggle: function(toggleLinkId, formContainerId, formId, hideLinkText, hideLinkTitle, showLinkText, showLinkTitle) { form=$('#'+formContainerId) form.toggle(); toggleLink = $('#'+toggleLinkId); if (!form.is(':visible')) { toggleLink.text(showLinkText).attr('title', showLinkTitle); } else { toggleLink.text(hideLinkText).attr('title', hideLinkTitle); $('#'+formId+' input:text:first').focus(); } toggleLink.parent().toggleClass('hide_form'); }, hide_all_recurring: function () { $.each(['daily', 'weekly', 'monthly', 'yearly'], function(){ $('#recurring_'+this).hide(); }); }, hide_all_edit_recurring: function () { $.each(['daily', 'weekly', 'monthly', 'yearly'], function(){ $('#recurring_edit_'+this).hide(); }); }, toggle_overlay: function () { el = document.getElementById("overlay"); el.style.visibility = (el.style.visibility == "visible") ? "hidden" : "visible"; }, set_project_name: function (name) { $('input#todo_project_name').val(name); }, set_context_name_and_default_context_name: function (name) { $('input#todo_context_name').val(name); $('input[name=default_context_name]').val(name); }, set_project_name_and_default_project_name: function (name) { $('#default_project_name_id').val(name); $('input#todo_project_name').val(); $('#project_name').html(name); }, set_tag_list: function (name) { $('input#tag_list').val(name); }, show_errors: function (html) { $('div#error_status').html(html); $('div#error_status').show(); }, hide_errors: function () { $('div#error_status').hide(); } } /* TODO, refactor the following two objects into three without obvious duplication */ var ProjectListPage = { update_state_count: function(state, count) { $('#'+state+'-projects-count').html(count); }, update_all_states_count: function (active_count, hidden_count, completed_count) { $(["active", "hidden", "completed"]).each(function() { ProjectListPage.update_state_count(this, eval(this+'_count')); }); }, show_or_hide_all_state_containers: function (show_active, show_hidden, show_completed) { $(["active", "hidden", "completed"]).each(function() { ProjectListPage.set_state_container_visibility(this, eval('show_'+this)); }); }, set_state_container_visibility: function (state, set_visible) { if (set_visible) { $('#list-'+state+'-projects-container').slideDown("fast"); } else { $('#list-'+state+'-projects-container').slideUp("fast"); } } } var ContextListPage = { update_state_count: function(state, count) { $('#'+state+'-contexts-count').html(count); }, update_all_states_count: function (active_count, hidden_count, completed_count) { $(["active", "hidden"]).each(function() { ContextListPage.update_state_count(this, eval(this+'_count')); }); }, show_or_hide_all_state_containers: function (show_active, show_hidden, show_completed) { $(["active", "hidden"]).each(function() { ContextListPage.set_state_container_visibility(this, eval('show_'+this)); }); }, set_state_container_visibility: function (state, set_visible) { if (set_visible) { $('#list-'+state+'-contexts-container').slideDown("fast"); } else { $('#list-'+state+'-contexts-container').slideUp("fast"); } } } var IntegrationsPage = { setup_behavior: function () { $('#applescript1-contexts').live('change', function(){ $("#applescript1").load(relative_to_root('integrations/get_applescript1?context_id='+this.value)); }); $('#applescript2-contexts').live('change', function(){ $("#applescript2").load(relative_to_root('integrations/get_applescript2?context_id='+this.value)); }); $('#quicksilver-contexts').live('change', function(){ $("#quicksilver").load(relative_to_root('integrations/get_quicksilver_applescript?context_id='+this.value)); }); } } var NotesPage = { setup_behavior: function() { $('a.delete_note_button').live('click', function(evt){ evt.preventDefault(); if(confirm("Are you sure that you want to "+this.title+"?")){ $(this).parents('.project').block({message: null}); params = {_method: 'delete'}; $.post(this.href, params, null, 'script'); } }); } } $.fn.clearForm = function() { return this.each(function() { var type = this.type, tag = this.tagName.toLowerCase(); if (tag == 'form') return $(':input',this).clearForm(); if (type == 'text' || type == 'password' || tag == 'textarea') this.value = ''; else if (type == 'checkbox' || type == 'radio') this.checked = false; else if (tag == 'select') this.selectedIndex = -1; }); }; /**************************************** * Unobtrusive jQuery written by Eric Allen ****************************************/ /* Set up authenticity token properly */ $(document).ajaxSend(function(event, request, settings) { if ( settings.type == 'POST' || settings.type == 'post' ) { if(typeof(AUTH_TOKEN) != 'undefined'){ settings.data = (settings.data ? settings.data + "&" : "") + "authenticity_token=" + encodeURIComponent( AUTH_TOKEN ) + "&" + "_source_view=" + encodeURIComponent( SOURCE_VIEW ); } else { settings.data = (settings.data ? settings.data + "&" : "") + "_source_view=" + encodeURIComponent( SOURCE_VIEW ); } request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); } request.setRequestHeader("Accept", "text/javascript"); }); todoItems = { // public ensureVisibleWithEffectAppear: function(elemId){ $('#'+elemId).fadeIn(400); }, expandNextActionListing: function(itemsElem, skipAnimation) { itemsElem = $(itemsElem); if(skipAnimation == true) { itemsElem.show(); } else { itemsElem.show('blind', 400); } todoItems.showContainer(itemsElem.parentNode); }, collapseNextActionListing: function(itemsElem, skipAnimation) { itemsElem = $(itemsElem); if(skipAnimation == true) { itemsElem.hide(); } else { itemsElem.hide('blind', 400); } todoItems.hideContainer(itemsElem.parentNode); }, ensureContainerHeight: function(itemsElem) { $(itemsElem).css({height: '', overflow: ''}); }, expandNextActionListingByContext: function(itemsElemId, skipAnimation){ todoItems.expandNextActionListing($('#'+itemsElemId).get(), skipAnimation); }, // private buildCookieName: function(containerElem) { tracks_login = $.cookie('tracks_login'); return 'tracks_'+tracks_login+'_context_' + containerElem.id + '_collapsed'; }, showContainer: function(containerElem) { imgSrc = $(containerElem).find('.container_toggle img').attr('src'); $(containerElem).find('.container_toggle img').attr('src', imgSrc.replace('expand', 'collapse')); }, hideContainer: function (containerElem) { imgSrc = $(containerElem).find('.container_toggle img').attr('src'); $(containerElem).find('.container_toggle img').attr('src', imgSrc.replace('collapse', 'expand')); } } function redirect_to(path) { window.location.href = path; } function setup_container_toggles(){ // bind handlers $('.container_toggle').click(function(evt){ toggle_target = $(this.parentNode.parentNode).find('.toggle_target'); if(toggle_target.is(':visible')){ // hide it imgSrc = $(this).find('img').attr('src'); $(this).find('img').attr('src', imgSrc.replace('collapse', 'expand')); $.cookie(todoItems.buildCookieName(this.parentNode.parentNode), true); } else { // show it imgSrc = $(this).find('img').attr('src'); $(this).find('img').attr('src', imgSrc.replace('expand', 'collapse')); $.cookie(todoItems.buildCookieName(this.parentNode.parentNode), null); } toggle_target.toggle('blind'); }); // set to cookied state $('.container.context').each(function(){ if($.cookie(todoItems.buildCookieName(this))=="true"){ imgSrc = $(this).find('.container_toggle img').attr('src'); if (imgSrc) { $(this).find('.container_toggle img').attr('src', imgSrc.replace('collapse', 'expand')); $(this).find('.toggle_target').hide(); } } }); } function askIfNewContextProvided(source) { var givenContextName = $('#'+source+'todo_context_name').val(); var contextNames = []; var contextNamesRequest = $.ajax({url: relative_to_root('contexts.autocomplete'), async: false, dataType: "text", data: "q="+givenContextName, success: function(result){ lines = result.split("\n"); for(var i = 0; i < lines.length; i++){ contextNames.push(lines[i].split("|")[0]); } }}); if (givenContextName.length == 0) return true; // do nothing and depend on rails validation error for (var i = 0; i < contextNames.length; ++i) { if (contextNames[i] == givenContextName) return true; } return confirm('New context "' + givenContextName + '" will be also created. Are you sure?'); } function update_order(event, ui){ container = $(ui.item).parent(); row = $(ui.item).children('.sortable_row'); url = ''; if(row.hasClass('context')) url = relative_to_root('contexts/order'); else if(row.hasClass('project')) url = relative_to_root('projects/order'); else { console.log("Bad sortable list"); return; } $.post(url, container.sortable("serialize"), function(){row.effect('highlight', {}, 1000)}, 'script'); } /* Unobtrusive jQuery behavior */ function project_defaults(){ if($('body').hasClass('contexts')){ // don't change the context // see ticket #934 } else { if(defaultContexts[$(this).val()] !== undefined) { context_name = $(this).parents('form').find('input[name=context_name]'); if(context_name.attr('edited') === undefined){ context_name.val(defaultContexts[$(this).val()]); } } } if(defaultTags[$(this).val()] !== undefined) { tag_list = $(this).parents('form').find('input[name=tag_list]'); if(tag_list.attr('edited') === undefined){ tag_list.val(defaultTags[$(this).val()]); } } } function enable_rich_interaction(){ /* fix for #1036 where closing a edit form before the autocomplete was filled * resulted in a dropdown box that could not be removed. We remove all * autocomplete boxes the hard way */ $('.ac_results').remove(); $('input.Date').datepicker({'dateFormat': dateFormat, 'firstDay': weekStart, 'showAnim': 'fold'}); /* Autocomplete */ $('input[name=context_name]').autocomplete({ source: relative_to_root('contexts.autocomplete') }); /* $('input[name=project[default_context_name]]').autocomplete( relative_to_root('contexts.autocomplete'), {matchContains: true}); $('input[name=project_name]').autocomplete( relative_to_root('projects.autocomplete'), {matchContains: true}); $('input[name=tag_list]:not(.ac_input)').autocomplete( relative_to_root('tags.autocomplete'), {multiple: true,multipleSeparator:',',matchContains:true}); $('input[name=predecessor_list]:not(.ac_input)').autocomplete( relative_to_root('auto_complete_for_predecessor'), {multiple: true,multipleSeparator:','}); /* have to bind on keypress because of limitataions 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'); }); $('input[name=tag_list]').live('keypress', function(){ $(this).attr('edited', 'true'); }); /* Drag & Drop for successor/predecessor */ function drop_todo(evt, ui) { dragged_todo = ui.draggable[0].id.split('_')[2]; 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'); } function drag_todo(){ $('.drop_target').show(); $(this).parents(".container").find(".context_target").hide(); } $('.item-show').draggable({handle: '.grip', revert: 'invalid', start: drag_todo, stop: function() {$('.drop_target').hide();}}); $('.item-show').droppable({drop: drop_todo, tolerance: 'pointer', hoverClass: 'hover'}); /* Drag & drop for changing contexts */ function drop_todo_on_context(evt, ui) { target = $(this); dragged_todo = ui.draggable[0].id.split('_')[2]; context_id = this.id.split('_')[1]; ui.draggable.remove(); target.block({message: null}); setTimeout(function() {target.show()}, 0); $.post(relative_to_root('todos/change_context'), {"todo[id]": dragged_todo, "todo[context_id]": context_id}, function(){target.unblock(); target.hide();}, 'script'); } $('.context_target').droppable({ drop: drop_todo_on_context, tolerance: 'pointer', hoverClass: 'hover'}); /* Reset auto updater */ field_touched = false; $('h2#project_name').editable(save_project_name, {style: 'padding:0px', submit: "OK"}); } /* Auto-refresh */ function setup_auto_refresh(interval){ field_touched = false; function refresh_page() { if(!field_touched){ window.location.reload(); } } setTimeout(refresh_page, interval); $(function(){ $("input").live('keydown', function(){ field_touched = true; }); }); } function page_notify(type, message, fade_duration_in_sec) { flash = $('h4#flash'); flash.html("