	
	// SMS objects used in this client:
	var infoBubble = null;
	var resourcesTab = null;
	var stdKeywords = '';
	var numberOfStrands = 0;
	var currentStrandCount = 0;
	var printRes = '';
	var printStrict = '';
	var strictResContent = false;
	var regResContent = false;
	var nsesContent = false;
	var resPager = 'page_0_4';
	var resStrictPager = 'page_0_4';
	var linkToPageOpen = false;
	
	var regResComplete = false;
	var strictResComplete= false;
	
	// Set up event listeners and actions on the Strand Map, on load:
	SMSEvent.addListener(StrandMap,"onload", setUpStrandMap);
	function setUpStrandMap() {
		
		// Set up handlers for actions on the StrandMap:
		infoBubble = StrandMap.getInfoBubble();		
		
		SMSEvent.addListener(StrandMap,"onbenchmarkselect",onBenchmarkSelect);
		SMSEvent.addListener(StrandMap,"onprintviewdisplay",onPrintViewDisplay);
		
		// Create the aligned 'Resources' tab and set it's handler:
		resourcesStrictTab = new InfoBubbleTab('Top Picks');
		infoBubble.addTab(resourcesStrictTab);
		SMSEvent.addListener(StrandMap,"onbenchmarkselect",resourcesStrictTabCallback);
		
		// Create the 'Resources' tab and set it's handler:
		resourcesTab = new InfoBubbleTab('Related Resources');
		infoBubble.addTab(resourcesTab);
		SMSEvent.addListener(StrandMap,"onbenchmarkselect",resourcesTabCallback);
		
		// Use the built-in tabs for displaying related benchmarks and nses standards:
		infoBubble.addBuiltinTab("nses","NSES Standards");
		
		if(gup('debug') == 1){
			// Add tabs to the Info Bubble in the order they will appear:		
			benchmarkInfoTab = new InfoBubbleTab('Benchmark info');
			infoBubble.addTab(benchmarkInfoTab);
			SMSEvent.addListener(benchmarkInfoTab,"onselect",myCallBackForBenchmarkInfoTab);	
			
			// Create the 'Recommend' tab and set it's handler:
			recommendTab = new InfoBubbleTab('Recommend a Resource');
			infoBubble.addTab(recommendTab);
			SMSEvent.addListener(StrandMap,"onbenchmarkselect",recommendTabCallback);		
		} else {
			// Use the built-in tabs for displaying related benchmarks and nses standards:
			infoBubble.addBuiltinTab("relatedbenchmarks","Related Benchmarks");
		}
		// When a benchmark is selected by the user, make sure the resourcesTab is displayed:
		SMSEvent.addListener(StrandMap,"onbenchmarkselect", function() {
			regResComplete = false;
			strictResComplete = false;
			nsesContent = false;
			infoBubble.hideTabPane(true);
			infoBubble.hideTab(_nsesTab);
			infoBubble.hideTab(resourcesTab);
			infoBubble.hideTab(resourcesStrictTab);
			var bmJson = StrandMap.getSelectedBenchmarkRecordJson();
			var sa = bmJson.itemRecord.Data.Standards.toString().split('+');
			if(sa[0] == 'NSES'){
				nsesContent	= true;
				infoBubble.showTab(_nsesTab);
			}
			
			infoBubble.selectTab(resourcesStrictTab);
		});
		StrandMap.enableMisconceptions(true);
		// register misconceptions click
		if($('smsMisconceptionsLink')){
			Event.observe($('smsMisconceptionsLink'),'click', trackMisconceptions);
		}
	}

	function registerTabs(){
		
		// Track clicks to the tabs and toggles:
		Event.observe($('tab1'),'click', trackTopPicks);
		Event.observe($('tab2'),'click', trackRelatedResources);
		Event.observe($('tab3'),'click', trackNSES);
		Event.observe($('tab4'),'click', trackRelatedBenchmarks);
	}

	function trackMisconceptions(){
		var mapId = StrandMap.getMapId();
		// if open register a close
		// if closed register an open
		//$$('.misconceptionLinkOpen')
		if(!isMisconceptionsDown){
			googleTrack('/content_click/student_misconceptions/'+mapId+'/');
		}
		
	}
	
	function trackViewLink() {
		var id = StrandMap.getSelectedBenchmarkId();
		var mapId = StrandMap.getMapId();
		if(id){
			googleTrack('/ui_click/link/link_to_this_page/'+mapId+'/'+id+'/');
		} else {
			googleTrack('/ui_click/link/link_to_this_page/'+mapId+'/');
		}
	}
	
	function trackPrintPdf(){
		var id = StrandMap.getSelectedBenchmarkId();
		var mapId = StrandMap.getMapId();
		if(id){
			googleTrack('/content_click/map_pdf_button/'+mapId+'/'+id+'/');
		} else {
			googleTrack('/content_click/map_pdf_button/'+mapId+'/');
		}
	}
	function trackTopPicks(){
		var id = StrandMap.getSelectedBenchmarkId();
		var mapId = StrandMap.getMapId();
		googleTrack('/content_click/tab/top_picks/'+mapId+'/'+id+'/'+resStrictPager+'/');
	}

	function trackRelatedResources(){
		var id = StrandMap.getSelectedBenchmarkId();
		var mapId = StrandMap.getMapId();
		
		googleTrack('/content_click/tab/related_resources/'+mapId+'/'+id+'/'+resPager+'/');
	}

	function trackNSES(){
		var id = StrandMap.getSelectedBenchmarkId();
		var mapId = StrandMap.getMapId();
		
		googleTrack('/content_click/tab/nses/'+mapId+'/'+id+'/');
	}

	function trackRelatedBenchmarks(){
		var id = StrandMap.getSelectedBenchmarkId();
		var mapId = StrandMap.getMapId();
		
		googleTrack('/content_click/tab/related_benchmarks/'+mapId+'/'+id+'/');
	}
	
	function onBenchmarkSelect() {
		var id = StrandMap.getSelectedBenchmarkId();
		var mapId = StrandMap.getMapId();
		googleTrack('/content_click/bubble/'+mapId+'/'+id+'/');
		
		// reset page trackers
		resPager = 'page_0_4';
		resStrictPager = 'page_0_4';
		
		infoBubble.setTitle("Benchmark Details");
		infoBubble.setBuiltinContent("benchmarkonly");
		
		registerTabs();
	}	
	function onPrintViewDisplay() {	
		
		getResources('print');	
		Event.observe($('mapPdfButton'),'click', trackPrintPdf);
		var inputs = document.getElementsByTagName("input");
		
		Event.observe(inputs[inputs.length - 1], 'mouseup',trackPrintButtons);
		
	}
	function trackPrintButtons(){
		var id = StrandMap.getSelectedBenchmarkId();
		var mapId = StrandMap.getMapId();
		if(id){
			googleTrack('/ui_click/print_command_button/'+mapId+'/'+id+'/');
		} else {
			googleTrack('/ui_click/print_command_button/'+mapId+'/');
		}
	}	
	function chooseActiveTab(){
		
		if(strictResContent != false){
			infoBubble.selectTab(resourcesStrictTab);
		} else if(regResContent != false){
			infoBubble.selectTab(resourcesTab);	
		} else if(nsesContent != false){
			infoBubble.selectTab(_nsesTab);	
		} else{
			infoBubble.selectTab(_bmTab);	
		} 
	
		infoBubble.showTabPane();
	}

	function checkResourcesComplete(){
		if(regResComplete == true && strictResComplete == true){
			chooseActiveTab();	
		}	
	}
	function resourcesTabCallback() {	
		stdKeywords = '';
		currentStrandCount = 0;
		numberOfStrands = 0;
		resourcesTab.setContent('Loading...');
		getResources('');	
	}
	function resourcesStrictTabCallback(){
		stdKeywords = '';
		currentStrandCount = 0;
		numberOfStrands = 0;
		resourcesStrictTab.setContent('Loading...');
		getResources('strict');
	}
	function recommendTabCallback() {	
		recommendTab.setContent('Loading...');
		var reqUrl = "bubble/recommender.jsp";
		new Ajax.Request(
			reqUrl, 
			{
				method: 'post', 			
				onSuccess: function (response) {
					var c;
					if(response.responseText){
						c = response.responseText;
						recommendTab.setContent(c);
					}
				},
				onFailure: function (response) {
					alert('The AJAX request failed. Message:\n\n ' + response.responseText);
				}
			});
		
	}

	function getStds(bmJson){
		var sa = bmJson.itemRecord.Data.Standards.toString().split('+');
		var stds= '';
		
		if(sa[0] == 'NSES'){
			for (var i = 0; i< sa.length; i += 6) {
				var re = new RegExp('(Standards)$');
				var toTest = sa[i+3];
  				if (toTest.match(re)) {
					stds += '<NSESstandard>' + sa[i] + ':' + sa[i+1]  + ':' + sa[i+3] + ':' + sa[i+4] + ':' + sa[i+5] + '</NSESstandard>';
				} else {
					stds += '<NSESstandard>' + sa[i] + ':' + sa[i+1]  + ':' + sa[i+3] + ' Standards:' + sa[i+4] + ':' + sa[i+5] + '</NSESstandard>';
				}
			}
			
			return stds;
		} else {
			return '';	
		} 
	}
	function checkRecommenderForm() {
			var error = '';
			if(document.getElementById('url').value.length==0 || document.getElementById('url').value==null){
				error += '<li>Missing Required Field: Resource URL</li>'	
				document.getElementById('divURL').className = "required_error";
			} else {
				var j = new RegExp("(http://|https://|ftp://)+([a-zA-Z0-9])+([\-\.]{1}[a-zA-Z0-9]+)*\.[a-zA-Z]{2,5}((:[0-9]{1,5})?/.*)?");
				if (!document.getElementById('url').value.match(j))
				{
					error += '<li>Incorrect URL Format: example <em>http://www.somedomain.org</em></li>';
				document.getElementById('divURL').className = "required_error";
				}	
			}

			if(document.getElementById('title').value.length==0 || document.getElementById('title').value==null){
				error += '<li>Missing Required Field: Resource Title</li>'	
				document.getElementById('divTitle').className = "required_error";
			}

			if(document.getElementById('audience').value.length==0 || document.getElementById('audience').value==null){
				error += '<li>Missing Required Field: Resource Audience</li>'	
				document.getElementById('divAudience').className = "required_error";
			}

			if(document.getElementById('description').value == ''){
				error += '<li>Missing Required Field: Resource Description</li>'	
				document.getElementById('divDescription').className = "required_error";
			}

			if(error != ''){
				document.getElementById('errorbox').innerHTML = '<div class="error"><strong>An error occurred:</strong><ul>' + error + '</ul></div>';	
			} else {
				var parentIds = StrandMap.getParentIds();
				var myUrl = 'http://strandmaps.nsdl.org/cms1-2/jsapi/json?callBack=processParentIds&Format=SMS-JSON&ObjectID='+parentIds[0];
				
				var mapScriptReq = document.createElement( 'script' );
				mapScriptReq.src = myUrl;
				// Insert the script in the document head, which executes the callback renderParentTab()
				document.getElementsByTagName('head')[0].appendChild( mapScriptReq );
			}
	}
	function processParentIds(parentJson){
		var recordJson = parentJson['SMS-CSIP'].QueryResponse.SMS.Record;
		if(recordJson.itemRecord.Data.ObjectType != 'Chapter'){
			var parentId = recordJson.itemRecord.Data.InternalRelationship.CatalogID.CatalogNumber;
			
			var myUrl = 'http://strandmaps.nsdl.org/cms1-2/jsapi/json?callBack=processParentIds&Format=SMS-JSON&ObjectID='+parentId;
			
			var mapScriptReq = document.createElement( 'script' );
			mapScriptReq.src = myUrl;
			// Insert the script in the document head, which executes the callback renderParentTab()
			document.getElementsByTagName('head')[0].appendChild( mapScriptReq );
		} else {
			submitRecommenderForm(recordJson.itemRecord.Data.Name);
		}
	}
	function getAAASCode(bmJson){
		var AAASCode = bmJson.itemRecord.Data.AAASCode;
		var re = new RegExp('/[A-Z]*');
		var grdloc = AAASCode.search(re);
		var newCode = AAASCode.substring(0,grdloc-1)+ '.' + AAASCode.substring(grdloc-1);
		var subCode = newCode.replace(re,'.');

		var re2 = new RegExp('a?b?$');
		var paraloc = subCode.search(re2);
		var lastCode = subCode.substring(0,paraloc);

		return lastCode;
	}
	
	function getGrades(gradeArray){
		switch(gradeArray[0])
		{
			case 'K':
  				var grades = 'Kindergarten|Grade 1|Grade 2|Early Elementary';
  				break    
			case '3':
  				var grades = 'Grade 3|Grade 4|Grade 5|Upper Elementary';
  				break   
			case '6':
  				var grades = 'Grade 6|Grade 7|Grade 8|Middle School';
  				break   
			case '9':
  				var grades = 'Grade 9|Grade 10|Grade 11|High School';
  				break
  		}
		return grades;
	}
	function submitRecommenderForm(chapterTitle) {
		var id = StrandMap.getSelectedBenchmarkId();
		var recordJson = StrandMap.getSelectedBenchmarkRecordJson();
		var bmID = id;
		var resStandards = getStds(recordJson);
		var grArray = recordJson.itemRecord.Data.GradeRanges.GradeRange;	
		var grades = getGrades(grArray);
		var resUrl = document.getElementById('url').value;
		var resTitle = document.getElementById('title').value;
		var resDescription = document.getElementById('description').value;
		var resAudience = document.getElementById('audience').value;
		var mapTitle = StrandMap.getMapJson().itemRecord.Data.Name;		
		var AAASCode = "AAAS Benchmarks "+ chapterTitle + ": "+ mapTitle + " " + getAAASCode(recordJson);
		var asnID = '<asnID></asnID>';
		// for now asnID var is not included in url;

		var subjects = '';
		for(var i=1;i<=6;i++){
			if(document.getElementById('subject_'+i).checked == true){
				var myValue = document.getElementById('subject_'+i).value;
				subjects += "<subject>"+myValue +"</subject>";
			}
		}	
		
		var reqUrl = "bubble/recommenderProcessor.jsp?url="+ resUrl+ "&title="+resTitle+"&description="+ resDescription + "&id="+bmID + "&grades="+grades + "&stds=" + resStandards + "&subjects=" + subjects + "&AAASCode=" + AAASCode + "&audience=" + resAudience + "&asnID=";
		
		new Ajax.Request(
			reqUrl, 
			{
				method: 'post', 			
				onSuccess: function (response) {
					var c;
					c = response.responseText;
					c = c.replace(/^\s+|\s+$/g, '') ;
					processResponse(c, resUrl, resTitle, resDescription, bmID, grades, resStandards, subjects, bmID, resAudience);
				},
				onFailure: function (response) {
					processResponse('AJAX FAILED', resUrl, resTitle, resDescription, bmID, grades, resStandards, subjects, resAAASCode, resAudience);
				}
			});
	}
	
	function processResponse(resourceID, resUrl, resTitle, resDescription, bmID, grades, resStandards, subjects, bmID, resAudience){
		// check for confirm id, then send data via email
		
		
		var mailUrl = "bubble/mail.jsp?resourceID=" + resourceID + "&url="+ resUrl+ "&title="+resTitle+"&description="+ resDescription + "&id="+bmID + "&grades="+grades + "&stds=" + resStandards + "&subjects=" + subjects + "&bmID=" + bmID +"&audience=" + resAudience;
		new Ajax.Request(
			mailUrl, 
			{
				method: 'post', 			
				onLoading: function() {
					recommendTab.setContent('Submitting resource...');
				},
				onComplete: function () {
					refreshForm(resUrl);
				}
			});	
	}
	function refreshForm(resUrl){
		var reqUrl = "bubble/recommender.jsp?url=" +resUrl;
		new Ajax.Request(
			reqUrl, 
			{
				method: 'post', 			
				onSuccess: function (response) {
					var c;
					if(response.responseText){
						c = response.responseText;
						recommendTab.setContent(c);
					}
				},
				onFailure: function (response) {
					alert('The AJAX request failed. Message:\n\n ' + response.responseText);
				}
			});
			
		}
	function updateResources(offset,displaytype){
		if(displaytype == 'print'){
			sendResRequest(offset,'print',function(content){
				printRes = "<h3>Related Resources</h3> " + content;
				printContent();
			});
		} else if(displaytype == 'strictprint'){
			sendResRequest(offset,'strictprint',function(content){
				printStrict = "<h3>Top Picks</h3> " + content;
				printContent();
			});
		} else if(displaytype == 'strict'){
			sendResRequest(offset,'strict',function(content){
				resourcesStrictTab.setContent(content);	
			});
		} else {
			resourcesTab.setContent('Loading...');
			sendResRequest(offset,'',function(content){
				resourcesTab.setContent(content);	
			});
		}
	}
	// get NSDL Search resources
	function getResources(viewtype){
		var json = StrandMap.getSelectedBenchmarkRecordJson();
		
		if(json != null){
			
			if(viewtype == 'strict'){
				getStrictRes();
			} else {
			
				if(stdKeywords == ''){
					<!-- // get the relationships and relationship types for this benchmark //-->
					var relArray = json.itemRecord.Data.InternalRelationship.CatalogID;	
					var stdStr = "STD";
					var index = 0;
					var strandArray = new Array();
					
					for(var k=0; k< relArray.length; k++){
						if((relArray[k].RelationType == 'Is Part Of' || relArray[k].RelationType == 'is part of') && relArray[k].CatalogNumber.search(stdStr) != -1){
							strandArray[index] = relArray[k].CatalogNumber;
							index++;
							
							numberOfStrands++;
						}
					}
					if(viewtype == 'print'){
						for(var i = 0; i < strandArray.length; i++) {
							var myUrl = 'http://strandmaps.nsdl.org/cms1-2/jsapi/json?callBack=checkStrandPrint&Format=SMS-JSON&ObjectID='+strandArray[i];
							
							var mapScriptReq = document.createElement( 'script' );
							mapScriptReq.src = myUrl;
							
							// Insert the script in the document head, which executes the callback renderParentTab()
							document.getElementsByTagName('head')[0].appendChild( mapScriptReq );	
						}
					} else {
						for(var i = 0; i < strandArray.length; i++) {
							var myUrl = 'http://strandmaps.nsdl.org/cms1-2/jsapi/json?callBack=checkStrand&Format=SMS-JSON&ObjectID='+strandArray[i];
							
							var mapScriptReq = document.createElement( 'script' );
							mapScriptReq.src = myUrl;
							
							// Insert the script in the document head, which executes the callback renderParentTab()
							document.getElementsByTagName('head')[0].appendChild( mapScriptReq );	
						}
					}
				}
			}	
		}	
	}

	function sendResRequest(offset,displaytype,callback){
		var json = StrandMap.getSelectedBenchmarkRecordJson();
		var id = StrandMap.getSelectedBenchmarkId();	
		<!--// get the map id //-->
		var referringMapId = StrandMap.getReferringMapId();
		if(referringMapId != null){
			var mapId = referringMapId;
		} else {
			var mapId = StrandMap.getMapId();
		}
		if(!offset){
			offset = 0;	
		}
		if(!displaytype){
			displaytype='';	
		}
		if(displaytype == 'strict' || displaytype == 'strictprint'){
			var recordJson = StrandMap.getSelectedBenchmarkRecordJson();
			var AAASCodeMod = getAAASCode(recordJson);
			var mapTitle = StrandMap.getMapJson().itemRecord.Data.Name;	
			var bmFullText = recordJson.itemRecord.Data.Description;
			var reqUrl = "bubble/resourcesStrict.jsp?mapTitle="+mapTitle+"&bmId="+ id + "&mapId="+mapId+ "&startingOffset=" + offset + "&displaytype="+displaytype+"&AAASCodeMod="+AAASCodeMod+"&bmFullText="+bmFullText;
		} else {
			<!-- // get the grades for this benchmark //-->
			var grArray = json.itemRecord.Data.GradeRanges.GradeRange;
			switch(grArray[0])
			{
				case 'K':
		  			var grades = 'K';
		  			break    
				case '3':
		  			var grades = '3';
		  			break   
				case '6':
		  			var grades = '6';
		  			break   
				case '9':
		  			var grades = '9';
		  			break
				default:
		  				
			}
			<!-- // get the keywords for this benchmark //-->
			var kwArray = json.itemRecord.Data.Keywords.keyword;
			var keywords = '';
			for(var i=0; i< kwArray.length; i++){
				if(i == 0){
					keywords += kwArray[i];
				} else if(i == kwArray.length-1){
					keywords += '|' + kwArray[i];
				} else {
					keywords += '|' + kwArray[i];
				}
			}
				
			
				if(mapId == 'SMS-MAP-1496' || mapId == 'SMS-MAP-1504' || mapId == 'SMS-MAP-1478' || mapId == 'SMS-MAP-1487' || mapId=='SMS-MAP-2185' || mapId=='SMS-MAP-2196' || mapId=='SMS-MAP-2214' || mapId=='SMS-MAP-2231'){
					var subjects = 'social studies';
				} else {
					var subjects = '';
					var subjArray = json.itemRecord.Data.Subjects.Subject;
					if(subjArray){
						if(typeof(subjArray) == 'string'){
							if(subjects.search(subjArray) == -1){
								if(subjects == ''){
									if(subjArray.search(':')){
										var testsubj =  subjArray.substr(subjArray.indexOf(':')+1);
										subjects += testsubj.replace(/#|\//g,'|');
									} else {
										subjects += subjArray.replace(/#|\//g,'|');
									}
								}
							}
						// If an array of keywords:
						} else {
							for(var m=0; m< subjArray.length; m++){
								if(typeof subjArray[m] != 'undefined'){
									if((subjects.search(subjArray[m].substr(subjArray[m].indexOf(':')+1)) == -1) && (subjects.search(subjArray[m]) == -1)){
										if(m==0){
											if(subjArray[m].search(':')){
												var testsubj =  subjArray[m].substr(subjArray[m].indexOf(':')+1);
												subjects += testsubj.replace(/#|\//g,'|');
											} else {
												subjects += subjArray[m].replace(/#|\//g,'|');
											}	
										} else if(m == subjArray.length-1){
											if(subjArray[m].search(':')){
												var testsubj =  subjArray[m].substr(subjArray[m].indexOf(':')+1);
												subjects += '|' + testsubj.replace(/#|\//g,'|');
											} else {
												subjects += '|' + subjArray[m].replace(/#|\//g,'|');
											}		
										} else {
											if(subjArray[m].search(':')){
												var testsubj =  subjArray[m].substr(subjArray[m].indexOf(':')+1);
												subjects += '|' + testsubj.replace(/#|\//g,'|');
											} else {
												subjects += '|' + subjArray[m].replace(/#|\//g,'|');
											}	
										}				
									}
										
								}
							}
						}
					}
				}
			if(gup('debug') != 1){
				var reqUrl = "bubble/resources.jsp?keywords="+ keywords+ "&grades="+grades+"&subjects="+ subjects + "&startingOffset="+offset+ "&stdKeywords="+stdKeywords + "&displaytype="+displaytype+"&bmId="+id+"&mapId="+mapId;
			} else {
				var reqUrl = "bubble/resources.jsp?keywords="+ keywords+ "&grades="+grades+"&subjects="+ subjects + "&startingOffset="+offset+ "&stdKeywords="+stdKeywords + "&displaytype="+displaytype+"&debug=1&bmId="+id+"&mapId="+mapId;
			}
		}
		new Ajax.Request(
			reqUrl, 
			{
				method: 'post', 			
				onSuccess: function (response) {
					var c;
					if(response.responseText){
						c = response.responseText;
						callback(c);
					}
				},
				onFailure: function (response) {
					alert('The AJAX request failed. Message:\n\n ' + response.responseText);
				}
			});
	}
	function getStrandKeywords(jsonResponse){
		var referringMapId = StrandMap.getReferringMapId();
		if(referringMapId != null){
			var mapId = referringMapId;
		} else {
			var mapId = StrandMap.getMapId();
		}
		var newKeywords = stdKeywords;
		var recordJson = jsonResponse['SMS-CSIP'].QueryResponse.SMS.Record;
		var relation = recordJson.itemRecord.Data.InternalRelationship.CatalogID;
		
		if(relation.length != undefined){
			for(var k=0; k< relation.length; k++){
				if(relation[k].CatalogNumber == mapId){
					var kwArray = recordJson.itemRecord.Data.Keywords.keyword;
					// If only one keyword:
					
					if(typeof(kwArray) == 'string'){
						if(newKeywords.search(kwArray) == -1){
							if(newKeywords == ''){
								newKeywords = kwArray;
							} else {
								newKeywords += kwArray;
							}
						}
					// If an array of keywords:
				} else {
						for(var i=0; i< kwArray.length; i++){
							if(newKeywords.search(kwArray[i]) == -1){
								if(newKeywords == ''){
									newKeywords = kwArray[i];;
								} else {
									newKeywords += "|"+kwArray[i];;
								}	
							}
						}
					}
				}
			}
		} else {
			if(relation.CatalogNumber == mapId){
					var kwArray = recordJson.itemRecord.Data.Keywords.keyword;
					// If only one keyword:
					
					if(typeof(kwArray) == 'string'){
						if(newKeywords.search(kwArray) == -1){
							if(newKeywords == ''){
								newKeywords = kwArray;
							} else {
								newKeywords += kwArray;
							}
						}
					// If an array of keywords:
				} else {
						for(var i=0; i< kwArray.length; i++){
							if(newKeywords.search(kwArray[i]) == -1){
								if(newKeywords == ''){
									newKeywords = kwArray[i];;
								} else {
									newKeywords += "|"+kwArray[i];;
								}	
							}
						}
					}
				}	
		}
		stdKeywords = newKeywords;
	}
	function getStrictRes(){
		sendResRequest('','strict',function(content){
			var re = new RegExp('/[A-Z]*');
			var contentCheck = content.search(re);
			if(contentCheck > -1){
				resourcesStrictTab.setContent(content);	
				strictResContent = true;
				infoBubble.showTab(resourcesStrictTab);
			} else {
				strictResContent = false;
				resourcesStrictTab.setContent('<p>There are no associated resources for this benchmark.  Please look at the Related Resources tab for possible relevant resources in the NSDL.</p>');
			}
			strictResComplete = true;
			infoBubble.selectTab(resourcesTab);
			checkResourcesComplete();
		});	
	}

	function checkStrand(jsonResponse){
		getStrandKeywords(jsonResponse);
		currentStrandCount++;
		if(currentStrandCount == numberOfStrands){
			sendResRequest('','',function(content){
				var re = new RegExp('/[A-Z]*');
				var contentCheck = content.search(re);
				if(contentCheck > -1){
					resourcesTab.setContent(content);
					regResContent = true;
					infoBubble.showTab(resourcesTab);
				} else {
					regResContent = false;
					resourcesTab.setContent('<p>There are no related resources for this benchmark.</p>');
				}
				regResComplete = true;
				checkResourcesComplete();
			});
		}
	}
	function checkStrictPrint(){
		sendResRequest('','strictprint',function(content){
			var re = new RegExp('/[A-Z]*');
			var contentCheck = content.search(re);
			if(contentCheck > -1){
				printStrict = "<h3>Top Picks</h3> " + content;
			} else {
				printStrict = "";
			}
			printContent();
		});		
	}
	function printContent(){
		StrandMap.setPrintViewContent(printStrict + printRes);	
	}
	function checkStrandPrint(jsonResponse){
		getStrandKeywords(jsonResponse);
		currentStrandCount++;
		if(currentStrandCount == numberOfStrands){
			sendResRequest('','print',function(content){
				var re = new RegExp('/[A-Z]*');
				var contentCheck = content.search(re);
				if(contentCheck > -1){
					printRes = "<h3>Related Resources</h3> " + content;
				} else {
					printRes = "";
				}
				checkStrictPrint();
			});
		}
	}
	
	
	// This tab illustrates how to access benchmark JSON and display it in the tab:
	function myCallBackForBenchmarkInfoTab() {
		var id = StrandMap.getSelectedBenchmarkId();
		var mapTitle = StrandMap.getMapJson().itemRecord.Data.Name;
		var recordJson = StrandMap.getSelectedBenchmarkRecordJson();
		
		var content = '<h1>Benchmark details</h1>';
		content += '<p>In map <i>' + mapTitle + '</i></p>';
		
		content += '<p>Here is a small sample of the data that is available from the service about this benchmark:</p>';
		content += '<ul>';
		content += '<li><b>Benchmark name</b>: ' + recordJson.itemRecord.Data.Name + '</li>';
		content += '<li><b>Description</b>: ' + recordJson.itemRecord.Data.Description + '</li>';
		content += '<li><b>Benchmark SMS ID</b>: ' + id + '</li>';
		content += '<li><b>AAAS Code</b>: ' + recordJson.itemRecord.Data.AAASCode + '</li>';

		var grArray = recordJson.itemRecord.Data.GradeRanges.GradeRange;	
		content += '<li><b>Grade range</b>: ' + grArray[0] + ' - ' + grArray[grArray.length-1] + '</li>';
		
		var kwArray = recordJson.itemRecord.Data.Keywords.keyword;
		content += '<li><b>Keywords</b>: ';
		for(var i=0; i< kwArray.length; i++)
			content += kwArray[i] + (i == kwArray.length-1 ? '</li>' : ', ');
			
		var relArray = recordJson.itemRecord.Data.InternalRelationship.CatalogID;	
		content += '<li><b>Internal relationships</b>:';
		for(var i=0; i< relArray.length; i++)
			content += '<br/>- ' + relArray[i].RelationType + ' - ' + relArray[i].CatalogNumber;		
		content += '</li></ul>';
		benchmarkInfoTab.setContent(content);
	}	
	
	function gaTrackResource(gaURL,collections,resource,position){
		// clickType possibilities
		   // open_resource
		   // send the shortened domain along with each collection id to google
		   var collection = collections.split('|');
		   var coll_len = collection.length;
		   
		   for(var i= 0;i<coll_len;i++){
		   	googleTrack(gaURL+collection[i]+'/'+resource+'/'+position);
		   	// send resource clicks to nsdl as well
		   	if(typeof(nsdlTracker) != 'undefined') {
			   	var path = '/sms/resource_click/'+collection[i]+'/'+resource+'/'+position;
                nsdlTracker._trackPageview(path);
   
                log("google tracker: " + path);
        	}
		   }
	}
	
	// ----- Other JS for the NSDL client page:
	
	function onPageLoad() {
		var body = document.getElementsByTagName('body')[0];
		Event.observe('contentArea', 'mousedown', onBodyClick, false);
		if($('smsMapTitleBarRight')){
			var a_links = $('smsMapTitleBarRight').getElementsByTagName("a");
			Event.observe(a_links[a_links.length - 1], 'mouseup',trackViewLink);
		}
		pageTracker._trackPageview();
		rollupTracker._trackPageview();		
	}
	Event.observe(window, 'load', onPageLoad, false);		
	
	function onBodyClick() {
		if(isHelpDown)	
			toggleHelp();
	}
	
	function trimString (str) {
  		str = this != window? this : str;
  		return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
	}
	var isHelpDown = false;
	function toggleHelp(){
		if(isHelpDown) {
			$('smsBrowse').className = 'smsForm';
			Effect.BlindUp('smsUsage',{duration:0.1});
		}
		else{
			$('smsBrowse').className = 'hide';
			Effect.BlindDown('smsUsage',{duration:0.1});
			
			googleTrack('/content_click/link/help/');
		}
		isHelpDown = !isHelpDown;
	}
		
	function gup( name )
	{
	  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	  var regexS = "[\\?&]"+name+"=([^&#]*)";
	  var regex = new RegExp( regexS );
	  var results = regex.exec( window.location.href );
	  if( results == null )
	    return "";
	  else
	    return results[1];
	}
	
	function resPagerTrack(path,pager){
		resPager = pager;
		googleTrack(path);
	}
	function resStrictPagerTrack(path,pager){
		resStrictPager = pager;
		googleTrack(path);
	}
	//Google analytics tracking for links, clicks, etc.
	function googleTrack(path) {
		
        if(typeof(pageTracker) != 'undefined') {
                pageTracker._trackPageview(path);
   
                log("google tracker: " + path);
        }
	}

	function log(m) {
        if(window.console)
                window.console.log(m);
        //else
                //alert(m);
	}

