var util = {
	NULL:	"null",
	
	get: function(id){
		if(document.getElementById(id)) return document.getElementById(id);
		else return window.frames[0].document.getElementById(id);
	},
	
	validText: function(txt){
		if(txt.length > 0 && txt != "") return true;
		return false;
	},
	
	isNULL: function(val){
		if(val == null || val == util.NULL || val == "") return true;
		return false;
	},
	
	isNumeric: function(val){
		var re = /([^0-9]){1,}/g;
		if (re.test(val) == true) return false;
		return true;
	},
	
	isZipCode: function(val){
		var re = /([0-9]){5}/g;
		if (re.test(val) == false) return false;
		return true;
	},
	
	isMLNUM: function(obj){
		var re = /([^0-9]){1,}/g;
		if(re.test(obj.value) == true) return false;
		return true;
	},
	
	sleep: function(seconds){
		new Ajax.Request(constants.url.sleep+seconds, {
			method: "get",
			asynchronous: false,
			onSuccess: function(request){}
		});
	},
	
	getXmlDoc: function(xml){
		try{//IE
			var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async="false";
			xmlDoc.loadXML(xml);
			return xmlDoc;
		} catch(e){
			try{//Firefox, Mozilla, Opera, etc.
				var parser = new DOMParser();
				var xmlDoc = parser.parseFromString(xml,"text/xml");
				return xmlDoc
			} catch(e){
				d.bug("util.getXmlDoc(): " + e);
			}
		}
		return util.NULL;
	},
	
	setBackgroundColor: function(element, color){
		element.style.backgroundColor = color;	
	},
	
	buildResultObject: function(cols, datas){
		// build search result
		var results = new Array();
		for(var i=0; i<datas.length; i++){
			var data = datas[i].firstChild.nodeValue.split(rets.delimiter);
			var o = new Object();
			for(var j=1; j<data.length-1; j++){
				o[cols[j]] = data[j];
			}
			results.push(o);
		}
		return results;
	},
	
	scrollToTop: function(){
		if(document.getElementById("mainframe")){
			cache.scrollX = window.frames[0].pageYOffset
			window.frames[0].scrollTo(0,0);
		} else {
			cache.scrollX = window.pageYOffset;
			window.scrollTo(0,0);
		}
	},
	
	scrollToCache: function(){
		if(document.getElementById("mainframe")){
			window.frames[0].scrollTo(0,cache.scrollX);
		} else {
			cache.scrollX = window.pageYOffset;
			window.scrollTo(0,cache.scrollX);
		}
	},
	
	showDetails: function(id, cacheId){
		util.getDetails(cache.getResult(id, cacheId));
		//util.showLayer("details");
	},
	
	showMultiFamilyDetails: function(id, cacheId){
		util.getMultiFamilyDetails(cache.getResult(id, cacheId));
	},
	
	showLotsDetails: function(id, cacheId){
		util.getLotsDetails(cache.getResult(id, cacheId));
	},
	
	getUserEmailAndOfficeFromResult: function(element, result){
		if(query.searchType == constants.searchTypes.openhouse){// fuse open house
			var s = "";
			var off = result[1459];
			if(off == null) off = "<i>listing office not available</i>";
			var ourl = office.getOfficePropertyById(result[1225], 988);
			if(ourl != null && ourl.length > 2){
				s += "This property is listed with <a href='"+ourl+"' target='_blank'><b>"+off+"</b></a>.&nbsp;&nbsp;";
			} else {
				s += "This property is listed with <b>"+off+"</b></a>.&nbsp;&nbsp;";
			}
			var agent = result[1458];
			if(agent == null) agent = "<i>listing agent not available</i>";
			var email = result[1465];
			if(email == null || email.length < 2){
				s += "For more information contact <b>"+agent+"</b>";
			} else {
				s += "For more information contact <a href='mailto:"+email+"?Subject=Inquiry From Billings.org Website, ML#: "+result[1222]+"'><b>"+agent+"</b></a>";	
			}
			
			util.get(element).innerHTML = s;
		} else {
			if(result[15] != null){
				new Ajax.Request(constants.url.getuserinfobyusername+result[15], {
					method:		"get",
					onSuccess:	function(response){
						if(response != null && response.responseXML != null){
							var cols  = response.responseXML.getElementsByTagName(rets.xml.columns)[0].firstChild.nodeValue.split(rets.delimiter);
							var datas = response.responseXML.getElementsByTagName(rets.xml.data);
							var user = util.buildResultObject(cols, datas);
							for(var j=0; j<user.length; j++){
								try{
									var s = "";
									var ourl = office.getOfficePropertyById(result[159], 988);
									if(!util.isNULL(ourl)){
										var off = result[1111];
										if(off == null) off = "<i>listing office not available</i>";
										s += "This property is listed with <a href='"+ourl+"' target='_blank'><b>"+off+"</b></a>.&nbsp;&nbsp;";		 
									}
									var agent = result[33];
									if(agent == null) agent = "<i>listing agent not available</i>";
									s += "For more information contact  <a href='mailto:"+user[j][1044]+"?Subject=Inquiry From Billings.org Website, ML#: "+result[169]+"'><b>"+agent+"</b></a>";
									util.get(element).innerHTML = s;
								} catch(e){ alert(e); }
							}
						}
					}
				});
			} else util.get(element).innerHTML = "For more information contact the listing agent";
		}
	},
	// residential & open house details
	getDetails: function(result){
		if(util.isNULL(result)){
			alert("Invalid Listing");
			return;
		}
		var ids = [199,286,10,169,243,205,266,161,1109,1129,17,78,42,109,148,145,1135,251,112,146,272,225,246,245,254,256,139,108,1123,58,30,257,57,255,51,147,273,138,105,198,30,33,98,154,247,101,283,284,87,91,285,1147,281,280,303,300,301,1159,159,106,208,299,192,207,107,168,287,288,271,220,302,238,239,240,241,82,83,84,85,174,175,176,177,141,142,143,144,221,222,223,224,128,129,130,131,165,1121,1115,211,282,76,127,265,1113,153,162,289,149,291,103,293,167,290,79,292,80,294,81,296,126,295,269,297,191,298];
		for(var i=0; i<ids.length; i++){
			try{
				var el = util.get("details."+ids[i]);
				if(result[ids[i]]) el.innerHTML = result[ids[i]];
				else el.innerHTML = "N/A";
			} catch(a){
				
			}
		}
		// build address
		var addr = result[246] + " " + result[245];
		util.get("details.address").innerHTML = addr;
		util.get("details.fulladdress").innerHTML = addr;
		// total f / h bathrooms
		util.get("details.totalfhbaths").innerHTML = result[254] + " / " + result[256];
		// set photo
		var pdiv = util.get("details.image");
		var photos = cache.getPhotos(result[169]);
		var s = "<img id='img-details' src='"+constants.url.photos+photos[0]+"' height='225' width='380'/><br/>View Photos:&nbsp;&nbsp;";
		for(var i=0; i<photos.length; i++){
			s += "<a href='javascript:void(0);' onmouseover='photoOP.setDetailsImage(\"img-details\", "+result[169]+", "+i+");'>"+Number(i+1)+" </a>&nbsp;&nbsp;";		
		}
		pdiv.innerHTML = s;
		util.getUserEmailAndOfficeFromResult("residential.remarks", result);
		util.showLayer("details");
	},
	
	getMultiFamilyDetails: function(result){
		if(util.isNULL(result)){
			alert("Invalid Listing");
			return;
		}
		var ids = [169,243,1119,161,10,78,246,104,245,1109,42,17,1113,1115,1121,357,1145,1127,401,51,1123,1117,374,318,1169,373,486,322,482,371483,332,480,333,355,353,1135,476,395,316,418,251,417,489,488,490,500,352,370,389,354,317,315,1179,439,436,437,438,440,492,434,435,433,442,441,1171,491,484,408,493,449,446,447,448,450,494,444,445,443,451,1173,1163,485,392,495,459,458,455,456,460,496,454,457,453,462,461,1175,1165,1181,321,497,469,468,465,466,470,498,464,467,463,472,471,1177,1167,1183,327,499];
		for(var i=0; i<ids.length; i++){
			try{
				var el = util.get("details.multifamily."+ids[i]);
				if(result[ids[i]]) el.innerHTML = result[ids[i]];
				else el.innerHTML = "N/A";
			} catch(a){
				
			}
		}
		// build address
		var addr = result[246] + " " + result[245];
		util.get("details.multifamily.fulladdress").innerHTML = addr;
		// set photo
		var pdiv = util.get("details.multifamily.image");
		var photos = cache.getPhotos(result[169]);
		var s = "<img id='img-details-multifamily' src='"+constants.url.photos+photos[0]+"' height='225' width='380'/><br/>View Photos:&nbsp;&nbsp;";
		for(var i=0; i<photos.length; i++){
			s += "<a href='javascript:void(0);' onmouseover='photoOP.setDetailsImage(\"img-details-multifamily\", "+result[169]+", "+i+");'>"+Number(i+1)+" </a>&nbsp;&nbsp;";		
		}
		pdiv.innerHTML = s;
		util.getUserEmailAndOfficeFromResult("multifamily.remarks", result);
		util.showLayer("details.multifamily");
	},
	getLotsDetails: function(result){
		if(util.isNULL(result)){
			alert("Invalid Listing");
			return;
		}
		var ids = [169,243,161,78,1119,246,104,254,1109,42,619,1115,1113,1121,1127,631,634,632,635,633,563,559,560,597,522,589,611,585,607,628,630,590,527,549,548,525,586,629,1135,511,599,251,554];
		for(var i=0; i<ids.length; i++){
			try{
				var el = util.get("details.lots."+ids[i]);
				if(result[ids[i]]) el.innerHTML = result[ids[i]];
				else el.innerHTML = "N/A";
			} catch(a){
				
			}
		}
		// build address
		var addr = result[246] + " " + result[245];
		util.get("details.lots.fulladdress").innerHTML = addr;
		// set photo
		var pdiv = util.get("details.lots.image");
		var photos = cache.getPhotos(result[169]);
		var s = "<img id='img-details-lots' src='"+constants.url.photos+photos[0]+"' height='225' width='380'/><br/>View Photos:&nbsp;&nbsp;";
		for(var i=0; i<photos.length; i++){
			s += "<a href='javascript:void(0);' onmouseover='photoOP.setDetailsImage(\"img-details-lots\", "+result[169]+", "+i+");'>"+Number(i+1)+" </a>&nbsp;&nbsp;";		
		}
		pdiv.innerHTML = s;
		util.getUserEmailAndOfficeFromResult("lots.remarks", result);
		util.showLayer("details.lots");
	},
	/** this simply hides a layer
	  */
	hide: function(id){
		var d = util.get(id);
		var t1 = new OpacityTween(d, null, 96, 0, .5);
		t1.onMotionFinished = function(){ d.style.visibility = "hidden"; }
		t1.start();
	},
	/** this simply shows a layer
	  */
	show: function(id){
		var d = util.get(id);
		d.style.visibility = "visible";
		var t1 = new OpacityTween(d, null, 0, 96, .5);
		t1.start();
	},
	/** this shows a layer from search results, and hides search results and the accordian
	  */
	showLayer: function(id){
		try{
			var layer = util.get(id);
			layer.style.visibility = "visible";
			layer.style.display = "block";
			try{
				var t1 = new OpacityTween(layer, null, 0, 96, .5);
				t1.start();
			} catch(a){}
			try{
				var t2 = new OpacityTween(util.get("searchresults"), null, 100, 0, .5);
				t2.start();
			} catch(a){}
			try{
				var t3 = new OpacityTween(util.get("accordian"), null, 100, 0, .5);
				t3.start();
			} catch(a){}
			util.scrollToTop();
		} catch(e){
			//d.bug("util.showLayer(): " + e);
		}
	},
	/** this hides a layer from search results, and shows search results and the accordian
	  */
	hideLayer: function(id){
		var d = util.get(id);
		try{
			var t1 = new OpacityTween(d, null, 96, 0, .5);
			t1.onMotionFinished = function(){ d.style.visibility = "hidden";d.style.display="none"; }
			t1.start();
		} catch(a){}
		try{
			var t2 = new OpacityTween(util.get("searchresults"), null, 0, 100, .5);
			t2.start();
		} catch(a){}
		try{
			var t3 = new OpacityTween(util.get("accordian"), null, 0, 100, .5);
			t3.start();
		} catch(a){}
		util.scrollToCache();
	},
	
	isMapVisible: function(){
		if(util.get("map-container").style.visibility == "visible") return true;
		return false;
	},
	showMap: function(){
		if(!util.isMapVisible()){
			var m = util.get("map-container");
			m.style.visibility = "visible";
			var t = new OpacityTween(m, null, 0, 100, .5);
			t.start();
			var t2 = new OpacityTween(util.get("searchresults"), null, 100, 0, .5);
			t2.start();
			var t3 = new OpacityTween(util.get("accordian"), null, 100, 0, .5);
			t3.start();
			util.scrollToTop();
		}
	},
	
	hideMap: function(){
		var m = util.get("map-container");
		try{
			var t = new OpacityTween(m, null, 100, 0, .5);
			t.onMotionFinished = function(){ util.get("map-container").style.visibility = "hidden"; }
			t.start();
		} catch(a){}
		try{
			var t2 = new OpacityTween(util.get("searchresults"), null, 0, 100, .5);
			t2.start();
		} catch(a){}
		try{
			var t3 = new OpacityTween(util.get("accordian"), null, 0, 100, .5);
			t3.start();
		} catch(a){}
		util.scrollToCache();
	},
	showStatusIcon: function(){
		try{
			util.get("search.loadingicon").style.visibility = "visible";
		} catch(e){
			//alert("util.showStatusIcon(): " + e);
		}
	},
	
	hideStatusIcon: function(){
		try{
			util.get("search.loadingicon").style.visibility = "hidden";
		} catch(e){
			//alert("util.hideStatusIcon(): " + e);
		}
	}
}
