var Interface = new Class({

	domMainInterface : null,
	
	domSortName : null,
	
	domSortDistance : null,
	
	initialize : function () {
	
		this.domMainInterface = $('mainInterface');
		
		this.domBrandsSelect = $('brandsSelect');
	
		this.domSortName = $('sortNameRadio');
		
		this.domSortDistance = $('sortDistanceRadio');
		
		// SETUP SORT EVENTS
		
		this.domSortName.addEvent('click', function(e) {
	   		
			var objResellersContainers = fncGetResellerContainers(); 
			
			var objCriteria = objResellersContainers.getCriteria();
			
			var strField = objCriteria.sortField;
			
			var strDirection = objCriteria.sortDirection; 

			if (strField == 'name' && strDirection == 'up') {
			
				objResellersContainers.resort('name', 'down');
				
			} else {
			
				objResellersContainers.resort('name', 'up');
			
			}
		
		}.bind(this));
		
		this.domSortDistance.addEvent('click', function(e) {
	   		
			var objResellersContainers = fncGetResellerContainers(); 
			
			var objCriteria = objResellersContainers.getCriteria();
			
			var strField = objCriteria.sortField;
			
			var strDirection = objCriteria.sortDirection; 

			if (strField == 'distance' && strDirection == 'up') {
			
				objResellersContainers.resort('distance', 'down');
			
			} else {
			
				objResellersContainers.resort('distance', 'up');
			
			}
		
		}.bind(this));
	
	},
			
	showMainInterface : function () {
		this.domMainInterface.style.display = 'block';
	},
	
	hideMainInterface : function () {
		this.domMainInterface.style.display = 'none';
	},
	
	setBrandSelect : function (strBrand) {
		this.domBrandsSelect.value = strBrand;
	}

});

/** 
 * ResellerContainers
 *
 * Controllers the tabs and containers for the tables of resellers results
 */
