﻿DomesticFareMgr = createClass();

DomesticFareMgr.prototype.init = function(args) {
    defaults = { parentDiv: "", fare: null, type: "DomMgr", showSeatMapLnk: false };

	for(var pr in defaults)
        this[pr] = isDefined(args[pr]) ?args[pr] :defaults[pr];
        
    var fare = this.fare;
    var fareMgr = this;
    this.mode = [ "compact", "compact"];
    
    //var widths = [ 46, 115, 154, 154, 105];
    var widths = [ 46, 101, 108, 109, 100, 106 ];

    var grp = 1;
    
    var updateColFunc = [];
    
    updateColFunc.push(function(el, mgr, obj) { });
    updateColFunc.push(function(el, mgr, obj) {
		var aC = obj.get('airlineCode', mgr.indices.flightGrp);
		var img = (/mult/i.test(aC)) ?"<img src='images/multi.jpg' width='44px' height='44px'/>" 
		                                :"<img src='images/airlineLogos/55x20/" + aC + ".gif' width='55px' height='20px'/>";
		var html = img + "<br/>" + Airlines.get(aC, 'name');
		if(!/mult/i.test(aC)) {
            var dt = obj.get('dept', mgr.indices.flightGrp);
            dt = Util.formatDate(dt, "dd-mmm-yyyy");
		    html += "<br/>" + obj.get('flightNumber', mgr.indices.flightGrp);		    
		    /*if(fareMgr.showSeatMapLnk)
		        html += "<br/><a style='color:#38a0bb;text-decoration:underline' href=\"javascript:popUP('SeatMap.aspx?FlightNo=" +  obj.get('flightNumber', mgr.indices.flightGrp) + "&arrivalCity=" +  obj.get('origin', mgr.indices.flightGrp) + "&depCity=" +  obj.get('destination', mgr.indices.flightGrp) + "&depDate=" + dt + " ')\">Seat Map</a>";*/
		}
		el.innerHTML = "<div>" + html + "</div>";
		var imgObj = el.getElementsByTagName("img")[0];
		DOM.addEvent(imgObj, "error", function(ev) {
		    imgObj.style.display = "none";
		});
    });
    updateColFunc.push(function(el, mgr, obj) {
        var aC = obj.get('origin', mgr.indices.flightGrp);
        var dt = obj.get('dept', mgr.indices.flightGrp);
		var html = Airports.get(aC, 'short') + "<br/>" + Util.formatDate(dt, "ddd dd mmm <br/><b>hh:nn</b>");
		el.innerHTML = "<div>" + html + "</div>";
    });
    updateColFunc.push(function(el, mgr, obj) {
        var aC = obj.get('destination', mgr.indices.flightGrp);
        var dt = obj.get('arrv', mgr.indices.flightGrp);

		var html = Airports.get(aC, 'short') + "<br/>" + Util.formatDate(dt, "ddd dd mmm <br/><b>hh:nn</b>");
		el.innerHTML = "<div>" + html + "</div>";
    });
    updateColFunc.push(function(el, mgr, obj) {
        var s = obj.get('stops', mgr.indices.flightGrp);
        var html = ((s == 0) ?"Direct Flight" : s + " stop");
        if(s > 1) html += "s";
        html += "<br/>" + Util.getIntlDurStr(obj.get('duration', mgr.indices.flightGrp));
        el.innerHTML = "<div>" + html + "</div>";
        //el.style.display = "none";
    });
    updateColFunc.push(function(el, mgr, obj) {		
        var i = mgr.indices.flightGrp;
		var type = obj.get('fareType', i);
		if(isDefined(type)) type = (type == "r") ?"Refundable" : "Non-Refundable";
		else type = "";
		if((fare.get('flights', i).length <= 1) || /expand/i.test(fareMgr.mode[i]))
		    el.innerHTML = "<div>" + type + 
		        "<br/><a style='color:#38a0bb;text-decoration: underline' href=\"javascript:popUP('farerules.aspx?f=" + 
		        obj.get('fareBasis', mgr.indices.flightGrp) + "&sid=" + _searchid + "&flight=" + 
		        obj.get('flightNumber', mgr.indices.flightGrp) + "')\">Fare rules</a></div>";
	    else		    
		    el.innerHTML= "<div>" + type + "<br/>";
	});
    
    this.isFareIB = function() {
        if(!isDefined(fare))
            return true; 
        else if(fare instanceof DomesticFare)        
            return false;
        else 
            return true;
    };
    
    this.getFlightDivsCnt = function(mgr) {
        var i = mgr.indices.flightGrp;
        var mode = fareMgr.mode[i];
        var reqCnt = /compact/i.test(mode) ?1 :
            (!isDefined(fare) ?1 :fare.get('flights', i).length);
		var actualCnt = 0;
		if(isArray(mgr.elements[i + "rows"])) 
			actualCnt = mgr.elements[i + "rows"].length;
		return { 'req': reqCnt, 'actual': actualCnt };
    };
    
    this.resetModes = function(mode) {
        this.mode[0] = this.mode[1] = mode;
    };

    
    this.hide = function() {
        this.domMgr.parent.style.display = "none";        
    };

    this.show = function() {
        this.domMgr.parent.style.display = "";
    };
    
    var header = {
	    tagName: "div",
	    cssClass: "header",
		style: { height: "24px" },
        layout: [{
	        tagName: "div",
	        cssClass: "left",
	        style: { fontWeight: "normal", fontFamily: "Verdana", fontSize: "11px" },
	        updateFunc: function(el, mgr) {
		        var cur = "<span style='font-family: tahoma'>" + 
			        fare.get('currency') + "</span>";
		        //if(isDefined(fare)) 
			    //    el.innerHTML = "(" + cur + fare.get('amt') + "&nbsp;+&nbsp;" + cur + fare.get('tax') + "&nbsp;Taxes & Fees)";
			    if(fare.get('discount') == 0)
			        el.innerHTML = "(" + cur + fare.get('amt') + "&nbsp;+&nbsp;" + cur + fare.get('tax') + "&nbsp;Taxes & Fees)";
			    else
			        el.innerHTML = "(" + cur + fare.get('amt') + "&nbsp;+&nbsp;" + cur + fare.get('tax') + "&nbsp;Taxes" + "&nbsp;-&nbsp;" + cur + fare.get('discount') + "&nbsp; Discounts)";
	        }
        },{
            tagName: "div",
            cssClass: "right",
            style: { textAlign: "center", fontWeight: "normal" },
            updateFunc: function(el, mgr) {
		        var cur = "<span style='font-family: tahoma; font-weight: bold; font-size: 12px; color: #E47614'>" + 
			        fare.get('currency') + fare.get('total') + "</span>";
		        if(isDefined(fare))
			        el.innerHTML = "Price - " + cur;
			}

		}]
    };
    
    var fareOrFlight = {
        tagName: "div",
        cssClass: "body",
        name: function(mgr) { return mgr.indices.flightGrp + "rows"; },
        foreach: { startIndex: 0, stopIndex: 5, indexKey: "bodyCol" },
        layout: {
            tagName: "div",
            cssClass: function(mgr) { 
                return (mgr.indices.bodyCol == 0) ?"left" + mgr.indices.flightGrp :"col"; },
			style: { backgroundColor : "#ffffff" },
            updateFunc: function(el, mgr) { 
                if(isDefined(fare)) {
                    var obj, i = mgr.indices.flightGrp;
                    if(/compact/i.test(fareMgr.mode[i])) {
                        if(!fareMgr.isFareIB() && i == 1)
                            obj = null;
                        else
                            obj = fare;
                    }
                    else
                        obj = fare.get('flights', i)[mgr.indices.flight];
                    if(isDefined(obj)) {    
                        updateColFunc[mgr.indices.bodyCol](el, mgr, obj);  
                        if(mgr.indices.bodyCol == 1)
                            el.firstChild.style.top = "5px";                  
                    }
                }
            },
            style: { width: function(mgr) { return widths[mgr.indices.bodyCol]-1 + "px"; } }
        }, 
        updateFunc: function(el, mgr) {
            var i = mgr.indices.flightGrp;
            var reqCnt = (/compact/i.test(fareMgr.mode[i]) || 
                !isDefined(fare)) ?1 :fare.get('flights', i).length;
            el.style.display = (mgr.indices.flight < reqCnt) ?"" :"none";
        }
    };
    
    var fareBody = {
        tagName: "div",
        foreach: { 
            startIndex: 0,
            stopIndex: function(mgr) {
                var c = fareMgr.getFlightDivsCnt(mgr);		
                return (c.req > c.actual) ?c.req-1 :c.actual-1;
            },
            indexKey: "flight"
        },
        layout: fareOrFlight,
        updateFunc: function(el, mgr) {
            var c = fareMgr.getFlightDivsCnt(mgr);            
            for(var i=c.actual; i<c.req; i++) {
                mgr.indices.flight = i;
                mgr.createLayout(fareBody.layout, el);
            }
            if(mgr.indices.flightGrp == 1)
                el.style.display = fareMgr.isFareIB() ?"" :"none";
        }
    };
    
    var emailtofriend = {
	    tagName: "div",
	    cssClass: "emailToFriend",
	    layout: [{
	        updateFunc: function(el, mgr) {
		        var _index;
                if(g.searchType == "D" && g.tripType == "OW")
                    _index = fare.id;
                else if(g.searchType == "D")
                    _index = [fare.ob.id, fare.ib.id];
                
                //var _index = fare.get('index', mgr.indices.flightGrp);
                var _emailtofriend = "<a style='color:#38a0bb;text-decoration: underline' alt='' href='#' onclick=\"javascript:window.open('Emailtofriend.aspx?searchId="+ _searchid +"&index="+ _index +"','','width=1000, height=700, left=45, top=15, scrollbars=yes, menubar=no,resizable=yes');return false;\">Email to friend</a>";
                el.innerHTML = _emailtofriend;
	        }
        }],
	    updateFunc: function(el, mgr) {
		    if(isDefined(fare))
		        if(mgr.indices.flightGrp == 0) el.style.display = "none";
	    }
    };
    
    var fareRules = {
	    tagName: "div",
	    cssClass: "farerules",
	    layout: [{
	        updateFunc: function(el, mgr) {
		        el.innerHTML = "";
	        }
        }],
	    updateFunc: function(el, mgr) {
		    if(isDefined(fare))
		        if(mgr.indices.flightGrp == 0) el.style.display = "none";
	    }
    };
    
    var itenerary = {
	    tagName: "div",
	    cssClass: "itenerarywithFR",
	    layout: {
		    tagName: "a",
		    name: 'itenerary',
		    attributes: { mode: "compact", index: function(mgr) { return mgr.indices.flightGrp; }, 
		                  href: "javascript:void(0)" },
		    handlers: { 
			    click: function(ev, mgr) {
				    var el = DOM.getTargetElement(ev);
				    if(/a$/i.test(el.tagName)) {
					    var mode = (/compact/i.test(fareMgr.mode[el.getAttribute("index")])) ?"expand" :"compact";
   					    fareMgr.mode[0] = fareMgr.mode[1] = mode;
					    fareMgr.update();
					    return false;
				    }
			    }
		    },
		    updateFunc: function(el, mgr) {
			    el.innerHTML = (/compact/i.test(fareMgr.mode[mgr.indices.flightGrp])) 
			        ?"Show full itinerary" :"Hide full itinerary";
		    }
	    },
	    updateFunc: function(el, mgr) {	        
		    var show = false;		    
		    if(isDefined(fare))
		    {
			    if(mgr.indices.flightGrp == 0) el.style.display = "none";
				else if(fareMgr.isFareIB())
				    show = ((fare.get('flights', 0).length+fare.get('flights', 1).length) > 2);
				else
			        show = (fare.get('flights', 0).length > 1);		    
			}
			el.style.display = (show) ?"" :"none";
	    }
    };

    var footer = {
	    tagName: "div",
        cssClass: "itenerary",        
        style: { align: "left"  },
	    layout: [ emailtofriend, fareRules, itenerary ],
	    updateFunc: function(el, mgr) {
		    if(isDefined(fare))
		        if(mgr.indices.flightGrp != 0) el.style.height="15px";
		}
    };

    this.layout = {
        parent: fareMgr.parentDiv,
        layout: {
            tagName: "div",
            cssClass: "domestic",
            layout: [ header, {
                tagName: "div",
                foreach: { startIndex: 0, stopIndex: grp, indexKey: "flightGrp" },
                layout: [ fareBody, footer ]
            }]
        }
    };
    this.domMgr = new DomMgr(this.layout);
    
    this.create = function(el) {
        this.domMgr.create(el);
    };
    
    this.update = function() {
        fare = this.fare;
        this.domMgr.update(true);
    };
};