
/*
FILE CONCAT ADD FILE
PATH: /ft/resources/client/modules/glossary/TermSearchPaging.js
*/
var TermSearchPaging_class = function(){
	this.contentBuffer = new ContentBuffer()
	this.resultsHolder =  Element.parseSelector("div.termsHolder", Element.get("wsod"), "first");
	this.currTerm = Element.parseSelector("span.currTerm", Element.get("wsod"), "first")
}

TermSearchPaging_class.prototype.init = function(){

	
	var term = this.currTerm.getAttribute("data")
	if(this.resultsHolder){
		this.paging = new Paging()
		this.paging.setContentContainer(this.resultsHolder);
		this.paging.setBufferLoadFunction(
			{
				contentType:                    'text/javascript'
				,context:                       this
				,url:                           '/ft/resources/buffer/TermResultsPagingBuffer.asp'
				,preventEval:	                true
				,method:                        'post'
				,data:                          {term:term}
				,onload:                        this.drawResultsTable
			}
		);
		this.paging.init();
	}
}

TermSearchPaging_class.prototype.drawResultsTable = function(cb) {
    var data = new Serializer().deserialize(cb.getResult())
    var len = data.results.length
    Element.removeChildNodes(this.resultsHolder);
    var exp = /(<.*?>)|(<\/.*?>)|(\[.*?\]).*?(\[\/.*?\])/g;

    var container = Element.create("div")

    for (var i = 0, currentTerm; i < len; i++) {
        currentTerm = data.results[i]
        currentTerm.definition = currentTerm.definition.replace(/\&quot;/g, '"');
        currentTerm.definition = currentTerm.definition.replace(/\&gt;/g, '>');
        currentTerm.definition = currentTerm.definition.replace(/\&lt;/g, '<');
        var definitionDisplay = "";

        var strippedDef = currentTerm.definition.replace(exp, "")

        if (strippedDef && strippedDef.length > 0) {
            definitionDisplay = strippedDef.length > 150 ? strippedDef.substr(0, 135) + "..." : strippedDef;
        } else {
            if (currentTerm.related != -32768) {
                var cleanTerm = currentTerm.related.replace(/\_/gi, '~').replace(/\-/gi, '_').replace(/\s/gi, '-');

                definitionDisplay = 'See <a href="term.asp?t=' + encodeURIComponent(cleanTerm) + '">' + currentTerm.related + '</a>';
            } else {
                definitionDisplay = 'The definition for the term ' + currentTerm.term + ' is currently not available';
            }
        }

        Element.create("div", { "class": "resultsDiv" }, [
			Element.create("div", { "class": "termResultHolder" }, [
				Element.create("a", { "class": "termHeader", "href": "term.asp?t=" + encodeURIComponent(currentTerm.term) }, [currentTerm.term])
			]),
			Element.create("div", { "class": "defResultsHolder" }, [
				Element.create("p", {}, [definitionDisplay])
			])
		], container)
        Element.create("div", { "style": "clear:both" }, [], container)
    }
    Element.addChild(this.resultsHolder, container);
}	

var termSearchPaging = new TermSearchPaging_class();
	termSearchPaging.init();
/*
FILE CONCAT ADD FILE
PATH: /ft/resources/client/modules/glossary/Categories.js
*/
var Categories_class = function() {}

Categories_class.prototype.init = function(){
	this.dragDrop = new DragDrop();
	this.loadingOverlay = new LoadingOverlay(this.getPageContainer());
	this.oTermIDs = {};
	this.oFeatureList = {};
	this.attachEvents();	
}

/* Getters */

Categories_class.prototype.getEventManager = function(){
	var em = new EventManager();
	
	this.getEventManager = function() {
		return em;
	}
	
	return this.getEventManager();	
}

Categories_class.prototype.getPageContainer = function(){
	var parent = Element.parseSelector("div.adminCategoriesModule", "wsod", "first");
	
	this.getPageContainer = function(){
		return parent;
	}
	
	return this.getPageContainer();
}

Categories_class.prototype.getCategoryParent = function(){
	var parent = Element.parseSelector("div.adminCatHolder", this.getPageContainer());
	
	this.getCategoryParent = function(){
		return parent;
	}
	
	return this.getCategoryParent();
}