var ResellerContainers = new Class({

	domResellers : null,

	aryDomContainers : {},
	
	aryDomTabs : {},
	
	domCSAmericanTab : null,

	domEmptyResellers : null,
	
	domBusy : null,
	
	currentTab : null,

	objRequester : null,
	
	objCriteria : null,
	
	initialize : function (objCriteria) {
	
		this.setCriteria(objCriteria);
	
		this.domResellers = $('resellers');
	
		var aryDomTabs = $ES('.selBrandTab');
		
		this.domCSAmericanTab = $('tabCSAmerican');
	
		var aryDomResellerLists = $ES('.selBrandDiv', this.domResellers);
		
		this.domEmptyResellers = $('emptyBrandContainer', this.domResellers);
		
		this.domBusy = $('resellersBusy', this.domResellers);
	
		this.aryDomTabs = aryDomTabs;
	
		/* SETUP BRAND TABS */
	   
	   $each(this.aryDomTabs, function(domTab) {
	
			var strBrand = domTab.id.substring(3);
		
			/* ADD TAB CLICK EVENTS TO LOAD RESULTS */
	
	   		domTab.addEvent('click', function(e) {
	   		
	   			new Event(e).stop();
	   		
	   			if (strBrand != this.getCurrentTab()) {
	   		
					this.changeBrand(strBrand);
					
					this.refresh();
		   		}
		   	
		  	}.bind(this));
	
		}.bind(this));
		
		/* SETUP GEOGRAPHIC TAB */
		
		this.domCSAmericanTab.addEvent('click', function(e) {
	   		
   			new Event(e).stop();
   		
   			if (this.domCSAmericanTab.id != this.getCurrentTab()) {
   		
				this.changeGeography('CSAmerican');
				
				this.refresh();
				
				var domGMap = fncGetMap();
				
				domGMap.setYouAreHereToCSAmerica();

	   		}
	   	
	  	}.bind(this));
		
		$each(aryDomResellerLists, function (domResellerContainer) {
		
			this.aryDomContainers[domResellerContainer.id] = new ResellerContainer(domResellerContainer);
		
		}.bind(this));
	
	},
	
	setResellersToBrand : function (strTab, aryResellers) {
	
		fncGetMap().emptyMarkers();
	
		var objCriteria = this.getCriteria();
	
		if (aryResellers == null || aryResellers.length == 0) {
			this.setCurrentTab(strTab);
		
			this._showEmptyContainer(strTab);
		} else {
			this.aryDomContainers[strTab].setResellers(aryResellers, objCriteria.sortField, objCriteria.sortDirection);
			
			this.setCurrentTab(strTab);
							
			this.showContainer(strTab);
		} 
	},
	
	resetTabsAndContainers : function () {
	
		this._setAllTabsInactive();
		   			
		this._hideAllContainers();
	
	},

	showContainer : function (strBrand) {
	
		this.aryDomContainers[strBrand].show();
	
	},
	
	setCurrentTab : function (strTabName) {
		
		this.currentTab = strTabName;
		
		var domTab = $('tab' + strTabName, this.domResellers);
		
		this._setTabActive(domTab);
		
	}, 
	
	getCurrentTab : function () {
		return this.currentTab;
	},
	
	setCriteria : function (objCriteria) {
	
		this.objCriteria = objCriteria;
	
	},
	
	getCriteria : function () {
	
		return this.objCriteria;
	
	},
	
	changeBrand : function (strBrand) {
	
		var objCurrCriteria = this.getCriteria();
		
		objCurrCriteria.brand = strBrand;
		
		delete objCurrCriteria.geography;
		
		this.setCriteria(objCurrCriteria);
	
		fncGetInterface().setBrandSelect(strBrand);
	},
	
	changeGeography : function (strBrand) {
	
		var objCurrCriteria = this.getCriteria();
		
		objCurrCriteria.sortField = 'name';
		
		objCurrCriteria.sortDirection = 'up';
		
		delete objCurrCriteria.brand;
		
		objCurrCriteria.geography = 'CSAmerican';
		
		this.setCriteria(objCurrCriteria);
	
	},
	
	refresh : function () {
	
		var objCriteria = this.getCriteria();
	
		var fncRequestOnComplete = function (resellers) {

			var strTab = '';

			this.resetTabsAndContainers();

			this._hideBusy();

			if (objCriteria.brand != undefined && objCriteria.brand != null && objCriteria.brand != '') {
				strTab = objCriteria.brand;
			} else {
				strTab = objCriteria.geography;
			}

			objResellerContainers.setResellersToBrand(strTab, resellers);
			
			this.setCurrentTab(strTab);
			
			if (resellers) {
				
				this.showContainer(strTab);
			}
		
		}.bind(this);
	
		var objRequester = new Requester(objCriteria);
		
		this._showBusy();
		
		objRequester.request(fncRequestOnComplete);
	
	},
	
	resort : function (strField, strDirection) {
	
		var objNewCriteria = this.objCriteria;
	
		objNewCriteria.sortField = strField;
		
		objNewCriteria.sortDirection = strDirection;
   		
   		this.setCriteria(objNewCriteria);
   		
   		this.refresh();
   		
	},
	
	_showEmptyContainer : function (strBrand) {
	
		this._hideAllContainers();
		
		var domBrandName = $E('.selBrandEmpty', this.domEmptyResellers);
		
		domBrandName.innerHTML = strBrand;
		
		this.domEmptyResellers.style.display = 'block';
	
	},
	
	_setTabActive : function (domTab) {
		domTab.style.backgroundColor = "#7352B3";
	},
	
	_setAllTabsInactive : function () {
	
		$each(this.aryDomTabs, function(domTab) {
			domTab.style.backgroundColor = "#3DC454";
		}.bind(this));
		
		this.domCSAmericanTab.style.backgroundColor = "#3DC454";
		
	}, 
	
	_hideAllContainers : function () {
		$each(this.aryDomContainers, function(domDiv) {
			domDiv.hide();
		}.bind(this));
		
		this.domEmptyResellers.style.display = 'none';
	},
	
	_showBusy : function() {
		this.domBusy.style.display = 'block';
	},
	
	_hideBusy : function() {
		this.domBusy.style.display = 'none';
	}

});

/**
 * ResellerContainer
 *
 * An individual container of product line specific results
 */
