SubjectTermFind = Class.create();

SubjectTermFind.prototype.initialize = function(root, name, textDirection) {

	this.ContextRoot = root;
	this.Name = name;
	this.TextDirection = textDirection;
	this.ElementsPrefix = '';
	this.NewTermFieldID = 'newSubjectTerm';
	this.FindSubjectTermsButtonID = 'findSubjectTermsButton';
	this.AddSubjectTermSectionID = 'addSubjectTerm';
	this.FindSubjectTermsDivID = 'findSubjectTermsDiv';
	this.FindSubjectTermsContainerID = 'findSubjectTermContainer';
	
	this.findSubjectTermsDisplayed = false;
	this.iframeDisplayed = false;

	// Function handlers and event listeners
	this.hasSubjectTermFunction = null;
	this.findSubjectTermsAddClickedListener = null;
	this.findSubjectTermsRemoveClickedListener = null;
	this.closeFindSubjectTermsClickedListener = this.closeFindSubjectTermsClicked.bindAsEventListener(this);
	this.findSubjectTermsInternalLinkClickedListener = this.findSubjectTermsInternalLinkClicked.bindAsEventListener(this);
	
	
}

SubjectTermFind.prototype.Create = function() {
	Event.observe($(this.FindSubjectTermsButtonID), 'click', this.findSubjectTermsClicked.bindAsEventListener(this));
}

SubjectTermFind.prototype.findSubjectTermsClicked = function(evt) {
	
	if (this.findSubjectTermsDisplayed || this.iframeDisplayed) {
		return;
	}
	
	var container = document.createElement('div');
	container.id = this.FindSubjectTermsDivID;
	container.style.display = 'none';
	
	$(this.FindSubjectTermsContainerID).appendChild(container);
	
	this.sendAjaxRequest();
}

SubjectTermFind.prototype.sendAjaxRequest = function() {
	var queryComponents = new Array();
	queryComponents.push('ref=' + (new Date()).getTime());
	if ($(this.NewTermFieldID).value != '') {
	    queryComponents.push('search');
	    queryComponents.push('searchDetails.queryType=ALL');
	    queryComponents.push('searchDetails.queryString='+ encodeURIComponent($(this.NewTermFieldID).value));
	}
	
	new Ajax.Request(this.ContextRoot + 'findSubjectTerms.action', 
		{ method: 'get', parameters: queryComponents.join('&'), 
		onComplete: this.displayFindSubjectTerms.bind(this) });
}

SubjectTermFind.prototype.displayFindSubjectTerms = function(request) {
	if (this.findSubjectTermsDisplayed) {
		return;
	}
	
	this.findSubjectTermsDisplayed = true;	

	var findSubjectTerms = $(this.FindSubjectTermsDivID);
	Element.update(findSubjectTerms, request.responseText);
	
	var addSubjectTermSection = $(this.AddSubjectTermSectionID);
	var offset = addSubjectTermSection.cumulativeOffset();
	var addSubjectTermSectionDimensions = addSubjectTermSection.getDimensions();
	var findSubjectTermsDimensions = findSubjectTerms.getDimensions();
	
	if (this.TextDirection == 'ltr') {
		findSubjectTerms.style.left = offset[0] + 'px';
	} else {
		findSubjectTerms.style.left = (offset[0] + addSubjectTermSectionDimensions.width - findSubjectTermsDimensions.width) + 'px';
	}
	
	findSubjectTerms.style.top = (offset[1] + addSubjectTermSectionDimensions.height) + 'px';
	
	this.findSubjectTermsReloaded(true);
	
	Effect.Grow(findSubjectTerms, {direction: this.getEffectDirection(),
			afterFinish: function() {
				findSubjectTerms.select('input.findTermsQuery')[0].focus();
			}});
	
	this.postDisplay();
	
}

SubjectTermFind.prototype.postDisplay = function() {
	// HACK to make IE < 6 display floating div on top of select boxes using an iframe
	$(this.FindSubjectTermsContainerID).insert( { top: '<iframe src="javascript:\'&lt;html&gt;&lt;/html&gt;\';" scrolling="no" frameborder="0" id="' + this.FindSubjectTermsDivID + 'iframe" style="position:absolute; display: none;"></iframe>' } );
	var iframe = $(this.FindSubjectTermsDivID + 'iframe');
	var findTermsDiv = $(this.FindSubjectTermsDivID);
	
	// Position iframe in same place as floating div, make it same size and grow it
	iframe.style.left = findTermsDiv.style.left;
	iframe.style.top = findTermsDiv.style.top;
	this.cloneSize(findTermsDiv, iframe);
	
	Effect.Grow($(this.FindSubjectTermsDivID + 'iframe'), {direction: this.getEffectDirection(),
			afterFinish: function() {
				this.iframeDisplayed = true;
			}.bind(this)});
}

