
/*
FILE CONCAT ADD FILE
PATH: /ft/resources/client/modules/glossary/AddEditTerm.js
*/
var AddEditTerm_class = function() {}

AddEditTerm_class.prototype.PATH_ADD_EDIT_TERM = "/ft/resources/buffer/glossaryAddUpdateTerm.asp";
AddEditTerm_class.prototype.ADD_TO_STORAGE_MANAGER = "/ft/resources/buffer/glossaryAddPreviewTerm.asp";

AddEditTerm_class.prototype.init = function() {
	var ref = this;

	this.radioButtons = document.forms[0].activate;
	
	Events.add(Element.parseSelector("div.save", "wsod", "first"), "click", this.updateTerm, this);
	Events.add(Element.parseSelector("div.preview", "wsod", "first"), "click", this.showPreview, this);
	Events.add(Element.parseSelector("select.editSummary", "wsod", "first"), "change", this.optionChange, this);
	
	// put this in an onload due to a race condition we were seeing
	Events.add(window, "load", function() {
		// setTimeout needed to correct for IE6's inability to attach this event without it
		setTimeout(function() {
			Events.add(Element.get("editor").contentWindow.document, "keyup", ref.cleanMSWordContent, ref);
		}, 0);
	
		new AddEditTermRelatedTerms_class(ref.getTermSettings().relatedTerms).init();
		new AddEditTermNews_class(ref.getTermSettings().relatedNews).init();
		new AddEditTermCategories_class(ref.getTermSettings().categories).init();
	
		new TextEditor_Class({
			sourceFrame: WSDOM.Element.get("editor"),
			controlPanel: WSDOM.Element.parseSelector(".controls", null, "first")
		})
	});
}

AddEditTerm_class.prototype.getUserInputs = function() {
	var aRelatedTerms = Element.parseSelector("div.relatedTermHolder", "adminRelatedTerms"),
		aRelatedNews = Element.parseSelector("div.relatedNewsHolder", "adminRelatedNews"),
		aCategories = Element.parseSelector("div.categoryHolder", "adminRightContent"),
		oTerm,
		sTerm,
		sTermID,
		sDocKey;

	oTerm = {
		"term": Element.get("adminTerm").value,
		"definition": Element.get("editor").contentWindow.document.body.innerHTML,
		"relatedTerms": {},
		"categories": {},
		"relatedNews": []
	}
	
	for (var i = 0; i < aRelatedTerms.length; i++) {
		sTerm = aRelatedTerms[i].getAttribute("term");
		sTermID = aRelatedTerms[i].getAttribute("termID");
		sTermStatus = aRelatedTerms[i].getAttribute("status");
	
		oTerm.relatedTerms[sTermID] = {
			name: sTerm,
			id: sTermID,
			status: sTermStatus
		};
	}
		
	for (var i = 0; i < aCategories.length; i++) {
		sCategory = aCategories[i].getAttribute("category");
	
		oTerm.categories[sCategory] = {
			name: sCategory
		};
	}
	
	for (var i = 0; i < aRelatedNews.length; i++) {
		sDocKey = aRelatedNews[i].getAttribute("docKey");
	
		oTerm.relatedNews.push(sDocKey);
	}
	
	return oTerm;
}

AddEditTerm_class.prototype.getTermSettings = function() {	
	var oTerm = this.getUserInputs();
	
	this.getTermSettings = function() {
		oTerm.term = Element.get("adminTerm").value;
		oTerm.definition = Element.get("editor").contentWindow.document.body.innerHTML;
	
		return oTerm;
	}
	
	return this.getTermSettings();
}

AddEditTerm_class.prototype.showPreview = function(e, el) {
    if (e) { e.cancel(); }

    var oTerm = CopyObj(this.getUserInputs());
    oTerm.definition = this.escapeInput(oTerm.definition);

    this.getContentBuffer().abortRequests();

    var conn = this.getContentBuffer().load({
        debug: true,
        url: this.ADD_TO_STORAGE_MANAGER,
        method: "post",
        contentType: "text/javascript",
        context: this,
        preventEval: true,
        data: {
            oTerm: this.getSerializer().serialize(oTerm)
        },
        onload: function(cb) {
            var result = cb.getResult();
            var oResult = this.getSerializer().deserialize(result);
            var storageId = oResult.id;

            window.open('/ft/glossary/previewTerm.asp?storageId=' + storageId, 'PreviewTerm', 'width=800,height=500,status=no,toolbar=no,resizable=yes,location=no,menubar=no,scrollbars=yes');  
        }
    });

}

AddEditTerm_class.prototype.optionChange = function(e, el) {
	Element.removeClass(Element.parseSelector("p.editSummary", "wsod", "first"), "red");
}

AddEditTerm_class.prototype.updateTerm = function(e, el) {
	e.cancel();
	
	var oTerm = CopyObj(this.getTermSettings()),
		bIsPublish = this.radioButtons[0].checked ? false : true,
		sTermId = el.getAttribute("termID"),
		editSummary = Element.parseSelector("select.editSummary", "wsod", "first"),
		sEditSummary = editSummary ? editSummary.value : 'Added to Lexicon'
		
	oTerm.definition = this.escapeInput(oTerm.definition);
	
	if(sEditSummary == 'default'){
		Element.addClass(Element.parseSelector("p.editSummary", "wsod", "first"), "red");
		alert('Please provide a description of your changes.');
		return;
	}
	
	if (oTerm.term) {
		this.getContentBuffer().abortRequests();
				
		var conn = this.getContentBuffer().load({
			debug: true,
			url: this.PATH_ADD_EDIT_TERM,
			method: "post",
			contentType: "text/javascript",
			context:this,
			preventEval: true,
			data: {
				id: sTermId,
				isPublish: bIsPublish,
				editSummary: sEditSummary,
				term: this.getSerializer().serialize(oTerm)
			},
			onload: this.bufferReturn
		});
			
	} else {
		alert("Please enter a term")
	}
	
}

AddEditTerm_class.prototype.bufferReturn = function(cb) {
	var oResults = this.getSerializer().deserialize(cb.getResult());

	if (oResults.termExists) {
		alert("Term already exists.");
		return;
	}
		
	if(oResults.status){
		Element.removeClass("termSavedMessage", "wsodHidden");
		if(oResults.newID){
			location.href = "/ft/internals/glossary/admin_addEditTerm.asp?termID="+oResults.newID;
		}else{
			location.href = location.href;
		}
	}
}

AddEditTerm_class.prototype.escapeInput = function(sInput) {
	sInput = sInput.replace(/\</g, "&lt;");
	sInput = sInput.replace(/\>/g, "&gt;");
	sInput = sInput.replace(/\"/g, "&quot;");
	
	return sInput;
}

AddEditTerm_class.prototype.cleanMSWordContent = function(e, el) {
	if (86 != e.nativeEvent.keyCode || !e.nativeEvent.ctrlKey) { return; }
	
	sDefinition = Element.get("editor").contentWindow.document.body.innerHTML;
	
	sDefinition = sDefinition.replace(/(\r\n)|\r|\n/gi, " ");
	
	sDefinition = sDefinition.replace(/<meta.*?>/gi, "");
	sDefinition = sDefinition.replace(/<link.*?>/gi, "");
	sDefinition = sDefinition.replace(/<style.*?>.*?<\/style>/gi, "");
	sDefinition = sDefinition.replace(/<xml.*?>.*?<\/xml>/gi, "");
	sDefinition = sDefinition.replace(/<\!\-\-.*?>/gi, "");
	sDefinition = sDefinition.replace(/<\!.*?\-\->/gi, "");
	sDefinition = sDefinition.replace(/<o:.*?>.*?<\/o:.*?>/gi, "");
	sDefinition = sDefinition.replace(/<w:.*?>.*?<\/w:.*?>/gi, "");
	
	sDefinition = this.stripTags(sDefinition, "P");
	sDefinition = this.removeHTMLAttributes(sDefinition, "P");

	Element.get("editor").contentWindow.document.body.innerHTML = sDefinition;
}

AddEditTerm_class.prototype.removeHTMLAttributes = function(s, tags) {
	tags = tags ? "(?:"+tags+")" : ".*"
	s = s .replace(/(<[^>]*>)/gi,function() { // any tag
		var regEx = new RegExp("(<"+tags+"?)(\\s[^>]*)(>)","i");

		//dwt(arguments[1] + "\n" + arguments[1].match(regEx),35)
		return arguments[1].match(regEx) ? (RegExp.$1 + RegExp.$3) : arguments[1];
	})
	return s;
}

AddEditTerm_class.prototype.stripTags = function(s, tags) {
	if (!tags) tags = "ALLTAGS";	
	s = s .replace(/(<\/?[^>]*>)/gi,function() {
		var regEx = new RegExp("<\/?("+tags+")[> ]","i");
		return arguments[1].match(regEx) ? arguments[1] : "";
	})
	return s;
}

AddEditTerm_class.prototype.removeComments = function(s, tags) {
	tags = tags ? "(?:"+tags+")" : ".*"
	s = s .replace(/(<[^>]*>)/gi,function() { // any tag
		var regEx = new RegExp("(<"+tags+"?)(\\s[^>]*)(>)","i");

		//dwt(arguments[1] + "\n" + arguments[1].match(regEx),35)
		return arguments[1].match(regEx) ? (RegExp.$1 + RegExp.$3) : arguments[1];
	})
	return s;
}

AddEditTerm_class.prototype.getContentBuffer = function() {
	var cb = new ContentBuffer();
	
	this.getContentBuffer = function() {
		return cb;
	}
	
	return this.getContentBuffer();
}

AddEditTerm_class.prototype.getSerializer = function() {
	var s = new Serializer();
	
	this.getSerializer = function() {
		return s;
	}
	
	return this.getSerializer();
}