/* IE (even IE7) hasn't implemented indexOf yet*/
/*
 * with the addition of mootools, this function breaks stuff in IE
 * if we remove mootools (for ldc rate chart at bottom) we may need this again
 * 
if(!Array.indexOf){
    Array.prototype.indexOf = function(obj){
        for(var i=0; i<this.length; i++){
            if(this[i]==obj){
                return i;
            }
        }
        return -1;
    }
}
* */

function createMarker(map,point, icon, htmlBox, letter) {
	var marker = new GMarker(point, icon);
	marker.type = letter;
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(htmlBox);
	});
	map.addOverlay(marker);
	return marker;
}

function getLetter(index){
	var letter = (index>=26)?(String.fromCharCode("a".charCodeAt(0) + index-26)):(String.fromCharCode("a".charCodeAt(0) + index));
	var number = (index>=26)?parseInt(index/26):"";
	return ''+letter+number;
}

function addCompMarkers(comps,map){
	var bounds = new GLatLngBounds();
	var icon = new GIcon();
	
	icon.shadow = "/home-values/images/homeval_map/houseicon_shadow.png";
	citystatezip = RabcSubjectObj.City + ', ' + RabcSubjectObj.State + ' ' + RabcSubjectObj.Zip;
	if(document.location.href.match(/\home-values\/search\//)){
		salesDateTxt='Last Update';
		salesPriceTxt='Estimated Price';
	} else {
		salesDateTxt='Sales Date';
		salesPriceTxt='Sales Price';
	}
	for (x=0;x<comps.length;x++){
		iconLetter = getLetter(x);
		icon.image = '/home-values/images/homval_map/houseicon_select/houseicon_sel_'+ iconLetter +'.png';
		icon.shadow = "/home-values/images/homval_map/houseicon_shadow.png";
		icon.iconSize = new GSize(25, 37);
		icon.shadowSize = new GSize(33, 37);
		icon.iconAnchor = new GPoint(0, 37);
		icon.infoWindowAnchor = new GPoint(10, 2);

		var addressline = '<div class="px11 bold darkbrown" style="padding-top:0px;padding-left:15px;">' + comps[x]['StreetAddressLink']+ '<br>' +citystatezip + '</div>';
		htmlBox = '<table border=0 cellpadding=0 cellspacing=0><tr><td align=left valign=middle class="px14 bold mediumbrown"><img src="'+icon.image+'"></td><td align="left" valign="middle">' + addressline + '</td></tr></table>';
		htmlBox += '<hr color="#FAF3E3" width="220" size="1"><div><table border=0 cellpadding=0 cellspacing=0><tr><td align="right" valign="middle" class="px11 bold darkbrown">'+salesDateTxt+':</td><td align="left" valign="middle" class="px10 darkbrown" style="padding-left:4px;">' + comps[x]['SaleDate']+ '</td></tr><tr><td align="right" valign="middle" class="px11 bold darkbrown">'+salesPriceTxt+': </td><td align="left" valign="middle" class="px10 darkbrown" style="padding-left:4px;">' + comps[x]['SalePrice'] + '</td></tr><tr><td align="right" valign="middle" class="px11 bold darkbrown">BR / BA:</td><td align="left" valign="middle" class="px10 darkbrown" style="padding-left:4px;">' + comps[x]['Beds']+ ' / ' + comps[x]['Baths']+ '</td><td align="right" valign="middle" class="px11 bold darkbrown">BLDG SQ FT:</td><td align="left" valign="middle" class="px10 darkbrown" style="padding-left:4px;">' +comps[x]['LivingArea']+ '</td></tr></table></div>';

		var point = new GLatLng(comps[x].Latitude, comps[x].Longitude);
		createMarker(map,point, icon, htmlBox, iconLetter);

		bounds.extend(point);
	}
	return bounds;
}

function addMainMarker(map){
	// ===== add main marker =====
	var mainicon = new GIcon();
	mainicon.image = '/home-values/images/homval_map/housepinonly_map.png';
	mainicon.shadow = "/home-values/images/homval_map/housepinshado_map.png";
	mainicon.iconSize = new GSize(49, 93);
	mainicon.shadowSize = new GSize(73, 93);
	mainicon.iconAnchor = new GPoint(0, 93);
	mainicon.infoWindowAnchor = new GPoint(10, 2);
	var subjectHtmlBox = '<div class="darkaqua px11 bold" style="padding-top:2px; padding-left:15px;">'+RabcSubjectObj.StreetAddress+'</div><div class="darkaqua px11 bold" style="padding-top:1px; padding-left:15px;">'+RabcSubjectObj.City+', '+RabcSubjectObj.State+' '+RabcSubjectObj.Zip+'</div><hr color="#0D5260" width="225" size="1"><div><table border=0 cellpadding=0 cellspacing=0><tr><td align="right" valign="middle" class="px11 bold">Sales Date:</td><td align="left" valign="middle" class="px10" style="padding-left:4px;">'+RabcSubjectObj.SaleDate+'</td></tr><tr><td align="right" valign="middle" class="px11 bold">Sales Price:</td><td align="left" valign="middle" class="px10" style="padding-left:4px;">'+RabcSubjectObj.SaleAmount+'</td></tr><tr><td align="right" valign="middle" class="px11 bold">BR / BA:</td><td align="left" valign="middle" class="px10" style="padding-left:4px;">'+RabcSubjectObj.Beds+' / '+RabcSubjectObj.Baths+'</td><td align="right" valign="middle" class="px11 bold">BLDG SQ FT:</td><td align="left" valign="middle" class="px10" style="padding-left:4px;">'+RabcSubjectObj.LivingArea+'</td></tr></table></div>';
	var mainpoint = new GLatLng(RabcSubjectObj.Latitude, RabcSubjectObj.Longitude);
	var mainmarker = new GMarker(mainpoint, mainicon);
	GEvent.addListener(mainmarker, "click", function() {
		mainmarker.openInfoWindowHtml(subjectHtmlBox);
	});
	map.addOverlay(mainmarker);
}

function parseTableForComps(compRows){
	var comps = [];
	for(x=0;x<compRows.length;x++){
		tmpNodes = compRows[x].childNodes;
		tds = [];
		for(y=0;y<tmpNodes.length;y++){
			if('TD' == tmpNodes[y].nodeName){
				tds[tds.length] = tmpNodes[y].innerHTML;
			}
		}
		
		//determin whitch type of obj to create and sort on
		t = document.getElementById('compTable');
		if(t.className.match(/cityPage/)){
			comps[x] = {'TheRow':compRows[x],'StreetAddressLink':tds[1],'SaleDate':tds[2],'SalePrice':tds[3],'YearBuilt':tds[4],'Beds':tds[5],'Baths':tds[6],'LivingArea':tds[7],'PricePer':tds[8],'LotSize':tds[9]};
			comps[x]['StreetAddress'] = comps[x]['StreetAddressLink'].match(/>([^<]*)</)[1];
		} else if(t.className.match(/detailPage/)){
			comps[x] = {'TheRow':compRows[x],'StreetAddressLink':tds[1],'Proximity':tds[2],'SaleDate':tds[3],'SalePrice':tds[4],'YearBuilt':tds[5],'Beds':tds[6],'Baths':tds[7],'LivingArea':tds[8],'PricePer':tds[9],'LotSize':tds[10]};
			comps[x]['StreetAddress'] = comps[x]['StreetAddressLink'].match(/>([^<]*)</)[1];
		}
		
		classNames = compRows[x].className;
		classNames = classNames.split(' ');
		for(z=0;z<classNames.length;z++){
			if(0==classNames[z].indexOf('lat_')){
				comps[x]['Latitude'] = classNames[z].substring(4,classNames[z].length);
			} else if(0==classNames[z].indexOf('long_')){
				comps[x]['Longitude'] = classNames[z].substring(5,classNames[z].length);
			}
			
		};
	}
	return comps;
}


function rabcgmap(){

	var comps = [];
	var compRows = YAHOO.util.Dom.getElementsByClassName('comp_row', 'tr'); 

	if(compRows.length > 3){
		comps = parseTableForComps(compRows);
	}
	if (GBrowserIsCompatible()) {
		var map = new GMap2(document.getElementById("googlemap"));
		map.setCenter(new GLatLng(RabcSubjectObj.Latitude, RabcSubjectObj.Longitude), 13);
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.addControl(new GScaleControl());
		
		if(compRows.length > 3){
			bounds = addCompMarkers(comps,map);
			map.setZoom(map.getBoundsZoomLevel(bounds));
			// ===== determine the centre from the bounds ======
			var clat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2;
			var clng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2;
			map.setCenter(new GLatLng(clat,clng));
		}
		
		addMainMarker(map);
	} else {
		//alert('Not Google maps Compatible.');			
	}
	tableData = comps;
	var sortHeaders = YAHOO.util.Dom.getElementsByClassName('sortHeaders', 'tr');
	if(sortHeaders[0]){
		var tds = sortHeaders[0].childNodes;
		for(i=0;i<tds.length;i++){
			if('TD'==tds[i].nodeName){
				if(tds[i].className.match(/sortable/)){
	 				YAHOO.util.Event.addListener(tds[i], "click", sortTableWrapper); 
				}
			}
		}	
	}

}

function sortTableWrapper(e){
	//if has proximity column, pass in mmode
	/*For some reason, YUI's event handler returns a different object depending on the browser. e.srcElement for IE, e.target for others*/
	var target = e.srcElement || e.target;

	var t = document.getElementById('compTable');
	if(t.className.match(/cityPage/)){
		sortTable(target,'SEARCH');
	} else if(t.className.match(/detailPage/)){
		sortTable(target,'DETAIL');
	}
}

function sort_comps_by_gla(a,b){
	a1 = a.LivingArea.replace(/[^\d]/g,'');
	b1 = b.LivingArea.replace(/[^\d]/g,'');
	return (a1-b1);
}

function sort_comps_by_priceper(a,b){
	a1 = a.PricePer.replace(/[^\d]/g,'');
	b1 = b.PricePer.replace(/[^\d]/g,'');
	return (a1-b1);
}

function sort_comps_by_lotsize(a,b){
	a1 = a.LotSize.replace(/[^\d]/g,'');
	b1 = b.LotSize.replace(/[^\d]/g,'');
	return (a1-b1);
}

function sort_comps_by_baths(a,b){
	if('N/A' == a.Baths) a.Baths = 0;
	if('N/A' == b.Baths) b.Baths = 0;
	return (parseFloat(a.Baths) - parseFloat(b.Baths));
}

function sort_comps_by_beds(a,b){
	if('N/A' == a.Beds) a.Beds = 0;
	if('N/A' == b.Beds) b.Beds = 0;
	return (parseFloat(a.Beds) - parseFloat(b.Beds));
}
function sort_comps_by_money(a,b){
	a1 = a.SalePrice.replace(/[^\d]/g,'');
	b1 = b.SalePrice.replace(/[^\d]/g,'');
	return (a1-b1);
}

function sort_comps_by_yearbuilt(a,b){
	if('N/A' == a.YearBuilt) a.YearBuilt = 0;
	if('N/A' == b.YearBuilt) b.YearBuilt = 0;
	return (parseFloat(a.YearBuilt) - parseFloat(b.YearBuilt));
}

function sort_comps_by_saledate(a,b){
	tmp = a.SaleDate.split('-');
	a1 = new Date(tmp[2],tmp[0],tmp[1]);
	tmp = b.SaleDate.split('-');
	b1 = new Date(tmp[2],tmp[0],tmp[1]);
	return (a1-b1);
}

function sort_comps_by_proximity(a,b){
	a1 = a.Proximity.replace(/ mi/,'');
	b1 = b.Proximity.replace(/ mi/,'');
	return (a1-b1);
}
function redrawTable(){
	theTable = document.getElementById('compTable');
	for(i=0;i<tableData.length;i++){
		theTable.tBodies[0].appendChild(tableData[i].TheRow)
	}
}

function sortTable(lnk,mode){
	var classNames = lnk.className;
	classNames = classNames.split(' ');
	fwdsorted = classNames.indexOf('rabcsortfwd');
	revsorted = classNames.indexOf('rabcsortrev');

	//clean up class names on all the tds
	var tr = lnk.parentNode;
	var tds = tr.childNodes;
	for(i=0;i<tds.length;i++){
		if('TD' ==tds[i].nodeName){
			//remove all rabcsortrev and rabcsortfwd class
			cn = tds[i].className.replace(/rabcsortrev/,'').replace(/rabcsortfwd/,'');
			tds[i].className = cn;
		}
	}

	if(fwdsorted>-1){
		tableData.reverse();
		redrawTable();
		classNames[fwdsorted] = 'rabcsortrev';
		classes = classNames.join(' ');
		lnk.className = classes;
		return;
	}
	if(revsorted>-1){
		tableData.reverse();
		redrawTable();
		classNames[revsorted] = 'rabcsortfwd';
		classes = classNames.join(' ');
		lnk.className = classes;
		return;
	}
	
	//column hasn't been sorted yet, sort and add class name
	if('SEARCH'==mode){
		switch(lnk.cellIndex){
			case 2: sortSaleDate();break;
			case 3: sortSalePrice();break;
			case 4: sortYearBuilt();break;
			case 5: sortBeds();break;
			case 6: sortBaths();break;
			case 7: sortGLA();break;
			case 8: sortPricePer();break;
			case 9: sortLotSize();break;
			default:break;
		}	
	} else if('DETAIL'==mode){
		switch(lnk.cellIndex){
			case 2: sortProximity();break;
			case 3: sortSaleDate();break;
			case 4: sortSalePrice();break;
			case 5: sortYearBuilt();break;
			case 6: sortBeds();break;
			case 7: sortBaths();break;
			case 8: sortGLA();break;
			case 9: sortPricePer();break;
			case 10: sortLotSize();break;
			default:break;
		}
	}

	classNames[classNames.length] = 'rabcsortfwd';
	classes = classNames.join(' ');
	lnk.className = classes;
	redrawTable();
}
function sortBeds(reverse){
	tableData.sort(sort_comps_by_beds);
}
function sortBaths(){
	tableData.sort(sort_comps_by_baths);
}
function sortGLA(){
	tableData.sort(sort_comps_by_gla);
}
function sortPricePer(){
	tableData.sort(sort_comps_by_priceper);
}
function sortLotSize(){
	tableData.sort(sort_comps_by_lotsize);
}

function sortSalePrice(){
	tableData.sort(sort_comps_by_money);
}
function sortYearBuilt(){
	tableData.sort(sort_comps_by_yearbuilt);
}

function sortSaleDate(){
	tableData.sort(sort_comps_by_saledate);
}

function sortProximity(){
	tableData.sort(sort_comps_by_proximity);
}

function toggleDiv( element, element2 ) {
 var e = document.getElementById(element);
 var e2 = document.getElementById(element2);

 if (e) {
 e.style.display = 'block';
 e2.style.display = 'none';
 }
}

function showInfoBox(box){
	if('mortgage' == box){
		document.getElementById('mortgage_info').style.display = 'block';
		document.getElementById('subject_info').style.display = 'none';
		
		document.getElementById('mortgageTab').src = '/home-values/images/homval_menus/mortgage_sel.gif';
		document.getElementById('subjectTab').src = '/home-values/images/homval_menus/subjtab_desel.gif';
	} else if('subject' == box){
		document.getElementById('subject_info').style.display = 'block';
		document.getElementById('mortgage_info').style.display = 'none';
		
		document.getElementById('mortgageTab').src = '/home-values/images/homval_menus/mortgage_desel.gif';
		document.getElementById('subjectTab').src = '/home-values/images/homval_menus/subjtab_sel.gif';
	}
}