SubjectTermFind.prototype.findSubjectTermsReloaded = function(initialLoad) {

	if (!this.findSubjectTermsDisplayed) {
		return;
	}
	
	var findSubjectTermsDiv = $(this.FindSubjectTermsDivID);
	var findSubjectTermsForm = findSubjectTermsDiv.getElementsByTagName('form')[0];
	var closeLink = findSubjectTermsDiv.select('a.jsCloseFindTerms')[0];

	Event.stopObserving(closeLink, 'click', this.closeFindSubjectTermsClickedListener);
	Event.observe(closeLink, 'click', this.closeFindSubjectTermsClickedListener);	
	
	Event.observe(findSubjectTermsForm, 'submit', this.findSubjectTermsFormSubmitted.bindAsEventListener(this));
	
	$A(findSubjectTermsDiv.getElementsByTagName('a')).each(function(link) {
		if (link.href.indexOf('#') == -1 && link.href.indexOf('javascript:') == -1) {
			link.setAttribute("ajaxHref", link.href);
			link.href = "#";
			Event.stopObserving(link, 'click', this.findSubjectTermsInternalLinkClickedListener);
			Event.observe(link, 'click', this.findSubjectTermsInternalLinkClickedListener);
		}
	}.bind(this));
	
	$A(findSubjectTermsDiv.select('a.jsRemoveSubjectTerm')).each(function(removeLink) {
		if (!this.hasSubjectTermFunction(removeLink.getAttribute("termID"))) {
			Element.hide(removeLink);
		} else {
			Element.show(removeLink);
		}
		Event.stopObserving(removeLink, 'click', this.findSubjectTermsRemoveClickedListener);
		Event.observe(removeLink, 'click', this.findSubjectTermsRemoveClickedListener);
	}.bind(this));
	
	
	$A(findSubjectTermsDiv.select('a.jsAddSubjectTerm')).each(function(addLink) {
		if (this.hasSubjectTermFunction(addLink.getAttribute("termID"))) {
			Element.hide(addLink);
		} else {
			Element.show(addLink);
		}
		
		Event.stopObserving(addLink, 'click', this.findSubjectTermsAddClickedListener);
		Event.observe(addLink, 'click', this.findSubjectTermsAddClickedListener);
	}.bind(this));
	
	this.postReload();
	
	// Focus textbox, if it is already visible (not initial load of frame)
	// Use timeout to make it work in IE
	if (!initialLoad) {
		setTimeout(function() {
			var queryBox = $(this.FindSubjectTermsDivID).select('input.findTermsQuery')[0];  
			queryBox.focus();
			var value = queryBox.value;
			queryBox.value = '';
			queryBox.value = value;
			 
		}.bind(this), 10);
	}
}

SubjectTermFind.prototype.postReload = function() {
	// HACK to make IE < 6  display floating div on top of select boxes using an iframe
	var iframe = $(this.FindSubjectTermsDivID + 'iframe');
	
	if (iframe == null) {
		return;
	}
	
	// Size iframe to same size as floating div
	this.cloneSize($(this.FindSubjectTermsDivID), iframe);
}

SubjectTermFind.prototype.findSubjectTermsFormSubmitted = function(evt) {
	var form = Event.element(evt);
	
	$(this.FindSubjectTermsDivID).select('input.findTermsQuery')[0].focus();
	ajaxSubmit(form, $(this.FindSubjectTermsDivID), this.Name + '.findSubjectTermsReloaded(false)');
	Event.stop(evt);
}

SubjectTermFind.prototype.findSubjectTermsInternalLinkClicked = function(evt) {
	var link = Event.element(evt);
	
	ajaxLoad(link.getAttribute("ajaxHref"), $(this.FindSubjectTermsDivID), this.Name + '.findSubjectTermsReloaded(false)');
	Event.stop(evt);
}

SubjectTermFind.prototype.closeFindSubjectTermsClicked = function(evt) {
	this.closeFindSubjectTerms();
}

SubjectTermFind.prototype.closeFindSubjectTerms = function() {
	var findSubjectTerms = $(this.FindSubjectTermsDivID);
	Effect.Shrink(findSubjectTerms, { direction: this.getEffectDirection(), 
			afterFinish: function(effect) {
				if (this.findSubjectTermsDisplayed) { 
					Element.remove(findSubjectTerms);
					this.findSubjectTermsDisplayed = false;
				}
			}.bind(this)});
	
	this.postClose();
}

SubjectTermFind.prototype.postClose = function() {
	// HACK to make IE display floating div on top of select boxes
	var iframe = $(this.FindSubjectTermsDivID + 'iframe');
	Effect.Shrink(iframe, { direction: this.getEffectDirection(),
			afterFinish: function(effect) {
				if (this.iframeDisplayed) {
					Element.remove(iframe); 
					this.iframeDisplayed = false;
				}
			}.bind(this)});
}

SubjectTermFind.prototype.cloneSize = function(source, target) {
	source = $(source);
	target = $(target);
	
//	if (source.offsetWidth != 0 && source.offsetHeight != 0) {
//		target.clonePosition(source, {setLeft: false, setTop: false, setWidth: true, setHeight: true, offsetLeft: 0, offsetTop: 0});
//	} else {
		target.style.width = source.clientWidth + ((source.clientLeft * 2) || 0);
		target.style.height = source.clientHeight + ((source.clientTop * 2) || 0);
//	}
}

SubjectTermFind.prototype.getEffectDirection = function() {
	var effectDirection;
	
	if (this.TextDirection == 'ltr') {
		effectDirection = 'top-left';
	} else {
		effectDirection = 'top-right';
	}
	
	return effectDirection;
}
