GBrowse

 view release on metacpan or  search on metacpan

htdocs/js/controller.js  view on Meta::CPAN

        this.each_track(track_id,function(gbtrack) {

            new Ajax.Request(Controller.url,{
                method:     'post',
                parameters: {
                    action:     'set_track_visibility',
                    visible:    visible,
                    track_name: track_name
                },
                onSuccess: function(transport) {
                    if (visible && gbtrack.get_last_update_key() == null || gbtrack.get_last_update_key() < Controller.last_update_key) {
                        Controller.rerender_track(gbtrack.track_id);
                    }
                }
            });
        });
    },

    // Kick-off Render Methods ****************************************
    reload_panels:  // called only to reload a snapshot
	function (segment_info) {
	    if (segment_info != null) {
		this.segment_info = segment_info;
	    }

	    new Ajax.Request(Controller.url,{
		    method: 'post',
		    parameters: {
			action: 'render_panels'
		    },
		    onSuccess: function(transport) { 
			$('panels').innerHTML = transport.responseText;
			$('panels').innerHTML.evalScripts();
			var color = overviewObject.background;
			var unit  = overviewObject.unit;
			var divider = overviewObject.divider;
			['overview','region','detail'].each(function(e) {
				    var m = $(e+'SelectMenu');
				    if (m) m.remove();
			    });
			this.initialize_page();
			set_dragcolors(color);
			set_dragunits(unit,divider);
		    }
		});
	    
	}, //end render_panels()

    update_coordinates:
    function (action, snapshot) {
	if (snapshot == null){
		snapshot = false;
	}
	
        // submit search form if the detail panel doesn't exist
        if ( null == $(detail_container_id) ){
            document.searchform.force_submit.value = 1; 
            document.searchform.submit(); 
        }

        this.busy();

        TrackPan.grey_out_markers();
        $('ruler_handle').setOpacity(0.3);
        $('detail_scale_scale').setOpacity(0.3);

        //Grey out image
        this.each_track(function(gbtrack) {
            if ($(gbtrack.track_image_id) != null)
                $(gbtrack.track_image_id).setOpacity(0.3);
            //  else
            //  alert('REPORT THIS BUG: element '+gbtrack.track_image_id+' should not be null');
        });

        new Ajax.Request(Controller.url, {
            method:     'post',
            parameters: {
                action:     'navigate',  // 'action'   triggers an async call
                navigate:   action,      // 'navigate' is an argument passed to the async routine
                view_start: Math.round(TrackPan.get_start()),
                view_stop:  Math.round(TrackPan.get_stop()),
		snapshot:   snapshot // Is true when a snapshot is being loaded, and false otherwise
            },
            onSuccess: function(transport) {
                var results                 = transport.responseJSON;
                Controller.segment_info     = results.segment_info;
                var track_keys              = results.track_keys;
                var overview_scale_bar_hash = results.overview_scale_bar;
                var region_scale_bar_hash   = results.region_scale_bar;
                var detail_scale_bar_hash   = results.detail_scale_bar;
                Controller.set_last_update_keys(track_keys);

                if (overview_scale_bar_hash) {
                    Controller.update_scale_bar(overview_scale_bar_hash);
                    $('overview_panels').setStyle({width: overview_scale_bar_hash.width+'px'});
                }
                if (region_scale_bar_hash) {
                    Controller.update_scale_bar(region_scale_bar_hash);
                    $('region_panels').setStyle({width: region_scale_bar_hash.width+'px'});
                }
                if (detail_scale_bar_hash) {
                    Controller.update_scale_bar(detail_scale_bar_hash);
                    $('detail_panels').setStyle({width: detail_scale_bar_hash.view_width+'px'});

                    var detail_width         = Controller.segment_info.detail_width;
                    var details_pixel_ratio  = Controller.segment_info.details_pixel_ratio;
                    var scale_width          = Math.round(detail_scale_bar_hash.scale_size / details_pixel_ratio) - 1;
                    var scale_left           = Math.round((Controller.segment_info.overview_width - scale_width) / 2) - 30;

                    var scale_div = $("detail_scale_scale");
                    if (scale_div) {
                        scale_div.innerHTML = detail_scale_bar_hash.scale_label + 
                            "<span style='display: inline-block; margin-left:5px; margin-bottom:4px; border-left: 1px solid black; border-right: 1px solid black; height:8px'>" +
                            "<span style='display: inline-block; border-bottom: 1px solid black; height: 4px; width:" + scale_width + "px'</span></span>";
                        $('ruler_handle').setOpacity(1);
                        scale_div.setOpacity(1);
                        scale_div.setStyle({ left: scale_left+'px' });
                    }
                }
                // Update the segment sections
                Controller.update_sections( Controller.segment_observers.keys());
                $('details_msg').innerHTML = results.details_msg;
                Controller.get_multiple_tracks(track_keys);
                TrackPan.make_details_draggable();
                if (results.display_details == 0)
                    Controller.hide_detail_tracks();
            } // end onSuccess
        }); // end Ajax.Request
    }, // end update_coordinates

    refresh_tracks: 
	function (snapshot) {
	    // The snapshot flag indicates that a snapshot is being loaded and refreshes the tracks accordingly
	    Controller.update_coordinates('left 0', snapshot);
	}, // end refresh_tracks

    scroll:
    function (direction,length_units) {
        if (!TrackPan.scroll(direction,length_units)) {
            var view_length = (parseInt(Controller.segment_info.detail_stop) - parseInt(Controller.segment_info.detail_start)) / parseFloat(Controller.segment_info.details_mult);
            this.update_coordinates(direction + ' ' + Math.round(length_units*view_length));
        }
    }, // end scroll

    add_track:
    function(track_name, onSuccessFunc, force) {
        var track_names = new Array(track_name);
        this.add_tracks(track_names,onSuccessFunc,force);
    },

    add_tracks:
    function(track_names, onSuccessFunc, force, onTop) {
        if (force == null)
            force = false;
        var request_str = "action=add_tracks";
        var found_track = false;
	track_names.reverse();
        for (var i = 0; i < track_names.length; i++) {
            var track_name = track_names[i];
		
            if ( force || !this.track_exists(track_name) ) {
                request_str += "&track_names="+encodeURIComponent(track_name);
                found_track = true;
            }
        }
	//track_names.reverse();
        if (!found_track) return false;
	
        this.busy();

        new Ajax.Request(Controller.url, {
            method:     'post',
            parameters: request_str,
            onSuccess: function(transport) {
                if (onSuccessFunc!=null)
                    onSuccessFunc();
                var results    = transport.responseJSON;
                var track_data = results.track_data;
                var track_keys = new Object();
                var get_tracks = false;

		//		for (var i = 0; i < track_names.length; i++) {
		// var ret_track_id = track_names[i];	
                for (var ret_track_id in track_data) {

                    if (Controller.gbtracks.get(ret_track_id) != null)
                        continue; //oops already know this one

                    var this_track_data = track_data[ret_track_id];
                    var ret_gbtrack     = Controller.register_track (
                        ret_track_id,
                        this_track_data.track_name,
                        'standard',
                        this_track_data.track_section
                    );

                    Controller.set_last_update_key(ret_gbtrack)
                    var html           = this_track_data.track_html;
                    var panel_id       = this_track_data.panel_id;

                    //Controller.append_child_from_html(html,$(panel_id),onTop);
		    // force true - experimental
		    Controller.append_child_from_html(html,$(panel_id),true);
		
                    if (this_track_data.display_details == 0) {
                        $(ret_gbtrack.track_image_id).setOpacity(0);
                    } else {
                        track_keys[ret_track_id]=this_track_data.track_key;
                        get_tracks = true;
                    }
                } // end for (var ret_track_name...
                if( get_tracks)
                    Controller.get_multiple_tracks(track_keys);
                else
                    Controller.idle();
            }
        });
        return true;
    },

    busy:
    function() {
        var bi = $('busy_indicator');
        var top  = document.body.scrollTop||document.documentElement.scrollTop;
        bi.style.top  =5+"px";
        bi.style.left =5+"px";
        bi.show();
    },

    idle:
    function() {
        var bi = $('busy_indicator');
        bi.hide();
    },

    rerender_track:
    function(track_id,scroll_there,nocache) {
        if (scroll_there == null)
            scroll_there = false;
        if (nocache == null)
            nocache = false;

        this.busy();

        this.each_track(track_id,function(gbtrack) {
            $(gbtrack.track_image_id).setOpacity(0.3);
            Controller.set_last_update_key(gbtrack);

            new Ajax.Request(Controller.url,{
                method:     'post',
                parameters: {
                    action:          'rerender_track',
                    track_id:        gbtrack.track_id,
                    nocache:         nocache ? 1 : 0
                },
                onSuccess: function(transport) {
                    var results    = transport.responseJSON;
                    var track_keys = results.track_keys;
                    if (results.display_details == 0) {
                        $(gbtrack.track_image_id).setOpacity(0);
                    } else {
                        time_key = create_time_key();
                        for (var track_id in track_keys) {
                            Controller.retrieve_tracks.set(gbtrack.track_id,true);
                            Controller.ret_track_time_key.set(gbtrack.track_id,time_key);
                        } // end for
                        Controller.get_remaining_tracks(track_keys,1000,1.1,time_key);
                    } 
                    if (scroll_there)
                        new Effect.ScrollTo(gbtrack.track_div_id,{queue: 'end'});
                } // end onSuccess
            }); // end Ajax.Request
        }); //end each_track()
    }, // end rerender_track

    scroll_to_matching_track:
    function scroll_to_matching_track(partial_name) {
        var tracks = $$('span.titlebar');
        var first_track = tracks.find(function(n) {
            var result = n.id.include(partial_name)
            && n.visible();
            return result;
        });
        if (first_track != null) {
	    new Effect.ScrollTo(first_track,
				{  queue:'end' }
				);
        }
    },

    delete_track:
    function(track_name) {
        this.each_track(track_name,function(gb) {
            Controller.unregister_track(gb.track_name);
            actually_remove(gb.track_div_id);
        });
    }, // end delete_track

    // Retrieve Rendered Track Methods ********************************
  
    get_multiple_tracks:
    function (track_keys) {

        time_key = create_time_key();
        $H(track_keys).keys().each( 
            function(track_id) {
                Controller.retrieve_tracks.set(track_id,true);
                Controller.ret_track_time_key.set(track_id,time_key);
            }
        );

        this.get_remaining_tracks(track_keys,1000,1.1,time_key);
    },

    // Time key is there to make sure separate calls don't trounce each other
    // Only Update if the tracks time_key matches the method's
    get_remaining_tracks:
    function (track_keys,time_out,decay,time_key){

        var track_ids = [];
        var finished = true;
        var track_key_str = '';
        this.busy();
        this.retrieve_tracks.keys().each(
            function(track_id) {
                if(Controller.retrieve_tracks.get(track_id)){
                    if (Controller.ret_track_time_key.get(track_id) == time_key){
                        track_ids.push(track_id);
                        track_key_str += '&tk_'+escape(track_id)+"="+track_keys[track_id];
                        finished = false;
                    }
                }
            }
        );

        if (finished) {
            this.idle();
            return;
        }

        new Ajax.Request(Controller.url, {
            method:     'post',
            parameters: $H({
                action:        'retrieve_multiple', 
                track_ids:     track_ids
            }).toQueryString() + track_key_str,
            onSuccess: function(transport) {
                var continue_requesting = false;
                var results             = transport.responseJSON;
                var track_html_hash     = results.track_html;
                for (var track_id in track_html_hash) {
                    track_html            = track_html_hash[track_id];

                    var gbtrack = Controller.gbtracks.get(track_id);
                    if (Controller.ret_track_time_key.get(track_id) == time_key){
                        track_div = document.getElementById(gbtrack.track_div_id);
                        if (track_html.substring(0,18) == "<!-- AVAILABLE -->"){
                            track_div.innerHTML = track_html;
                            gbtrack.track_resolved();
                            Controller.retrieve_tracks.set(track_id,false);
                        } else if (track_html.substring(0,16) == "<!-- EXPIRED -->") {
                            Controller.retrieve_tracks.set(track_id,false);
                            if (gbtrack.expired_count >= expired_limit){
                                $(gbtrack.track_image_id).setOpacity(0);
                            } else {
                                gbtrack.increment_expired_count();
                                Controller.rerender_track(track_id);
                            }
                        } else if (track_html.substring(0,14) == "<!-- ERROR -->") {
                            gbtrack.track_resolved();
                            Controller.retrieve_tracks.set(track_id,false);
                            track_div.innerHTML = track_html;
                        } else if (track_html.substring(0,16) == "<!-- DEFUNCT -->") {
                        gbtrack.track_resolved();
                        Controller.retrieve_tracks.set(track_id,false);
                        $(gbtrack.track_image_id).setOpacity(0);
                        } else {
                            continue_requesting = true;
                        }
                    }
                }
                if (continue_requesting) {
                    setTimeout( function() {



( run in 0.606 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )