﻿// JScriptt File
function etsDistanceCalculator(onComplete, onError, ediv){
    var SLEEPING = 0;
    var STARTED = 1;
    var COMPLETED = 2;
    var ERROR = 3;
    
    this.addressPairs = new Array(50);
    this.usedPairs = 0;
    
    this.ediv = null;
    if(ediv) this.ediv = ediv;
        
    this.onComplete = null;
    if(onComplete) this.onComplete = onComplete;
    
    this.onError = null;
    if(onError) this.onError = onError;
    
    this.Insert = _Insert;
    this.Start = _Start;
    this.Remove = _Remove;
    this.Clear = _Clear;
    this.CheckStatus = _CheckStatus;
    this.hasError = false;
    
    
    function _Insert(obj, i)
    {
        if(!i){i = this.usedPairs;}
        if(i>this.usedPairs){i = this.usedPairs;}
        if(i<this.usedPairs-1)
        {
            for(j=this.usedPairs-1;j>=i;j--){
                this.addressPairs[j+1] = this.addressPairs[j];
            }
        }
        this.addressPairs[i] = obj;
        this.usedPairs++;
    }
    
    function _Clear()
    {
        this.addressPairs = new Array(50);
        this.usedPairs = 0;
    }
    
    function _Remove(i)
    {
        if(!i){i = this.usedPairs-1;}
        if(i>this.usedPairs){i = this.usedPairs-1;}
        if(i<this.usedPairs-1)
        {
            for(j=i;j<=this.usedPairs-1;j++){
                this.addressPairs[j] = this.addressPairs[j+1];
            }
        }
        this.usedPairs--;
    }
    function _Start(objName){
        this.objName = objName;
        if(this.usedPairs>0){
            try
            {
                for(var i=0;i<this.usedPairs;i++)
                {
                    this.addressPairs[i].dObj = new GDirections();
                    this.addressPairs[i].status = STARTED;
                    this.addressPairs[i].dObj.load("from: " + this.addressPairs[i].start + " to: " + this.addressPairs[i].end);
                }
                window.setTimeout(this.objName + ".CheckStatus()",50);
            }
            catch(err)
            {
                this.hasError = true;
            }
        }
        else{
            this.onError(-1,"No Addresses Supplied");
        }
    }
    function _CheckStatus(){
        var stillProcessing = false;
        for(var i=0;i<this.usedPairs;i++)
        {
            var obj = this.addressPairs[i];
            try
            {
            if(obj.status == STARTED){
                var gd = obj.dObj;
                stillProcessing = true;
                
                if(!gd.getDistance()){
                    if(gd.getStatus().code != 500 || obj.loops > 200){
                        if(obj.loops > 200){ obj.error =  -2;}
                        else{obj.error =  gd.getStatus().code;}
                        if(obj.tries <4){
                            obj.tries++;
                            obj.dObj = null;
                            obj.error = 0;
                            obj.message = '';
                            obj.loops = 0;
                            obj.onError=null;
                            obj.hasError = false;
                            obj.dObj = new GDirections();
                            obj.status = STARTED;
                            obj.dObj.load("from: " + obj.start + " to: " + obj.end);
                        }else{
                            obj.status = ERROR;
                        }
                        if(obj.onError){
                          if(!(obj.tries <4)){
                            this.hasError = true;
                            obj.onError(i, obj.identifier, obj.error);}}
                    }else{
                        obj.loops++;
                    }
                }else{
                    obj.Distance_Meters = gd.getDistance().meters;
                    obj.Duration_Seconds = gd.getDuration().seconds;
                    obj.status = COMPLETED;
                    if(obj.onComplete){
                        var dis = obj.Distance_Meters;
                        if(dis==0)dis = 0.1;
                        obj.onComplete(i, obj.identifier, dis, obj.Duration_Seconds);
                    }
                }
            }
            }
            catch(err)
            {
                this.hasError = true;
            }
        }
        if(stillProcessing){window.setTimeout(this.objName + ".CheckStatus()",200);}
       else{
            if(this.hasError){
            this.onError();
            }else{this.onComplete();}
        }
    }
}
function etsAddressPair(start, end, identifier, onComplete, onError){
    this.start = start;
    this.end = end;
    this.identifier = identifier;
    
    this.onComplete = null;
    if(onComplete) this.onComplete = onComplete;
    
    this.onError = null;
    if(onError) this.onError = onError;
    
    this.status = 0;
    this.Distance_Meters = 0;
    this.Distance_Miles = 0;
    this.Duration_Seconds = 0;
    this.Duration_Hours = 0;
    
    this.dObj = null;
    
    this.error = 0;
    this.message = '';
    this.loops = 0;
    this.tries = 0;
}