Categories_class.prototype.getCategoryTerms = function(){
	var catContainers = this.getCategoryParent();
	
	for(var i=0; i<catContainers.length; i++){
		var categoryHolder = Element.parseSelector("span.headerTall", catContainers[i], "first");
		var category = categoryHolder.getAttribute("category");
		var category_format = category.replace(/\s?/g, "");
		this.oTermIDs[category_format] = {};
		var termArray = Element.parseSelector("div.catTerm", catContainers[i]);
		
			for(var j=0; j<termArray.length; j++){
				this.oTermIDs[category_format][termArray[j].getAttribute("termid")] = "doNothing";
			}		
	}
}

Categories_class.prototype.getFeatureTerms = function(e, el){
	var elementHolder = Element.getParentBySelector(el, "div.catTermAll");
	var parent = Element.getParentBySelector(el, "div.adminCatHolder");
	var currCategory = Element.parseSelector("span.headerTall", parent, "first").getAttribute("category");
	
	(el.checked) ? Element.addClass(elementHolder, "highlight") : Element.removeClass(elementHolder, "highlight");
	this.updateFeatureTotal(parent);
}

Categories_class.prototype.getSearchInputs = function(){
	var aTermSearchInputs = Element.parseSelector("input.searchField", Element.get("wsod"));
	
	for (var i = 0, oTermSearch; i < aTermSearchInputs.length; i++) {
		oTermSearch = new TermSearch_class();
		oTermSearch.submitForm = function(e) {
			if (e) {
				e.cancel();
				
				var aResults = this.getSearchResults() || [],
					bTermExists = false;
				
				for (var i = 0; i < aResults.length; i++) {
					if (this.elInput.value == aResults[i].innerHTML) {
						bTermExists = true;
						break;
					}
				}
				
				if (!bTermExists) { return; }
			}
		
			var parentDiv = Element.getParentBySelector(this.elForm, "div.adminCatHolder"),
				container = Element.parseSelector("div.adminCategoryTerms", parentDiv, "first");
			
			Element.create("div", {"class":"addedCatTerm catTermAll", "termID":this.elInputTermId.value, "term":this.elInput.value},[
				Element.create("input", {"class":"feature", "type":"checkbox", "term":this.elInput.value, "termID":this.elInputTermId.value}, []),
				Element.create("div", {"class":"term"}, [
					Element.create("a", {"href":"/ft/internals/glossary/admin_addEditTerm.asp?termID="+this.elInputTermId.value}, this.elInput.value)
				]),
				Element.create("div", {"style":"float:right", "class":"catAdminDelete icon icon-delete-close"},[])
			], container);
			Element.create("div", {"style":"clear:both"}, null, container);
			
			this.elInput.value = "";
			this.elInput.focus();
		};
		oTermSearch.init(aTermSearchInputs[i]);
	}
}

Categories_class.prototype.getEditorsPick = function(e, el){
	this.oCheckBoxes = {};
	var editorsDisplay = Element.parseSelector("span.editorsNum", this.getPageContainer(), "first");
	var checkBox = Element.parseSelector('input.editorPick', this.getPageContainer());
	var count = 0;
		
	for (var i=0; i<checkBox.length; i++){
		if(checkBox[i].checked){
			this.oCheckBoxes[checkBox[i].getAttribute("value")] = {
				type: "add"
			};
			count++;
		}else{
			this.oCheckBoxes[checkBox[i].getAttribute("value")] = {
				type: "remove"
			};
		}
	}
	
	var featureText = count+" of 3 Categories selected";
	Element.setHTML(editorsDisplay, featureText);
	
	return count;
}


/* Methods */

Categories_class.prototype.attachEvents = function(){			
	this.getEventManager().add(Element.parseSelector("input.editorPick", this.getPageContainer()), "click", this.getEditorsPick, this);
	this.getEventManager().add(Element.parseSelector("div.contentHolder", this.getCategoryParent()), "click", this.deleteTerm, this);
	this.getEventManager().add(Element.parseSelector("input.feature", this.getCategoryParent()), "click", this.getFeatureTerms, this);
	this.getEventManager().add(Element.parseSelector("div.save", this.getCategoryParent()), "click", this.updateCategory, this);
	this.getEventManager().add(Element.parseSelector("div.editorsPick", this.getPageContainer()), "click", this.updateEditors, this);
	this.getEventManager().add(Element.parseSelector("a.deleteCat", this.getCategoryParent()), "click", this.deleteCat, this);
	this.getEventManager().add(Element.parseSelector("div.addCategory", this.getPageContainer()), "click", this.addCategory, this);
	this.getEventManager().add(Element.parseSelector("a.catType", this.getCategoryParent()), "click", this.bufferCategoryType, this);
	this.getEventManager().add(Element.parseSelector("select.categoryList", this.getPageContainer()), "change", this.bufferCategory, this);
		
	this.getCategoryTerms();
	this.getSearchInputs();
}