var ResellerContainer = new Class({

	strBrand : null,

	domContainer : null,
	
	domTable : null,
	
	initialize : function (domContainer) {
	
		this.strBrand = domContainer.id;
	
		this.domContainer = domContainer;
		
		this.domTable = $E('.selResellerTable', domContainer);
		
	},
	
	setResellers : function (aryResellers, strSortField, strSortDirection) {

		if (aryResellers == null) {
			this.domContainer.innerHTML = 'Sorry there are no resellers for that brand.';
		} else {
		
			var objInterface = fncGetInterface();
		
			this._emptyRows();
		
			var intRowNum = 1;
		
			$each (aryResellers, function(aryReseller) {
		
				var objReseller = aryReseller[0];
				
				var strSiteLink = '';
				var domSiteLink = null;
				
				if (objReseller.Website == null) {
					domSiteLink = document.createTextNode(objReseller.Reseller); // THIS MAKES A &nbsp;
				} else {
				
					domSiteLink = document.createElement('a');
				
					domSiteLink.href = 'http://' + objReseller.Website;
					domSiteLink.innerHTML = objReseller.Reseller;
					domSiteLink.target = '_new';
					domSiteLink.title = 'Opens in new window';
					
					strSiteLink = domSiteLink.href;
					
				} 
				
				if (objReseller.ParentResellerID == null) {
			
					var domRow = document.createElement('tr');
					
					var domCellName = document.createElement('td');
					var domCellCountry = document.createElement('td');
					//var domCellEmail = document.createElement('td');
					var domCellPhone = document.createElement('td');
					
					var strFormatHTML = null;
					
					domCellName.style.padding = '2px 0 2px 0';
					domCellCountry.style.padding = '2px 0 2px 0';
					//domCellEmail.style.padding = '2px 0 2px 0';
					domCellPhone.style.padding = '2px 0 2px 0';
					
					var domCountry = null;
					
					if(intRowNum % 2 == 0) {
						domRow.style.backgroundColor = '#DDDDDD';
					} 
					
					domCellName.style.paddingLeft = '2px';
					
					/* SITE LINK */
					
					/*
					if (objReseller.Email == null) {
						domEmail = document.createTextNode(String.fromCharCode(160));  // THIS MAKES A &nbsp;
					} else {
							
						domEmail = document.createElement('a');
	
						domEmail.href = 'mailto:' + objReseller.Email;
						domEmail.innerHTML = objReseller.Email;				
					}
					*/
					
					domCellName.appendChild(domSiteLink);
					domCellCountry.appendChild(document.createTextNode(objReseller.Country));
					//domCellEmail.appendChild(domEmail);				
					domCellPhone.appendChild(document.createTextNode(objReseller.TollFreePhone));
				
					domRow.appendChild(domCellName);
					domRow.appendChild(domCellCountry);
					//domRow.appendChild(domCellEmail);
					domRow.appendChild(domCellPhone);
					
					/* CODE TO SHOW DISTANCE */
					/*
					var fltDistance = aryReseller[1];
					var domCellDistance = document.createElement('td');
					var domMiles = null;
					domMiles = document.createElement('span');
					
					domMiles.style.fontSize = '1.1em';
					domMiles.style.color = '#3DC454';
					
					domMiles.innerHTML = fltDistance;
					domCellDistance.appendChild(domMiles);
					domCellDistance.appendChild(document.createTextNode(' miles'));
					domRow.appendChild(domCellDistance);
					*/
					/* END DISTANCE CODE */
					
					// ADD FORMAT IF ARTAINIUM OR SUBLIJET
					if (this.strBrand == 'ArTainium' || this.strBrand == 'SubliJet' || this.strBrand == 'Sublim') {
						var fltDistance = aryReseller[1];
						var domCellFormatSmall = document.createElement('td');
						var domCellFormatLarge = document.createElement('td');
						
						domCellFormatSmall.style.textAlign = 'center';
						domCellFormatLarge.style.textAlign = 'center';
		
						var domFormatSmall = null;
						var domFormatLarge = null;
						
						domFormatSmall = document.createElement('span');
						domFormatLarge = document.createElement('span');
						
						domFormatSmall.style.fontWeight = 'bold';
						domFormatSmall.style.color = '#3DC454';
						domFormatSmall.style.width = '20px';
						
						domFormatLarge.style.fontWeight = 'bold';
						domFormatLarge.style.color = '#3DC454';
						domFormatLarge.style.width = '20px';
						
						domFormatSmall.innerHTML = objReseller.Small;
						domFormatLarge.innerHTML = objReseller.Large;
						
						domCellFormatSmall.appendChild(domFormatSmall);
						domCellFormatLarge.appendChild(domFormatLarge);
						
						var aryFormats = new Array();
						
						if (objReseller.Small == 'Y') {
							aryFormats.push('Small');
						} 
						
						if (objReseller.Large == 'Y') {
							aryFormats.push('Large');
						}
						
						strFormatHTML = aryFormats.join(' & '); 
						
					} else {
						var domCellFormatSmall = document.createElement('td');
						var domCellFormatLarge = document.createElement('td');
						
						domCellFormatSmall.appendChild(document.createTextNode(String.fromCharCode(160)));  // THIS MAKES A &nbsp;
						domCellFormatLarge.appendChild(document.createTextNode(String.fromCharCode(160)));  // THIS MAKES A &nbsp;
						
					}
					
					domRow.appendChild(domCellFormatSmall);
					domRow.appendChild(domCellFormatLarge);
					
					this.domTable.appendChild(domRow);
					
					intRowNum++;
				}
				
				
				// BUILD INFO WINDOW HTML
				var strInfoHtml = '<div>';
								  
				// INFO WINDOW: NAME AND URL
				if (strSiteLink.length != null) {
					strInfoHtml += '<p style="font-size: 1.0em; margin: 2px;"><a href="' + strSiteLink + '" target="_new">' + objReseller.Reseller + '</a></p>';
				} else {
					strInfoHtml += '<p style="font-size: 1.0em; margin: 2px;">' + objReseller.Reseller + '</p>';
				}
				
				// INFO WINDOW: ADDRESS
				strInfoHtml += '<p style="margin: 2px;">' 
								  + objReseller.Street + '<br />' 
								  + objReseller.City + ', ' + objReseller.State + ' ' + objReseller.Zip + ' ' + objReseller.Country; 
								  + '</p>';
				
				// INFO WINDOW: PHONE NUMBERS
				if (objReseller.LocalPhone != null || 
					objReseller.TollFreePhone != null ||
					objReseller.Fax != null) {
				
					var strPhone = '';
				
					strInfoHtml += '<p style="font-size: .8em; margin: 2px;">';
				
					if (objReseller.LocalPhone != null) {
						strPhone += '<strong>Phone:</strong> ' + objReseller.LocalPhone;
					}
					
					if (objReseller.TollFreePhone != null) {
						strPhone += ' ' + objReseller.TollFreePhone;
					}
					
					strPhone += '<br />';
					
					strInfoHtml += strPhone;
					
					if (objReseller.Fax != null) {
						strInfoHtml += '<strong>Fax:</strong> ' + objReseller.Fax + '<br />';
					}
					
					strInfoHtml += '</p>';
				}
				
				// INFO WINDOW: EMAIL
				if (objReseller.Email != null) {
					strInfoHtml += '<p style="margin: 2px;"><strong>Email:</strong> <a href="mailto"' + objReseller.Email + '">' + objReseller.Email + '</a></p>';
				}

				
				if (strFormatHTML != null) {
					strInfoHtml += '<p style="font-size: .8em; margin: 2px 2px 6px 2px;"><strong>Formats Available:</strong> ' + strFormatHTML + '</p>';
				}
				
				// ADD MAP MARKER
				fncGetMap().addMarker(objReseller.lat, objReseller.lng, strInfoHtml);
			
			}.bind(this));
		}
		
	}, 
	
	show : function () {
		this.domContainer.style.display = "block";
	},
	
	hide : function () {
		this.domContainer.style.display = "none";
	},
	
	_emptyRows : function () {
		 
	   var aryRows = this.domTable.getChildren();
	   
	   aryRows.shift(); // THIS IS TO PREVENT THE SORT CONTROLS FROM BEING REMOVED
	   
	   $each(aryRows, function (domRow) {
			 domRow.remove();	   
	   });
	    	    	     
	}

});

