﻿// JScript 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){
            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()",10);
        }
        else{
            this.onError(-1,"No Addresses Supplied");
        }
    }
   function _CheckStatus(){
        //debugger 
        var stillProcessing = false;
        for(var i=0;i<this.usedPairs;i++)
        {
            var obj = this.addressPairs[i];
            
            if(obj.status == STARTED){
                var gd = obj.dObj;
                stillProcessing = true;
                
                if(!gd.getDistance()){
                    if (gd.getStatus() != undefined){
                        if(gd.getStatus().code != 500 || obj.loops > 200){
                            if(obj.loops > 200){ obj.error =  -2;}
                            else{obj.error =  gd.getStatus().code;}
                            if(obj.tries <20){
                                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 <20)){
                                    this.hasError = true;
                                    obj.onError(i, obj.identifier, obj.error);
                                    stillProcessing = false;
                                }
                            }
                        }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);
                    }
                }
            }
        }
        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;
}
