
function sortNumber(a,b) {
	return a - b;
}

function nearestPoint(refpoint,pointList) {
	var extendedlatlng = null;
	extendedLatLngArr = [];
	distanceArr = [];

	for(var i=0;i<pointList.length;i++) {
		if(pointList[i].length !== 0 ) {
			extendedLatLngArr.push(new ExtendedLatLng(pointList[i],pointList[i].distanceFrom(refpoint)));
			distanceArr[i] = pointList[i].distanceFrom(refpoint);
//			Log("Distance via route from : " + refpoint + " to " +pointList[i] + " is " + distanceArr[i] + "<br>");
		}
	}
	distanceArr.sort(sortNumber);
//	Log("Min distance is : " + distanceArr[0] + "<br>");
	for(var k=0;k<extendedLatLngArr.length;k++) {
			if(parseFloat(distanceArr[0]) == parseFloat(extendedLatLngArr[k].GetDistance())) {
				extendedlatlng = extendedLatLngArr[k];
				break;
			}
	}
	return extendedlatlng;
}

function isEqual(latlng1,latlng2) {
	var flag = false;
	if(latlng1.length !== 0 && parseFloat(latlng1.lat()) === parseFloat(latlng2.lat())){
		if(parseFloat(latlng1.lng()) == parseFloat(latlng2.lng())){
			flag = true;
		}
	}
	return flag;
}

function isExists(arr,point) {
	var flag = false;
	for(var i=0;i<arr.length;i++) {
		if(arr[i] !== null && arr[i] !== 'undefined' &&  arr[i].length !== 0) {
//			alert(arr[i]);
			if((point.length !== 0) && (parseFloat(arr[i].lat()) === parseFloat(point.lat()))){
				if(parseFloat(arr[i].lng()) == parseFloat(point.lng())){
					flag = true;
				}
			}
		}
	}
	return flag;
}

function getPoints(wp,sortedWayPoint,refpoint) {
	arr = [];
	var k = 0;
	for(var i=0;i<wp.length;i++) {
		if(isEqual(wp[i],refpoint) === false){
			if(isExists(sortedWayPoint,wp[i]) === false) {
				arr[k] = wp[i];
				k++;
			}
		}
	}
	return arr;
}

function getIndex(latlng,arr) {
	var index=-1;
	for(var i=0;i<arr.length;i++) {
		if(arr[i].length !== 0 && isEqual(latlng,arr[i])) {
			index = i;
			break;
		}
	}
	return index;
}

