﻿PublishFareMgr = createClass();

PublishFareMgr.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 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, 'name') + "(" + aC
		+ ")"  + "<br/>" + Util.formatDate(dt, "ddd dd mmm yy hh:nn");
		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, 'name') + "(" + aC
		+ ")"  + "<br/>" + Util.formatDate(dt, "ddd dd mmm yy hh:nn");
		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));
        
        /*var type = obj.get('fareType', mgr.indices.flightGrp);
        if(isDefined(type)) type = (type == "r") ?"Refundable" : "Non-Refundable";
		html += "<br/>" + type;*/
		
        el.innerHTML = "<div>" + html + "</div>";
    });
    
    this.isFareIB = function() {
        if(!isDefined(fare))
            return true; 
        else if(fare.get('flights', 'ib').length == 0)
            return false;
        else 
            return true;
    };
    
    this.resetModes = function(mode) {
        this.mode[0] = this.mode[1] = mode;
    };
    
    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.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)) {
			        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: 4, 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 = fare.id;
                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",
	    //style: { width: "50%" },
	    layout: [{
	        updateFunc: function(el, mgr) {
		        var type = fare.get('fareType', mgr.indices.flightGrp);
                if(isDefined(type)) type = (type == "r") ?"Refundable" : "Non-Refundable";
		        var _fareRules = "<a style='color:#38a0bb;text-decoration: underline' href='javascript:void(0);' onmouseover=\"showhint('<table><tr><td valign=top>&bull;</td><td valign=top>Most airline tickets are non-refundable.</td></tr><tr><td valign=top>&bull;</td><td valign=top>Please ensure that you have a valid visa before your international travel. Wakanow.com will not be held liable by airport authorities if you have not fulfilled your visa requirements.<br/></td></tr><tr><td valign=top>&bull;</td><td valign=top>Tickets can only be cancelled by 12midnight of the ticketing day for a full refund to apply with the exception of a $30 processing fee.</td></tr><tr><td valign=top>&bull;</td><td valign=top>There may be penalties and charges for cancellations/voids/changes for tickets purchased on Wakanow.com which may include a minimum airline charge of $55 change fee and a higher fare.</td></tr><tr><td valign=top>&bull;</td><td valign=top>On many airlines, tickets have no value and cannot be refunded for no-shows.</td></tr><tr><td valign=top>&bull;</td><td valign=top>Refundable airline tickets will be processed within 7 days.</td></tr><tr><td valign=top>&bull;</td><td valign=top>In the case of cancellation, amount paid for insurance will be non-refundable. This is applicable if insurance is booked along with a ticket.</td></tr><tr><td valign=top>&bull;</td><td valign=top>A maximum of one infant is allowed to travel with one adult.</td></tr><tr><td valign=top>&bull;</td><td valign=top>If you or anyone accompanying you has a serious health issue, please call us before booking.</td></tr><tr><td valign=top>&bull;</td><td valign=top>Egypt Air tickets cannot be booked for one way routes, there should be a RESTRICTION on bookings, NO ONE WAY on Egypt Air.</td></tr><tr><td valign=top>&bull;</td><td valign=top>Tickets to Kualar Lumpur must not exceed 14 days, this simply means all tickets booked to Kualar Lumpur may be less than 14 days but must not be more than 14 days.</td></tr></table>', this, event, '400px')\">Fare rules</a>";
                el.innerHTML = _fareRules;
	        }
        }],
	    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: "publish",
            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);        
    };
};

