function highlight(obj, color) {
}

function unhighlight(obj) {
}

function setSelectInnerHTML(selectObject, innerHTML) {
	// get the object
	var thisSelect = $(selectObject);
	
	// clear it out
	thisSelect.empty();
	
	
	// if its mozilla, set its innerHTML
	if (!document.all) {
		thisSelect.setHTML(innerHTML);
		return;
	} else { // if its IE
		// then parse out its open tag
		var thisSelectHTML = thisSelect.outerHTML;
		var thisSelectOpenTag = thisSelectHTML.substr(0, thisSelectHTML.indexOf("</") );
		selectObject.outerHTML = thisSelectOpenTag + innerHTML + "</select>";
		return;
		
	}
} 

function getSelect(filterName) {
	switch (filterName) {
		case "category": return $("categorySelect"); break;
		case "series": return $("seriesSelect"); break;
		case "speaker": return $("speakerSelect"); break;
	}
}

function getFilter(filterName) {
	try {
		var filterVal = myFiltersArray[filterName];
		
		if (! filterVal) {
			return "";
		}
		
		return filterVal;
	} catch(e) {
		return "";
	}
}


var XSSRequest = {
	toString: function(obj){
		switch($type(obj)){
			case 'string':
				return '"' + obj.replace(/(["\\])/g, '\\$1') + '"';
			case 'array':
				return '[' + obj.map(Json.toString).join(',') + ']';
			case 'object':
				var string = [];
				for (var property in obj) string.push(Json.toString(property) + ':' + Json.toString(obj[property]));
				return '{' + string.join(',') + '}';
		}
		return String(obj);
	}
};

XSSRequest.Remote = XHR.extend({

	initialize: function(url, options){
		this.url = url;
		this.addEvent('onSuccess', this.onComplete);
		this.parent(options);
		this.setHeader('X-Request', 'JSON');
	},

	send: function(obj){
		return this.parent(this.url, 'json=' + XSSRequest.toString(obj));
	},

	onComplete: function(){
		this.fireEvent('onComplete', this.response.text);
	}

});

function processFilterData(selectName, selectMasterName, result, numResults) {
	
	setSelectInnerHTML($(selectName), result);
	
	if (document.all) { 
		setSelectInnerHTML($(selectMasterName), result);
	}
}

function loadFilters( dontUpdateResults  ) {
	if (dontUpdateResults == null) { dontUpdateResults = false; }
	
	if (! dontUpdateResults) {
		myFiltersArray["pageNumber"] = 1;
		myFiltersArray["lang"] = urlLanguageExt;
	}
	
	var queryString = getQueryString();
	
	
	//var rootURL = "http://yutorah.outdash.net/browse/"; 
	var rootURL = "http://www.yutorah.org/browse/"; 
	var head = document.getElementsByTagName('HEAD')[0];
			
	var speakerURL = rootURL + "_getSpeakerJS.cfm?" + queryString;
	var catURL = rootURL + "_getCategoriesJS.cfm?" + queryString;
	var seriesURL = rootURL +  "_getSeriesJS.cfm?" + queryString;
	/*
	var speakerURL = "_getSpeakerHTML.cfm?" + queryString;
	var catURL = "_getCategoriesHTML.cfm?" + queryString;
	var seriesURL = "_getSeriesHTML.cfm?" + queryString;
	*/
	//alert(filterName);
	//alert(catURL);


	if (getFilter("speaker") == "") {
		//alert("get new speakers");
		$("speakerSelect").empty();
		
		var speakerScriptNode = document.createElement("SCRIPT");
			speakerScriptNode.id = "speakerScriptNode";
			speakerScriptNode.type = "text/javascript";
			speakerScriptNode.src = speakerURL;
		head.appendChild(speakerScriptNode);
			
		
		/*new XSSRequest.Remote(speakerURL, {
			onComplete: function(result) {
				setSelectInnerHTML($("speakerSelect"), result);
				if (document.all) { setSelectInnerHTML($("speakerMasterSelect"), result); }
			}

		}).send();*/
		
	}
			
	if (getFilter("category") == "") {
		//alert("get new categories");
		$("categorySelect").empty();
		/*new XSSRequest.Remote(catURL, {
			onComplete: function(result) {
				setSelectInnerHTML($("categorySelect"), result);
				if (document.all) { setSelectInnerHTML($("categoryMasterSelect"), result); }
			}
		}).send();*/
		
		var categoryScriptNode = document.createElement("SCRIPT");
			categoryScriptNode.id = "categoryScriptNode";
			categoryScriptNode.type = "text/javascript";
			categoryScriptNode.src = catURL;
		head.appendChild(categoryScriptNode);
		
	}

	if (getFilter("series") == "") {
		//alert("get new series");
		$("seriesSelect").empty();
		/*new XSSRequest.Remote(seriesURL, {
			onComplete: function(result) {
				setSelectInnerHTML($("seriesSelect"), result);
				if (document.all) { setSelectInnerHTML($("seriesMasterSelect"), result); }
			}
		}).send();*/
		
		var seriesScriptNode = document.createElement("SCRIPT");
			seriesScriptNode.id = "seriesScriptNode";
			seriesScriptNode.type = "text/javascript";
			seriesScriptNode.src = seriesURL;
		head.appendChild(seriesScriptNode);
	}
	
	
}

function getTitleFrom(someTitle, optionElement){
	
	try {
		
		// first get the optGroup title (if there is one)
		optGroupTitle = "";
		optGroupElement = optionElement.parentNode;
		
		// if the parent element of this node is an option group
		if (optGroupElement.tagName.toUpperCase() == "OPTGROUP") {
			
			// if it has a title
			if (optGroupElement.label != String.fromCharCode(160)) {
				
				// then prefix the optGroup title to the label
				optGroupTitle = optGroupElement.label + " &gt; ";
			}
		}
		

		// then get the element title
		var parens = someTitle.split("(");
		var finalString = parens[0];
		for (var x = 1; x < parens.length -1; x++) {
			finalString = finalString  + "(" + parens[x];
		}
		
		return optGroupTitle + "<b>" + finalString + "</b>";
	} catch (e) {
		return "String Parsing Error";
	}
}

function setPageNumber(specificVal, dontUpdateResults ) {
	if (dontUpdateResults == null) { dontUpdateResults = false; }
	
	myFiltersArray["pageNumber"] = specificVal;
	
	if (! dontUpdateResults) {
		//alert("new page number: " + specificVal);
		updateBrowseResults();
	}
	
	return false;
}

function addFilter(filterType, selectObj, specificVal, specificTitle, dontUpdateResults) {
	
	if (dontUpdateResults != null) {
		// if its been set then leave it alone
	} else {
		dontUpdateResults = false;
	}
	
	if (!specificVal) {
		var selected = selectObj.options[selectObj.selectedIndex];
		var thisVal = selected.value;
		var thisTitle = selected.text;
	} else {
		var thisVal = specificVal;
		var thisTitle = specificTitle;
		selectObj = filterType + "Select";
	}

	var thisFilterLabel = $(filterType + "Filter");
	
	myFiltersArray[filterType] = thisVal;
	thisFilterLabel.setHTML(getTitleFrom(thisTitle, selected));
	thisFilterLabel.setStyle("display","");
	$(selectObj).setStyle("display","none");
	$(filterType + "FilterReset").setStyle("display","inline");
	$(filterType + "FilterTextBox").setStyle("display","none");
	
	loadFilters(dontUpdateResults);
	
	if (! dontUpdateResults) {
		updateBrowseResults();
	}
	//alert(thisTitle);
	return false;
}

myFiltersArray = new Array();

function resetFilter(filterType, dontUpdate) {
	if (dontUpdate == null) { dontUpdate == false; };
	
	myFiltersArray[filterType] = "";	
	var thisFilterLabel = $(filterType + "Filter");

	thisFilterLabel.setStyle("display","none");
	$(filterType + "Select").setStyle("display","");
	$(filterType + "FilterReset").setStyle("display","none");
	$(filterType + "FilterTextBox").setStyle("display","").value = "";

	loadFilters(filterType, "");
	
	if (! dontUpdate ) {
		myFiltersArray["pageNumber"] = 1;
		updateBrowseResults();
	}
	
	return false;
}

function getMediaTypeCategory() {
	mediaTypeCategoryElements = $ES(".mediaTypeCategory");
	mtString = "";
	
	for (var x = 0; x < mediaTypeCategoryElements.length; x++) {
		var thisElement = mediaTypeCategoryElements[x];
		if (thisElement.checked) {
			mtString = mtString + "," + thisElement.value;
		}
	}
	
	myFiltersArray["mediaTypeCategory"] = mtString.substr(1);
	//myFiltersArray["pageNumber"] = 1;
}

function setMediaTypeCategory(mtValueString) {
	// parse out the possible media types	
	var mtValuesArray = new String("audio,video,text").split(",");
	
	// for each possible media type
	for (var x = 0; x < mtValuesArray.length; x++) {
		// get this media type
		var thisMediaType = mtValuesArray[x];
		
		// if this media type is in the string
		if (mtValueString.indexOf(thisMediaType) > -1) {
			// then check its checkbox
			$("mt_" + thisMediaType ).checked = true;
		} else { // otherwise
			// uncheck the box
			$("mt_" + thisMediaType ).checked = false;
		}
	}
}

function getDateRange(){
	
	dateRange = $("mediaDateRange");
	
	myFiltersArray["mediaDateRange"] = dateRange.value;
}

function setDateRange(mValueString){
	var dateRange = $("mediaDateRange");
	
	for (var x = 0; x < dateRange.options.length; x++){
		if (dateRange.options[x].value == mValueString){
			dateRange.selectedIndex = x;
		}
	}
}

function getQueryString(forHash) {
	
	if (forHash == null) { var forHash = false; }
	if (forHash) { var prefix = ""; } else { var prefix = "ID"; }
	
	var queryString = "";
	
	getMediaTypeCategory();
	getDateRange();
	
	for (var filter in myFiltersArray) {
		if (typeof(myFiltersArray[filter]) != "function") {
			if (filter == "mediaTypeCategory") {
				if (myFiltersArray[filter] != "audio,video,text") {
					queryString = queryString + filter + prefix + "=" + myFiltersArray[filter] + "&";
				}
			} else if (filter == "pageNumber") {
				if (myFiltersArray[filter] != "1") {
					queryString = queryString + filter + prefix + "=" + myFiltersArray[filter] + "&";
				}
			} else if (filter == "mediaDateRange") {
				if (myFiltersArray[filter] != "All") {
					queryString = queryString + filter + prefix + "=" + myFiltersArray[filter] + "&";
			    }
			} else if (myFiltersArray[filter] != "") {
				queryString = queryString + filter + prefix + "=" + myFiltersArray[filter] + "&";
			}
		}
	}
	
	return queryString + "organizationID=" + urlAffiliateKey;
}


function setFilterHTML(nodeID, result) {
	var thisNode =  $(nodeID);
	//alert(thisNode.outerHTML);
	thisNode.setHTML(result);
	//alert(nodeID);
}

function loadLectures(lecturesURL) {
	var head = document.getElementsByTagName('HEAD')[0];

	var lectureScriptNode = document.createElement("SCRIPT");
		lectureScriptNode.id = "lectureScriptNode";
		lectureScriptNode.type = "text/javascript";
		lectureScriptNode.src = lecturesURL;
	head.appendChild(lectureScriptNode);
		
	/*new XSSRequest.Remote(lecturesURL, {
		onComplete: function(result) {
			//alert(result);
			$("lecturesDiv").setHTML(result);
			
		}
	}).send();*/
}


function setSortOrder() {
	specificVal = document.getElementById('setSortOrder').value;
	myFiltersArray["sortOrder"] = specificVal;

	//alert("new page number: " + specificVal);
	updateBrowseResults();
	
	return false;
}



function updateBrowseResults() {
	//var URL = "_browseResults.cfm?";
	var URL = "_browseResultsJS.cfm?";
	var queryString = getQueryString();
	// if this isnt already in the history
	if (location.hash.replace("#","") != getQueryString(true)) {
		// then add it to the history
		//alert("from: " + location.hash.replace("#","") + "\n\nto:   " + getQueryString(true));
		jQuery.historyLoad(getQueryString(true), true);
	}
	//alert("updating result with new url:" + URL + queryString);
	//try { jQuery.historyLoad(queryString); } catch (e) {}
	//var baseURL = "http://yutorah.outdash.net/browse/";
	var baseURL = "http://www.yutorah.org/browse/";
					
	loadLectures(baseURL + URL + queryString);
	//$("browseResultsFrame").src = URL + queryString;
}

function getTitleFromID(filterType, filterValue) {
	var thisSelect = getSelect(filterType);
	
	if (thisSelect) {
		for (var x = 0; x < thisSelect.options.length; x++) {
			if (thisSelect.options[x].value == filterValue) {
				return thisSelect.options[x].text;
			}
		}
	} 
	
	return "";
}

function processBrowseTitle(filterType, newTitle, recordCount) {
	var thisFilterLabel = $(filterType + "Filter");
	thisFilterLabel.setHTML(newTitle);
}

function loadContentFromHash(hash) {

	var reset_category = true;
	var reset_speaker = true;
	var reset_series = true;
	var reset_pageNumber = true;
	

	// assuming we have something to work with
	if (hash != "") {
		var hashArray = hash.split("&");

		for (var x = 0; x < hashArray.length; x++) {
			var thisHashElement = hashArray[x];
			var thisHashElementArray = thisHashElement.split("=");
			var thisHashFieldName = thisHashElementArray[0];
			var thisHashFieldValue = thisHashElementArray[1];
			
			if (
					(thisHashFieldName == "category") ||
					(thisHashFieldName == "speaker") ||
					(thisHashFieldName == "series")
					
				) {
			
				var thisTitle = getTitleFromID(thisHashFieldName, thisHashFieldValue);
				
				// if we didnt find a title
				if (thisTitle == "") {
					// then try to get the actual title
					//var baseURL = "http://yutorah.outdash.net/browse/";
					var baseURL = "http://www.yutorah.org/browse/";
					
					var getTitleURL = baseURL + "_getTitleJS.cfm?filterType=" + thisHashFieldName + "&filterValue=" + thisHashFieldValue;
					/*var response = null;
					var thisJSON = new XHR({method:'get',async:false}).send(getTitleURL);
					thisTitle = thisJSON.transport.responseText;*/
					var head = document.getElementsByTagName('HEAD')[0];
	
					var titleScriptNode = document.createElement("SCRIPT");
						titleScriptNode.id = "titleScriptNode";
						titleScriptNode.type = "text/javascript";
						titleScriptNode.src = getTitleURL;
					head.appendChild(titleScriptNode);
					
				}
				
				// set the reset vars
				eval("reset_" + thisHashFieldName + " = false;");
				
				// add the filter
				addFilter(thisHashFieldName, getSelect(thisHashFieldName), thisHashFieldValue, thisTitle, true);
				
			} else if (thisHashFieldName == "pageNumber") {
				// set the page number
				 myFiltersArray["pageNumber"] = thisHashFieldValue;
				 reset_pageNumber = false;
			} else if (thisHashFieldName == "mediaTypeCategory") {
				// set the media type category
				setMediaTypeCategory(thisHashFieldValue);
			} else if (thisHashFieldName == "mediaDateRange") {
				// set the date range
				setDateRange(thisHashFieldValue);
			}
		}
		
		if (reset_speaker) { resetFilter("speaker", true); }
		if (reset_category) { resetFilter("category", true); }
		if (reset_series) { resetFilter("series", true); }
		if (reset_pageNumber) { setPageNumber(1, true); }


		// and refresh the content at the bottom
		updateBrowseResults();
	} else {
		// clear everything and update the results
		resetFilter("speaker", true);
		resetFilter("category", true);
		resetFilter("series", true);
		updateBrowseResults();
	}
	
}

function filterSelectContent(filterType, textBox) {
	var filterValue = textBox.value.toUpperCase();
	
	if (document.all) { // if its IE
		// then use the master select box as the source
		var selectBox = $(filterType + "MasterSelect");
		var slaveSelectBox = $(filterType + "Select");
		setSelectInnerHTML(slaveSelectBox, selectBox.innerHTML); 
		
		if (filterValue == "") {
			return false;
		}
	} 
	
	var selectBox = $(filterType + "Select");

	var optionsArray = $ES("option", selectBox);
	
	for (var x = 0; x < optionsArray.length; x++){
		var thisOption = optionsArray[x];
		
		if (thisOption.value > 0) {
			// if this is a real option
			
			if (thisOption.text.toUpperCase().indexOf(filterValue) == -1) {
				if (thisOption.className != "hiddenOption") {
					if (document.all) {
						thisOption.remove();
					} else {
						thisOption.className = "hiddenOption";
					}
				}
			} else {
				if (thisOption.className != "visibleOption") {
					thisOption.className = "visibleOption";
				}
			}
		} else {
			if (thisOption.className != "visibleOption") {
				thisOption.className = "visibleOption";
			}
		}
	}
	
	var optgroupsArray = $ES("optgroup", selectBox);
	for (var y = 0; y < optgroupsArray.length; y++){
		var thisOptgroup = optgroupsArray[y];
		
		if (thisOptgroup.label.charCodeAt(0) != 160) {
			if ($ES(".visibleOption", thisOptgroup).length == 0) {
				if (document.all) {
					thisOptgroup.remove();
				} else {
					thisOptgroup.className = "hiddenOption";
				}
			} else {
				thisOptgroup.className = "visibleOption";
			}
		}
	}
	
}