﻿AirlineFilter = createSingleton(AirlineFilter = {});

AirlineFilter.prototype.init = function(args) {
     /*
        preset          : Preset values to be used 
		onChange		: Handler to be invoked on-change
		list			: List minimum fares group-by airlines
    */
	if(!isDefined(args))
		args = {};
	defaults = { preset: null, onChange: null, fareList: null, parentDiv: "", taxMode: "Inclusive" };
	for(var pr in defaults)
		this[pr] = isDefined(args[pr]) ?args[pr] :defaults[pr];
    var filter = this;
    
    // Sort list of fares
	this.sortList = function() {
        this.list.sort(function(f1, f2) {
            var ac1 = f1.get('airlineCode');
            var ac2 = f2.get('airlineCode');
            if(/mult/i.test(ac1))
                return 1; 
            else if(/mult/i.test(ac2))
                return -1;
            else
                return ac1.localeCompare(ac2);
        });
    };
	
	// Reset filter
	this.reset = function(list)
	{
	    this.list = convertToArr(list);
	    this.checked = {};
        this.update();
    };            
    
  	// Update the filter
  	this.update = function() {
  	    this.sortList();
  	    this.updateCheckedList();
	    this.domMgr.update(false);
    };
        
    // Method for updating checked status list
    this.updateCheckedList = function() {
	    var code;
	    var preset = isDefined(this.preset);
        var checked = 0;
        
	    if(preset) {
	        for(var i=0; i<this.preset.length; i++)	        
	            this.checked[this.preset[i]] = true;	        
	    }
	    
	    for(var i=0; i<this.list.length; i++) {
		    code = this.list[i].get('airlineCode');
		    if(!isDefined(this.checked[code]))
			    this.checked[code] = !preset;
            else
                checked++;
	    }
	    
	    // If actual checked is zero, set all airlines as checked
	    if(checked == 0) {
	        for(var c in this.checked)
	            this.checked[c] = true;
	    }	    
    };
	
	// Get count of the required rows for airlines
	this.getRowsCnt = function() {
		var reqCnt = this.list.length;
		var actualCnt = 0;
		if(isArray(this.domMgr.elements["rows"])) 
			actualCnt = this.domMgr.elements["rows"].length;
		return { 'req': reqCnt, 'actual': actualCnt };
	};

    // Get check status for Airline-code
	this.getCheckStatus = function(c) {
		return this.checked[c];
	};

    // Set check status for Airline-code
	this.setCheckStatus = function(c, s) {
		this.checked[c] = s;
		if(this.onChange)
			this.onChange(this);
	};

    // Method for validating fare to be displayed
    this.isValidFare = function(fare) {
        var arr = fare.get('airlineCodes');
        var allow = this.checked[fare.get('airlineCode')];
        if(allow)
            for(var i=0; i<arr.length; i++)
                allow = allow && (isDefined(this.checked[arr[i]]) ?this.checked[arr[i]] :true);
        return allow;
    };
	
	this.hide = function() {
        $(this.parentDiv).style.display = "none";        
    };

    this.show = function() {
        $(this.parentDiv).style.display = "";        
    };
	
    var header = {
        tagName: "div", 
        cssClass: "headerCap", 
        layout: [{
		    tagName: "div",
		    cssClass: "col",
		    layout: "&nbsp;Airline"
	    },{
		    tagName: "div",
		    cssClass: "col2", 
		    layout: "Lowest Prices*"
	    }]
    };

    var hr = {
        tagName: "div", 
        cssClass: "break",
        layout: [{
            tagName: "div",
            cssClass: "c1"
        },{
            tagName: "div",
            cssClass: "c2"
        },{
            tagName: "div",
            cssClass: "c3"
        }]
    };
            
        
	var c = {};
	var row = {
	    tagName: "div",
	    name: "rows",
	    cssClass: "row",
	    layout: [{
		    tagName: "div",
		    cssClass: "col",
		    updateFunc: function(el, mgr) {
			    if(mgr.indices.row < c.req) {
			        var code = filter.list[mgr.indices.row].get('airlineCode');			        
			        el.innerHTML = "<div>" + Airlines.get(code, 'name') + "</div>";
			        el.title = Airlines.get(code, 'name');
			        var status = filter.getCheckStatus(code);
			        el.firstChild.style.backgroundImage =  status
			            ?"url(images/checked.gif)" :"url(images/unchecked.gif)"; 			        
                }
		    }
	    },{
		    tagName: "div",
		    cssClass: "col2", 
		    layout: function(el, mgr) {
			    var fare = filter.list[mgr.indices.row];
			    el.innerHTML = "<span style='font-family: tahoma'>" + 
			        fare.get('currency') + "</span> " + fare.get('total');
		    }
	    }],
	    updateFunc: function(el, mgr) { 
		    el.style.display = (mgr.indices.row < c.req) ?"" :"none";
		    el.setAttribute("code", (mgr.indices.row < c.req) ?filter.list[mgr.indices.row].get('airlineCode') :""); 
	    },
	    handlers: {
		    click: function(ev, mgr) {
			    var el = DOM.getTargetElement(ev);
			    while(el && !isDefined(el.getAttribute("code")))
				    el = el.parentNode;
			    var code = el.getAttribute("code");
			    var status = filter.getCheckStatus(code);
			    status = !status;
			    el.firstChild.firstChild.style.backgroundImage =  status
			            ?"url(images/checked.gif)" :"url(images/unchecked.gif)";			    
			    filter.setCheckStatus(code, status);
		    }
	    }
    };
	
	var body = {
        tagName: "div",
	    foreach: { startIndex: 0, stopIndex: function(mgr) {
		    return (c.req > c.actual) ?c.req-1 :c.actual-1;
	    }, indexKey: "row" },
	    layout: row,
	    updateFunc: function(el, mgr) {
		    c = filter.getRowsCnt();
		    for(var i=c.actual; i<c.req; i++) {
			    mgr.indices.row = i;
			    mgr.createLayout(row, el);
		    }
	    }    
	};
	
	var footer = { 
	    tagName: "div", 
	    cssClass: "footer",
	    layout: "* " + this.taxMode + " of taxes &amp; fees"
	};
	
    this.container = new LeftFilter({ 
        caption: "Airline Preference",
        parentDiv: filter.parentDiv
    });
	this.layout = {
	    parent: filter.container.body, 
	    layout: [ header, hr, body, hr, footer ]
	};
	
    this.list = convertToArr(this.fareList.get('min(total)', 'airlineCode'));
	this.checked = {};
	
	// AirlineFilter Dom-manager (manage DOM manipulation)
	this.domMgr = new DomMgr(this.layout);
	this.domMgr.create();
	this.update();
};