﻿
// DomesticCombo : Represents one ob fare ( + ib fare )

DomesticCombo = createClass();
DomesticCombo.prototype.init = function(args) {
    /*
        obFare      : Out-bound fare
        ibFare      : In-bound fare 
    */
	defaults = { obFare: null, ibFare: null, ob: null, ib: null };
	for(var pr in defaults)
		this[pr] = isDefined(args[pr]) ?args[pr] :defaults[pr];
    
    if(!(args instanceof DomesticCombo)) {
        this.obFare = this.ob = args.ob;
        this.ibFare = this.ib = args.ib;
    }
    
    // Get a property/aggregated value
    this.get = function(pr, mode) {
	    var arr, value = null; 
	    if(/_/.test(pr)) {
            mode = pr.split("_")[1];
            pr = pr.split("_")[0];
        }
	        
	    mode = isDefined(mode) ?mode :"rt";
	    var obMode = (/ob/i.test(mode) || mode == 0) ?true :false;
        var rtMode = /rt/i.test(mode);

        if(obMode)
		    arr = this.ob.flights;
	    else if(rtMode) {
	        var flights = new Array();
            var i;
            for(i=0; i<this.ob.flights.length; i++)
                flights.push(this.ob.flights[i]);
            for(i=0; i<this.ib.flights.length; i++)
                flights.push(this.ib.flights[i]);
            arr = flights;
        }
	    else
	        arr = this.ib.flights;
		        
	    if(/curr/i.test(pr)) {
		    // Origin airport		    
		    value = this.ob.currency;
	    }
	    else if(/origin/i.test(pr)) {
		    // Origin airport		    
		    value = arr[0].originCode;
	    }
	    else if(/(dest)|(destination)/i.test(pr)) {
		    // Destination airport
		    value = arr[arr.length-1].destinationCode;
	    }
	    else if(/amt/i.test(pr)) {
		    return Math.ceil((this.ob.get('amt') + this.ib.get('amt')) * 100)/100;
	    }
	    else if(/discount/i.test(pr)) {
		    return Math.ceil((this.ob.get('discount') + this.ib.get('discount')) * 100)/100;
	    }
        else if(/tax/i.test(pr)) {
        
        
         //    return Math.ceil((((this.ob.get('amt')*5)/100) + ((this.ib.get('amt')*5)/100)) * 100)/100;
		    return Math.ceil((this.ob.get('tax') + this.ib.get('tax')) * 100)/100;
	    }
	    else if(/total/i.test(pr)) {
		    return Math.ceil((this.ob.get('total') + this.ib.get('total')) * 100)/100;
	    }
	    else if(/flights/i.test(pr)) {
		    // Flights list
		    value = arr;
	    }
	    else if(/airlineCode$/i.test(pr)) {
		    // Airline code if all flights have same airline code, multi otherwise
		    var code = arr[0].airlineCode;
		    for(var i=1; i<arr.length; i++)
			    if(arr[i].airlineCode != code) {
				    code = "mult";
				    break;	
			    }
		    value = code;
	    }
	    else if(/airlineCodes/i.test(pr)) {
		    // Airline codes of all flights
		    var code = {};
		    for(var i=0; i<arr.length; i++)
			    if(!isDefined(code[arr[i].airlineCode]))
			        code[arr[i].airlineCode] = arr[i].airlineCode;
		    value = convertToArr(code);
	    }
	    else if (/flightNumber/i.test(pr)) {
		    // Flight-number for first flight
		    value = arr[0].airlineCode + "-" + arr[0].flightNumber;
	    }
	    else if (/dept/i.test(pr)) {
		    // Departure time for first flight
		    value = arr[0].deptTime;
		    if(/deptMin/i.test(pr)) 
		        value = (value.getHours()*60) + value.getMinutes();
	    }
	    else if (/arrv/i.test(pr)) {
		    // Arrival time for last flight
		    value = arr[arr.length-1].arrvTime;
		    if(/arrvMin/i.test(pr)) 
		        value = (value.getHours()*60) + value.getMinutes();
	    }
	    else if (/stops/i.test(pr)) {
		    // Number of stops
            if(obMode || !rtMode) {
                var stops;
                if(obMode)
                    stops = this.ob.flights.length-1;
                else
                    stops = (this.ib.flights.length == 0) ?0 :this.ib.flights.length-1;
		        for(var i=0; i<arr.length; i++)
		            stops += arr[i].stops;
                value = stops;
            }
            else {
                var obStops = this.get('stops', 'ob');
                var ibStops = this.get('stops', 'ib');
                value = (obStops > ibStops) ?obStops :ibStops;
            }
	    }
	    else if(/duration/i.test(pr)) {
		    // Duration of trip
		    if(obMode)
			    value = this.ob.duration;
		    else if(rtMode) {
		        value = new Duration({});
		        value.add(this.ob.duration);
		        value.add(this.ib.duration);
		    }
		    else
			    value = this.ib.duration;
	    }
	    else if(/fareBreakup/i.test(pr)) {
	        value = new FareBreakup({});
	        value.add(this.ob.fareBreakup);
	        value.add(this.ib.fareBreakup);
	    }
	    else if(/fareType/i.test(pr)) {
	        if(obMode || rtMode)
	            value = this.ob.fareType;
            else
                value = this.ib.fareType;
	    }
	    else if(/fareBasis/i.test(pr)) {
	        if(obMode || rtMode)
	            value = this.ob.fareBasis;
            else
                value = this.ib.fareBasis;
	    }
	    else if(isDefined(this[pr])) {
		    value = this[pr];
	    }
	    return value;
    };
};

// Static functions for comparing two fares on basis of property
DomesticCombo.compare = {
	amt: function(f1, f2) {
		return f1.get('amt')-f2.get('amt');
	},
	fareType: function(f1, f2) {
		return f1.get('fareType').localeCompare(f2.get('fareType'));
	},
	dept: function(f1, f2) {
		return Util.compareTimes(f1.get('dept'), f2.get('dept'));
	},
	arrv: function(f1, f2) {
		return Util.compareTimes(f1.get('arrv'), f2.get('arrv'));
	},
	duration: function(f1, f2) {
		var m1 = f1.get('duration').get('minutes');
		var m2 = f2.get('duration').get('minutes');
		return m1 - m2;
	}
};

// Combine lists to create a combo-list
DomesticCombo.combine = function(obList, ibList) {
    var obArr = obList.list;
    var ibArr = ibList.list;
    
    var i, j, arr = new Array();
    var dept, arrv, hrs;
    for(i=0; i<obArr.length; i++)
        for(j=0; j<ibArr.length; j++) {
            d1 = obArr[i].get('arrv');
            d2 = ibArr[j].get('dept');

            if(Util.compareTimes(d1, d2, true) == 0) {
                hrs = Math.round((d2.valueOf()-d1.valueOf())/60*1000); 
                if(hrs >= 2*60)
                    arr.push({ ob: obArr[i], ib: ibArr[j]});
            }
            else
                arr.push({ ob: obArr[i], ib: ibArr[j]});
    }
    return (new FareList({ fareType: DomesticCombo, fares: arr}));
};