//methods for handling the detail page

var detail =
{  
    offset : 0,
    categoryId : 0,
    resultsOffset : 0,
    resultsCount : 0,
    resultsCountTotal : 0,
    bookmark : null,
    bookmarkId : -1,
    contentId : -1,
    sourceContentCollectionId : -1,
    navChange : false,
    scrollEnabled : 0,
    resultsElement : null,
    resultsContainerElement : null,
    performingInit : true,
    originalTemplate : null,
    originalTemplateParent : null,
    results : null,
    repaintMain : false,

    init : function()
    {
		// prevents a reload of the page 
    	modalWindow.refreshPage=false;
    	if (window.parent.gyzork.closingModalWindow) {
    		if (window.location.href.indexOf("firstModalPage") > -1) {
   				window.parent.gyzork.closingModalWindow = false;
   				window.parent.gyzork.modalHandlingBackButton = false;
   				gyzork.closeModalWindow();
    		} else {
    			history.go(-1);
    		}
    		return;  
    	}
    
    	if ( ! window.parent.modalWindow.showingDetailModal )  return;
    	
    	// If the user hit the back button then need to sync up the pos in the list of modalWindows
    	if ( window.location.href.indexOf( window.parent.gyzork.modalWindows[ window.parent.gyzork.currentModalDisplayed ] ) == -1) {
    		var pos = 0;
    		while ( (window.location.href.indexOf( window.parent.gyzork.modalWindows[ pos ] ) == -1) && (pos < (window.parent.gyzork.modalWindows.length-1)) )
    			pos++;
    		
    		window.parent.gyzork.currentModalDisplayed = pos;
    	}
    	
        // setup the content collection control as well as the selected content collectionid;
    	gyzork.setupContentCollectionControl();

        gyzork.updateContent(document, "displayableLabel", "innerHTML", gyzork.similarDisplayableLabel);
        
        detail.resultsElement = document.getElementById("results");
        detail.resultsContainerElement = document.getElementById("resultsContainer");
        
		// establish either list or detail view
    	// tell the gyzork routine that we are in the detail area so that cookies on this page are name spaced
    	gyzork.establishItemViewMode("DetailPage","list");

        var call = CTXT_ID + "/bookmarkQuery.html?queryOperation=BOOKMARK_IDS&format=JSON&contentCollectionId=" +
                   gyzork.getContentCollectionId();
        new XHR( {method: 'get', onSuccess: detail.handleResponse, onFailure: detail.onFailureHandler, async: true } ).send(call);    
        
        // initialize the content frame resizer, with the vertical elements
        // that are used in this view.
        contentResizer.init({ 
        	'header': 0, 
      		'footer': 0
        });
    },
    
    init_continue : function()
    {
        var queryParameters = gyzork.getQueryParameters();
        
        detail.sourceContentCollectionId = queryParameters["SOURCE_CC_ID"];
        if (typeof queryParameters["TARGET_CC_ID"] != "undefined") 
        	gyzork.setContentCollection( queryParameters["TARGET_CC_ID"] );
        else
        	gyzork.setContentCollection( detail.sourceContentCollectionId );

        if (typeof queryParameters["bookmarkId"] == "undefined")  
        {
            detail.contentId = queryParameters["contentId"];
            if (typeof queryParameters["categoryId"] != "undefined")  detail.categoryId = queryParameters["categoryId"];
            call = CTXT_ID + "/similar/" + gyzork.getContentCollectionId() + "/" + detail.sourceContentCollectionId + "/" + detail.contentId + "/" + 
            	   detail.categoryId + "/" + detail.resultsOffset + "/" + gyzork.numberReturnedPerQuery + "?format=json";
            new XHR( {method: 'get', onSuccess: detail.handleResponse, onFailure: detail.onFailureHandler, async: true } ).send(call);    
        } 
        else if (typeof queryParameters["bookmarkId"] != "undefined") 
        {
            detail.bookmarkId = queryParameters["bookmarkId"];
            detail.contentId = queryParameters["contentId"];
            if (typeof queryParameters["categoryId"] != "undefined")  detail.categoryId = queryParameters["categoryId"];

            call = CTXT_ID + "/bookmarkQuery.html?queryOperation=BOOKMARKS&format=JSON&contentCollectionId=" +  
            		gyzork.getContentCollectionId() +"&bookmarkId=" + detail.bookmarkId;
            new XHR( {method: 'get', onSuccess: detail.handleResponse, onFailure: detail.onFailureHandler, async: true } ).send(call); 
            
            call = CTXT_ID + "/bookmark/" + gyzork.getContentCollectionId() + "/" + detail.bookmarkId + "/" + detail.categoryId + "/" + detail.resultsOffset +
                   "/" + gyzork.numberReturnedPerQuery + 
                   "?format=json";
            new XHR( {method: 'get', onSuccess: detail.handleResponse, onFailure: detail.onFailureHandler, async: true} ).send(call);               
        } else {
            alert("Must specify a contentId or bookmarkId");
        }
        
        if (gyzork.detailPageFormat == "modal")  gyzork.updateModalWindowButtons();
    },
    
    closeModalWindow : function()
    {
		if(detail.repaintMain){
			window.parent.document.location.href = window.parent.document.location.href;
			return;
		}
    	window.parent.gyzork.modalHandlingBackButton = true;
    	window.parent.gyzork.closingModalWindow = true;
    	gyzork.closeModalWindow();
    	
    	// If not on safari and not one first modal detail page, then go back one entry in the history 
    	if ( ! navigator.userAgent.toLowerCase().contains("safari") && (window.location.href.indexOf("firstModalPage") == -1)  ) 
    		history.go(-1);
    },
    
    onFailureHandler : function(response)
    {
    	if ( window.parent.gyzork.closingModalWindow || window.parent.gyzork.modalHandlingBackButton )  return;
    	
    	gyzork.updateContent(document, "resultsContainer", "innerHTML", "<p>Request Failed  Error: " + response.status + " - " + response.statusText + "</p>");
    },
    
    // handle the successfuly resposne to an ajax call, the response is expected to be in json format. The actions we take is based on the fields within the json object.
    handleResponse : function(response) 
    {
        var jsonText = response.trim();
        
        if (! jsonText)  return;
                  
        var jsonObject = Json.evaluate( jsonText );
     
        if (jsonObject.breadcrumbs != null) {
            var breadcrumbs = jsonObject.breadcrumbs;
            if ( breadcrumbs[0] ) {
                breadcrumbs[0].nodeLabel = "All Categories";
                breadcrumbs[0].fullLabel = "All Categories";
            }
            
            if ( (detail.resultsOffset == 0) || (detail.resultsCountTotal < breadcrumbs[breadcrumbs.length-1].count) ) {
            	detail.resultsCountTotal = breadcrumbs[breadcrumbs.length-1].count;
            	gyzork.updateResultCounts("total", detail.resultsCountTotal);
            }
            
            gyzork.displayLeftGutterCategoryInfo("detail", breadcrumbs);
        }
        
        if (jsonObject.bookmarkedContentIds != null) { 
            gyzork.bookmarkIds = jsonObject.bookmarkedContentIds;
            detail.init_continue();
        }
        
        if (jsonObject.similarQuery != null) 
        	detail.displaySelectedArticle( jsonObject.similarQuery );
    
        if (jsonObject.relatedResults != null) {
            var results = jsonObject.relatedResults;
            if (results.length == 0) {
                if (detail.resultsOffset == 0) {
                	detail.resultsElement.innerHTML = gyzork.noResultsMessage;
                	gyzork.updateResultCounts("count", 0);
                	gyzork.updateResultCounts("total", 0);
                } else {
    				gyzork.updateContent(document, "displayableCount", "innerHTML", document.getElementById("displayedCount").innerHTML);
				}
                detail.disableScroll();
            	gyzork.updateContent(document, "results-loader-template", "style.display", "none");
            } else {        
            	if (detail.resultsOffset == 0) {
            		var label = "related " + gyzork.getContentCollectionLabel();
            		gyzork.updateContent(document, "relatedLabel", "innerHTML", label);
            	
                	var firstResult = jsonObject.relatedResults[0];
                        
                	results = new Array();
                	var n=0;
                	for (var i=0; i<jsonObject.relatedResults.length; i++) {
                		if ( (jsonObject.relatedResults[i].contentId == detail.contentId) && (detail.sourceContentCollectionId == gyzork.getContentCollectionId()) ) {
                			// detail.displaySelectedArticle( jsonObject.relatedResults[i] );
                		} else {
                			results[n++] = jsonObject.relatedResults[i];
                		}
                	}
            	}
            	
            	detail.resultsCount += results.length;
            	gyzork.updateResultCounts("count", detail.resultsCount);
            
            	detail.results = results;
            
            	detail.displayResults();

 				if (detail.resultsOffset == 0)  detail.resultsContainerElement.scrollTop = 0;
 				
       			if ( detail.resultsCount >= detail.resultsCountTotal ) 				
    				gyzork.updateContent(document, "displayableCount", "innerHTML", document.getElementById("displayedCount").innerHTML);
 			}
        }
        
        if (jsonObject.bookmarks != null) {
            detail.bookmark = jsonObject.bookmarks[0];
			// show the bookmark detail immediately
            detail.displaySelectedBookmark(detail.bookmark);
        }      
    },
    
    navigationChange : function(dimensionId)
    {
        detail.selectCategory(dimensionId);
    },
    
    selectCategory : function(categoryId)
    {
        detail.navChange = true;
        detail.categoryId = categoryId;
        detail.resultsOffset = 0;
        detail.resultsCount = 0;
        
        if (detail.bookmarkId == -1)  
        {
            call = CTXT_ID + "/similar/" + gyzork.getContentCollectionId() + "/" + detail.sourceContentCollectionId + "/" + detail.contentId + "/" + 
                   categoryId + "/0/" + gyzork.numberReturnedPerQuery + "?format=json";
            new XHR( {method: 'get', onSuccess: detail.handleResponse, onFailure: detail.onFailureHandler, async: true } ).send(call);    
        } 
        else 
        {
            call = CTXT_ID + "/bookmark/" + gyzork.getContentCollectionId() + "/" + detail.bookmarkId + "/" + categoryId + "/" + detail.offset +
                   "/" + gyzork.numberReturnedPerQuery + "?format=json";
            new XHR( {method: 'get', onSuccess: detail.handleResponse, onFailure: detail.onFailureHandler, async: true} ).send(call);               
        }
    },
    
    displaySelectedBookmark : function(bm)
    {
        gyzork.updateContent(document, "mainHeaderId", "innerHTML", "Selected Gyzork Detail");

        var container = document.getElementById("selectedArticle");
        
        gyzork.updateContent(document, "selectedArticle", "innerHTML", "");
        
        var originalTemplate = document.getElementById("bmTemplate");
		var originalTemplateParent = originalTemplate.parentNode;
		originalTemplateParent.removeChild(originalTemplate);
        
        // disconnet the results template as well since there is an ID collision
        var rtOriginalTemplate = document.getElementById("results-template");
		var rtOriginalTemplateParent = rtOriginalTemplate.parentNode;
		rtOriginalTemplateParent.removeChild(rtOriginalTemplate);
  
		var template = originalTemplate.cloneNode(true);
		container.appendChild(template );
		gyzork.createBookmarkResultItemElement("detail", template, bm, 0)
		template.style.borderBottom = "none";
		
        gyzork.updateContent(template, "results-data-menu-meta", "style.display", "none");
        gyzork.updateContent(template, "results-data-menu", "id", "results-data-menu-0");
        gyzork.updateContent(template, "results-data-menu-meta", "id", "results-data-menu-meta-0");
        gyzork.updateContent(template, "results-data-related-0", "style.display", "none");

		// put back the original templates
		originalTemplateParent.appendChild(originalTemplate);
		rtOriginalTemplateParent.appendChild(rtOriginalTemplate);
	    
        gyzork.updateContent(template, "results-data-toggler-0", "onclick", "detail.slideIn(this);");
        gyzork.updateContent(template, "results-data-title-0", "onclick", "detail.slideIn(this);");
        
        detail.slideOut( template );
    },
    
    displaySelectedArticle : function(result)
    {
        parent.gyzork.moreLikeThisUrl = result.link;

        var element = document.getElementById("selectedArticle");

        gyzork.updateContent(document, "selectedArticle", "innerHTML", "");

		//get the template and disconnect it
	  	var originalTemplate = document.getElementById("results-template");
		var originalTemplateParent = originalTemplate.parentNode;
		originalTemplateParent.removeChild(originalTemplate);

        var bmOriginalTemplate = document.getElementById("bmTemplate");
		var bmOriginalTemplateParent = bmOriginalTemplate.parentNode;
		bmOriginalTemplateParent.removeChild(bmOriginalTemplate);
        

		// clone populate and append the real data
		var template = originalTemplate.cloneNode(true);
		element.appendChild(template );
        gyzork.createResultItemElement("detail", result, 0, template);
        gyzork.updateContent(template, "results-data-related-0", "style.display", "none");
        template.style.borderBottom = "none";
        
		// put back the original template
		originalTemplateParent.appendChild(originalTemplate);
		bmOriginalTemplateParent.appendChild(bmOriginalTemplate);
		        
        gyzork.updateContent(template, "results-data-toggler-0", "onclick", "detail.slideIn(this);");
        gyzork.updateContent(template, "results-data-title-0", "onclick", "detail.slideIn(this);");
        
        detail.slideOut( template );
    },
    
    displayResult : function(item)
    {
    	if (! detail.results)  return;
    	if (! detail.originalTemplateParent)  return;
    	
    	detail.performingInit = false;
    	
		detail.originalTemplateParent.removeChild(detail.originalTemplate);
		
		var lastItem = item + gyzork.numberResultsToDisplay;
		if (lastItem > detail.results.length)  lastItem = detail.results.length;
		for (var i=item; i<lastItem; i++) {
        	var itemNumber = i + detail.resultsOffset;
        	if ( detail.results[i] ) 
	    	{
           		var template = detail.originalTemplate.cloneNode(true);
				detail.resultsElement.appendChild(template);
           		gyzork.createResultItemElement("detail", detail.results[i], itemNumber, template);
           		gyzork.updateContent(template, "lineId", "style.display", "block");
	    		gyzork.handleItemDisplay(template);
       		}
       	}
       	detail.originalTemplateParent.appendChild(detail.originalTemplate);
       	
       	if ( (item + gyzork.numberResultsToDisplay) < detail.results.length) {
       		window.setTimeout('detail.displayResult(' + (item + gyzork.numberResultsToDisplay) + ');', gyzork.resultsDelay);
   		} else {
        	if (detail.resultsCount < detail.resultsCountTotal) {
        		window.setTimeout('gyzork.checkNumberOfResults("detail");', 50);
   				detail.enableScroll();
   			} else {
   				detail.disableScroll();
			}
            gyzork.updateContent(document, "results-loader-template", "style.display", "none");
       	}
    },
    
    displayResults : function() 
    {	
    	detail.performingInit = false;
    	
        if (detail.resultsOffset == 0) {
            gyzork.saveBulletStats( detail.results );
        	gyzork.removeAllChildren("results");
        
        	// adjust the height of the dimensions nav -- some browser specific code here.
        	var element = document.getElementById("dimension-nav");
        
        	var adjustment = 300;
        	var agt=navigator.userAgent.toLowerCase();
        	if (agt.contains("msie 6.0") )
           	adjustment = -1;

        	if (agt.contains("msie 7.0") )
           		adjustment = 305;
        
        	// Adjust minHeight for results div depending on the available space in the users browser
        	var eleHeight = window.getHeight() - adjustment;
        	if ( (element) && (adjustment > -1) )
            	element.style.minHeight = eleHeight + "px";
        }
        
        // offset since selected article/bookmark is item 0
        if (detail.resultsOffset == 0)  detail.resultsOffset = 1;
        
        gyzork.updateContent(document, "rssSubscriptionId", "href", detail.rssServer);

		detail.originalTemplate = document.getElementById("results-template");
		detail.originalTemplateParent = detail.originalTemplate.parentNode;
			
		detail.displayResult(0);
    },
    
    slideIn : function(el)
    {
        gyzork.slideIn(el);
        
        gyzork.updateContent(document, "results-data-toggler-0", "onclick", "detail.slideOut(this);");
        gyzork.updateContent(document, "results-data-title-0", "onclick", "detail.slideOut(this);");
			
        window.setTimeout('contentResizer.doResize();', 250);
    },
    
    slideOut : function(el)
    {
        gyzork.slideOut(el);
        
        gyzork.updateContent(document, "results-data-toggler-0", "onclick", "detail.slideIn(this);");
        gyzork.updateContent(document, "results-data-title-0", "onclick", "detail.slideIn(this);");
        
        window.setTimeout('contentResizer.doResize();', 250);
    },
    
    alreadyGyzorkd : function(contentId)
    {
        var status = false;
        if ( gyzork.bookmarkIds && (typeof gyzork.bookmarkIds[contentId] != "undefined") )  status = true;

        return status;
    },
    
    setViewType : function(type)
    {
        if (type == "list") {
            gyzork.hideAll();
                    
			if (detail.resultsCount < detail.resultsCountTotal)
           		window.setTimeout("gyzork.checkNumberOfResults('detail');", 100);
        } else {
            gyzork.showAll();
        }
        
        window.setTimeout('contentResizer.doResize();', 250);
    
    },
    disableScroll : function() 
    {
        detail.scrollEnabled = 0;
    },
    
    enableScroll : function()
    {
        if (detail.scrollEnabled)  return;
        
        detail.scrollEnabled = 1;
        window.setTimeout('detail.checkScroll()', 250);
    },
    
    checkScroll : function() 
    {
    	// If no scroll bar, then return
        if (detail.resultsContainerElement.scrollHeight <= detail.resultsContainerElement.offsetHeight)  return;

		if (! detail.scrollEnabled)  return;
		        
    	detail.disableScroll();
    	
        var e = detail.resultsContainerElement;
        
        var pos = e.scrollHeight - (e.offsetHeight + e.scrollTop);
		//console.log("pos: " + pos);
		// pos < e.scrollTop was to ensure that the first page does not scroll until the user moves the scroll bar, even if pos < 40.
		if ( (pos < gyzork.scrollTrigger) && (pos < e.scrollTop) ) {

            var tmpOffset = detail.resultsOffset + gyzork.numberReturnedPerQuery;
            
            gyzork.updateContent(document, "results-loader-template", "style.display", "block");
           
			window.setTimeout('detail.getMoreResults()', 250);
			
		} else {
		    detail.enableScroll();
		}
    },

    getMoreResults : function() 
    {
    	detail.disableScroll();
        detail.resultsOffset += gyzork.numberReturnedPerQuery;
        
        if (detail.bookmarkId == -1)  
        {
            call = CTXT_ID + "/similar/" + gyzork.getContentCollectionId() + "/" + detail.sourceContentCollectionId + "/" + detail.contentId + "/" + 
                   detail.categoryId + "/" + detail.resultsOffset + "/" + gyzork.numberReturnedPerQuery + "?format=json";
            new XHR( {method: 'get', onSuccess: detail.handleResponse, onFailure: detail.onFailureHandler, async: true } ).send(call);    
        } 
        else 
        {
            call = CTXT_ID + "/bookmark/" + gyzork.getContentCollectionId() + "/" + detail.bookmarkId + "/" + detail.categoryId + "/" + detail.resultsOffset +
                   "/" + gyzork.numberReturnedPerQuery + 
                   "?format=json";
            new XHR( {method: 'get', onSuccess: detail.handleResponse, onFailure: detail.onFailureHandler, async: true} ).send(call);               
        }  
    }
}
