//methods for handling the discover page

var discover =
{  
    target : "_blank",

    sliders : new Object(),
    currentDimensionId : 0,
    currentUrl : null,
    categoryServer : null,
    resultsServer : null,
    rssServer : null,
    findServer : null,
    relatedServer : null,
    findSimilarText : "",
    resultsOffset : 0,
    resultsCount : 0,
    resultsCountTotal : 0,
    searchBy : "category",
    performingInit : true,
    queryCategories : null,
    breadcrumb : "All Categories",  // Current category as text, used in Blogs and Gyzorks header, full name without top/all 
    backButton : false,
    requestFailed : false,
    scrollEnabled : 0,
    resultsElement : null,
    resultsContainerElement : null,
    originalTemplate : null,
    originalTemplateParent : null,
    results : null,

    init : function()
    {
    	// setup the content collection control as well as the selected content collectionid;
    	gyzork.setupContentCollectionControl();
    
        gyzork.updateContent(document, "displayableLabel", "innerHTML", gyzork.browseDisplayableLabel);
        
        discover.resultsElement = document.getElementById("results");
        discover.resultsContainerElement = document.getElementById("resultsContainer");
        
		// establish either list or detail view
		gyzork.establishItemViewMode("DiscoverPage","detail");
        
        discover.categoryServer = CTXT_ID + "/categorynav/"+gyzork.getContentCollectionId()+"/";
        discover.resultsServer = CTXT_ID + "/category/"+gyzork.getContentCollectionId()+"/";
        discover.findServer = CTXT_ID + "/find/"+gyzork.getContentCollectionId()+"/";    
        
        new XHR( {method: 'get', onSuccess: discover.handleResponse, onFailure: discover.onFailureHandler, async: true } ).send(gyzork.bookmarkServer);    
        
        var queryParameters = gyzork.getQueryParameters();
        
        //initialize our DHTML history
        dhtmlHistory.initialize();
    
        //subscribe to DHTML history change events
        dhtmlHistory.addListener(discover.historyChange);

        if (typeof queryParameters["id"] != "undefined")  
            discover.jumpstartSystem( queryParameters ); 
        else
            discover.sendCategoryPathInfoRequest(0);

            
        // initialize the content frame resizer, with the vertical elements
        // that are used in this view.
        contentResizer.init({ 
        	'header': 0, 
      		'footer': 0
        });
    },
    
    clearDimensionNav : function()
    {
        var navChildren = document.getElementById('list').childNodes;
        
	    // element 0 is the template, don't delete it
	    for(var x=navChildren.length;x>1;x--)
	    {
    		var item = navChildren[x-1];
		    item.parentNode.removeChild(item);
	    }  
	    
	    gyzork.updateContent(document, "currentNavLocation", "innerHTML", "");  
    },
    
    selectType : function(type)
    {
        discover.currentDimensionId = 0;
        gyzork.selectType(type); // delegate common behavior
        if (type == "find") {
            gyzork.updateContent(document, "find-label", "style.display", "none");
            gyzork.updateContent(document, "browse-label", "style.display", "none");
            discover.clearDimensionNav();
            discover.searchBy = "keyword";
            gyzork.updateContent(document, "contentHeader", "innerHTML", "Search for New Content");
            gyzork.updateContent(document, "displayableLabel", "innerHTML", gyzork.similarDisplayableLabel);
        } 
        else 
        {
            gyzork.updateContent(document, "find-label", "style.display", "none");
            gyzork.updateContent(document, "browse-label", "style.display", "block");
            discover.searchBy = "category";
            discover.sendCategoryPathInfoRequest(0);
            gyzork.updateContent(document, "contentHeader", "innerHTML", "Discover New Content");
            discover.bookmarkState();
            gyzork.updateContent(document, "displayableLabel", "innerHTML", gyzork.browseDisplayableLabel);
        }
		        
    },
    
    handleContentChange : function(selectBox)
    {
    	var ccId = selectBox.value;
    	setCookie("ccId",ccId,365);
    	
    	var location = window.location.href;
    	var pos = location.indexOf("#");
    	if (pos > -1) 
    		location = window.location.href.substring(0, pos);
    		
    	if (discover.searchBy == "keyword") {
            fText = encodeURI( discover.findSimilarText );
            
            location += "#id=0&srchBy=keyword" + "&fText=" + fText + "&CC_ID=" + ccId;
        }

   		window.location.href = location;
   		if (discover.searchBy == "keyword")  window.location.reload();
    },
    
    jumpstartSystem : function(queryParameters)
    {
        discover.resultsOffset = 0;
        discover.resultsCount = 0;
        
        discover.currentDimensionId = 0;
        discover.searchBy = "category";
        var numberToGet = gyzork.numberReturnedPerQuery;
        
        if ( typeof queryParameters["id"] != "undefined")  discover.currentDimensionId = queryParameters["id"];
        if ( typeof queryParameters["srchBy"] != "undefined")  discover.searchBy = queryParameters["srchBy"];
        if ( typeof queryParameters["numToGet"] != "undefined")  numberToGet = queryParameters["numToGet"];
        if ( typeof queryParameters["fText"] != "undefined") 
            discover.findSimilarText = decodeURI( queryParameters["fText"] ); 
        if ( typeof queryParameters["CC_ID"] != "undefined") 
        	gyzork.setContentCollection( queryParameters["CC_ID"] );
        
        
        if ( discover.searchBy == "category") {
            gyzork.updateContent(document, "browse-selector", "style.display", "none");
            gyzork.updateContent(document, "find-selector", "style.display", "block");
            gyzork.updateContent(document, "find-label", "style.display", "none");
            gyzork.updateContent(document, "browse-label", "style.display", "block");
            gyzork.updateContent(document, "search-box-container", "style.display", "none");
            discover.sendCategoryPathInfoRequest( discover.currentDimensionId, numberToGet );
            gyzork.updateContent(document, "displayableLabel", "innerHTML", gyzork.browseDisplayableLabel);
        } else {
            gyzork.updateContent(document, "query-categories", "innerHTML", "");
            gyzork.updateContent(document, "browse-selector", "style.display", "block");
            gyzork.updateContent(document, "find-selector", "style.display", "none");
            gyzork.updateContent(document, "find-label", "style.display", "none");
            gyzork.updateContent(document, "browse-label", "style.display", "none");
            gyzork.updateContent(document, "search-box-container", "style.display", "block");
            gyzork.updateContent(document, "displayableLabel", "innerHTML", gyzork.similarDisplayableLabel);
            discover.clearDimensionNav();

            discover.rssServer = discover.findServer + discover.currentDimensionId + "?format=rss&query=" + encodeURI( discover.findSimilarText );        

            document.getElementById("findSimilarId").value = discover.findSimilarText;

            discover.submitFindRequest();
        }
    },
    
    historyChange : function(newLocation, historyData) 
    {
        if (discover.performingInit)  return;
        discover.backButton = true;
        
        if (window.parent.modalWindow.showingDetailModal) {
        	gyzork.closeModalWindow();
        	history.go(1);
        }

       	discover.currentDimensionId = 0;
       	discover.searchBy = "category";
       	var numberToGet = gyzork.numberReturnedPerQuery;
       	discover.findSimilarText = "";
        
       	if ( historyData ) {
           	if ( historyData.currentDimensionId )  discover.currentDimensionId = historyData.currentDimensionId;
           	if ( historyData.searchBy )  discover.searchBy = historyData.searchBy;
           	if ( historyData.numberToGet )  numberToGet = historyData.numberToGet;
           	if ( historyData.findSimilarText )
               	discover.findSimilarText = historyData.findSimilarText;
           	if ( historyData.CC_ID ) 
               	gyzork.setContentCollection( historyData.CC_ID );
      	} else {
      		discover.jumpstartSystem( gyzork.getQueryParameters() );
      	}
        
       	if ( discover.searchBy == "category") {
           	gyzork.updateContent(document, "browse-selector", "style.display", "none");
           	gyzork.updateContent(document, "find-selector", "style.display", "block");
           	gyzork.updateContent(document, "search-box-container", "style.display", "none");
           	gyzork.updateContent(document, "find-label", "style.display", "none");
           	gyzork.updateContent(document, "browse-label", "style.display", "block");
            gyzork.updateContent(document, "displayableLabel", "innerHTML", gyzork.browseDisplayableLabel);

           	discover.sendCategoryPathInfoRequest( discover.currentDimensionId, numberToGet );
       	} else {
           	gyzork.updateContent(document, "query-categories", "innerHTML", "");
           	gyzork.updateContent(document, "browse-selector", "style.display", "block");
           	gyzork.updateContent(document, "find-selector", "style.display", "none");
           	gyzork.updateContent(document, "find-label", "style.display", "none");
           	gyzork.updateContent(document, "browse-label", "style.display", "none");
           	gyzork.updateContent(document, "search-box-container", "style.display", "block");
            gyzork.updateContent(document, "displayableLabel", "innerHTML", gyzork.similarDisplayableLabel);
           	discover.clearDimensionNav();
                
           	document.getElementById("findSimilarId").value = discover.findSimilarText;

           	discover.submitFindRequest();
        }
    },
    
    bookmarkState : function()
    {
        if (discover.backButton) { discover.backButton = false; return; }
        if (discover.performingInit) { discover.performingInit = false; return; }

        var fText = "";
        
        var complexObject = new Object();
        complexObject.currentDimensionId = discover.currentDimensionId;
        complexObject.searchBy = discover.searchBy;
        complexObject.numberToGet = discover.resultsOffset + gyzork.numberReturnedPerQuery;
        complexObject.CC_ID = gyzork.getContentCollectionId();
		if (discover.searchBy == "keyword") {
            complexObject.findSimilarText = discover.findSimilarText;
            fText = encodeURI( discover.findSimilarText );
        }
         
        var label = "id=" + discover.currentDimensionId;
        label += "&srchBy=" + discover.searchBy;
        label += "&CC_ID=" + gyzork.getContentCollectionId();
        if (complexObject.numberToGet > gyzork.numberReturnedPerQuery) label += "&numToGet=" + complexObject.numberToGet;
        if (fText != "")  label += "&fText=" + fText;

        dhtmlHistory.add(label, complexObject);
    },
    
    submitFindRequest : function( dimensionId ) 
    {   
    	discover.disableScroll();
        var element = document.getElementById("findSimilarButtonId");
        element.focus();
        
        if ( typeof dimensionId != "undefined" ) 
            discover.currentDimensionId = dimensionId;
                    
        discover.findSimilarText = document.getElementById("findSimilarId").value;

        parent.gyzork.findText = discover.findSimilarText;
        parent.gyzork.moreLikeThisUrl = "";

        discover.searchBy = "keyword";
        discover.resultsOffset = 0;
        discover.resultsCount = 0;
        
        var call = discover.findServer + discover.currentDimensionId + "/" + discover.resultsOffset + "/" + gyzork.numberReturnedPerQuery + 
            "?format=json&query=" + encodeURI( discover.findSimilarText );
        new XHR( {method: 'get', onSuccess: discover.handleResponse, onFailure: discover.onFailureHandler, async: true } ).send(call);    
        
        discover.rssServer = discover.findServer + discover.currentDimensionId + "?format=rss&query=" + encodeURI( discover.findSimilarText );
        
        discover.bookmarkState();
    },
    
    navigationChange : function(dimensionId)
    {
        discover.selectCategory(dimensionId);
    },
    
    selectCategory : function(contentId)
    {
        discover.sendCategoryPathInfoRequest(contentId);
    },
    
    sendCategoryPathInfoRequest : function(dimensionId, numberToGet)
    {
        discover.currentDimensionId = dimensionId;
        discover.disableScroll();
        
        if (typeof numberToGet == "undefined")
            numberToGet = gyzork.numberReturnedPerQuery;
        
        discover.resultsOffset = 0;
        discover.resultsCount = 0;
        
        if (discover.searchBy == "category") {
            var call = discover.categoryServer + dimensionId + "?format=json";  
            new XHR( {method: 'get', onSuccess: discover.handleResponse, onFailure: discover.onFailureHandler, async: true } ).send(call); 
           
            call = discover.resultsServer +  dimensionId + "/" + discover.resultsOffset + "/" + numberToGet + "?format=json";  
            new XHR( {method: 'get', onSuccess: discover.handleResponse, onFailure: discover.onFailureHandler, async: true } ).send(call);    
            
            discover.rssServer = discover.resultsServer + dimensionId + "?format=rss";

            discover.bookmarkState();
        } else {
            discover.submitFindRequest( dimensionId );
        }
    },
    
    onFailureHandler : function(response, js)
    {
    	if ((discover.resultsOffset == 0) && (discover.searchBy == "keyword") && (response.status == 1223)) {
    		// special case handling of HTTP status 204 from a find results from IE7. Fix of #2587
    		discover.clearDimensionNav();
            gyzork.updateContent(document, "find-label", "style.display", "none");
            discover.resultsElement.innerHTML = gyzork.noResultsMessage;
    	}
    	else {
    		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) {
            if ((discover.resultsOffset == 0) && (discover.searchBy == "keyword")) {
                discover.clearDimensionNav();
                gyzork.updateContent(document, "find-label", "style.display", "none");
                discover.resultsElement.innerHTML = gyzork.noResultsMessage;
            }

            return;
        }
                  
        var jsonObject = Json.evaluate( jsonText );
     
     	// update the breadcrumbs
        if (jsonObject.breadcrumbs != null) {
            if (jsonObject.breadcrumbs.length == 0) {
                if (discover.resultsOffset == 0) {
                	gyzork.updateContent(document, "currentNavLocation", "innerHTML", "");
                	discover.clearDimensionNav();
                	gyzork.updateContent(document, "find-label", "style.display", "none");
                }
            } else {
                var breadcrumbs = jsonObject.breadcrumbs;
                if ( breadcrumbs[0] ) {
                    breadcrumbs[0].nodeLabel = "All Categories";
                    breadcrumbs[0].fullLabel = "All Categories";
                }
            
                if (discover.searchBy == "keyword")  gyzork.updateContent(document, "find-label", "style.display", "block");
               
                gyzork.displayLeftGutterCategoryInfo("discover", breadcrumbs);
                
                if ( (discover.resultsOffset == 0) || (discover.resultsCountTotal < breadcrumbs[breadcrumbs.length-1].count) ) {
                	discover.resultsCountTotal = breadcrumbs[breadcrumbs.length-1].count;
                	gyzork.updateResultCounts("total", discover.resultsCountTotal);
                }
                
                contentResizer.doResize();
            }
        }
        
        if (jsonObject.queryCategories != null)
            gyzork.updateContent(document, "query-categories", "innerHTML", gyzork.createCategoryData( "discover", jsonObject.queryCategories ) );
            
        if (jsonObject.bookmarkedContentIds != null) 
            gyzork.bookmarkIds = jsonObject.bookmarkedContentIds;
    
        if (jsonObject.results != null) {            
            if (jsonObject.results.length == 0) {
                if (discover.resultsOffset == 0) {
                	discover.resultsElement.innerHTML = gyzork.noResultsMessage;
                	gyzork.updateResultCounts("count", 0);
                	gyzork.updateResultCounts("total", 0);
                } else {
    				gyzork.updateContent(document, "displayableCount", "innerHTML", document.getElementById("displayedCount").innerHTML);
				}
                discover.disableScroll();
            	gyzork.updateContent(document, "results-loader-template", "style.display", "none");
            } else {        
                var serverResults = jsonObject.results;
    
                discover.resultsCount += serverResults.length;
                gyzork.updateResultCounts("count", discover.resultsCount);
    
    			discover.results = serverResults;
                discover.displayResults();
                
                if (discover.resultsOffset == 0)  discover.resultsContainerElement.scrollTop = 0;
       	
        		if (discover.resultsCount >= discover.resultsCountTotal)
        		    gyzork.updateContent(document, "displayableCount", "innerHTML", document.getElementById("displayedCount").innerHTML);
   			}
        }
    },
    
    // add a gyzork for the specified item in the global results list.
    addGyzork : function(label, contentId)
    {
        // update the label for this result item to indicate that it's been gyzork'd
        var html = "Gyzork'd";
        var element = document.getElementById(label);
        element.parentNode.id = "off";
        element.parentNode.innerHTML = html;
        
        gyzork.bookmarkIds[contentId] = true;  
    },
    
    displayResult : function(item)
    {
    	if (! discover.results)  return;
    	if (! discover.originalTemplateParent)  return;
    	
		discover.originalTemplateParent.removeChild(discover.originalTemplate);
		
		var lastItem = item + gyzork.numberResultsToDisplay;
		if (lastItem > discover.results.length)  lastItem = discover.results.length;
		for (var i=item; i<lastItem; i++) {
        	var itemNumber = i + discover.resultsOffset;
        	if ( discover.results[i] ) 
	    	{
           		var template = discover.originalTemplate.cloneNode(true);
				discover.resultsElement.appendChild(template);
           		gyzork.createResultItemElement("discover", discover.results[i], itemNumber, template);
           		gyzork.updateContent(template, "lineId", "style.display", "block");
	    		gyzork.handleItemDisplay(template);
       		}
       	}
       	discover.originalTemplateParent.appendChild(discover.originalTemplate);
       	
       	if ( (item + gyzork.numberResultsToDisplay) < discover.results.length) {
       		window.setTimeout('discover.displayResult(' + (item + gyzork.numberResultsToDisplay) + ');', gyzork.resultsDelay);
   		} else {
        	if (discover.resultsCount < discover.resultsCountTotal) {
        		window.setTimeout('gyzork.checkNumberOfResults("discover");', 50);
   				discover.enableScroll();
   			} else {
   				discover.disableScroll();
   			}

			discover.results = null;
            gyzork.updateContent(document, "results-loader-template", "style.display", "none");
       	}
    },
    
    displayResults : function() 
    {	
        bookmark.performingInit = false;
        
        if (discover.resultsOffset == 0) {
            gyzork.saveBulletStats( discover.results );
        	gyzork.removeAllChildren("results");
        }
        
        gyzork.updateContent(document, "rssSubscriptionId", "href", discover.rssServer);

		discover.originalTemplate = document.getElementById("results-template");
		discover.originalTemplateParent = discover.originalTemplate.parentNode;
		
		discover.displayResult(0);
    },
    
    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 (discover.resultsCount < discover.resultsCountTotal)    
            	window.setTimeout("gyzork.checkNumberOfResults('discover');", 100);
        } else {
            gyzork.showAll();
        }
    },
    
    disableScroll : function() 
    {
        discover.scrollEnabled = 0;
    },
    
    enableScroll : function()
    {
        if (discover.scrollEnabled)  return;
        
        discover.scrollEnabled = 1;
        window.setTimeout('discover.checkScroll()', 250);
    },
    
    checkScroll : function() 
    {
    	// If no scroll bar, then return
        if (discover.resultsContainerElement.scrollHeight <= discover.resultsContainerElement.offsetHeight)  return;
        
        if (! discover.scrollEnabled)  return;
        
        discover.disableScroll();
        
        var e = discover.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) ) {

            gyzork.updateContent(document, "results-loader-template", "style.display", "block");
        
			discover.getMoreResults();			
		} else {
		    discover.enableScroll();
		}
    },

    getMoreResults : function() 
    {
    	discover.disableScroll();
    	
        discover.resultsOffset += gyzork.numberReturnedPerQuery;

        if (discover.searchBy == "category") {
            call = discover.resultsServer +  discover.currentDimensionId + "/" + discover.resultsOffset + "/" + gyzork.numberReturnedPerQuery + "?format=json";  
            new XHR( {method: 'get', onSuccess: discover.handleResponse, async: true } ).send(call);    
        } else {
            var call = discover.findServer + discover.currentDimensionId + "/" + discover.resultsOffset + "/" + gyzork.numberReturnedPerQuery + 
                       "?format=json&query=" + discover.findSimilarText;
            new XHR( {method: 'get', onSuccess: discover.handleResponse, async: true } ).send(call);    
        }  
    }
}