Categories_class.prototype.addCategory = function(e, el){
	var category = Element.parseSelector("input.category", this.getPageContainer(), "first").value;
	
	if (category != ""){
		var cb = new ContentBuffer();
	
		var conn = cb.load({
			debug: true,
			url: "/ft/resources/buffer/glossaryAddRemoveCategory.asp",
			method: "post",
			contentType: "text/javascript",
			preventEval: false,
			data: {
				 category: category
				,type: "add"
			},
			onload: function() {
				alert(category + " has been added.");
				location.href = location.href;
			}
		});
	}
}

Categories_class.prototype.deleteTerm = function(e, el){
	var target = e.getTarget();
	
	if(Element.hasClass(target, "removeFeature")){
		var parentDiv = Element.getParent(target);
		
		this.oFeatureList[parentDiv.getAttribute("term")] = {
			 id: parentDiv.getAttribute("termID")
			,type: "remove"
		};
		
		Element.remove(parentDiv);
			
	}else if(Element.hasClass(target, "catAdminDelete")){
		var parentDiv = Element.getParent(target);
		var containerDiv = Element.getParentBySelector(parentDiv, "div.adminCatHolder");
		var categoryHolder = Element.parseSelector("span.headerTall", containerDiv, "first");
		
		var title = categoryHolder.getAttribute("category").replace(/\s?/g, "");
		var termID = parentDiv.getAttribute("termid");
		
		this.oTermIDs[title][termID] = "remove";
		Element.remove(parentDiv);
	}
}

Categories_class.prototype.deleteCat = function(e, el){
	var parentDiv = Element.getParentBySelector(el, "div.adminCatHolder");
	var category = el.getAttribute("catName");
	var deleteConfirm = confirm("Are you sure you want to delete the category "+category+"?");
	
	if(deleteConfirm){
		var cb = new ContentBuffer();
		
		var conn = cb.load({
			debug: true,
			url: "/ft/resources/buffer/glossaryAddRemoveCategory.asp",
			method: "post",
			contentType: "text/javascript",
			preventEval: false,
			data: {
				 category: category
				,type: "delete"
			},
			onload: function() {
				alert(category + " has been deleted.");
				Element.remove(parentDiv);
				location.href = location.href;
			}
		});
	}else{
		alert (category+" was not deleted");
	}
}

Categories_class.prototype.updateCategory = function(e, el){
	var ref = this;
	var parentDiv = Element.getParentBySelector(el, "div.adminCatHolder");	
	var categoryHolder = Element.parseSelector("span.headerTall", parentDiv, "first");
	var category = categoryHolder.getAttribute("category");
	var category_format = category.replace(/\s?/g, "");
	var featureTerms = Element.parseSelector("input.feature", parentDiv);
	var featureDivs = Element.parseSelector("div.draggable", parentDiv);
	var oFeatureOrder = {};
	var oCategoryOrder = {};
	
	if(featureDivs.length){
		for(var i=0; i<featureDivs.length; i++){
			oFeatureOrder[featureDivs[i].getAttribute("term")] = {
				 number: i+1
				,id: featureDivs[i].getAttribute("termID")
				,category: category_format
			}
		}
	}
	
	for (var i=0; i<featureTerms.length; i++){
		if(featureTerms[i].checked){
			this.oFeatureList[featureTerms[i].getAttribute("term")] = {
				id: featureTerms[i].getAttribute("termID"),
				type: "add"
			};
		}else{
			this.oFeatureList[featureTerms[i].getAttribute("term")] = {
				id: featureTerms[i].getAttribute("termID"),
				type: "remove"
			};
		}
	}
		
	var newTermsArray = Element.parseSelector("div.addedCatTerm", parentDiv);
	
	if(newTermsArray.length > 0){
		for(var j=0; j<newTermsArray.length; j++){
			this.oTermIDs[category_format][newTermsArray[j].getAttribute("termid")] = "add"
		}
	}

	var s = new Serializer();
	var ids = s.serialize(this.oTermIDs[category_format]);
	var featured = s.serialize(this.oFeatureList);
	var featureOrder = s.serialize(oFeatureOrder);

	this.loadingOverlay.showLoading();
	var cb = new ContentBuffer();
	
	var conn = cb.load({
		debug: true,
		url: "/ft/resources/buffer/glossaryUpdateCategories.asp",
		method: "post",
		contentType: "text/javascript",
		preventEval: true,
		context: this,
		data: {
			 ids: ids
			,cat: category
			,featured: featured
			,featureOrder: featureOrder
		},
		onload: this.updateCategoriesReturn
	});
}

