
/**
 * Pubmed-class
 * @class Pubmed
 * @property {string} prefixdir Prefix for certain AJAX-loading -calls
 * @property {string} scopenotesvisibility Boolean-check for visibility of scopenotes
 * @property {array} abstracttextbackup Backup-array for abstracttexts
 * @property {array} currentlinktype Keeper of the linktypes
 */
function Pubmed(){

    /**
     * Earlier search strings
     * @type array
     */
    this.prefixdir = "pubmedslicer/";
    this.scopenotesvisibility= "visible";
	this.abstracttextbackup = new Array;
	this.currentlinktype = new Array;
    var that = this;
    
    
    /**
     * Searches PubMed using given parameters
     * @function searchPubmed
     * @param {string} searchstring
     * @param {string} source
     * @param {int} start
     * @param {boolean} onlyfreefulltext
     * @param {string} medlinesubset
     * @param {boolean} filterseenitems
     * @param {int} earliestyear
     * @param {int} latestyear
     * @param {string} standalone
     */
    this.searchPubmed = function(searchstring, source, start, onlyfreefulltext, medlinesubset, filterseenitems, earliestyear, latestyear, standalone){
    
        var pars = new Object();
        
        pars.restart = start;
        
        if (filterseenitems) 
            pars.filterseenitems = true;
        
        if (medlinesubset == "medline") 
            pars.medlinesubset = "medline";
        else 
            if (medlinesubset == "oldmedline") 
                pars.medlinesubset = "oldmedline";
            else 
                if (medlinesubset == "all") 
                    pars.medlinesubset = "all";
        
        if (onlyfreefulltext) 
            pars.onlyfreefulltext = true;
        
        pars.searchstring = escape(search.checkSearchstring(searchstring).replace(/\"/g, '#'));
        pars.action = "pubmeditemlist";
        pars.earliestyear = earliestyear;
        pars.latestyear = latestyear;
        pars.standalone = standalone;
        
        $('#pubmed_items').load(that.prefixdir + "loadcontent.php", pars);
        
    }
    
    /**
     * Toggles checkboxes of a area defined by target-parameter
     * @function toogleCheckboxes
     * @param {string} target
     */
    this.toggleCheckboxes = function(target){
    
        $(":checkbox[id^=" + target + "]").attr('checked', function(){
        
            var checked = this.checked;
            //		console.log(checked+" ");
            if (checked) 
                return "";
            else 
                return "checked";
            
        });
        
    };
    
    /**
     * Builds year-slider
     * @function buildSlider
     * @param {int} earliestyear
     * @param {int} latestyear
     */
    this.buildSlider = function(earliestyear, latestyear){
    
        $('#pubmed_yearrange').slider({
            min: earliestyear,
            max: latestyear,
            stepping: 1,
            range: true,
            slide: function(e, ui){
            
                var earliestyear = $('#pubmed_yearrange').slider('value', 0);
                var latestyear = $('#pubmed_yearrange').slider('value', 1);
                
                $('#pubmed_yearrange_text').html("Limit publishing years to be between" +
                " <span id=\"pubmed_earliestyear\">" +
                earliestyear +
                "</span> and" +
                " <span id=\"pubmed_latestyear\">" +
                latestyear +
                "</span>.");
                
                $("input[name=earliestyear]").val(earliestyear);
                $("input[name=latestyear]").val(latestyear);
                
            }
        });
        
        $('#pubmed_yearrange_text').html("Limit publishing years to be between" +
        " <span id=\"pubmed_earliestyear\">" +
        earliestyear +
        "</span> and" +
        " <span id=\"pubmed_latestyear\">" +
        latestyear +
        "</span>.");
        
    };
    
    /**
     * Destroys year-slider
     * @function destroySlider
     */
    this.destroySlider = function(){
    
        //	$('#'+sliderid).slider('moveTo', 1800, 0);
        //	$('#'+sliderid).slider('moveTo', 3000, 1);
        $('#pubmed_yearrange').slider('destroy');
        $("div .ui-slider-range").remove();
        
    };
    /*    
     this.changeSliders = function(medlinesubset, earliestyear, latestyear){
     
     if (medlinesubset == "medline") {
     
     $('#pubmed_slider1').show();
     $('#pubmed_slider2').hide();
     $('#pubmed_abstractrange1').show();
     $('#pubmed_abstractrange2').hide();
     
     }
     
     else if (medlinesel == "oldmedline") {
     
     $('#pubmed_slider1').hide();
     $('#pubmed_slider2').show();
     $('#pubmed_abstractrange1').hide();
     $('#pubmed_abstractrange2').show();
     
     }
     
     $('#pubmed_yearrange_text').html("Limit publishing years to be between" +
     "<span id=\"pubmed_earliestyear\">" + earliestyear + "</span> and" +
     "<span id=\"pubmed_latestyear\">" + latestyear + "</span>.");
     
     };
     */
    /**
     * Loads a single abstract having given pubmed id
     * @function loadSingleAbstarct
     * @param {int} abstractid
     */
    this.loadSingleAbstract = function(abstractid){
    
        $("#pubmed_singleitem").load(that.prefixdir + "loadcontent.php", {
            action: "loadsingleabstract",
            abstractid: abstractid
        });
        
    }
    
    /**
     * Loads multiple abstracts
     * @function loadMultipleAbstracts
     * @param {string} abstractids
     */
    this.loadMultipleAbstracts = function(abstractids){
    
        $("#pubmed_items").load(that.prefixdir + "loadcontent.php", {
            action: "loadmultipleabstracts",
            abstractids: abstractids,
            command: 'showbasket'
        });
        
    }
    
    /**
     * Loads related abstracts for a given pubmed id
     * @function loadAbstractRelated
     * @param {int} abstractid
     * @param {int} relatedid
     */
    this.loadAbstractRelated = function(abstractid, relatedid){
    
        el = $('#' + relatedid);
        
        if (el.text() == "") {
        
            el.load(that.prefixdir + "loadcontent.php", {
                action: "loadabstractrelated",
                abstractid: abstractid
            });
            
        }
        
    };
    
    /**
     * Loads LinkOuts for a given pubmed id
     * @function loadAbstractLinkouts
     * @param {int} abstractid
     * @param {int} relatedid
     */
    this.loadAbstractLinkouts = function(abstractid, linkoutsid){
    
        el = $('#' + linkoutsid);
        
        if (el.text() == "") {
        
            el.load(that.prefixdir + "loadcontent.php", {
                action: "loadabstractlinkouts",
                abstractid: abstractid
            });
            
        }
        
    }

    /**
     * Loads statistics
     * @function loadStatistics
     * @param {string} searchstring
     */
    this.loadStatistics = function(searchstring, type){

		$("#pubmed_items").empty();
		var stattype = new Array;
		stattype[0] = "stats 1 (test)"
		stattype[1] = "stats 2 (n/a)"
		stattype[2] = "stats 3 (n/a)"

		this.createTabsforStatistics(stattype);

		$('#stattabs > ul').tabs({selected: null, cache: true});
		$('#stattabs > ul').bind('tabsselect', function(event, ui) {

//			window.onunload = function()
//				location.href = "index.php?searchstring=" + searchstring + "&toolname=pubmedslicer&command=loadstatistics&type=" + ui.index;

			$(ui.panel).load(that.prefixdir + "loadcontent.php", {
	            action: "loadstatistics",
	            searchstring: escape(search.checkSearchstring(searchstring).replace(/\"/g, '#')),
	            type: ui.index
	        });

		});
		$('#stattabs > ul').tabs("select", type);
    }

    /**
     * Create tabs for statistics
     * @function createTabsforStatistics
     * @param {array} stattype
     */
    this.createTabsforStatistics = function(stattype){
	
		var stattabs = "";
		var statdivs = "";
		
		for (var i = 0; i<stattype.length; i++) {
		
			stattabs += "<li><a href='#pubmedstatstab-" + i + "'>" + stattype[i] + "</a></li>";
			statdivs += "<div id='pubmedstatstab-" + i + "'>content " + (i+1) + "</div>";
			
		}
		
		$("#pubmed_statistics").html("<div id='stattabs'><ul>" + stattabs + "</ul><br/>" + statdivs + "</div>");
		
	}
    
    /**
     * Creates MeSH-tree
     * @function createMeshTree
     */
    this.createMeshTree = function(){
    
        var tree;
        tree = new dhtmlXTreeObject("meshtree", "100%", "100%", 'meshtreeroot');
        tree.setImagePath("js/imgs/");
        tree.setXMLAutoLoading(that.prefixdir + "loadcontent.php?action=loadmeshtree");
        tree.setOnClickHandler(function(nodeid){
        
            addAfter(nodeid, tree.getItemText(nodeid), 'mh', 'mesh');
            
        });
        tree.enableAutoTooltips(true);
        tree.enableDHTMLXTooltips(true);
        tree.loadXML(prefixdir + "loadcontent.php?action=loadmeshtree&id=meshtreeroot");
        
    }
    
    /**
     * Toggle visibility of PubMed -search form
     * @function togglePubMedSearchForm
     */
    this.togglePubMedSearchForm = function(){
    
        $("#pubmed_search_hideout").show();
        
    }
    
    /**
     * Adds an abstract to the basket
     * @function addToBasket
     * @param {int} abstractid
     */
    this.addToBasket = function(abstractid){
    
        var basket = $.cookie('abstractbasket');
        
        if (basket != null) {
        
            var abstracts = basket.split("_AND_");
            if (abstracts.length == 20) 
                abstracts.shift();
            
            $.cookie('abstractbasket', abstracts.join("_AND_") + "_AND_" + abstractid);
            $(document.body).append('<div id="abstractadded">Added...</div>');
            $('#abstractadded').css({
                padding: "2px",
                fontSize: "9pt",
                position: "fixed",
                top: "0",
                left: "0",
                background: "green",
                color: "white"
            }).fadeOut("slow", function(){
            
                $('#abstractadded').remove();
                
            });
            
        }
        else {
        
            $.cookie('abstractbasket', abstractid);
            
        }
        
    };
    
    /**
     * Adds multiple abstractids to the basket.
     * Will replace earlier basket-cookie
     * @function addStraightToBasket
     * @param {string} abstractids
     */
    this.addStraightToBasket = function(abstractids){
    
        var abstracts = abstractids.split("_AND_");
        if (abstracts.length > 20) 
            abstracts = abstracts.slice(0, 20);
        if (abstracts.length > 0) 
            $.cookie('abstractbasket', abstracts.join("_AND_"));
        
    };
    
    /**
     * Removes an abstract from the basket
     * @function removeFromBasket
     * @param {int} abstractid
     * @param {int} pos
     */
    this.removeFromBasket = function(abstractid, pos){
    
        var basket = $.cookie('abstractbasket');
        if (basket != null) {
        
            var basketabstracts = basket.split("_AND_");
            
            if (basketabstracts.length === 1) 
                $.cookie('abstractbasket', null);
            else {
                basketabstracts.splice(basketabstracts.findPlace(abstractid), 1);
                basket = basketabstracts.join("_AND_");
                $.cookie('abstractbasket', basket);
            }
            $("#" + pos + abstractid).remove();
            
            if ($("#pubmed_items > ul:first-child > li > div[id^='pubmed']").length === 1) 
                $("#pubmed_items").empty();
            else 
                $("#pubmed_items > ul > li > div[id = 'pubmed_" + pos + "_pubmedid']").parent().remove();
            
        }
        //		else $.cookie('foodbasket', foodid);
    
    };
    
    /**
     * Shows abstracts in the basket
     * @function showBasket
     */
    this.showBasket = function(){
    
        var basket = $.cookie('abstractbasket');
        if (basket != null) 
            window.location.href = "index.php?abstractids=" + basket + "&toolname=pubmedslicer&command=showbasket";
        
    };

    /**
     * Shows statistics for a given search string
     * @function showStatistics
     */
    this.showStatistics = function(){

		if (searchstring = $('#pubmedslicer_searchstring').attr('value'))    
			window.location.href = "index.php?searchstring=" + searchstring+ "&toolname=pubmedslicer&command=loadstatistics&type=0";
        
    };

    /**
     * Toggle visibility of scopenotes
     * @function toggleScopenotes
     * @param {DOM node} el
     */
    this.toggleScopenotes = function(el){

		if (that.scopenotesvisibility == "visible") {    
			$("ul[class=descriptor] > li > p.scopenote").hide();
			$("#pubmed_statistics li.descriptor").css('display','inline');
			$("#pubmed_statistics p.descriptorname").css('display','inline').append("<span class='middot'> &#8226; </span>");
			that.scopenotesvisibility = "hidden"; 
		}
		else {
			$("ul[class=descriptor] > li > p.scopenote").show();
			$("#pubmed_statistics li.descriptor").css('display','');
			$("#pubmed_statistics p.descriptorname").css('display','block');
			$("#pubmed_statistics span.middot").remove();
			that.scopenotesvisibility = "visible"; 
		}
        
    };

    /**
     * Toggle abstracttext moprhing
     * @function toggleTextMorph
     * @param {int} pos
     */
    this.toggleTextMorph = function(pos){

// semantic intelligence could not be better

		if (this.abstracttextbackup[pos]) {
			$("#abstracttext" + pos).html(this.abstracttextbackup[pos]);
			this.abstracttextbackup[pos] = "";
		}

		else {
			
			if (this.currentlinktype[pos] == "pubmedtags") currentlinktype = "pubmedtags";
			else if (this.currentlinktype[pos] == "querylinks") currentlinktype = "querylinks";
			else currentlinktype = "pubmedtags";

 			this.abstracttextbackup[pos] = $("#abstracttext" + pos).html();
			var morphedtext = this.morphToLinks($("#abstracttext" + pos).text(), currentlinktype); 
			$("#abstracttext" + pos).html(morphedtext);

		}

    };

    /**
     * Morph textwords to links
     * @function toggleTextMorph
     * @param {string} content
     * @param {int} type
     */
    this.morphToLinks = function(content, type){
	
		var newparts = new Array;
		var parts = new Array;
		var parts = content.split(" ");

		$.each(parts, function(i, val){
			//		    	newparts[i] = "<input type=\"button\" name=\"abstracttext\" value=\"" + val + "\" class=\"querybutton\"/>";
			if (type == "pubmedtags")
				newparts[i] = "<span class=\"altlinknou\"><a href=\"javascript:search.addAfter('descriptor','" + val + "','au','pubmedslicer')\">" + val + "</a></span>";
			else if (type == "querylinks")
				newparts[i] = "<span class=\"altlinknou\"><a href=\"index.php?toolname=querycomposer&searchstring=" + val + "\">" + val + "</a></span>";
			else
				newparts[i] = "<span class=\"altlinknou\"><a href=\"javascript:search.addAfter('descriptor','" + val + "','au','pubmedslicer')\">" + val + "</a></span>";
		});

		return newparts.join(" ")
		
	};
	
    /**
     * Toggle links target between tags and querylinks
     * @function toggleLinksTarget
     * @param {int} pos
     */
    this.toggleLinksTarget = function(pos){

		$("#abstractinfo"+pos).empty().show();

		$(".abstractauthors_pubmedtags"+pos).toggle();
		$(".abstractauthors_querylinks"+pos).toggle();
		$(".abstractjournal_pubmedtags"+pos).toggle();
		$(".abstractjournal_querylinks"+pos).toggle();
		$(".abstractdescriptornames_pubmedtags"+pos).toggle();
		$(".abstractdescriptornames_querylinks"+pos).toggle();

 		if (this.currentlinktype[pos] == "pubmedtags") this.currentlinktype[pos] = "querylinks";
 		else if (this.currentlinktype[pos] == "querylinks") this.currentlinktype[pos] = "pubmedtags";
 		else this.currentlinktype[pos] = "querylinks";

		if (this.abstracttextbackup[pos]) {
			var abstracttext = this.abstracttextbackup[pos].replace(/(<([^>]+)>)/ig,"");
			var morphedtext = this.morphToLinks(abstracttext, this.currentlinktype[pos]); 
			$("#abstracttext" + pos).html(morphedtext);
		}

		$("#abstractinfo"+pos).html("Changed").fadeOut(1000);

    };
    
}