function DistanceByAir(addList,isSort) {

	this.addressList = addList;
	var refpoint = null;

	this.addrLatLng = [];
	this.sortedAddrLatLng = [];
	this.sortedAddress = [];
	this.isSortRequired = isSort;
	this.directionObj = null;

	this.delay = 1000;

	this.GetOptimizedAddress = function() {
		if(distanceCalulator.isSortRequired) {
			for(var i=0;i<this.addressList.length;i++) {
				if(this.addressList[i] !== null) {
//					Log("Adding address : " + this.addressList[i].GetAddress() + "<br>");
					distanceCalulator.addrLatLng.push(distanceCalulator.addressList[i].GetLatLng());
				}
				else {
					distanceCalulator.addrLatLng.push('');
				}
			}
			distanceCalulator.sortLocations();
		}
		return this.sortedAddress;
	};

	this.sortLocations = function() {
		this.sortedAddrLatLng = [];
		this.sortedAddress = [];
		this.refpoint = null;
		var k=0;
//		Log("Finding route");
		waypoints = this.addrLatLng.copy();
		for(var i=0; i<waypoints.length; i++) {	
			if(waypoints[i] !== null && waypoints[i].length !== 0) {
				if(i === 0 ) {
					this.refpoint = this.addrLatLng[i];
					this.sortedAddrLatLng[k] = waypoints[i];
					this.sortedAddress[k] = this.addressList[0];
					k++;
				}
				else{
					tempArr = getPoints(this.addrLatLng,this.sortedAddrLatLng,this.refpoint);
					extendedlatlng = nearestPoint(this.refpoint,tempArr);
					if(extendedlatlng !== null) {
//						Log("Nearest point from : " + this.refpoint + " is " + extendedlatlng.GetLatLng() + "<br>");
//						Log("Value of k is : " + k + "<br>");
						this.sortedAddrLatLng[k] = extendedlatlng.GetLatLng();
						this.sortedAddress[k] = this.addressList[getIndex(extendedlatlng.GetLatLng(),waypoints)];
						this.refpoint = extendedlatlng.GetLatLng();
						k++;
					}
				}
			}
			else {
				k++;
			}
		}
//		for(var i=0; i<this.sortedAddress.length; i++) {
//			Log("Sorted address is : " + this.sortedAddress[i]); 
//		}
		return this.sortedAddress;
	};

	this.searchRoute = function() {
		addarr = [];
		if(this.isSortRequired) {
			addarr = this.sortedAddrLatLng.copy();
		}
		else {
			for(var i=0;i<this.addressList.length;i++) {
				addarr.push(this.addressList[i].GetActualAddress());
			}
		}
		this.sortedAddress.push(this.sortedAddress[0]);
		// add start address as end address
		addarr.push(addarr[0]);
				
//		for(var i=0;i<addarr.length;i++) {
//			Log("Route " + i + " " + addarr[i] + "<br>");
//		}

//		Log("Finding route now : <br>");
		//prepareDragAddress();
		//showElement("dragPanel");
		//hideElement("routePointPanel");
		//hideElement("searchPanel");

		this.directionObj = new GDirections(null ,null,{getSteps:true,getPolyline:true});
		this.directionObj.loadFromWaypoints(addarr,{getSteps:true,getPolyline:true,preserveViewport:false});
		GEvent.addListener(this.directionObj, "load",SortedDirectionLoad);
		GEvent.addListener(this.directionObj, "error", GErrorOccured);
	};
}

function isAddrExists(addarr,add) {
	var flag = false;
	for(i=0;i<addarr.length;i++) {
		if(addarr[i] == add){
			flag = true;
		}
	}
	return flag;
}

function GetAddress(sourceList,sortedList,refAdd) {
	arr = [];
	var k = 0;
	for(var i=0;i<sourceList.length;i++) {
		if(sourceList[i] != refAdd){
			if(isAddrExists(sortedList,sourceList[i]) === false) {
				arr[k] = sourceList[i];
				k++;
			}
		}
	}
	return arr;
}

Array.prototype.copy = function() {
	var a = [], i = this.length;
	while( i-- ) {
		a[i] = typeof this[i].copy!=='undefined' ? this[i].copy() : this[i];
	}
	return a;
};

function standardize(a) {
	for (var i=0; i<standards.length; i++) {
	if (a == standards[i][0])  {a = standards[i][1];}
    }
    return a;
}

function different(a,b) {
	// only interested in the bit before the first comma in the reply
    var c = b.split(",");
    b = c[0];
    // convert to lower case
    a = a.toLowerCase();
    b = b.toLowerCase();
    // remove apostrophies
    a = a.replace(/'/g ,"");
    b = b.replace(/'/g ,"");
    // replace all other punctuation with spaces
    a = a.replace(/\W/g," ");
    b = b.replace(/\W/g," ");
    // replace all multiple spaces with a single space
    a = a.replace(/\s+/g," ");
    b = b.replace(/\s+/g," ");
    // split into words
    awords = a.split(" ");
    bwords = b.split(" ");
    // perform the comparison
    var reply = false;
    for (var i=0; i<bwords.length; i++) {
    	//GLog.write (standardize(awords[i])+"  "+standardize(bwords[i]))
    	if (standardize(awords[i]) !== standardize(bwords[i])) {reply = true;}
    }
    //GLog.write(reply);
    return (reply);
}