﻿(function($) {
    var previousDayID = null;
    var previousDisplayOrder = null;
    var sortables = ".trip-planner ul.ui-sortable";
    var useAsync = true;

    $.widget("cimbrian.triporganizer", {
        _init: function() {
            var self = this,
                o = this.options;
            useAsync = this.options.async;
            self.element.addClass("trip-planner");
            self._assignClicks();
            self._load();
        },
        _assignClicks: function() {
            var self = this;
            //set up click handlers for deletes
            $("li.trip-planner-day-list-item > div > span.trip-planner-delete")
                .live('click', function(e) {
                    e.preventDefault();
                    e.stopPropagation();
                    var dayid = $(this).parent().parent().attr("dayid");
                    self._deleteDay(dayid);
                });

            $("ul.trip-planner-destination-list span.trip-planner-delete")
                .live('click', function(e) {
                    e.preventDefault();
                    e.stopPropagation();
                    var parent = $(this).parent();
                    var destinationid = parent.attr("destinationid");
                    var dayid = parent.parent().attr("dayid");
                    self._deleteDestination(destinationid, dayid);
                });

            $("ul.trip-planner-lodging-list span.trip-planner-delete")
                .live('click', function(e) {
                    e.preventDefault();
                    e.stopPropagation();
                    var parent = $(this).parent();
                    var lodgingid = parent.attr("itinerarylodgingid");
                    self._deleteLodging(lodgingid);
                });
            
            $("div.trip-planner-actions")
                .live('click', function(e) {
                    var target = $(e.target);
                    e.preventDefault();
                    e.stopPropagation();
                    if (target.is("a.trip-planner-action-link")) {
                        switch (target.attr("fn")) {
                            case "addday":
                                self._addDay();
                                break;
                            case "entermanual":
                                self._trigger("addManual");
                                break;
                            case "openplanner":
                                window.location = "/Itinerary/Details";
                                break;
                    }
                }
            });

            $("span.trip-planner-share-link")
                .live('click', function(e) {
                    //set click handlers for print plan and email
                    var target = $(e.target).parent();
                    if (!target.is(".trip-planner-drivingDirections")) {
                    e.preventDefault();
                    e.stopPropagation();
                    if (target.is(".trip-planner-printPlan")) {
                        self._trigger("printPlan");
                    } else if (target.is(".trip-planner-emailPlan")) {
                        self._trigger("emailPlan");
                    }
                }
            });
            

            //ABOVE Code condensed to 5 lines. -awesome if it worked
            /*
                $("div.trip-planner-actions a.addday").live('click', function(e) { self._addDay(); });
                $("div.trip-planner-actions a.entermanual").live('click', function(e) { self._trigger("addManual"); });
                $("div.trip-planner-actions a.openplanner").live('click', function(e) { window.location = "/Itinerary/Details"; });
            $("div.trip-planner-share-link span.trip-planner-printPlan a").live('click', function(e) { self._trigger("printPlan"); });
            $("div.trip-planner-share-link span.trip-planner-emailPlan a").live('click', function(e) { self._trigger("emailPlan"); });
            */
        },
        isDisabled: function() {
            return this._getData("disabled");
        },
        setDisabled: function() {
            this._setData("disabled", true);
        },
        setEnabled: function() {
            this._setData("disabled", false);
        },
        _load: function() {
            var self = this;
            if (!self.isDisabled()) {
                self.setDisabled();
                $.ajax({
                    async: useAsync,
                    url: this.options.url,
                    data: 'ItineraryID=' + this.options.itineraryID + '&rand=' + (new Date().getTime()),
                    type: 'GET',
                    dataType: 'json',
                    error: function() {
                        alert("An error occurred while processing your request.");
                    },
                    success: function($response, $status) {
                        if ($response.StatusCode != 200) {
                            alert($response.StatusMessage);
                        } else {
                            self._renderAll($response.HTML);
                        }
                    },
                    complete: function() {
                        self.setEnabled();
                    }
                });
            }
        },
        refreshAll: function() {
            var self = this;
            self._load();
        },
        _renderAll: function(HTML) {
            var self = this;
            $(sortables).sortable('destroy');
            self.element.empty();
            self.element.html(HTML);
            self._makeLodgingsSortable();
            self._makeDaysSortable();
            var hiddenActionLink = "entermanual";
            if (self.options.allowManualEntries) {
                hiddenActionLink = "openplanner";
            }
            $(".trip-planner-action-link[fn='" + hiddenActionLink + "']")
                    .hide();
            if (!self.options.showOtherLinks) {
                $("span.trip-planner-share-link")
                    .hide();
            }
            self._checkDestinationCount(self);
        },
        _getMaxDayID: function() {
            return $("li.trip-planner-day-list-item:last-child").attr("dayid");
        },
        _addDay: function() {            
            var self = this;
            if (!self.isDisabled()) {
                self.setDisabled();
                $.ajax({
                    async: useAsync,
                    url: '/Itinerary/AddDay',
                    data: 'ItineraryID=' + self.options.itineraryID + '&rand=' + (new Date().getTime()),
                    type: 'GET',
                    dataType: 'json',
                    error: function() {
                        alert("An error occurred while processing your request.");
                    },
                    success: function($response, $status) {
                        if ($response.StatusCode != 200) {
                            alert($response.StatusMessage);
                        } else {
                            self._renderDays($response.HTML);
                            self._trigger("addDay");
                        }
                    },
                    complete: function() {
                        self.setEnabled();
                    }
                });
            }
        },
        addLodgingByName: function(MemberName) {
            var self = this;
            if (!self.isDisabled()) {
                self.setDisabled();
                $.ajax({
                    async: useAsync,
                    url: '/Itinerary/AddLodging',
                    data: 'MemberName=' + encodeURIComponent(MemberName) + '&ItineraryID=' + self.options.itineraryID + '&rand=' + (new Date().getTime()),
                    type: 'GET',
                    dataType: 'json',
                    error: function() {
                        alert("An error occurred while processing your request.");
                    },
                    success: function($response, $status) {
                        if ($response.StatusCode != 200) {
                            alert($response.StatusMessage);
                        } else {
                            self._renderLodgings($response.HTML);
                        }
                    },
                    complete: function() {
                        self.setEnabled();
                    }
                });
            }
        },
        addMemberByName: function(MemberName, DayID) {
            var self = this;
            if (!self.isDisabled()) {
                self.setDisabled();
                $.ajax({
                    async: useAsync,
                    url: '/Itinerary/AddDestination',
                    data: 'MemberName=' + encodeURIComponent(MemberName) + '&DayID=' + DayID + '&rand=' + (new Date().getTime()),
                    type: 'GET',
                    dataType: 'json',
                    error: function(msg) {
                        alert("An error occurred while processing your request.");
                    },
                    success: function($response, $status) {
                        if ($response.StatusCode != 200) {
                            alert($response.StatusMessage);
                        } else {
                            self._renderDay(DayID, $response.HTML);
                        }
                    },
                    complete: function() {
                        self.setEnabled();
                    }
                });
            }
        },
        addMemberByID: function(MemberID) {
            var self = this;
            if (!self.isDisabled()) {
                self.setDisabled();
                $.ajax({
                    async: useAsync,
                    url: '/Itinerary/AddMember',
                    data: 'MemberID=' + MemberID + '&ItineraryID=' + self.options.itineraryID + '&rand=' + (new Date().getTime()),
                    type: 'GET',
                    dataType: 'json',
                    error: function() {
                        alert("An error occurred while processing your request.");
                    },
                    success: function($response, $status) {
                        if ($response.StatusCode != 200) {
                            alert($response.StatusMessage);
                        } else {
                            var dayid = self._getMaxDayID();
                            self._renderDay(dayid, $response.HTML);
                        }
                    },
                    complete: function() {
                        self.setEnabled();
                    }
                });
            }
        },
        addEventByID: function(EventID) {
            var self = this;
            if (!self.isDisabled()) {
                self.setDisabled();
                $.ajax({
                    async: useAsync,
                    url: '/Itinerary/AddEvent',
                    data: 'eoid=' + EventID + '&ItineraryID=' + self.options.itineraryID + '&rand=' + (new Date().getTime()),
                    type: 'GET',
                    dataType: 'json',
                    error: function() {
                        alert("An error occurred while processing your request.");
                    },
                    success: function($response, $status) {
                        if ($response.StatusCode != 200) {
                            alert($response.StatusMessage);
                        } else {
                            var dayid = self._getMaxDayID();
                            self._renderDay(dayid, $response.HTML);
                            self._trigger("eventAdded", 0, EventID);
                        }
                    },
                    complete: function() {
                        self.setEnabled();
                    }
                });
            }
        },
        copyItinerary: function(ItineraryID) {
            var self = this;
            if (!self.isDisabled()) {
                self.setDisabled();
                $.ajax({
                    async: useAsync,
                    url: '/Itinerary/CopyPlanner',
                    data: 'From=' + ItineraryID + '&To=' + self.options.itineraryID + '&rand=' + (new Date().getTime()),
                    type: 'GET',
                    dataType: 'json',
                    error: function() {
                        alert("An error occurred while processing your request.");
                    },
                    success: function($response, $status) {
                        if ($response.StatusCode != 200) {
                            alert($response.StatusMessage);
                        } else {
                            self._renderAll($response.HTML);
                        }
                    },
                    complete: function() {
                        self.setEnabled();
                    }
                });
            }
        },
        _renderDay: function(DayID, HTML) {
            var self = this;
            var day = $("ul.connectDays[dayid='" + DayID + "']");
            day.empty();
            day.html(HTML);
            day.sortable('refresh');
            self._checkDestinationCount(self);
        },
        _renderDays: function(HTML) {
            var self = this;
            var days = $("ul.trip-planner-day-list");
            $("ul.trip-planner-destination-list").sortable('destroy');
            days.empty();
            days.html(HTML);
            self._makeDaysSortable();
            self._checkDestinationCount(self);
        },
        _renderLodgings: function(HTML) {
            var self = this;
            var lodgings = $("ul.trip-planner-lodging-list");
            lodgings.empty();
            lodgings.html(HTML);
            lodgings.sortable("refresh");
            self._checkDestinationCount(self);
        },
        _makeLodgingsSortable: function() {
            var self = this;
            var lodgingList = $("ul.trip-planner-lodging-list");
            lodgingList.sortable({
                axis: 'y',
                cursor: 'move',
                items: 'li:not(.trip-planner-disabled)',
                start: function(event, ui) {
                    previousDisplayOrder = parseInt(ui.item.attr("displayorder"));
                },
                stop: function(event, ui) {
                    var lodgingID = ui.item.attr("itinerarylodgingid");
                    var displayOrder = 1;
                    var prevSibling = ui.item.prev();
                    if (prevSibling.length == 1) {
                        displayOrder = parseInt(prevSibling.attr("displayorder"));
                        if (previousDisplayOrder > displayOrder) {
                            displayOrder = displayOrder + 1;
                        }
                    }
                    var target = $(this);
                    $.ajax({
                        async: useAsync,
                        url: '/Itinerary/MoveLodging',
                        data: 'ItineraryLodgingID=' + lodgingID + '&DisplayOrder=' + displayOrder + '&rand=' + new Date().getTime(),
                        dataType: 'json',
                        type: 'GET',
                        error: function() {
                            target.sortable('cancel');
                            alert("An error occurred while processing your request.");
                        },
                        success: function($response, $status) {
                            if ($response.StatusCode != 200) {
                                target.sortable('cancel');
                                alert($response.StatusMessage);
                            } else {
                                self._renderLodgings($response.HTML);
                            }
                        }
                    });
                }
            }).disableSelection();
        },
        _makeDaysSortable: function() {
            var days = $("ul.trip-planner-destination-list");
            var self = this;
            days.sortable({
                axis: 'y',
                cursor: 'move',
                connectWith: '.connectDays',
                items: 'li:not(.trip-planner-disabled)',
                start: function(event, ui) {
                    previousDayID = ui.item.parent().attr("dayid");
                    previousDisplayOrder = parseInt(ui.item.attr("displayorder"));
                },
                stop: function(event, ui) {
                    var destinationID = ui.item.attr("destinationid");
                    var dayID = ui.item.parent().attr("dayid");
                    var displayOrder = 1;
                    var prevSibling = ui.item.prev();
                    if (prevSibling.length == 1) {
                        if (previousDayID == dayID) {
                            displayOrder = parseInt(prevSibling.attr("displayorder"));
                            if (previousDisplayOrder > displayOrder) {
                                displayOrder = displayOrder + 1;
                            }
                        } else {
                            displayOrder = (parseInt(prevSibling.attr("displayorder")) + 1);
                        }
                    }
                    var target = $(this);
                    $.ajax({
                        async: useAsync,
                        url: '/Itinerary/MoveDestination',
                        data: 'DestinationID=' + destinationID + '&DayID=' + dayID + '&DisplayOrder=' + displayOrder + '&rand=' + new Date().getTime(),
                        dataType: 'json',
                        type: 'GET',
                        error: function() {
                            target.sortable('cancel');
                            alert("An error occurred while processing your request.");
                        },
                        success: function($response, $status) {
                            if ($response.StatusCode != 200) {
                                target.sortable('cancel');
                                alert($response.StatusMessage);
                            } else {
                                self._renderDays($response.HTML);
                            }
                        }
                    });
                }
            }).disableSelection();
        },
        _deleteDay: function(DayID) {
            var self = this;
            if (!self.isDisabled()) {
                self.setDisabled();
                $.ajax({
                    async: useAsync,
                    url: '/Itinerary/DeleteDay',
                    data: 'ItineraryDayID=' + DayID + '&rand=' + (new Date().getTime()),
                    type: 'GET',
                    dataType: 'json',
                    error: function() {
                        alert("An error occurred while processing your request.");
                    },
                    success: function($response, $status) {
                        if ($response.StatusCode != 200) {
                            alert($response.StatusMessage);
                        } else {
                            self._renderDays($response.HTML);
                            self._trigger("deleteDay");
                        }
                    },
                    complete: function() {
                        self.setEnabled();
                    }
                });
            }
        },
        _deleteLodging: function(LodgingID) {
            var self = this;
            if (!self.isDisabled()) {
                self.setDisabled();
                $.ajax({
                    async: useAsync,
                    url: '/Itinerary/DeleteLodging',
                    data: 'ItineraryLodgingID=' + LodgingID + '&rand=' + (new Date().getTime()),
                    type: 'GET',
                    dataType: 'json',
                    error: function() {
                        alert("An error occurred while processing your request.");
                    },
                    success: function($response, $status) {
                        if ($response.StatusCode != 200) {
                            alert($response.StatusMessage);
                        } else {
                            self._renderLodgings($response.HTML);
                        }
                    },
                    complete: function() {
                        self.setEnabled();
                    }
                });
            }
        },
        _deleteDestination: function(DestinationID, DayID) {
            var self = this;
            if (!self.isDisabled()) {
                self.setDisabled();
                $.ajax({
                    async: useAsync,
                    url: '/Itinerary/DeleteDestination',
                    data: 'ItineraryDestinationID=' + DestinationID + '&rand=' + (new Date().getTime()),
                    type: 'GET',
                    dataType: 'json',
                    error: function() {
                        alert("An error occurred while processing your request.");
                    },
                    success: function($response, $status) {
                        if ($response.StatusCode != 200) {
                            alert($response.StatusMessage);
                        } else {
                            self._renderDay(DayID, $response.HTML);
                        }
                    },
                    complete: function() {
                        self.setEnabled();
                    }
                });
            }
        },
        _checkDestinationCount: function(self) {
            //only do this check if we're supposed to show the driving directions link on this page
            if (self.options.showOtherLinks) {
                var total = 0;
                var lodgings = $("ul.trip-planner-lodging-list > li:not(.trip-planner-disabled)");
                if (lodgings.length > 0) {
                    total++;
                }
                var days = $(".connectDays")
                    .each(function(i) {
                        var destinations = $(this).find("li:not(.trip-planner-disabled)");
                        total += destinations.length;
                        if (destinations.length > 0 && lodgings.length > 0) {
                            total++;
                        }
                    });
                //google can't handle more than 25 waypoints, hide the link if the user has more than 25
                var directionsLink = $(".trip-planner-drivingDirections");
                if (total > 25 || total < 2) {
                    directionsLink
                        .css("display", "none");
                } else if (directionsLink.css("display") == "none") {
                    directionsLink
                        .css("display", "inline-block");
                }
            }
        }
    });

    $.extend($.cimbrian.triporganizer, {
        version: "1.7.2",
        defaults: {
            url: '/Itinerary/LoadItinerary',
            itineraryID: 0,
            title: '',
            allowManualEntries: false,
            showOtherLinks: false,
            disabled: false,
            async: true
        }
    });
})(jQuery);
