﻿
// FareList : Represents a collection of fares

FareList = createClass();
FareList.prototype.init = function(args) {

	this.list = [];
    if(!isDefined(args.fareType))
        throw new Error("Fare-type is mandatory");
    this.fareType = args.fareType;    
	
	// Load details from json (usually downloaded from server)
	var arr = args.fares;
	for(var f=0; f<arr.length; f++) {
		this.list.push(new this.fareType(arr[f]));
	    this.list[f].index = f;
	}
	
	// Get a property value; or list of values if grpBy is specified; mode :- min, max, all
    this.get = function( query, grpBy) {
	    var arr = this.list;
	    var ht = {};
	    var mode, pr;
	    var match = query.match(/([a-z]+)\(([a-z_]+)\)/i);
	    mode = match[1] || "arr";
	    pr = match[2] || "amt";

	    var prVal, grpByVal;
	    var func = this.fareType.compare[pr] || Util.compare(pr);
	    for(var i=0; i<arr.length; i++) {
		    prVal = arr[i].get(pr);
		    grpByVal = "_" + arr[i].get(grpBy);
		    if(!isDefined(ht[grpByVal])) {
			    if(/arr/i.test(mode)) 
				    ht[grpByVal] = [arr[i]];
			    else
				    ht[grpByVal] = arr[i];
		    }
		    else if(/arr/i.test(mode))
			    ht[grpByVal].push(arr[i]);
		    else if(/min|max/i.test(mode)) {
			    var r = func(arr[i], ht[grpByVal]);
			    if((/min/i.test(mode) && r < 0) || (/max/i.test(mode) && r > 0))
				    ht[grpByVal] = arr[i];
		    }
	    }

	    return isDefined(grpBy) ?ht :ht[grpByVal];
    };

    // Sort list by property (byPr)
    this.sort = function(byPr) {
	    var pr = byPr || "amt";
	    var func = this.fareType.compare[pr] || Util.compare(pr);
	    this.list.sort(func);
    };
};