/**
 * Requestor
 *
 * A wrapper class to abstract details of JSON requests
 */
var Requester = new Class({

	criteria : null,
	
	initialize : function (objCriteria) {
		this.criteria = objCriteria;
	}, 
	
	request : function (fncOnComplete) {
		// REQUEST DATA
	   		// ADD IT TO CONTAINER
	   		// SHOW CONTAINER
   		var jsonRequest = new Json.Remote("getPartners.php", {onComplete: fncOnComplete}).send(this.criteria);	
	}

});

/**
 * ResllerMap
 *
 * Wrapper class to provider itnerfaces to the Google maps and 
 * provide helper function.
 */
var ResellerMap = new Class({

	domMap : null,

	objGMap : null,

	aryMarkers : new Array(),
	
	domYouAreHere : null,
	
	objCurrentCenter : {},
	
	intCurrentZoom : null,
	
	initialize : function (strDomId) {
	
		this.domMap = document.getElementById('map');
	
		if (GBrowserIsCompatible()) {
			this.objGMap = new GMap2(this.domMap);
		}
		
		this.objGMap.addControl(new GSmallMapControl());
		this.objGMap.addControl(new GMapTypeControl());
	
	},
		
	centerWithZoom : function (fltLat, fltLng, intZoom) {
	
		this.intCurrentZoom = intZoom;
		
		this.objCurrentCenter.lat = fltLat;
		
		this.objCurrentCenter.lng = fltLng;
	
		this.objGMap.setCenter(new GLatLng(fltLat, fltLng), intZoom);
	},
	
	setYouAreHere : function (fltLat, fltLng) {
	
		if (this.domYouAreHere != null) {
			this.objGMap.removeOverlay(this.domYouAreHere);
		}
	
		this.objCurrentCenter.lat = fltLat;
		
		this.objCurrentCenter.lng = fltLng;
	
		var objYouAreHereIcon = new GIcon(G_DEFAULT_ICON);
		
		objYouAreHereIcon.image = "images/map/youarehere.png";
		objYouAreHereIcon.iconSize = new GSize(32, 32);
		
		
		markerOptions = { icon:objYouAreHereIcon };
		
		var point = new GLatLng(fltLat, fltLng);
		
		this.domYouAreHere = new GMarker(point, markerOptions);
		
		this.objGMap.addOverlay(this.domYouAreHere);
	
	},
	
	hideYouAreHere : function () {
	
		this.objGMap.removeOverlay(this.domYouAreHere);
	
	},
	
	setYouAreHereToUSA : function () {
	
		this.setYouAreHere(+39.804840, -96.104703, 6);
	
	},
	
	setYouAreHereToCSAmerica : function () {
	
		this.centerWithZoom(-7.96639634, -72.59765625, 2);
		
		this.hideYouAreHere();
		
	},
	
	addMarker : function (fltLat, fltLng, strHtml) {
	
		var sawgrassIcon = new GIcon(G_DEFAULT_ICON);
		sawgrassIcon.image = "images/map/dealerlogo.png";
		sawgrassIcon.shadow = "";
		sawgrassIcon.iconSize = new GSize(32, 32);
				                
		// Set up our GMarkerOptions object
		markerOptions = { icon:sawgrassIcon };
	
		var objPoint = new GLatLng(fltLat, fltLng);
		
		var objMarker = new GMarker(objPoint, markerOptions)
		
		// ADD CLICK FOR INFO WINDOW
		GEvent.addListener(objMarker, "click", function() {
		    this.objGMap.panTo(new GLatLng(fltLat, fltLng));
		    
		    this.objGMap.openInfoWindowHtml(objPoint, strHtml);
		  }.bind(this));
		
		this.aryMarkers.push(objMarker);
					    
		this.objGMap.addOverlay(objMarker);
	}, 
	
	emptyMarkers : function () {
	
		$each(this.aryMarkers, function (objMarker) {
		
			this.objGMap.removeOverlay(objMarker);
		
		}.bind(this));
	
	}, 
	
	refreshDom : function () {
		this.objGMap.checkResize();
		
		this.centerWithZoom(this.objCurrentCenter.lat, this.objCurrentCenter.lng, this.intCurrentZoom);
	}
	
});