Categories_class.prototype.updateEditors = function(e, el){
	var ref = this;
	var editorsPicks = this.getEditorsPick();
	
	if(editorsPicks == 3){
		var s = new Serializer();
		var picks = s.serialize(this.oCheckBoxes);
		
		this.loadingOverlay.showLoading();
		var cb = new ContentBuffer();
		
		var conn = cb.load({
			debug: true,
			url: "/ft/resources/buffer/glossaryUpdateCategories.asp",
			method: "post",
			contentType: "text/javascript",
			preventEval: true,
			context: this,
			data: {
				picks: picks
			},
			onload: this.updateCategoriesReturn
		});
	}else{
		alert('Please select only 3 Editors Picks. You currently have '+editorsPicks+' selected.')
	}
}

Categories_class.prototype.updateCategoriesReturn = function(cb) {
	var s = new Serializer();
	var results = s.deserialize(cb.getResult());
	var url = results.url;
	this.loadingOverlay.hideLoading();
	alert("Categories have been updated.");
	location.href = url;
}

Categories_class.prototype.bufferCategoryType = function(e, el){
	var ref = this;
	this.getEventManager().removeAll();
	var type = el.getAttribute('type');
	var parent = Element.getParentBySelector(el, "div.adminCatHolder");
	var category = Element.parseSelector("span.headerTall", parent, "first").getAttribute("category");
	var termHolder = Element.parseSelector("div.contentHolder", parent, "first");
	var termSearch = Element.parseSelector("div.addTermBG", parent, "first");
	var featuredNum = Element.parseSelector("span.featuredNum", parent, "first");
	var linkActive = Element.parseSelector("a.active", parent, "first");
	
	Element.removeChildNodes(termHolder);
	Element.removeClass(linkActive, "active");
	this.loadingOverlay.showLoading();

	var cb = new ContentBuffer();
	var conn = cb.load({
		debug: true,
		url: "/ft/resources/buffer/glossaryCategoryTypes.asp",
		method: "post",
		contentType: "text/html",
		data: {
			 category: category
			,type: type
		},
		onload: function(cb){
			Element.setHTML(termHolder, cb.getResult());
			Element.addClass(el, "active");
			ref.loadingOverlay.hideLoading();
			
			if (type == 'featured'){
				ref.dragDrop.init();
			}
			ref.attachEvents();
		}
	});
}

Categories_class.prototype.bufferCategory = function(e, el){
	var ref = this;
	var newCategory = el.value;
	var parent = Element.getParentBySelector(el, "div.adminCatHolder");
	var termHolder = Element.parseSelector("div.contentHolder", parent, "first");
	var aShownCategories = Element.parseSelector("span.headerTall", this.getPageContainer());
	var currCategory = Element.parseSelector("span.headerTall", parent, "first");
	var linkActive = Element.parseSelector("a.catType", parent);

	if(newCategory != "default"){
		Element.removeChildNodes(termHolder);
		this.loadingOverlay.showLoading();
		this.getEventManager().removeAll();
		Element.removeClass(linkActive, "active");
		
		var cb = new ContentBuffer();
		var conn = cb.load({
			debug: true,
			url: "/ft/resources/buffer/glossaryCategoryTypes.asp",
			method: "post",
			contentType: "text/html",
			data: {
				  category: newCategory
				 ,type: 'all'
			},
			onload: function(cb){
				Element.setHTML(termHolder, cb.getResult());
				Element.setHTML(currCategory, newCategory)
				currCategory.setAttribute("category", newCategory)
				Element.addClass(linkActive[0], "active");
				ref.loadingOverlay.hideLoading();
				ref.attachEvents();
			}
		});
	}
}

Categories_class.prototype.updateFeatureTotal = function(parent){
	var featureTerms = Element.parseSelector("input.feature", parent);
	var featureDisplay = Element.parseSelector("span.featuredNum", parent, "first");
	var aFeatureList = [];
	
	for (var i=0; i<featureTerms.length; i++){
		if(featureTerms[i].checked){
			aFeatureList.push(featureTerms[i].getAttribute("termID"));
		}
	}
	
	var featureText = (aFeatureList.length ==1) ? aFeatureList.length+" Feature Term selected" : aFeatureList.length+" Feature Terms selected";
	
	Element.setHTML(featureDisplay, featureText);
}