/* Minification failed. Returning unminified contents.
(1255,86-87): run-time error JS1195: Expected expression: >
(1270,18-19): run-time error JS1195: Expected expression: ,
(1278,14-15): run-time error JS1004: Expected ';': )
(1279,9-10): run-time error JS1002: Syntax error: }
(1281,54-55): run-time error JS1004: Expected ';': {
(1368,5-6): run-time error JS1002: Syntax error: }
 */
/* <reference path="AsiaPay/Expresscheckoutpost.html" />*/
var app = angular.module('app');

app.controller('DonationDetailCtrl', ['$scope', 'common', 'FundraisingSvc', 'PagesLookupSvc', '$timeout', '$filter', 'ContactProfileSvc', 'authService', 'ngAuthSettings', '$cookieStore', '$modal', 'CheckoutSvc', 'GuestCartSvc', 'PageCartSvc', '$sce',
    function ($scope, common, FundraisingSvc, PagesLookupSvc, $timeout, $filter, ContactProfileSvc, authService, ngAuthSettings, $cookieStore, $modal, CheckoutSvc, GuestCartSvc, PageCartSvc, $sce) {

        $scope.CCProcessingPercentage = Number(window.crm.constants.CCProcessingPercentage);
        $scope.TemplateName = getResolveValue(common, 'TemplateName');
        $scope.client = window.crm.constants.client;
        $scope.AllDonation = [];
        $scope.DonationPage = { Formulas: [] };
        //$scope.ParentProgramList = [];
        $scope.PageNumber = 1;
        $scope.PageSize = 100;
        $scope.CheckoutDonation = {};
        $scope.currentdoantionformula = {};
        $scope.CheckoutDonation.gift =
            {
                RecurringProfile: {
                    RemainingInstallments: {}
                },
                Type: 'Once',
                IncludeCharges: false
            };
        $scope.CheckoutDonation.contact = { BillingAddress: {} };
        $scope.CheckoutDonation.iPay = {};
        $scope.DonationPageId = 0;
        $scope.CartId = '';
        $scope.showdonatepage = false;
        $scope.CurrentDate = new Date().getDate();
        $scope.showloginpanel = authService.authentication.isAuth;
        $scope.ExpresscheckoutPayment = (window.crm.list.gatewayType == 'AsiaPay' ? true : false);
        $scope.loginData = {
            userName: "",
            password: "",
            useRefreshTokens: false
        };

        $scope.message = '';
        $scope.currenturl = '';
        $scope.CheckoutDonation.contact.Emails = [{ Name: '' }];
        $scope.CheckoutDonation.payment = { PaymentId: 0 };
        $scope.CheckoutDonation.payment.PaymentDate = $scope.CheckoutDonation.gift.DonationDate = $scope.CheckoutDonation.gift.TransactionDate = new Date();
        $scope.RecurringOption = [{ name: 'One Time', value: 'OneTime' }, { name: 'Monthly', value: 'Monthly' }, { name: 'Quarterly', value: 'Quarterly' }, { name: 'Yearly', value: 'Yearly' }];
        $scope.CurrentMonth = $filter('date')(tomorrowdDate(), 'MMMM');//December-November like;

        $scope.currentdoantionformula = { Amount: 0 };

        $scope.InitFundraisingPage = function () {
            $scope.TemplateName = getResolveValue(common, 'TemplateName');
            $scope.CurrentMonth = $filter('date')(tomorrowdDate(), 'MMMM');//December-November like;
            $scope.CurrencyCodeList = window.crm.list.currencyCode;
            if (common.$routeParams.DonationPageId !== undefined && common.$routeParams.DonationPageId > 0) {
                $scope.DonationPageId = common.$routeParams.DonationPageId;
                $scope.setDonationPage();
                $scope.CreateDoubleTheDonationElement(true);
            }
            else {
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
                //RedirectToHome();
            }
        }

        $scope.SetFrequncy = function (formula) {
            if (formula.Recurringfrequency == undefined || formula.Recurringfrequency == null || formula.Recurringfrequency == "") {
                return "OneTime";
            }
            else
                return formula.Recurringfrequency;
        }

        $scope.GetAllDonation = function () {
            common.usSpinnerService.spin('spnPublicPagesDonationpage');
            FundraisingSvc.getAllDonationPage().then(function (data) {
                angular.forEach(data.data, function (obj) {
                    if (obj.DonationPageId !== $scope.DonationPage.DonationPageId)
                        $scope.AllDonation.push(obj);
                })
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
            },
                function (err) {
                    //common.aaNotify.error(err.data.Message);
                    common.usSpinnerService.stop('spnPublicPagesDonationpage');
                })
        };

        $scope.setDonationPage = function () {
            common.usSpinnerService.spin('spnPublicPagesDonationpage');
            $scope.DonationPage = {};
            var AdminAuthorise = window.crm.constants.isAdminAuthorise == 'True' ? true : false;
            FundraisingSvc.getDonationPage($scope.DonationPageId, AdminAuthorise).then(function (res) {
                $scope.DonationPage = res.data;
                $scope.DonationPage.HomeCurrency = window.crm.list.clientFinancialSettings.Currency;
                $scope.DonationPage.ForeignCurrency = window.crm.list.clientFinancialSettings.Currency;
                $scope.DonationPage.EnableMultiCurrencyProcessing = window.crm.list.clientFinancialSettings.EnableMultiCurrencyProcessing;

                _.each($scope.DonationPage.Formulas, function (o) { o.OriginalAmount = o.Amount, o.HomeCurrency = window.crm.list.clientFinancialSettings.Currency, o.ForeignCurrency = window.crm.list.clientFinancialSettings.Currency, o.EnableMultiCurrencyProcessing = window.crm.list.clientFinancialSettings.EnableMultiCurrencyProcessing });

                if (common.$routeParams.Amount != undefined && common.$routeParams.Amount > 0) {
                    var found_formula = _.find($scope.DonationPage.Formulas, function (obj) { return parseFloat(obj.Amount) == parseFloat(common.$routeParams.Amount); });

                    if (found_formula == null) {
                        found_formula = _.find($scope.DonationPage.Formulas, function (obj) { return parseFloat(obj.Amount) == 0; });
                    }
                    if (common.$routeParams.Currency != undefined && IsNotNullorEmpty(common.$routeParams.Currency)) {
                        found_formula.HomeCurrency = window.crm.list.clientFinancialSettings.Currency;
                        found_formula.ForeignCurrency = common.$routeParams.Currency;
                        found_formula.EnableMultiCurrencyProcessing = window.crm.list.clientFinancialSettings.EnableMultiCurrencyProcessing;
                    }

                    if ($scope.CheckoutDonation.gift.Recurring == 'true') {
                        _.forEach($scope.DonationPage.Formulas, function (obj) {
                            if (parseFloat(obj.Amount) == parseFloat(common.$routeParams.Amount)
                                && (common.$routeParams.Monthly != undefined
                                    && ((common.$routeParams.Monthly == "m" || common.$routeParams.Monthly == "M")
                                        || common.$routeParams.Monthly == "q" || common.$routeParams.Monthly == "Q"
                                        || common.$routeParams.Monthly == "y" || common.$routeParams.Monthly == "Y"))) {

                                switch (common.$routeParams.Monthly) {
                                    case "m":
                                    case "M":
                                        obj.Recurringfrequency = "Monthly";
                                        break;
                                    case "q":
                                    case "Q":
                                        obj.Recurringfrequency = "Quarterly";
                                        break;
                                    case "y":
                                    case "Y":
                                        obj.Recurringfrequency = "Yearly";
                                        break;
                                    default:
                                        obj.Recurringfrequency = "OneTime";
                                        break;
                                }
                            }
                            else {
                                obj.Recurringfrequency = "OneTime";
                            }

                        });
                    }
                    if (found_formula != null) {
                        $scope.MakeAskFormula(found_formula, common.$routeParams.Amount);
                    }

                }

                $scope.DonationPage.progress = $filter('number')(((($scope.DonationPage.DonationRaised / $scope.DonationPage.DonationGoal) * 100) > 100) ? 100 : (($scope.DonationPage.DonationRaised / $scope.DonationPage.DonationGoal) * 100), 0);
                $scope.currenturl = encodeURIComponent(common.$location.$$absUrl);
                $scope.currentpagetitle = encodeURIComponent($scope.DonationPage.Title);
                $scope.GetAllDonation();
                $scope.GetContactInfo();

                /*----- Start - Fundraising Page Get Lookup - Added By VP -----*/
                if ($scope.DonationPage.DisplayProgram == true && $scope.DonationPage.DisplaySubProgram == true) {
                    PagesLookupSvc.getLookupParentChild('ProgramDonor', 'true', 'true', 'true').then(function (res) {
                        $scope.ParentProgramList = [];
                        angular.forEach(res.data, function (di) {
                            $scope.ParentProgramList.push({ Key: di.Id, Value: di.Name, ParentId: di.ParentId });
                        });
                    });
                }
                else if ($scope.DonationPage.DisplayProgram == true && $scope.DonationPage.DisplaySubProgram == false) {
                    PagesLookupSvc.getLookupParentChild('ProgramDonor', 'true', 'false', 'true').then(function (res) {
                        $scope.ParentProgramList = [];
                        angular.forEach(res.data, function (di) {
                            $scope.ParentProgramList.push({ Key: di.Id, Value: di.Name, ParentId: di.ParentId });
                        });
                    });
                }
                else if ($scope.DonationPage.DisplayProgram == false && $scope.DonationPage.DisplaySubProgram == true) {
                    PagesLookupSvc.getLookupParentChild('ProgramDonor', 'false', 'true', 'true').then(function (res) {
                        $scope.ParentProgramList = [];
                        angular.forEach(res.data, function (di) {
                            if (IsNotNullorEmpty($scope.DonationPage.ProgramId)) {
                                if (di.ParentId == $scope.DonationPage.ProgramId || di.Id == $scope.DonationPage.ProgramId) {
                                    $scope.ParentProgramList.push({ Key: di.Id, Value: di.Name, ParentId: di.ParentId });
                                }
                            }
                            else
                                $scope.ParentProgramList.push({ Key: di.Id, Value: di.Name, ParentId: di.ParentId });
                        });
                    });
                }
                /*----- End - Fundraising Page Get Lookup - Added By VP -----*/

                common.usSpinnerService.stop('spnPublicPagesDonationpage');
            },
                function (err) {
                    //common.aaNotify.error(err);
                    common.usSpinnerService.stop('spnPublicPagesDonationpage');
                });
        };

        $scope.OpenMediaVideo = function (media) {
            var modalplayvideoInstance = $modal.open({
                templateUrl: 'playvideopopup.html',
                controller: playvideopopupctrl,
                scope: $scope,
                keyboard: true,
                backdrop: 'static',
                resolve: {
                    media: function () {
                        return media;
                    }
                }
            });
            modalplayvideoInstance.result.then(function () {
            }, function () {
            });
        }

        $scope.ShowMessage = function (Message) {
            if (Message !== null) {
                if (Message.Type == 'Error' || Message.Type == '1') {
                    common.aaNotify.error(Message.Description);
                    return false;
                }
                else {
                    common.aaNotify.success(Message.Description);
                    return true;
                }
            }
            else {
                return true;
            }
        };

        $scope.redirectspecificdonationpage = function (donationPageId) {
            common.$location.path('/' + donationPageId);
        }

        $scope.redirecttosignin = function () {
            RedirectToLoginSignup();
        }

        function tomorrowdDate() {
            var myDate = new Date();
            myDate.setDate(myDate.getDate() + 1);
            var dt = myDate;
            return dt;
        }

        $scope.MakeAskFormula = function (formula, amount) {
            $scope.showdonatepage = true;
            $scope.OtherAmount = 0;
            $scope.currentdoantionformula = formula;

            switch (formula.Recurringfrequency) {
                case "Monthly":
                    $scope.currentdoantionformula.Frequency = "Month";
                    break;
                case "Quarterly":
                    $scope.currentdoantionformula.Frequency = "Quarter";
                    break;
                case "Yearly":
                    $scope.currentdoantionformula.Frequency = "Year";
                    break;
                default:
                    $scope.currentdoantionformula.Frequency = "";
                    break;
            }

            if ($scope.currentdoantionformula.ForeignCurrency == undefined || $scope.currentdoantionformula.ForeignCurrency == 'undefined' || IsNullorEmpty($scope.currentdoantionformula.ForeignCurrency)) {
                $scope.currentdoantionformula.HomeCurrency = window.crm.list.clientFinancialSettings.Currency;
                $scope.currentdoantionformula.ForeignCurrency = window.crm.list.clientFinancialSettings.Currency;
            }

            if (formula.Amount == 0) {
                formula.Amount = amount;
            }
        }

        $scope.Cancel = function () {
            $scope.showdonatepage = false;
            $scope.currentdoantionformula = {};
            $scope.OtherAmount = 0;
        }

        $scope.$on('failureMsg', function (event, args) {
            common.aaNotify.danger(args.message);
        });

        $scope.$on('SuccessMsg', function (event, args) {
            common.$location.path('/Thankyou');
        });

        $scope.Expresscheckoutpost = function (posturl) {
            $scope.Asiapayposturl = posturl;
            //console.log($scope.Asiapayposturl);
            var modalInstanceAsiapayPost = $modal.open({
                templateUrl: '/App_Client/views/Pages/PublicPages/AsiaPay/Expresscheckoutpost.html',
                controller: modalInstanceExpresscheckoutCtrl,
                sizeclass: 'modal-full only-content',
                scope: $scope,
                keyboard: false,
                backdrop: false
            });

        }

        $scope.MakePaymentObject = function () {
            $scope.CheckoutDonation.iPay.ContactId = 0;
            $scope.CheckoutDonation.iPay.UseCreditIfAvailable = false;
            $scope.CheckoutDonation.iPay.Payment = $scope.CheckoutDonation.payment;
            $scope.CheckoutDonation.iPay.Payment.UnAllocatedAmount = $scope.CheckoutDonation.iPay.Payment.Amount = $scope.CheckoutDonation.gift.Amount;
            $scope.CheckoutDonation.iPay.Payment.AllocatedAmount = 0;
            $scope.CheckoutDonation.iPay.Payment.PaymentModeId = 3; //For Credit Card
            $scope.CheckoutDonation.iPay.SendReceipt = true;

            $scope.CheckoutDonation.iPay.Payment.HomeCurrency = $scope.CheckoutDonation.gift.HomeCurrency;
            $scope.CheckoutDonation.iPay.Payment.ForeignCurrency = $scope.CheckoutDonation.gift.ForeignCurrency;

        }

        $scope.AddToCartOrCheckout = function (IsCheckout) {

            if (window.crm.constants.isAdmin == true) {
                alert($filter('translate')('_AdminAlert_'));
                return false;
            }
            if ($scope.currentdoantionformula.Amount <= 0) {
                common.aaNotify.danger("Please select gift amount.");
                return false;
            }

            $scope.CheckoutDonation.gift.Amount = $scope.currentdoantionformula.Amount;
            $scope.CheckoutDonation.gift.TaxDeductibleAmount = $scope.currentdoantionformula.TaxDeductibleAmount;
            $scope.CheckoutDonation.gift.AskArrayFormulaId = $scope.currentdoantionformula.FormulaId > 0 ? $scope.currentdoantionformula.FormulaId : null;
            $scope.CheckoutDonation.gift.ClientId = $scope.client;
            $scope.CheckoutDonation.gift.SourceOfFundId = -1;

            $scope.CheckoutDonation.gift.HomeCurrency = $scope.currentdoantionformula.HomeCurrency;
            $scope.CheckoutDonation.gift.ForeignCurrency = $scope.currentdoantionformula.ForeignCurrency;

            $scope.CheckoutDonation.gift.Recurring = $scope.currentdoantionformula.Frequency !== "OneTime" ? true : false;

            if ($scope.CheckoutDonation.gift.Recurring == undefined || $scope.CheckoutDonation.gift.Recurring == false) {
                $scope.CheckoutDonation.gift.RecurringProfile = {};
            }
            else {
                $scope.CheckoutDonation.gift.RecurringProfile.RemainingInstallments = null;
                $scope.CheckoutDonation.gift.RecurringProfile.Amount = $scope.CheckoutDonation.gift.Amount;
                $scope.CheckoutDonation.gift.RecurringProfile.ContactId = $scope.CheckoutDonation.contact.ContactId;
                $scope.CheckoutDonation.gift.RecurringProfile.StartDate = tomorrowdDate();
                $scope.CheckoutDonation.gift.RecurringProfile.Frequency = $scope.currentdoantionformula.Frequency;
            }

            $scope.CheckoutDonation.gift.ContactId = $scope.CheckoutDonation.contact.ContactId;
            $scope.CheckoutDonation.contact.ClientId = $scope.client;

            if (IsNotNullorEmpty($scope.CheckoutDonation.contact.Emails[0])) {
                $scope.CheckoutDonation.contact.Emails[0].UserForCommunication = true;
            }
            $scope.CheckoutDonation.contact.BillingAddress.AddressType = 'Billing';

            if ($scope.CheckoutDonation.gift.Amount == undefined || $scope.CheckoutDonation.gift.Amount <= 0) {
                common.aaNotify.danger("Invalid amount.");
                return false;
            }
            common.usSpinnerService.spin('spnPublicPagesDonationpage');
            $scope.CheckoutDonation.gift.CartItemId = 0;


            var Dataobject = {};
            Dataobject.ContactId = $scope.CheckoutDonation.contact.ContactId;
            Dataobject.DonationTypeId = 1;
            Dataobject.InvoiceSource = 2;//InvoiceSource 1-Offline,2-Pages,3-API
            Dataobject.FundId = $scope.DonationPage.DonationConfigurationId;
            Dataobject.SourceId = $scope.DonationPage.SourceId;
            Dataobject.AskArrayFormulaId = $scope.CheckoutDonation.gift.AskArrayFormulaId;
            Dataobject.ItemName = $scope.DonationPage.DonationConfigurationName;
            Dataobject.TotalAmount = Dataobject.NetAmount = parseFloat($scope.CheckoutDonation.gift.Amount).toFixed(2);
            Dataobject.TaxDeductibleAmount = $scope.CheckoutDonation.gift.TaxDeductibleAmount;
            Dataobject.CampaignId = $scope.DonationPage.CampaignId;
            Dataobject.ProgramId = $scope.DonationPage.ProgramId || null;
            Dataobject.IsAnonymousDonation = $scope.CheckoutDonation.gift.IsAnonymousDonation;
            Dataobject.RecurringProfile = $scope.CheckoutDonation.gift.RecurringProfile;
            Dataobject.Tribute = $scope.CheckoutDonation.gift.Tribute;
            Dataobject.SourceOfFundId = $scope.CheckoutDonation.gift.SourceOfFundId;
            Dataobject.SendAcknowledgement = $scope.CheckoutDonation.SendAcknowledgement;
            Dataobject.HomeCurrency = $scope.CheckoutDonation.gift.HomeCurrency;
            Dataobject.ForeignCurrency = $scope.CheckoutDonation.gift.ForeignCurrency;
            Dataobject.CartId = CartId;
            Dataobject.IncludeCharges = $scope.CheckoutDonation.gift.IncludeCharges;
            Dataobject.GiftMemo = $scope.CheckoutDonation.gift.GiftMemo;

            $scope.CheckoutDonation.gift.DataObject = angular.toJson(Dataobject);

            if (IsCheckout === true) {
                //open login signup popup.
                $scope.CheckoutNow(Dataobject);
            }
            else {
                //add item to cart with blank contact details and redirect to checkout page.
                $scope.AddDonationObjectToCart(Dataobject);
            }
        };

        $scope.CheckoutNow = function (Dataobject) {
            common.usSpinnerService.stop('spnPublicPagesDonationpage');
            $scope.modalloginsignupInstance = $modal.open({
                controller: "LoginSignupOrGuestCheckoutPopup",
                templateUrl: '/App_Client/views/Pages/PublicPages/Account/' + $scope.TemplateName + '/LoginSignupOrGuestCheckoutPopup.html?v=' + window.crm.constants.version,
                keyboard: true,
                backdrop: 'static',
                sizeclass: $scope.TemplateName === "Template3" ? 'modal-md' : 'modal-lg',
                resolve: {
                    FunctionType: function () {
                        return "DonationCheckout";
                    },
                    DataObject: function () {
                        $scope.DoubleTheDonationDetails = { CompanyId: 0, CompanyName: "" };
                        if (window.crm.constants.DDApiKey !== undefined && window.crm.constants.DDApiKey !== null && window.crm.constants.DDApiKey !== "") {
                            var companyNameelement = document.getElementsByName("doublethedonation_company_name");
                            var companyIDelement = document.getElementsByName("doublethedonation_company_id");

                            if (companyIDelement !== undefined && companyIDelement !== null && companyIDelement.length > 0 && companyIDelement[0] !== undefined && companyIDelement[0] !== null) {
                                $scope.DoubleTheDonationDetails.CompanyId = companyIDelement[0].value;
                            }

                            if (companyNameelement !== undefined && companyNameelement !== null && companyNameelement.length > 0 && companyNameelement[0] !== undefined && companyNameelement[0] !== null) {
                                $scope.DoubleTheDonationDetails.CompanyName = companyNameelement[0].value;
                            }
                        }
                        $scope.ObjectToBeProcessed = { ItemObject: Dataobject, OriginalObject: $scope.DoubleTheDonationDetails };
                        return $scope.ObjectToBeProcessed;
                    }
                }
            });
            $scope.modalloginsignupInstance.result.then(function (value) {
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
            }, function () {
            });
        };

        //this function will be called once popup task completes
        $scope.AddDonationObjectToCart = function (Dataobject) {
            GuestCartSvc.addDonationToCart(Dataobject).then(function (res) {
                $scope.ShowMessage(res.data.Message);
                $scope.CheckoutDonation.gift = res.data;
                $scope.CartId = res.data.CartId;
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
                common.$rootScope.$broadcast('RefreshCartCount');
                PageCartSvc.SetCartId(res.data.CartId);
                window.location.reload();
                //window.location.href = window.crm.constants.baseurl + '/Checkout';
            }, function (err) {
                //common.aaNotify.error(err);
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
            });
        }

        $scope.GetContactInfo = function () {

            if (authService.authentication.isAuth) {
                common.usSpinnerService.spin('spnPublicPagesDonationpage');
                ContactProfileSvc.getContactDetail().then(function (res) {
                    $scope.CheckoutDonation.contact = res.data;
                    $scope.GetformulasByLoginUser();
                    //FundraisingSvc.getCartItemsByContactId($scope.CheckoutDonation.contact.ContactId).then(function (res) {
                    //   console.log(res.data);
                    //});
                    common.usSpinnerService.stop('spnPublicPagesDonationpage');
                },
                    function (err) {
                        //common.aaNotify.error(err.data);
                        common.usSpinnerService.stop('spnPublicPagesDonationpage');
                    });
            }
        }

        $scope.GetformulasByLoginUser = function () {
            //if (IsNotNullorEmpty($scope.CheckoutDonation.contact.ContactId && IsNotNullorEmpty($scope.DonationPage.AskArrayId && IsNotNullorEmpty($scope.DonationPage.Culture)))) {
            //    common.usSpinnerService.spin('spnPublicPagesDonationpage');
            //    FundraisingSvc.getFormulaByContact($scope.CheckoutDonation.contact.ContactId, $scope.DonationPage.AskArrayId, $scope.DonationPage.Culture).then(function (res) {
            //        $scope.DonationPage.Formulas = res.data;
            //        common.usSpinnerService.stop('spnPublicPagesDonationpage');
            //    },
            //    function (err) {
            //        common.aaNotify.error(err.data.Message);
            //        common.usSpinnerService.stop('spnPublicPagesDonationpage');
            //    })
            //}
        }

        $scope.trustSrc = function (url) {
            return $sce.trustAsResourceUrl(url);
        }

        /**********************For Template2**********************************/
        /**********************Start***************************/

        $scope.TempFormula = { Amount: 0, Recurringfrequency: "OneTime" };
        $scope.TempAmount = 0;

        $scope.SetTempFormula = function (formula, amount, arrIndex) {
            $scope.CheckoutDonation.gift.IncludeCharges = false;
            angular.forEach($scope.DonationPage.Formulas, function (formula, index) {
                formula.IsSelected = arrIndex == index ? true : false;
                if (arrIndex !== index && formula.OriginalAmount == 0) {
                    formula.Amount = 0;
                }
            });

            var tempFormula = ($filter('filter')($scope.DonationPage.Formulas, { IsSelected: true }, true));
            if (tempFormula !== undefined && tempFormula !== null
                && tempFormula[0] !== undefined && tempFormula[0] !== null
                && tempFormula[0].Amount !== undefined
                && tempFormula[0].Amount !== null
                && tempFormula[0].Amount !== ""
                && Number(tempFormula[0].Amount) > 0) {

                angular.copy(tempFormula[0], $scope.currentdoantionformula);

                if ($scope.TempFormula.Recurringfrequency !== undefined && $scope.TempFormula.Recurringfrequency !== null && $scope.TempFormula.Recurringfrequency !== "") {
                    $scope.currentdoantionformula.Frequency = $scope.TempFormula.Recurringfrequency;
                }
            }
        }

        $scope.SetRecurring = function (frequency) {

            $scope.TempFormula.Recurringfrequency = frequency;

            switch ($scope.TempFormula.Recurringfrequency) {
                case "Monthly":
                    $scope.currentdoantionformula.Frequency = "Month";
                    break;
                case "Quarterly":
                    $scope.currentdoantionformula.Frequency = "Quarter";
                    break;
                case "Yearly":
                    $scope.currentdoantionformula.Frequency = "Year";
                    break;
                default:
                    $scope.currentdoantionformula.Frequency = "";
                    break;
            }
        }

        $scope.GetActiveclass = function (frequency) {
            return $scope.TempFormula.Recurringfrequency === frequency ? "active" : "";
        }

        /**********************End****************************/

        $scope.CalculateDonationCharges = function () {
            if ($scope.currentdoantionformula.Amount > 0) {
                if ($scope.CheckoutDonation.gift.IncludeCharges === true) {
                    var modalInstance = $modal.open({
                        templateUrl: '/App_Client/views/Pages/PublicPages/Fundraising/' + $scope.TemplateName + '/DonationExtraFeePopup.html?v=' + window.crm.constants.version,
                        controller: "DonationFeePopupCtrl",
                        keyboard: false,
                        backdrop: 'static',
                        sizeclass: 'modal-md',
                        scope: $scope,
                        resolve: {
                            ExtraFee: function () {
                                return $scope.CCProcessingPercentage;
                            },
                            AskArrayDonation: function () {
                                $scope.currentdoantionformula.ForeignCurrency = window.crm.list.clientFinancialSettings.Currency;
                                return $scope.currentdoantionformula;
                            }
                        }
                    });
                    modalInstance.result.then(function (result) {
                        if (result.Operation === "Proceed") {
                            $scope.currentdoantionformula.Amount = parseFloat($scope.currentdoantionformula.Amount) * 100 / (100 - parseFloat($scope.CCProcessingPercentage));
                            $scope.currentdoantionformula.NetAmount = parseFloat($scope.currentdoantionformula.Amount);
                        }
                        else if (result.Operation === "Revert") {
                            $scope.CheckoutDonation.gift.IncludeCharges = false;
                        }
                    }, function () {
                    });
                }
                else {
                    $scope.currentdoantionformula.Amount = parseFloat($scope.currentdoantionformula.OriginalAmount);
                    $scope.currentdoantionformula.NetAmount = parseFloat($scope.currentdoantionformula.Amount);
                }
            }
            else {
                common.aaNotify.danger("Please select gift amount.");
                $scope.CheckoutDonation.gift.IncludeCharges = false;
            }
        };

        $scope.CreateDoubleTheDonationElement = function (isDonationPresent) {
            if (isDonationPresent === true && window.crm.constants.DDApiKey !== "") {
                if (authService.authentication.isAuth) {
                    //Get Contact's Matching Organization Details
                    ContactProfileSvc.getMatchingOrganizations().then(function (res) {
                        //If metching organization exists then no need to show matching organization selection.
                        if (!(res.data.length > 0)) {
                            $scope.CreateElement();
                        }
                    }, function (err) {
                    });
                }
                else {
                    $scope.CreateElement();
                }
            }
            else {
                $scope.ShowDDMessage = false;
                var doubleTheDonationDiv = angular.element(document.querySelector('#DoubleTheDonationDiv'));
                doubleTheDonationDiv.empty();
            }

            $scope.IsDonationExists = isDonationPresent;
        };

        $scope.CreateElement = function () {
            $scope.ShowDDMessage = true;
            var doubleTheDonationDiv = angular.element(document.querySelector('#DoubleTheDonationDiv'));
            doubleTheDonationDiv.empty();
            var searchInput = angular.element('<div id="dd-company-name-input"></div>');
            doubleTheDonationDiv.append(searchInput);
            doublethedonation.plugin.load_streamlined_input(searchInput[0]);
        }

        $scope.InitFundraisingPage();

    }]);

app.controller('DonationThankyouCtrl', ['$scope', 'common',
    function ($scope, common) {

    }]);

var playvideopopupctrl = function ($scope, common, $modalInstance, $sce, media) {
    $scope.init = function () {
        $scope.media = {};
        $scope.media.Videourl = $sce.trustAsResourceUrl(media.Videourl);
    }
    $scope.trustSrc = function () {
        return $sce.trustAsResourceUrl($scope.media.Videourl);
    }
    $scope.cancelvideo = function () {
        $modalInstance.close();
    };
    $scope.init();
}
playvideopopupctrl.$inject = ['$scope', 'common', '$modalInstance', '$sce', 'media'];

var DonationFeePopup = function ($scope, common, $location, $modalInstance, ExtraFee, AskArrayDonation) {
    $scope.InitActionCtrl = function () {
        $scope.ExtraFee = ExtraFee;
        $scope.AskArrayDonation = AskArrayDonation;

        $scope.FeeAmount = (parseFloat($scope.AskArrayDonation.Amount) * 100 / (100 - parseFloat($scope.ExtraFee))) - parseFloat($scope.AskArrayDonation.Amount);
        $scope.FeeAmount = parseFloat($scope.FeeAmount);
    };
    $scope.Revert = function () {
        $modalInstance.close({ Operation: "Revert" });
    };
    $scope.Proceed = function () {
        $modalInstance.close({ Operation: "Proceed" });
    };
    $scope.InitActionCtrl();
};
DonationFeePopup.$inject = ["$scope", "common", "$location", "$modalInstance", "ExtraFee", "AskArrayDonation"];;
var app = angular.module('app');

app.controller('FundRaisingDetailCtrl', ['$scope', 'common', 'FundraisingSvc', 'PagesLookupSvc', '$timeout', '$filter', 'ContactProfileSvc', 'authService', 'ngAuthSettings', '$cookieStore', '$modal', '$sce', 'publiccardService', 'GuestCartSvc', 'PageCartSvc',
    function ($scope, common, FundraisingSvc, PagesLookupSvc, $timeout, $filter, ContactProfileSvc, authService, ngAuthSettings, $cookieStore, $modal, $sce, publiccardService, GuestCartSvc, PageCartSvc) {

        $scope.TemplateName = getResolveValue(common, 'TemplateName');

        $scope.CCProcessingPercentage = Number(window.crm.constants.CCProcessingPercentage);
        $scope.client = window.crm.constants.client;
        $scope.PayLaterOn = window.crm.list.clientPageModuleSetting.PayLaterOn;
        $scope.PayLaterLabel = window.crm.list.clientPageModuleSetting.PayLaterLabel;
        $scope.DisableCart = window.crm.constants.DisableCart === "True" ? true : false;
        $scope.DisableProfile = window.crm.constants.DisableProfile === "True" ? true : false;

        $scope.AllDonation = [];
        $scope.DonationPage = { Formulas: [] };
        //$scope.ParentProgramList = [];
        $scope.PageNumber = 1;
        $scope.PageSize = 100;
        $scope.UseCardsOnFiles = [];

        $scope.CheckoutDonation = {
            gift: {
                Type: 'Once',
                DonationDate: new Date(),
                TransactionDate: new Date(),
                RecurringProfile: {
                    RemainingInstallments: {}
                },
                IncludeCharges: false
            }
        };

        $scope.Checkout = {
            CheckoutDetails:
            {
                SameAsMailing: 'true',
                Mailing: { SetAsMailing: true },
                Billing: {},
                CardInformation: { CardOnFileId: 0, Tokenize: false },
                PayLater: false,
                Organization: {}
            },
            ContactDetails: {
                MailingAddress: { SetAsMailing: true },
                ContactId: 0
            },
            UserDetails: {},
            CartId: "",
            IsOrganizationCheckout: false,
            CheckoutAs: "",
            IncludeCharges: false,
            DisablePaylater: false
        };

        $scope.currentdoantionformula = { Amount: 0 };

        $scope.DonationPageId = 0;
        $scope.CartId = '';
        $scope.showdonatepage = false;
        $scope.CurrentDate = new Date().getDate();
        $scope.showloginpanel = authService.authentication.isAuth;
        $scope.ExpresscheckoutPayment = (window.crm.list.gatewayType == 'AsiaPay' ? true : false);
        $scope.loginData = {
            userName: "",
            password: "",
            useRefreshTokens: false
        };

        $scope.message = '';
        $scope.currenturl = '';

        $scope.RecurringOption = [{ name: 'One Time', value: 'OneTime' }, { name: 'Monthly', value: 'Monthly' }, { name: 'Quarterly', value: 'Quarterly' }, { name: 'Yearly', value: 'Yearly' }];
        $scope.CurrentMonth = $filter('date')(tomorrowdDate(), 'MMMM');//December-November like;

        $scope.ContactMergeSetting = {};
        $scope.TempFormula = { Amount: 0, Recurringfrequency: "OneTime" };
        $scope.TempAmount = 0;

        //Page Init
        $scope.InitSinglePageDonation = function () {
            $scope.TemplateName = getResolveValue(common, 'TemplateName');
            $scope.CurrentMonth = $filter('date')(tomorrowdDate(), 'MMMM');//December-November like;
            $scope.CurrencyCodeList = window.crm.list.currencyCode;
            if (common.$routeParams.DonationPageId !== undefined && common.$routeParams.DonationPageId > 0) {
                $scope.DonationPageId = common.$routeParams.DonationPageId;
                $scope.setDonationPage();
                $scope.CreateDoubleTheDonationElement(true);
            }
            else {
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
                //RedirectToHome();
            }

            if ($scope.DisableCart === true && $scope.DisableProfile === false) {
                if (authService.authentication.isAuth) {
                    $scope.GetContactInfo();
                }
            }
        };

        $scope.setDonationPage = function () {
            common.usSpinnerService.spin('spnPublicPagesDonationpage');
            $scope.DonationPage = {};
            var AdminAuthorise = window.crm.constants.isAdminAuthorise == 'True' ? true : false;
            FundraisingSvc.getDonationPage($scope.DonationPageId, AdminAuthorise).then(function (res) {
                $scope.DonationPage = res.data;
                $scope.DonationPage.HomeCurrency = window.crm.list.clientFinancialSettings.Currency;
                $scope.DonationPage.ForeignCurrency = window.crm.list.clientFinancialSettings.Currency;
                $scope.DonationPage.EnableMultiCurrencyProcessing = window.crm.list.clientFinancialSettings.EnableMultiCurrencyProcessing;

                _.each($scope.DonationPage.Formulas, function (o) { o.OriginalAmount = o.Amount, o.HomeCurrency = window.crm.list.clientFinancialSettings.Currency, o.ForeignCurrency = window.crm.list.clientFinancialSettings.Currency, o.EnableMultiCurrencyProcessing = window.crm.list.clientFinancialSettings.EnableMultiCurrencyProcessing });

                if (common.$routeParams.Amount !== undefined && common.$routeParams.Amount > 0) {
                    var found_formula = _.find($scope.DonationPage.Formulas, function (obj) { return parseFloat(obj.Amount) == parseFloat(common.$routeParams.Amount); });

                    if (found_formula == null) {
                        found_formula = _.find($scope.DonationPage.Formulas, function (obj) { return parseFloat(obj.Amount) == 0; });
                    }
                    if (common.$routeParams.Currency !== undefined && IsNotNullorEmpty(common.$routeParams.Currency)) {
                        found_formula.HomeCurrency = window.crm.list.clientFinancialSettings.Currency;
                        found_formula.ForeignCurrency = common.$routeParams.Currency;
                        found_formula.EnableMultiCurrencyProcessing = window.crm.list.clientFinancialSettings.EnableMultiCurrencyProcessing;
                    }

                    if ($scope.CheckoutDonation.gift.Recurring == 'true') {
                        _.forEach($scope.DonationPage.Formulas, function (obj) {
                            if (parseFloat(obj.Amount) == parseFloat(common.$routeParams.Amount)
                                && (common.$routeParams.Monthly !== undefined
                                    && ((common.$routeParams.Monthly == "m" || common.$routeParams.Monthly == "M")
                                        || common.$routeParams.Monthly == "q" || common.$routeParams.Monthly == "Q"
                                        || common.$routeParams.Monthly == "y" || common.$routeParams.Monthly == "Y"))) {

                                switch (common.$routeParams.Monthly) {
                                    case "m":
                                    case "M":
                                        obj.Recurringfrequency = "Monthly";
                                        break;
                                    case "q":
                                    case "Q":
                                        obj.Recurringfrequency = "Quarterly";
                                        break;
                                    case "y":
                                    case "Y":
                                        obj.Recurringfrequency = "Yearly";
                                        break;
                                    default:
                                        obj.Recurringfrequency = "OneTime";
                                        break;
                                }
                            }
                            else {
                                obj.Recurringfrequency = "OneTime";
                            }

                        });
                    }
                    if (found_formula !== null) {
                        $scope.MakeAskFormula(found_formula, common.$routeParams.Amount);
                    }

                }

                $scope.DonationPage.progress = $filter('number')(((($scope.DonationPage.DonationRaised / $scope.DonationPage.DonationGoal) * 100) > 100) ? 100 : (($scope.DonationPage.DonationRaised / $scope.DonationPage.DonationGoal) * 100), 0);
                $scope.currenturl = encodeURIComponent(common.$location.$$absUrl);
                $scope.currentpagetitle = encodeURIComponent($scope.DonationPage.Title);
                $scope.GetAllDonation();

                /*----- Start - Fundraising Page Get Lookup - Added By VP -----*/
                if ($scope.DonationPage.DisplayProgram == true && $scope.DonationPage.DisplaySubProgram == true) {
                    PagesLookupSvc.getLookupParentChild('ProgramDonor', 'true', 'true', 'true').then(function (res) {
                        $scope.ParentProgramList = [];
                        angular.forEach(res.data, function (di) {
                            $scope.ParentProgramList.push({ Key: di.Id, Value: di.Name, ParentId: di.ParentId });
                        });
                    });
                }
                else if ($scope.DonationPage.DisplayProgram == true && $scope.DonationPage.DisplaySubProgram == false) {
                    PagesLookupSvc.getLookupParentChild('ProgramDonor', 'true', 'false', 'true').then(function (res) {
                        $scope.ParentProgramList = [];
                        angular.forEach(res.data, function (di) {
                            $scope.ParentProgramList.push({ Key: di.Id, Value: di.Name, ParentId: di.ParentId });
                        });
                    });
                }
                else if ($scope.DonationPage.DisplayProgram == false && $scope.DonationPage.DisplaySubProgram == true) {
                    PagesLookupSvc.getLookupParentChild('ProgramDonor', 'false', 'true', 'true').then(function (res) {
                        $scope.ParentProgramList = [];
                        angular.forEach(res.data, function (di) {
                            if (IsNotNullorEmpty($scope.DonationPage.ProgramId)) {
                                if (di.ParentId == $scope.DonationPage.ProgramId || di.Id == $scope.DonationPage.ProgramId) {
                                    $scope.ParentProgramList.push({ Key: di.Id, Value: di.Name, ParentId: di.ParentId });
                                }
                            }
                            else
                                $scope.ParentProgramList.push({ Key: di.Id, Value: di.Name, ParentId: di.ParentId });
                        });
                    });
                }
                /*----- End - Fundraising Page Get Lookup - Added By VP -----*/

                common.usSpinnerService.stop('spnPublicPagesDonationpage');
            }, function (err) {
                //common.aaNotify.error(err);
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
            });
        };

        $scope.GetAllDonation = function () {
            common.usSpinnerService.spin('spnPublicPagesDonationpage');
            FundraisingSvc.getAllDonationPage().then(function (data) {
                angular.forEach(data.data, function (obj) {
                    if (obj.DonationPageId !== $scope.DonationPage.DonationPageId)
                        $scope.AllDonation.push(obj);
                })
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
            }, function (err) {
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
            })
        };

        $scope.OpenMediaVideo = function (media) {
            var modalplayvideoInstance = $modal.open({
                templateUrl: 'playvideopopup.html',
                controller: playvideopopupctrl,
                scope: $scope,
                keyboard: true,
                backdrop: 'static',
                resolve: {
                    media: function () {
                        return media;
                    }
                }
            });
            modalplayvideoInstance.result.then(function () {
            }, function () {
            });
        }

        $scope.ShowMessage = function (Message) {
            if (Message !== null) {
                if (Message.Type == 'Error' || Message.Type == '1') {
                    common.aaNotify.error(Message.Description);
                    return false;
                }
                else {
                    common.aaNotify.success(Message.Description);
                    return true;
                }
            }
            else {
                return true;
            }
        };


        function tomorrowdDate() {
            var myDate = new Date();
            myDate.setDate(myDate.getDate() + 1);
            var dt = myDate;
            return dt;
        }

        $scope.MakeAskFormula = function (formula, amount) {
            $scope.showdonatepage = true;
            $scope.OtherAmount = 0;
            $scope.currentdoantionformula = formula;

            switch (formula.Recurringfrequency) {
                case "Monthly":
                    $scope.currentdoantionformula.Frequency = "Month";
                    break;
                case "Quarterly":
                    $scope.currentdoantionformula.Frequency = "Quarter";
                    break;
                case "Yearly":
                    $scope.currentdoantionformula.Frequency = "Year";
                    break;
                default:
                    $scope.currentdoantionformula.Frequency = "";
                    break;
            }

            if ($scope.currentdoantionformula.ForeignCurrency == undefined || $scope.currentdoantionformula.ForeignCurrency == undefined || IsNullorEmpty($scope.currentdoantionformula.ForeignCurrency)) {
                $scope.currentdoantionformula.HomeCurrency = window.crm.list.clientFinancialSettings.Currency;
                $scope.currentdoantionformula.ForeignCurrency = window.crm.list.clientFinancialSettings.Currency;
            }

            if (formula.Amount == 0) {
                formula.Amount = amount;
            }
        }

        $scope.Cancel = function () {
            $scope.showdonatepage = false;
            $scope.currentdoantionformula = {};
            $scope.OtherAmount = 0;
        }

        $scope.$on('failureMsg', function (event, args) {
            common.aaNotify.danger(args.message);
        });

        $scope.$on('SuccessMsg', function (event, args) {
            common.$location.path('/Thankyou');
        });

        $scope.authExternalProvider = function (provider) {
            var redirectUri = location.protocol + '//' + location.host + '/app_client/views/pages/publicpages/authcomplete.html';
            var externalProviderUrl = ngAuthSettings.apiServiceBaseUri + "api/Account/ExternalLogin?provider=" + provider
                + "&response_type=token&client_id=" + ngAuthSettings.clientId
                + "&APIKey=" + window.crm.constants.APIKey
                + "&redirect_uri=" + redirectUri;
            window.$windowScope = $scope;
            var oauthWindow = window.open(externalProviderUrl, "Authenticate Account", "location=0,status=0,width=600,height=750");
        };

        $scope.authCompletedCB = function (fragment) {
            $scope.$apply(function () {
                if (fragment.haslocalaccount == 'False') {
                    authService.logOut();
                    authService.externalAuthData = {
                        provider: fragment.provider,
                        userName: fragment.external_user_name,
                        externalAccessToken: fragment.external_access_token
                    };
                    common.$location.path('/login');
                }
                else {
                    //Obtain access token and redirect to orders
                    var externalData = { provider: fragment.provider, externalAccessToken: fragment.external_access_token };
                    authService.obtainAccessToken(externalData).then(function (response) {
                        window.location.reload();
                    }, function (err) {
                        $scope.message = err.error_description;
                    });
                }
            });
        }

        $scope.GetContactInfo = function () {
            if (authService.authentication.isAuth) {
                common.usSpinnerService.spin('spnPublicPagesDonationpage');
                ContactProfileSvc.getContactDetail().then(function (res) {
                    $scope.Checkout.ContactDetails = res.data;
                    common.usSpinnerService.stop('spnPublicPagesDonationpage');
                }, function (err) {
                    //common.aaNotify.error(err.data);
                    common.usSpinnerService.stop('spnPublicPagesDonationpage');
                });
            }
        };

        $scope.trustSrc = function (url) {
            return $sce.trustAsResourceUrl(url);
        }

        $scope.SetTempFormula = function (formula, amount, arrIndex) {
            $scope.CheckoutDonation.gift.IncludeCharges = false;
            angular.forEach($scope.DonationPage.Formulas, function (formula, index) {
                formula.IsSelected = arrIndex == index ? true : false;
                if (arrIndex !== index && formula.OriginalAmount == 0) {
                    formula.Amount = 0;
                }
            });

            var tempFormula = ($filter('filter')($scope.DonationPage.Formulas, { IsSelected: true }, true));
            if (tempFormula !== undefined && tempFormula !== null
                && tempFormula[0] !== undefined && tempFormula[0] !== null
                && tempFormula[0].Amount !== undefined
                && tempFormula[0].Amount !== null
                && tempFormula[0].Amount !== ""
                && Number(tempFormula[0].Amount) > 0) {
                angular.copy(tempFormula[0], $scope.currentdoantionformula);
                if ($scope.TempFormula.Recurringfrequency !== undefined && $scope.TempFormula.Recurringfrequency !== null && $scope.TempFormula.Recurringfrequency !== "") {
                    $scope.currentdoantionformula.Frequency = $scope.TempFormula.Recurringfrequency;
                }
            }
        }

        $scope.SetRecurring = function (frequency) {

            $scope.TempFormula.Recurringfrequency = frequency;

            $scope.Checkout.DisablePaylater = $scope.TempFormula.Recurringfrequency !== "OneTime";

            switch ($scope.TempFormula.Recurringfrequency) {
                case "Monthly":
                    $scope.currentdoantionformula.Frequency = "Month";
                    break;
                case "Quarterly":
                    $scope.currentdoantionformula.Frequency = "Quarter";
                    break;
                case "Yearly":
                    $scope.currentdoantionformula.Frequency = "Year";
                    break;
                default:
                    $scope.currentdoantionformula.Frequency = "";
                    break;
            }
        }

        $scope.GetActiveclass = function (frequency) {
            return $scope.TempFormula.Recurringfrequency === frequency ? "active" : "";
        }

        $scope.CalculateDonationCharges = function () {
            if ($scope.currentdoantionformula.Amount > 0) {
                if ($scope.CheckoutDonation.gift.IncludeCharges === true) {
                    var modalInstance = $modal.open({
                        templateUrl: '/App_Client/views/Pages/PublicPages/Fundraising/' + $scope.TemplateName + '/DonationExtraFeePopup.html?v=' + window.crm.constants.version,
                        controller: "DonationFeePopupCtrl",
                        keyboard: false,
                        backdrop: 'static',
                        sizeclass: 'modal-md',
                        scope: $scope,
                        resolve: {
                            ExtraFee: function () {
                                return $scope.CCProcessingPercentage;
                            },
                            AskArrayDonation: function () {
                                $scope.currentdoantionformula.ForeignCurrency = window.crm.list.clientFinancialSettings.Currency;
                                return $scope.currentdoantionformula;
                            }
                        }
                    });
                    modalInstance.result.then(function (result) {
                        if (result.Operation === "Proceed") {
                            $scope.currentdoantionformula.Amount = parseFloat($scope.currentdoantionformula.Amount) * 100 / (100 - parseFloat($scope.CCProcessingPercentage));
                            $scope.currentdoantionformula.NetAmount = parseFloat($scope.currentdoantionformula.Amount);
                        }
                        else if (result.Operation === "Revert") {
                            $scope.CheckoutDonation.gift.IncludeCharges = false;
                        }
                    }, function () {
                    });
                }
                else {
                    $scope.currentdoantionformula.Amount = parseFloat($scope.currentdoantionformula.OriginalAmount);
                    $scope.currentdoantionformula.NetAmount = parseFloat($scope.currentdoantionformula.Amount);
                }
            }
            else {
                common.aaNotify.danger("Please select gift amount.");
                $scope.CheckoutDonation.gift.IncludeCharges = false;
            }
        };

        $scope.DonateNow = function (checkoutType) {
            if ($scope.ValidateDonation() === true) {
                $scope.CopyDonationObject();
                //this will call ProcceedToCheckout once token will be received.
                if (checkoutType === "PayLater") {
                    common.$rootScope.$broadcast('checkoutByPayLeter');
                }
                else
                    common.$rootScope.$broadcast('getCCToken');
            }
        };

        $scope.CopyDonationObject = function () {
            $scope.CheckoutDonation.gift.Amount = $scope.currentdoantionformula.Amount;
            $scope.CheckoutDonation.gift.TaxDeductibleAmount = $scope.currentdoantionformula.TaxDeductibleAmount;
            $scope.CheckoutDonation.gift.AskArrayFormulaId = $scope.currentdoantionformula.FormulaId > 0 ? $scope.currentdoantionformula.FormulaId : null;
            $scope.CheckoutDonation.gift.ClientId = $scope.client;
            $scope.CheckoutDonation.gift.SourceOfFundId = -1;

            $scope.CheckoutDonation.gift.HomeCurrency = $scope.currentdoantionformula.HomeCurrency;
            $scope.CheckoutDonation.gift.ForeignCurrency = $scope.currentdoantionformula.ForeignCurrency;

            $scope.CheckoutDonation.gift.Recurring = $scope.currentdoantionformula.Frequency !== "OneTime" ? true : false;

            if ($scope.CheckoutDonation.gift.Recurring === undefined || $scope.CheckoutDonation.gift.Recurring === null || $scope.CheckoutDonation.gift.Recurring === false) {
                $scope.CheckoutDonation.gift.RecurringProfile = {};
            }
            else {
                $scope.CheckoutDonation.gift.RecurringProfile.RemainingInstallments = null;
                $scope.CheckoutDonation.gift.RecurringProfile.Frequency = $scope.currentdoantionformula.Frequency;
                $scope.CheckoutDonation.gift.RecurringProfile.Amount = $scope.CheckoutDonation.gift.Amount;
                $scope.CheckoutDonation.gift.RecurringProfile.ContactId = $scope.Checkout.ContactDetails.ContactId;
                $scope.CheckoutDonation.gift.RecurringProfile.StartDate = tomorrowdDate();
            }

            $scope.CheckoutDonation.gift.ContactId = $scope.Checkout.ContactDetails.ContactId;
            //$scope.Checkout.ContactDetails.ClientId = $scope.client;

            if ($scope.CheckoutDonation.gift.Amount == undefined || $scope.CheckoutDonation.gift.Amount <= 0) {
                common.aaNotify.danger("Invalid amount.");
                return;
            }
            common.usSpinnerService.spin('spnPublicPagesDonationpage');
            $scope.CheckoutDonation.gift.CartItemId = 0;

            var Dataobject = {};
            Dataobject.ContactId = $scope.Checkout.ContactDetails.ContactId;
            Dataobject.DonationTypeId = 1;
            Dataobject.InvoiceSource = 2;//InvoiceSource 1-Offline,2-Pages,3-API
            Dataobject.FundId = $scope.DonationPage.DonationConfigurationId;
            Dataobject.SourceId = $scope.DonationPage.SourceId;
            Dataobject.AskArrayFormulaId = $scope.CheckoutDonation.gift.AskArrayFormulaId;
            Dataobject.ItemName = $scope.DonationPage.DonationConfigurationName;
            Dataobject.TotalAmount = Dataobject.NetAmount = parseFloat($scope.CheckoutDonation.gift.Amount).toFixed(2);
            Dataobject.TaxDeductibleAmount = $scope.CheckoutDonation.gift.TaxDeductibleAmount;
            Dataobject.CampaignId = $scope.DonationPage.CampaignId;
            Dataobject.ProgramId = $scope.DonationPage.ProgramId || null;
            Dataobject.IsAnonymousDonation = $scope.CheckoutDonation.gift.IsAnonymousDonation;
            Dataobject.RecurringProfile = $scope.CheckoutDonation.gift.RecurringProfile;
            Dataobject.Tribute = $scope.CheckoutDonation.gift.Tribute;
            Dataobject.SourceOfFundId = $scope.CheckoutDonation.gift.SourceOfFundId;
            Dataobject.SendAcknowledgement = $scope.CheckoutDonation.SendAcknowledgement;
            Dataobject.HomeCurrency = $scope.CheckoutDonation.gift.HomeCurrency;
            Dataobject.ForeignCurrency = $scope.CheckoutDonation.gift.ForeignCurrency;
            Dataobject.GiftMemo = $scope.CheckoutDonation.gift.GiftMemo;

            $scope.CheckoutDonation.gift.DataObject = angular.toJson(Dataobject);

            $scope.DataObject = Dataobject;
        };

        $scope.ValidateDonation = function () {
            if ($scope.currentdoantionformula.Amount <= 0) {
                common.aaNotify.danger("Please select gift amount.");
                return false;
            }
            else
                return true;
        }

        $scope.ProcceedToCheckout = function (PaymentOption) {
            if (PaymentOption !== undefined && PaymentOption !== null
                && PaymentOption.Key !== undefined && PaymentOption.Key !== null && PaymentOption.Key !== "") {
                if (PaymentOption.Key === "CardToken") {
                    $scope.Checkout.CheckoutDetails.CardInformation.CardToken = PaymentOption.Value;
                    $scope.Checkout.CheckoutDetails.CardInformation.Tokenize = PaymentOption.Tokenize;
                }
                else if (PaymentOption.Key === "CardOnFileId") {
                    $scope.Checkout.CheckoutDetails.CardInformation.CardOnFileId = PaymentOption.Value;
                }
                else if (PaymentOption.Key === "PayLater") {
                    $scope.Checkout.CheckoutDetails.PayLater = true;
                }

                //first add the donation to the cart and then process cart.
                GuestCartSvc.addDonationToCart($scope.DataObject).then(function (res) {
                    $scope.CheckoutDonation.gift = res.data;
                    $scope.Checkout.CartId = res.data.CartId;
                    //Process cart
                    $scope.ProcessCart();
                }, function (err) {
                    //common.aaNotify.error(err);
                    common.usSpinnerService.stop('spnPublicPagesDonationpage');
                });
            }
            else {
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
            }
        };

        $scope.ProcessCart = function () {
            //double the donation details
            $scope.Checkout.DoubleTheDonationDetails = { CompanyId: 0, CompanyName: "" };
            if (window.crm.constants.DDApiKey !== undefined && window.crm.constants.DDApiKey !== null && window.crm.constants.DDApiKey !== "") {
                var companyNameelement = document.getElementsByName("doublethedonation_company_name");
                var companyIDelement = document.getElementsByName("doublethedonation_company_id");

                if (companyIDelement !== undefined && companyIDelement !== null && companyIDelement.length > 0 && companyIDelement[0] !== undefined && companyIDelement[0] !== null) {
                    $scope.Checkout.DoubleTheDonationDetails.CompanyId = companyIDelement[0].value;
                }

                if (companyNameelement !== undefined && companyNameelement !== null && companyNameelement.length > 0 && companyNameelement[0] !== undefined && companyNameelement[0] !== null) {
                    $scope.Checkout.DoubleTheDonationDetails.CompanyName = companyNameelement[0].value;
                }
            }

            if ($scope.Checkout.CheckoutDetails.CardInformation.CardOnFileId === undefined || $scope.Checkout.CheckoutDetails.CardInformation.CardOnFileId === null || $scope.Checkout.CheckoutDetails.CardInformation.CardOnFileId === "") {
                $scope.Checkout.CheckoutDetails.CardInformation.CardOnFileId = 0;
            }
            if ($scope.Checkout.CheckoutDetails.CardInformation.Tokenize === undefined || $scope.Checkout.CheckoutDetails.CardInformation.Tokenize === null || $scope.Checkout.CheckoutDetails.CardInformation.Tokenize === "") {
                $scope.Checkout.CheckoutDetails.CardInformation.Tokenize = false;
            }

            if (!authService.authentication.isAuth && $scope.Checkout.ContactDetails.KeepDetailsSaved === true) {
                $scope.GuestContactDetails = {};
                angular.copy($scope.Checkout.ContactDetails, $scope.GuestContactDetails);
                $scope.GuestContactDetails.CheckoutAs = $scope.Checkout.IsOrganizationCheckout === true ? "O" : "I";
                PageCartSvc.SetGuestContact($scope.GuestContactDetails);
            }

            GuestCartSvc.checkOut($scope.Checkout).then(function (checkoutRes) {
                publiccardService.validateCardInfo(checkoutRes).then((authResponse) => {
                    switch (authResponse.status) {
                        case window.crm.constants.cardAuthenticationProps.cardApproved:
                            $scope.Checkout.CheckoutDetails.CardInformation.PaymentIntentId = authResponse.paymentIntent.id;
                            $scope.ProcessCart();
                            break;
                        case window.crm.constants.cardAuthenticationProps.cardRejected:
                            common.aaNotify.error(authResponse.description, { showClose: true, iconClass: 'icon-close', ttl: 16000 });
                            $scope.Checkout.CheckoutDetails.CardInformation.PaymentIntentId = null;
                            common.usSpinnerService.stop('spnPublicPagesDonationpage');
                            break;
                        default:
                            common.usSpinnerService.stop('spnPublicPagesDonationpage');
                            $scope.ShowMessageList(checkoutRes.data);
                    }
                }, function (err) {
                    common.aaNotify.error(err);
                    common.usSpinnerService.stop('spnPublicPagesDonationpage');
                });

            }, function (err) {
                common.aaNotify.error(err.data.Message);
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
            });
        };

        $scope.ShowMessageList = function (response) {
            $scope.ErrorMessageList = [];
            if (response.Message.Type === 'Error' || response.Message.Type === '1') {
                $scope.ErrorMessageList.push(response.Message);
                common.aaNotify.error(response.Message.Description);
            }
            else {
                window.location.href = window.crm.constants.baseurl + '/fundraising/#/Thankyou';
            }
        };

        $scope.CheckoutNow = function () {
            if ($scope.ValidateDonation() === true) {
                $scope.CopyDonationObject();
                common.usSpinnerService.stop('spnPublicPagesDonationpage');
                $scope.modalloginsignupInstance = $modal.open({
                    controller: "LoginSignupOrGuestCheckoutPopup",
                    templateUrl: '/App_Client/views/Pages/PublicPages/Account/' + $scope.TemplateName + '/LoginSignupOrGuestCheckoutPopup.html?v=' + window.crm.constants.version,
                    keyboard: true,
                    backdrop: 'static',
                    sizeclass: $scope.TemplateName === "Template3" ? 'modal-md' : 'modal-lg',
                    resolve: {
                        FunctionType: function () {
                            return "DonationCheckout";
                        },
                        DataObject: function () {
                            $scope.Checkout.DoubleTheDonationDetails = { CompanyId: 0, CompanyName: "" };
                            if (window.crm.constants.DDApiKey !== undefined && window.crm.constants.DDApiKey !== null && window.crm.constants.DDApiKey !== "") {
                                var companyNameelement = document.getElementsByName("doublethedonation_company_name");
                                var companyIDelement = document.getElementsByName("doublethedonation_company_id");

                                if (companyIDelement !== undefined && companyIDelement !== null && companyIDelement.length > 0 && companyIDelement[0] !== undefined && companyIDelement[0] !== null) {
                                    $scope.Checkout.DoubleTheDonationDetails.CompanyId = companyIDelement[0].value;
                                }

                                if (companyNameelement !== undefined && companyNameelement !== null && companyNameelement.length > 0 && companyNameelement[0] !== undefined && companyNameelement[0] !== null) {
                                    $scope.Checkout.DoubleTheDonationDetails.CompanyName = companyNameelement[0].value;
                                }
                            }

                            $scope.ObjectToBeProcessed = { ItemObject: $scope.DataObject, OriginalObject: $scope.Checkout.DoubleTheDonationDetails };
                            return $scope.ObjectToBeProcessed;
                        }
                    }
                });
                $scope.modalloginsignupInstance.result.then(function (value) {
                    common.usSpinnerService.stop('spnPublicPagesDonationpage');
                }, function () {
                });
            }
        };

        $scope.CreateDoubleTheDonationElement = function (isDonationPresent) {
            if ($scope.Checkout.IsOrganizationCheckout === false && isDonationPresent === true && window.crm.constants.DDApiKey !== "") {
                if (authService.authentication.isAuth) {
                    //Get Contact's Matching Organization Details
                    ContactProfileSvc.getMatchingOrganizations().then(function (res) {
                        //If metching organization exists then no need to show matching organization selection.
                        if (!(res.data.length > 0)) {
                            $scope.CreateElement();
                        }
                    }, function (err) {
                    });
                }
                else {
                    $scope.CreateElement();
                }
            }
            else {
                $scope.ShowDDMessage = false;
                var doubleTheDonationDiv = angular.element(document.querySelector('#DoubleTheDonationDiv'));
                doubleTheDonationDiv.empty();
            }

            $scope.IsDonationExists = isDonationPresent;
        };

        $scope.CreateElement = function () {
            $scope.ShowDDMessage = true;
            var doubleTheDonationDiv = angular.element(document.querySelector('#DoubleTheDonationDiv'));
            doubleTheDonationDiv.empty();
            var searchInput = angular.element('<div id="dd-company-name-input"></div>');
            doubleTheDonationDiv.append(searchInput);
            doublethedonation.plugin.load_streamlined_input(searchInput[0]);
        }

        $scope.InitSinglePageDonation();
    }]);

var playvideopopupctrl = function ($scope, common, $modalInstance, $sce, media) {
    $scope.init = function () {
        $scope.media = {};
        $scope.media.Videourl = $sce.trustAsResourceUrl(media.Videourl);
    }
    $scope.trustSrc = function () {
        return $sce.trustAsResourceUrl($scope.media.Videourl);
    }
    $scope.cancelvideo = function () {
        $modalInstance.close();
    };
    $scope.init();
}
playvideopopupctrl.$inject = ['$scope', 'common', '$modalInstance', '$sce', 'media'];
;

function getRoutes() {
    return [
        {
            url: '/Thankyou',
            config:
            {
                templateUrl: "/App_Client/views/pages/Publicpages/Fundraising/" + window.crm.constants.templateName + "/FundraisingthankYou.html",
                areaName: 'Configuration/Pages',
                resolve:
                {
                    TemplateName: ['$routeParams', 'common', function ($routeParams, common) {
                        return window.crm.constants.templateName;
                    }]
                }
            }
        },
        {
            url: '/:DonationPageId/:Amount/:Monthly/:Currency',
            config:
            {
                templateUrl: (window.crm.constants.templateName === "Template2" || window.crm.constants.templateName === "Template3") && window.crm.constants.DisableCart === "True"
                    ? "/App_Client/views/pages/Publicpages/Fundraising/" + window.crm.constants.templateName + "/NewFlow/FundraisingDetail.html"
                    : "/App_Client/views/pages/Publicpages/Fundraising/" + window.crm.constants.templateName + "/FundraisingDetail.html",
                areaName: 'Configuration/Pages',
                resolve:
                {
                    TemplateName: ['$routeParams', 'common', function ($routeParams, common) {
                        return window.crm.constants.templateName;
                    }]
                }
            }
        },
        {
            url: '/:DonationPageId/:Amount/:Currency',
            config:
            {
                templateUrl: (window.crm.constants.templateName === "Template2" || window.crm.constants.templateName === "Template3") && window.crm.constants.DisableCart === "True"
                    ? "/App_Client/views/pages/Publicpages/Fundraising/" + window.crm.constants.templateName + "/NewFlow/FundraisingDetail.html"
                    : "/App_Client/views/pages/Publicpages/Fundraising/" + window.crm.constants.templateName + "/FundraisingDetail.html",
                areaName: 'Configuration/Pages',
                resolve:
                {
                    TemplateName: ['$routeParams', 'common', function ($routeParams, common) {
                        return window.crm.constants.templateName;
                    }]
                }
            }
        },
        {
            url: '/:DonationPageId',
            config:
            {
                templateUrl: (window.crm.constants.templateName === "Template2" || window.crm.constants.templateName === "Template3") && window.crm.constants.DisableCart === "True"
                    ? "/App_Client/views/pages/Publicpages/Fundraising/" + window.crm.constants.templateName + "/NewFlow/FundraisingDetail.html"
                    : "/App_Client/views/pages/Publicpages/Fundraising/" + window.crm.constants.templateName + "/FundraisingDetail.html",
                areaName: 'Configuration/Pages',
                resolve:
                {
                    TemplateName: ['$routeParams', 'common', function ($routeParams, common) {
                        return window.crm.constants.templateName;
                    }]
                }
            }
        },
        {
            url: '/',
            config:
            {
                templateUrl: (window.crm.constants.templateName === "Template2" || window.crm.constants.templateName === "Template3") && window.crm.constants.DisableCart === "True"
                    ? "/App_Client/views/pages/Publicpages/Fundraising/" + window.crm.constants.templateName + "/NewFlow/FundraisingDetail.html"
                    : "/App_Client/views/pages/Publicpages/Fundraising/" + window.crm.constants.templateName + "/FundraisingDetail.html",
                areaName: 'Configuration/Pages',
                resolve:
                {
                    TemplateName: ['$routeParams', 'common', function ($routeParams, common) {
                        return window.crm.constants.templateName;
                    }]
                }
            }
        }
    ];
};
var app = angular.module('app');

app.directive('publicpageuniqueemail', ['PagesLookupSvc', function (PagesLookupSvc) {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, element, attrs, modelCtrl) {
            element.bind('keydown keypress', function (e) {
                modelCtrl.$setValidity('emailunique', true);
                if (IsNotNullorEmpty(scope.EnableSubmit)) {
                    if (typeof scope.EnableSubmit != 'undefined')
                        scope.EnableSubmit = false;
                    else
                        scope.EnableSubmit = true;
                }
            });
            element.bind('blur', function (e) {
                modelCtrl.$setValidity('emailunique', true);
                if (IsNotNullorEmpty(modelCtrl.$viewValue)) {
                    var contactId = IsNotNullorEmpty(attrs.contactid) ? attrs.contactid : 0;
                    var validateemail = IsNotNullorEmpty(attrs.validateemail) && (attrs.validateemail == 'true' || attrs.validateemail == true) ? true : false;
                    if (validateemail) {
                        PagesLookupSvc.CheckEmailExists(modelCtrl.$viewValue, contactId).then(function (res) {
                            if (res.data == 'true') {
                                modelCtrl.$setValidity('emailunique', false);
                                if (typeof scope.EnableSubmit != 'undefined')
                                    scope.EnableSubmit = true;
                            }
                            else {
                                modelCtrl.$setValidity('emailunique', true);
                                if (typeof scope.EnableSubmit != 'undefined')
                                    scope.EnableSubmit = true;
                            }
                        }, function () {
                            modelCtrl.$setValidity('emailunique', true);
                            if (typeof scope.EnableSubmit != 'undefined')
                                scope.EnableSubmit = true;
                        });
                    }
                    else {
                        modelCtrl.$setValidity('emailunique', true);
                        if (typeof scope.EnableSubmit != 'undefined')
                            scope.EnableSubmit = true;
                    }
                }
            });
        }
    }
}]);;
app.directive("svgProgress", ['$compile', function ($compile) {
    var DDO = {
        restrict: 'E',
        required: "ngModel",
        scope: {
            svgModel: '=ngModel'
        },
        replace: true,
        link: function (scope, element, attr) {
            updateprogress();
            scope.$watch('svgModel',
                       function (newValue) {
                           updateprogress();
                       }
                   );

            function updateprogress() {
                scope.text = attr.spText || 'Raised';
                //var _goal = attr.spGoal || '100';
                //var _achieved = attr.spAchieved || '0';
                scope.activeEvent = attr.spActive || 'true';
                scope.percentage = scope.svgModel;//Math.round((_achieved * 100) / _goal);
                scope.achievementMsg = 0;
                if (scope.activeEvent == 'false') {
                    if (scope.percentage > 110) {
                        scope.achievementMsg = 4
                    } else if (scope.percentage >= 100 && scope.percentage <= 110) {
                        scope.achievementMsg = 3
                    } else if (scope.percentage >= 50 && scope.percentage <= 100) {
                        scope.achievementMsg = 2
                    } else if (scope.percentage < 50) {
                        scope.achievementMsg = 1
                    } else {
                        scope.achievementMsg = 0;
                    }
                }
                var _rootElement = element[0];
                var circle = _rootElement.getElementsByTagName("path")[0];
                var _movement = Math.round((scope.percentage * 360) / 100) || 0;
                var _isAcchieved = false;
                if (_movement >= 361) { _movement = 360; _isAcchieved = true; }
                var i = 0;
                var _startAngle = -90;
                var _endAngle = _movement - 90;
                var _radius = attr.spRadius || 25;
                var _rotationAngle = _startAngle;
                if (_movement > 0 && !_isAcchieved) {
                    var timer = setInterval(
                        function () {
                            _rotationAngle += 3;
                            _rotationAngle %= 360;
                            var radians = (_rotationAngle / 180) * Math.PI;
                            var x = 30 + Math.cos(radians) * _radius;
                            var y = 30 + Math.sin(radians) * _radius;
                            var e = circle.getAttribute("d");
                            if (i == 0) {
                                var d = e + " M " + x + " " + y;
                            }
                            else {
                                var d = e + " L " + x + " " + y;
                            }
                            if (_rotationAngle > _endAngle && i !== 0) {
                                window.clearInterval(timer);
                            }
                            circle.setAttribute("d", d);
                            i++;
                        }
                  , 10)
                }
            }

        },
        template: function (tElement, tAttrs) {
            var _viewBox = tAttrs.spViewBox || '0 0 60 60';
            var _width = tAttrs.spWidth || '100%';
            var _height = tAttrs.spHeight || '100%';
            var _achieved = tAttrs.spAchievedMsg || 'Achieved';
            var _innerCircleRadius = tAttrs.spInnerCircleRadius || '21';
            var template = '<div class="svg-progress-chart{{percentage >= 100 ? \' raised\':\'\'}} {{activeEvent == \'true\'? \'active\':\'inactive\'}} mode-{{achievementMsg}}"><svg viewBox="' + _viewBox + '" width="' + _width + '" height="' + _height + '"><g>';
            template += '<circle class="mCircle" cx="30" cy="30" r="' + _innerCircleRadius + '" fill="#ccc"></circle>';
            template += '<path class="mPath" d="" fill="none" stroke="#bbb" strock-width="1"/>';
            template += '<g class="{{achievementMsg == 0? \'show\':\'hide\'}}">';
            template += '<text class="text-percentage" x="30" y="30" font-size="10" text-anchor="middle">{{percentage}}%</text>';
            template += '<text class="text-caption"  x="30" y="38" font-size="8" text-anchor="middle">{{text}}</text>';

            template += '<g class="ok {{achievementMsg == 1 ? \'show\':\'hide\'}}">';
            template += '<g>';
            template += '<circle fill-rule="evenodd" clip-rule="evenodd" fill="#C9C9C9" cx="24.798" cy="24.118" r="3.015"/>';
            template += '<circle fill-rule="evenodd" clip-rule="evenodd" fill="#C9C9C9" cx="35.202" cy="24.118" r="3.015"/>';
            template += '</g>';
            template += '<path fill="none" stroke="#C9C9C9" stroke-width="2" stroke-miterlimit="10" d="M22.339,38.897c4.234-4.234,11.087-4.234,15.321,0"/>';
            template += '</g>';

            template += '<g class="welldone {{achievementMsg == 2 ? \'show\':\'hide\'}}">';
            template += '<text class="text-achieved" x="30" y="32" text-anchor="middle" font-size="10">Nice Tried</text>';
            template += '</g>';
            template += '<g class="rock {{achievementMsg == 3 ? \'show\':\'hide\'}}">';
            template += '<text class="text-achieved" x="30" y="33" text-anchor="middle" font-size="10">WellDone</text>';
            template += '</g>';
            template += '<g class="rock {{achievementMsg == 4 ? \'show\':\'hide\'}}">';
            template += '<text class="text-achieved" x="30" y="33" text-anchor="middle" font-size="10">You Rock</text>';
            template += '</g>';
            template += '</g></svg></div>';
            return template;
        }
    }
    return DDO;
}]);

;
/*
 * jQuery FlexSlider v2.2.2
 * Copyright 2012 WooThemes
 * Contributing Author: Tyler Smith
 */
;
(function ($) {

  //FlexSlider: Object Instance
  $.flexslider = function(el, options) {
    var slider = $(el);

    // making variables public
    slider.vars = $.extend({}, $.flexslider.defaults, options);

    var namespace = slider.vars.namespace,
        msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture,
        touch = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch,
        // depricating this idea, as devices are being released with both of these events
        //eventType = (touch) ? "touchend" : "click",
        eventType = "click touchend MSPointerUp keyup",
        watchedEvent = "",
        watchedEventClearTimer,
        vertical = slider.vars.direction === "vertical",
        reverse = slider.vars.reverse,
        carousel = (slider.vars.itemWidth > 0),
        fade = slider.vars.animation === "fade",
        asNav = slider.vars.asNavFor !== "",
        methods = {},
        focused = true;

    // Store a reference to the slider object
    $.data(el, "flexslider", slider);

    // Private slider methods
    methods = {
      init: function() {
        slider.animating = false;
        // Get current slide and make sure it is a number
        slider.currentSlide = parseInt( ( slider.vars.startAt ? slider.vars.startAt : 0), 10 );
        if ( isNaN( slider.currentSlide ) ) slider.currentSlide = 0;
        slider.animatingTo = slider.currentSlide;
        slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last);
        slider.containerSelector = slider.vars.selector.substr(0,slider.vars.selector.search(' '));
        slider.slides = $(slider.vars.selector, slider);
        slider.container = $(slider.containerSelector, slider);
        slider.count = slider.slides.length;
        // SYNC:
        slider.syncExists = $(slider.vars.sync).length > 0;
        // SLIDE:
        if (slider.vars.animation === "slide") slider.vars.animation = "swing";
        slider.prop = (vertical) ? "top" : "marginLeft";
        slider.args = {};
        // SLIDESHOW:
        slider.manualPause = false;
        slider.stopped = false;
        //PAUSE WHEN INVISIBLE
        slider.started = false;
        slider.startTimeout = null;
        // TOUCH/USECSS:
        slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS && (function() {
          var obj = document.createElement('div'),
              props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'];
          for (var i in props) {
            if ( obj.style[ props[i] ] !== undefined ) {
              slider.pfx = props[i].replace('Perspective','').toLowerCase();
              slider.prop = "-" + slider.pfx + "-transform";
              return true;
            }
          }
          return false;
        }());
        slider.ensureAnimationEnd = '';
        // CONTROLSCONTAINER:
        if (slider.vars.controlsContainer !== "") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer);
        // MANUAL:
        if (slider.vars.manualControls !== "") slider.manualControls = $(slider.vars.manualControls).length > 0 && $(slider.vars.manualControls);

        // RANDOMIZE:
        if (slider.vars.randomize) {
          slider.slides.sort(function() { return (Math.round(Math.random())-0.5); });
          slider.container.empty().append(slider.slides);
        }

        slider.doMath();

        // INIT
        slider.setup("init");

        // CONTROLNAV:
        if (slider.vars.controlNav) methods.controlNav.setup();

        // DIRECTIONNAV:
        if (slider.vars.directionNav) methods.directionNav.setup();

        // KEYBOARD:
        if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 || slider.vars.multipleKeyboard)) {
          $(document).bind('keyup', function(event) {
            var keycode = event.keyCode;
            if (!slider.animating && (keycode === 39 || keycode === 37)) {
              var target = (keycode === 39) ? slider.getTarget('next') :
                           (keycode === 37) ? slider.getTarget('prev') : false;
              slider.flexAnimate(target, slider.vars.pauseOnAction);
            }
          });
        }
        // MOUSEWHEEL:
        if (slider.vars.mousewheel) {
          slider.bind('mousewheel', function(event, delta, deltaX, deltaY) {
            event.preventDefault();
            var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev');
            slider.flexAnimate(target, slider.vars.pauseOnAction);
          });
        }

        // PAUSEPLAY
        if (slider.vars.pausePlay) methods.pausePlay.setup();

        //PAUSE WHEN INVISIBLE
        if (slider.vars.slideshow && slider.vars.pauseInvisible) methods.pauseInvisible.init();

        // SLIDSESHOW
        if (slider.vars.slideshow) {
          if (slider.vars.pauseOnHover) {
            slider.hover(function() {
              if (!slider.manualPlay && !slider.manualPause) slider.pause();
            }, function() {
              if (!slider.manualPause && !slider.manualPlay && !slider.stopped) slider.play();
            });
          }
          // initialize animation
          //If we're visible, or we don't use PageVisibility API
          if(!slider.vars.pauseInvisible || !methods.pauseInvisible.isHidden()) {
            (slider.vars.initDelay > 0) ? slider.startTimeout = setTimeout(slider.play, slider.vars.initDelay) : slider.play();
          }
        }

        // ASNAV:
        if (asNav) methods.asNav.setup();

        // TOUCH
        if (touch && slider.vars.touch) methods.touch();

        // FADE&&SMOOTHHEIGHT || SLIDE:
        if (!fade || (fade && slider.vars.smoothHeight)) $(window).bind("resize orientationchange focus", methods.resize);

        slider.find("img").attr("draggable", "false");

        // API: start() Callback
        setTimeout(function(){
          slider.vars.start(slider);
        }, 200);
      },
      asNav: {
        setup: function() {
          slider.asNav = true;
          slider.animatingTo = Math.floor(slider.currentSlide/slider.move);
          slider.currentItem = slider.currentSlide;
          slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide");
          if(!msGesture){
              slider.slides.on(eventType, function(e){
                e.preventDefault();
                var $slide = $(this),
                    target = $slide.index();
                var posFromLeft = $slide.offset().left - $(slider).scrollLeft(); // Find position of slide relative to left of slider container
                if( posFromLeft <= 0 && $slide.hasClass( namespace + 'active-slide' ) ) {
                  slider.flexAnimate(slider.getTarget("prev"), true);
                } else if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass(namespace + "active-slide")) {
                  slider.direction = (slider.currentItem < target) ? "next" : "prev";
                  slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
                }
              });
          }else{
              el._slider = slider;
              slider.slides.each(function (){
                  var that = this;
                  that._gesture = new MSGesture();
                  that._gesture.target = that;
                  that.addEventListener("MSPointerDown", function (e){
                      e.preventDefault();
                      if(e.currentTarget._gesture)
                          e.currentTarget._gesture.addPointer(e.pointerId);
                  }, false);
                  that.addEventListener("MSGestureTap", function (e){
                      e.preventDefault();
                      var $slide = $(this),
                          target = $slide.index();
                      if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) {
                          slider.direction = (slider.currentItem < target) ? "next" : "prev";
                          slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
                      }
                  });
              });
          }
        }
      },
      controlNav: {
        setup: function() {
          if (!slider.manualControls) {
            methods.controlNav.setupPaging();
          } else { // MANUALCONTROLS:
            methods.controlNav.setupManual();
          }
        },
        setupPaging: function() {
          var type = (slider.vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging',
              j = 1,
              item,
              slide;

          slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>');

          if (slider.pagingCount > 1) {
            for (var i = 0; i < slider.pagingCount; i++) {
              slide = slider.slides.eq(i);
              item = (slider.vars.controlNav === "thumbnails") ? '<img src="' + slide.attr( 'data-thumb' ) + '"/>' : '<a>' + j + '</a>';
              if ( 'thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions ) {
                var captn = slide.attr( 'data-thumbcaption' );
                if ( '' != captn && undefined != captn ) item += '<span class="' + namespace + 'caption">' + captn + '</span>';
              }
              slider.controlNavScaffold.append('<li>' + item + '</li>');
              j++;
            }
          }

          // CONTROLSCONTAINER:
          (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold);
          methods.controlNav.set();

          methods.controlNav.active();

          slider.controlNavScaffold.delegate('a, img', eventType, function(event) {
            event.preventDefault();

            if (watchedEvent === "" || watchedEvent === event.type) {
              var $this = $(this),
                  target = slider.controlNav.index($this);

              if (!$this.hasClass(namespace + 'active')) {
                slider.direction = (target > slider.currentSlide) ? "next" : "prev";
                slider.flexAnimate(target, slider.vars.pauseOnAction);
              }
            }

            // setup flags to prevent event duplication
            if (watchedEvent === "") {
              watchedEvent = event.type;
            }
            methods.setToClearWatchedEvent();

          });
        },
        setupManual: function() {
          slider.controlNav = slider.manualControls;
          methods.controlNav.active();

          slider.controlNav.bind(eventType, function(event) {
            event.preventDefault();

            if (watchedEvent === "" || watchedEvent === event.type) {
              var $this = $(this),
                  target = slider.controlNav.index($this);

              if (!$this.hasClass(namespace + 'active')) {
                (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev";
                slider.flexAnimate(target, slider.vars.pauseOnAction);
              }
            }

            // setup flags to prevent event duplication
            if (watchedEvent === "") {
              watchedEvent = event.type;
            }
            methods.setToClearWatchedEvent();
          });
        },
        set: function() {
          var selector = (slider.vars.controlNav === "thumbnails") ? 'img' : 'a';
          slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider);
        },
        active: function() {
          slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active");
        },
        update: function(action, pos) {
          if (slider.pagingCount > 1 && action === "add") {
            slider.controlNavScaffold.append($('<li><a>' + slider.count + '</a></li>'));
          } else if (slider.pagingCount === 1) {
            slider.controlNavScaffold.find('li').remove();
          } else {
            slider.controlNav.eq(pos).closest('li').remove();
          }
          methods.controlNav.set();
          (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active();
        }
      },
      directionNav: {
        setup: function() {
          var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li><a class="' + namespace + 'prev" href="#">' + slider.vars.prevText + '</a></li><li><a class="' + namespace + 'next" href="#">' + slider.vars.nextText + '</a></li></ul>');

          // CONTROLSCONTAINER:
          if (slider.controlsContainer) {
            $(slider.controlsContainer).append(directionNavScaffold);
            slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer);
          } else {
            slider.append(directionNavScaffold);
            slider.directionNav = $('.' + namespace + 'direction-nav li a', slider);
          }

          methods.directionNav.update();

          slider.directionNav.bind(eventType, function(event) {
            event.preventDefault();
            var target;

            if (watchedEvent === "" || watchedEvent === event.type) {
              target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev');
              slider.flexAnimate(target, slider.vars.pauseOnAction);
            }

            // setup flags to prevent event duplication
            if (watchedEvent === "") {
              watchedEvent = event.type;
            }
            methods.setToClearWatchedEvent();
          });
        },
        update: function() {
          var disabledClass = namespace + 'disabled';
          if (slider.pagingCount === 1) {
            slider.directionNav.addClass(disabledClass).attr('tabindex', '-1');
          } else if (!slider.vars.animationLoop) {
            if (slider.animatingTo === 0) {
              slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1');
            } else if (slider.animatingTo === slider.last) {
              slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1');
            } else {
              slider.directionNav.removeClass(disabledClass).removeAttr('tabindex');
            }
          } else {
            slider.directionNav.removeClass(disabledClass).removeAttr('tabindex');
          }
        }
      },
      pausePlay: {
        setup: function() {
          var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a></a></div>');

          // CONTROLSCONTAINER:
          if (slider.controlsContainer) {
            slider.controlsContainer.append(pausePlayScaffold);
            slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer);
          } else {
            slider.append(pausePlayScaffold);
            slider.pausePlay = $('.' + namespace + 'pauseplay a', slider);
          }

          methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause' : namespace + 'play');

          slider.pausePlay.bind(eventType, function(event) {
            event.preventDefault();

            if (watchedEvent === "" || watchedEvent === event.type) {
              if ($(this).hasClass(namespace + 'pause')) {
                slider.manualPause = true;
                slider.manualPlay = false;
                slider.pause();
              } else {
                slider.manualPause = false;
                slider.manualPlay = true;
                slider.play();
              }
            }

            // setup flags to prevent event duplication
            if (watchedEvent === "") {
              watchedEvent = event.type;
            }
            methods.setToClearWatchedEvent();
          });
        },
        update: function(state) {
          (state === "play") ? slider.pausePlay.removeClass(namespace + 'pause').addClass(namespace + 'play').html(slider.vars.playText) : slider.pausePlay.removeClass(namespace + 'play').addClass(namespace + 'pause').html(slider.vars.pauseText);
        }
      },
      touch: function() {
        var startX,
          startY,
          offset,
          cwidth,
          dx,
          startT,
          scrolling = false,
          localX = 0,
          localY = 0,
          accDx = 0;

        if(!msGesture){
            el.addEventListener('touchstart', onTouchStart, false);

            function onTouchStart(e) {
              if (slider.animating) {
                e.preventDefault();
              } else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) {
                slider.pause();
                // CAROUSEL:
                cwidth = (vertical) ? slider.h : slider. w;
                startT = Number(new Date());
                // CAROUSEL:

                // Local vars for X and Y points.
                localX = e.touches[0].pageX;
                localY = e.touches[0].pageY;

                offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
                         (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
                         (carousel && slider.currentSlide === slider.last) ? slider.limit :
                         (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
                         (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
                startX = (vertical) ? localY : localX;
                startY = (vertical) ? localX : localY;

                el.addEventListener('touchmove', onTouchMove, false);
                el.addEventListener('touchend', onTouchEnd, false);
              }
            }

            function onTouchMove(e) {
              // Local vars for X and Y points.

              localX = e.touches[0].pageX;
              localY = e.touches[0].pageY;

              dx = (vertical) ? startX - localY : startX - localX;
              scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY));

              var fxms = 500;

              if ( ! scrolling || Number( new Date() ) - startT > fxms ) {
                e.preventDefault();
                if (!fade && slider.transitions) {
                  if (!slider.vars.animationLoop) {
                    dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);
                  }
                  slider.setProps(offset + dx, "setTouch");
                }
              }
            }

            function onTouchEnd(e) {
              // finish the touch by undoing the touch session
              el.removeEventListener('touchmove', onTouchMove, false);

              if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
                var updateDx = (reverse) ? -dx : dx,
                    target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');

                if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
                  slider.flexAnimate(target, slider.vars.pauseOnAction);
                } else {
                  if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true);
                }
              }
              el.removeEventListener('touchend', onTouchEnd, false);

              startX = null;
              startY = null;
              dx = null;
              offset = null;
            }
        }else{
            el.style.msTouchAction = "none";
            el._gesture = new MSGesture();
            el._gesture.target = el;
            el.addEventListener("MSPointerDown", onMSPointerDown, false);
            el._slider = slider;
            el.addEventListener("MSGestureChange", onMSGestureChange, false);
            el.addEventListener("MSGestureEnd", onMSGestureEnd, false);

            function onMSPointerDown(e){
                e.stopPropagation();
                if (slider.animating) {
                    e.preventDefault();
                }else{
                    slider.pause();
                    el._gesture.addPointer(e.pointerId);
                    accDx = 0;
                    cwidth = (vertical) ? slider.h : slider. w;
                    startT = Number(new Date());
                    // CAROUSEL:

                    offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
                        (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
                            (carousel && slider.currentSlide === slider.last) ? slider.limit :
                                (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
                                    (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
                }
            }

            function onMSGestureChange(e) {
                e.stopPropagation();
                var slider = e.target._slider;
                if(!slider){
                    return;
                }
                var transX = -e.translationX,
                    transY = -e.translationY;

                //Accumulate translations.
                accDx = accDx + ((vertical) ? transY : transX);
                dx = accDx;
                scrolling = (vertical) ? (Math.abs(accDx) < Math.abs(-transX)) : (Math.abs(accDx) < Math.abs(-transY));

                if(e.detail === e.MSGESTURE_FLAG_INERTIA){
                    setImmediate(function (){
                        el._gesture.stop();
                    });

                    return;
                }

                if (!scrolling || Number(new Date()) - startT > 500) {
                    e.preventDefault();
                    if (!fade && slider.transitions) {
                        if (!slider.vars.animationLoop) {
                            dx = accDx / ((slider.currentSlide === 0 && accDx < 0 || slider.currentSlide === slider.last && accDx > 0) ? (Math.abs(accDx) / cwidth + 2) : 1);
                        }
                        slider.setProps(offset + dx, "setTouch");
                    }
                }
            }

            function onMSGestureEnd(e) {
                e.stopPropagation();
                var slider = e.target._slider;
                if(!slider){
                    return;
                }
                if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
                    var updateDx = (reverse) ? -dx : dx,
                        target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');

                    if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
                        slider.flexAnimate(target, slider.vars.pauseOnAction);
                    } else {
                        if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true);
                    }
                }

                startX = null;
                startY = null;
                dx = null;
                offset = null;
                accDx = 0;
            }
        }
      },
      resize: function() {
        if (!slider.animating && slider.is(':visible')) {
          if (!carousel) slider.doMath();

          if (fade) {
            // SMOOTH HEIGHT:
            methods.smoothHeight();
          } else if (carousel) { //CAROUSEL:
            slider.slides.width(slider.computedW);
            slider.update(slider.pagingCount);
            slider.setProps();
          }
          else if (vertical) { //VERTICAL:
            slider.viewport.height(slider.h);
            slider.setProps(slider.h, "setTotal");
          } else {
            // SMOOTH HEIGHT:
            if (slider.vars.smoothHeight) methods.smoothHeight();
            slider.newSlides.width(slider.computedW);
            slider.setProps(slider.computedW, "setTotal");
          }
        }
      },
      smoothHeight: function(dur) {
        if (!vertical || fade) {
          var $obj = (fade) ? slider : slider.viewport;
          (dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).height()}, dur) : $obj.height(slider.slides.eq(slider.animatingTo).height());
        }
      },
      sync: function(action) {
        var $obj = $(slider.vars.sync).data("flexslider"),
            target = slider.animatingTo;

        switch (action) {
          case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break;
          case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break;
          case "pause": $obj.pause(); break;
        }
      },
      uniqueID: function($clone) {
        // Append _clone to current level and children elements with id attributes
        $clone.filter( '[id]' ).add($clone.find( '[id]' )).each(function() {
          var $this = $(this);
          $this.attr( 'id', $this.attr( 'id' ) + '_clone' );
        });
        return $clone;
      },
      pauseInvisible: {
        visProp: null,
        init: function() {
          var prefixes = ['webkit','moz','ms','o'];

          if ('hidden' in document) return 'hidden';
          for (var i = 0; i < prefixes.length; i++) {
            if ((prefixes[i] + 'Hidden') in document)
            methods.pauseInvisible.visProp = prefixes[i] + 'Hidden';
          }
          if (methods.pauseInvisible.visProp) {
            var evtname = methods.pauseInvisible.visProp.replace(/[H|h]idden/,'') + 'visibilitychange';
            document.addEventListener(evtname, function() {
              if (methods.pauseInvisible.isHidden()) {
                if(slider.startTimeout) clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible
                else slider.pause(); //Or just pause
              }
              else {
                if(slider.started) slider.play(); //Initiated before, just play
                else (slider.vars.initDelay > 0) ? setTimeout(slider.play, slider.vars.initDelay) : slider.play(); //Didn't init before: simply init or wait for it
              }
            });
          }
        },
        isHidden: function() {
          return document[methods.pauseInvisible.visProp] || false;
        }
      },
      setToClearWatchedEvent: function() {
        clearTimeout(watchedEventClearTimer);
        watchedEventClearTimer = setTimeout(function() {
          watchedEvent = "";
        }, 3000);
      }
    };

    // public methods
    slider.flexAnimate = function(target, pause, override, withSync, fromNav) {
      if (!slider.vars.animationLoop && target !== slider.currentSlide) {
        slider.direction = (target > slider.currentSlide) ? "next" : "prev";
      }

      if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev";

      if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) {
        if (asNav && withSync) {
          var master = $(slider.vars.asNavFor).data('flexslider');
          slider.atEnd = target === 0 || target === slider.count - 1;
          master.flexAnimate(target, true, false, true, fromNav);
          slider.direction = (slider.currentItem < target) ? "next" : "prev";
          master.direction = slider.direction;

          if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) {
            slider.currentItem = target;
            slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
            target = Math.floor(target/slider.visible);
          } else {
            slider.currentItem = target;
            slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
            return false;
          }
        }

        slider.animating = true;
        slider.animatingTo = target;

        // SLIDESHOW:
        if (pause) slider.pause();

        // API: before() animation Callback
        slider.vars.before(slider);

        // SYNC:
        if (slider.syncExists && !fromNav) methods.sync("animate");

        // CONTROLNAV
        if (slider.vars.controlNav) methods.controlNav.active();

        // !CAROUSEL:
        // CANDIDATE: slide active class (for add/remove slide)
        if (!carousel) slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide');

        // INFINITE LOOP:
        // CANDIDATE: atEnd
        slider.atEnd = target === 0 || target === slider.last;

        // DIRECTIONNAV:
        if (slider.vars.directionNav) methods.directionNav.update();

        if (target === slider.last) {
          // API: end() of cycle Callback
          slider.vars.end(slider);
          // SLIDESHOW && !INFINITE LOOP:
          if (!slider.vars.animationLoop) slider.pause();
        }

        // SLIDE:
        if (!fade) {
          var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW,
              margin, slideString, calcNext;

          // INFINITE LOOP / REVERSE:
          if (carousel) {
            //margin = (slider.vars.itemWidth > slider.w) ? slider.vars.itemMargin * 2 : slider.vars.itemMargin;
            margin = slider.vars.itemMargin;
            calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo;
            slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext;
          } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") {
            slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0;
          } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") {
            slideString = (reverse) ? 0 : (slider.count + 1) * dimension;
          } else {
            slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension;
          }
          slider.setProps(slideString, "", slider.vars.animationSpeed);
          if (slider.transitions) {
            if (!slider.vars.animationLoop || !slider.atEnd) {
              slider.animating = false;
              slider.currentSlide = slider.animatingTo;
            }
            
            // Unbind previous transitionEnd events and re-bind new transitionEnd event
            slider.container.unbind("webkitTransitionEnd transitionend");
            slider.container.bind("webkitTransitionEnd transitionend", function() {
              clearTimeout(slider.ensureAnimationEnd);
              slider.wrapup(dimension);
            });

            // Insurance for the ever-so-fickle transitionEnd event
            clearTimeout(slider.ensureAnimationEnd);
            slider.ensureAnimationEnd = setTimeout(function() {
              slider.wrapup(dimension);
            }, slider.vars.animationSpeed + 100);

          } else {
            slider.container.animate(slider.args, slider.vars.animationSpeed, slider.vars.easing, function(){
              slider.wrapup(dimension);
            });
          }
        } else { // FADE:
          if (!touch) {
            //slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationSpeed, slider.vars.easing);
            //slider.slides.eq(target).fadeIn(slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);

            slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing);
            slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);

          } else {
            slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
            slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
            slider.wrapup(dimension);
          }
        }
        // SMOOTH HEIGHT:
        if (slider.vars.smoothHeight) methods.smoothHeight(slider.vars.animationSpeed);
      }
    };
    slider.wrapup = function(dimension) {
      // SLIDE:
      if (!fade && !carousel) {
        if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) {
          slider.setProps(dimension, "jumpEnd");
        } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) {
          slider.setProps(dimension, "jumpStart");
        }
      }
      slider.animating = false;
      slider.currentSlide = slider.animatingTo;
      // API: after() animation Callback
      slider.vars.after(slider);
    };

    // SLIDESHOW:
    slider.animateSlides = function() {
      if (!slider.animating && focused ) slider.flexAnimate(slider.getTarget("next"));
    };
    // SLIDESHOW:
    slider.pause = function() {
      clearInterval(slider.animatedSlides);
      slider.animatedSlides = null;
      slider.playing = false;
      // PAUSEPLAY:
      if (slider.vars.pausePlay) methods.pausePlay.update("play");
      // SYNC:
      if (slider.syncExists) methods.sync("pause");
    };
    // SLIDESHOW:
    slider.play = function() {
      if (slider.playing) clearInterval(slider.animatedSlides);
      slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed);
      slider.started = slider.playing = true;
      // PAUSEPLAY:
      if (slider.vars.pausePlay) methods.pausePlay.update("pause");
      // SYNC:
      if (slider.syncExists) methods.sync("play");
    };
    // STOP:
    slider.stop = function () {
      slider.pause();
      slider.stopped = true;
    };
    slider.canAdvance = function(target, fromNav) {
      // ASNAV:
      var last = (asNav) ? slider.pagingCount - 1 : slider.last;
      return (fromNav) ? true :
             (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true :
             (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :
             (target === slider.currentSlide && !asNav) ? false :
             (slider.vars.animationLoop) ? true :
             (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false :
             (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false :
             true;
    };
    slider.getTarget = function(dir) {
      slider.direction = dir;
      if (dir === "next") {
        return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;
      } else {
        return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;
      }
    };

    // SLIDE:
    slider.setProps = function(pos, special, dur) {
      var target = (function() {
        var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo,
            posCalc = (function() {
              if (carousel) {
                return (special === "setTouch") ? pos :
                       (reverse && slider.animatingTo === slider.last) ? 0 :
                       (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
                       (slider.animatingTo === slider.last) ? slider.limit : posCheck;
              } else {
                switch (special) {
                  case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos;
                  case "setTouch": return (reverse) ? pos : pos;
                  case "jumpEnd": return (reverse) ? pos : slider.count * pos;
                  case "jumpStart": return (reverse) ? slider.count * pos : pos;
                  default: return pos;
                }
              }
            }());

            return (posCalc * -1) + "px";
          }());

      if (slider.transitions) {
        target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)";
        dur = (dur !== undefined) ? (dur/1000) + "s" : "0s";
        slider.container.css("-" + slider.pfx + "-transition-duration", dur);
         slider.container.css("transition-duration", dur);
      }

      slider.args[slider.prop] = target;
      if (slider.transitions || dur === undefined) slider.container.css(slider.args);

      slider.container.css('transform',target);
    };

    slider.setup = function(type) {
      // SLIDE:
      if (!fade) {
        var sliderOffset, arr;

        if (type === "init") {
          slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
          // INFINITE LOOP:
          slider.cloneCount = 0;
          slider.cloneOffset = 0;
          // REVERSE:
          if (reverse) {
            arr = $.makeArray(slider.slides).reverse();
            slider.slides = $(arr);
            slider.container.empty().append(slider.slides);
          }
        }
        // INFINITE LOOP && !CAROUSEL:
        if (slider.vars.animationLoop && !carousel) {
          slider.cloneCount = 2;
          slider.cloneOffset = 1;
          // clear out old clones
          if (type !== "init") slider.container.find('.clone').remove();
          slider.container.append(methods.uniqueID(slider.slides.first().clone().addClass('clone')).attr('aria-hidden', 'true'))
                          .prepend(methods.uniqueID(slider.slides.last().clone().addClass('clone')).attr('aria-hidden', 'true'));
        }
        slider.newSlides = $(slider.vars.selector, slider);

        sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset;
        // VERTICAL:
        if (vertical && !carousel) {
          slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%");
          setTimeout(function(){
            slider.newSlides.css({"display": "block"});
            slider.doMath();
            slider.viewport.height(slider.h);
            slider.setProps(sliderOffset * slider.h, "init");
          }, (type === "init") ? 100 : 0);
        } else {
          slider.container.width((slider.count + slider.cloneCount) * 200 + "%");
          slider.setProps(sliderOffset * slider.computedW, "init");
          setTimeout(function(){
            slider.doMath();
            slider.newSlides.css({"width": slider.computedW, "float": "left", "display": "block"});
            // SMOOTH HEIGHT:
            if (slider.vars.smoothHeight) methods.smoothHeight();
          }, (type === "init") ? 100 : 0);
        }
      } else { // FADE:
        slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%", "position": "relative"});
        if (type === "init") {
          if (!touch) {
            //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing);
            if (slider.vars.fadeFirstSlide == false) {
              slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).css({"opacity": 1});
            } else {
              slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing);
            }
          } else {
            slider.slides.css({ "opacity": 0, "display": "block", "webkitTransition": "opacity " + slider.vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2});
          }
        }
        // SMOOTH HEIGHT:
        if (slider.vars.smoothHeight) methods.smoothHeight();
      }
      // !CAROUSEL:
      // CANDIDATE: active slide
      if (!carousel) slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide");

      //FlexSlider: init() Callback
      slider.vars.init(slider);
    };

    slider.doMath = function() {
      var slide = slider.slides.first(),
          slideMargin = slider.vars.itemMargin,
          minItems = slider.vars.minItems,
          maxItems = slider.vars.maxItems;

      slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width();
      slider.h = slide.height();
      slider.boxPadding = slide.outerWidth() - slide.width();

      // CAROUSEL:
      if (carousel) {
        slider.itemT = slider.vars.itemWidth + slideMargin;
        slider.minW = (minItems) ? minItems * slider.itemT : slider.w;
        slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w;
        slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems :
                       (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems :
                       (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth;

        slider.visible = Math.floor(slider.w/(slider.itemW));
        slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible;
        slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1);
        slider.last =  slider.pagingCount - 1;
        slider.limit = (slider.pagingCount === 1) ? 0 :
                       (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;
      } else {
        slider.itemW = slider.w;
        slider.pagingCount = slider.count;
        slider.last = slider.count - 1;
      }
      slider.computedW = slider.itemW - slider.boxPadding;
    };

    slider.update = function(pos, action) {
      slider.doMath();

      // update currentSlide and slider.animatingTo if necessary
      if (!carousel) {
        if (pos < slider.currentSlide) {
          slider.currentSlide += 1;
        } else if (pos <= slider.currentSlide && pos !== 0) {
          slider.currentSlide -= 1;
        }
        slider.animatingTo = slider.currentSlide;
      }

      // update controlNav
      if (slider.vars.controlNav && !slider.manualControls) {
        if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) {
          methods.controlNav.update("add");
        } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) {
          if (carousel && slider.currentSlide > slider.last) {
            slider.currentSlide -= 1;
            slider.animatingTo -= 1;
          }
          methods.controlNav.update("remove", slider.last);
        }
      }
      // update directionNav
      if (slider.vars.directionNav) methods.directionNav.update();

    };

    slider.addSlide = function(obj, pos) {
      var $obj = $(obj);

      slider.count += 1;
      slider.last = slider.count - 1;

      // append new slide
      if (vertical && reverse) {
        (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj);
      } else {
        (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj);
      }

      // update currentSlide, animatingTo, controlNav, and directionNav
      slider.update(pos, "add");

      // update slider.slides
      slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
      // re-setup the slider to accomdate new slide
      slider.setup();

      //FlexSlider: added() Callback
      slider.vars.added(slider);
    };
    slider.removeSlide = function(obj) {
      var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;

      // update count
      slider.count -= 1;
      slider.last = slider.count - 1;

      // remove slide
      if (isNaN(obj)) {
        $(obj, slider.slides).remove();
      } else {
        (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove();
      }

      // update currentSlide, animatingTo, controlNav, and directionNav
      slider.doMath();
      slider.update(pos, "remove");

      // update slider.slides
      slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
      // re-setup the slider to accomdate new slide
      slider.setup();

      // FlexSlider: removed() Callback
      slider.vars.removed(slider);
    };

    //FlexSlider: Initialize
    methods.init();
  };

  // Ensure the slider isn't focussed if the window loses focus.
  $( window ).blur( function ( e ) {
    focused = false;
  }).focus( function ( e ) {
    focused = true;
  });

  //FlexSlider: Default Settings
  $.flexslider.defaults = {
    namespace: "flex-",             //{NEW} String: Prefix string attached to the class of every element generated by the plugin
    selector: ".slides > li",       //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril
    animation: "fade",              //String: Select your animation type, "fade" or "slide"
    easing: "swing",                //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported!
    direction: "horizontal",        //String: Select the sliding direction, "horizontal" or "vertical"
    reverse: false,                 //{NEW} Boolean: Reverse the animation direction
    animationLoop: true,            //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
    smoothHeight: false,            //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode
    startAt: 0,                     //Integer: The slide that the slider should start on. Array notation (0 = first slide)
    slideshow: true,                //Boolean: Animate slider automatically
    slideshowSpeed: 7000,           //Integer: Set the speed of the slideshow cycling, in milliseconds
    animationSpeed: 600,            //Integer: Set the speed of animations, in milliseconds
    initDelay: 0,                   //{NEW} Integer: Set an initialization delay, in milliseconds
    randomize: false,               //Boolean: Randomize slide order
    fadeFirstSlide: true,           //Boolean: Fade in the first slide when animation type is "fade"
    thumbCaptions: false,           //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav.

    // Usability features
    pauseOnAction: true,            //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
    pauseOnHover: false,            //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
    pauseInvisible: true,   		//{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage.
    useCSS: true,                   //{NEW} Boolean: Slider will use CSS3 transitions if available
    touch: true,                    //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices
    video: false,                   //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches

    // Primary Controls
    controlNav: true,               //Boolean: Create navigation for paging control of each slide? Note: Leave true for manualControls usage
    directionNav: true,             //Boolean: Create navigation for previous/next navigation? (true/false)
    prevText: "Previous",           //String: Set the text for the "previous" directionNav item
    nextText: "Next",               //String: Set the text for the "next" directionNav item

    // Secondary Navigation
    keyboard: true,                 //Boolean: Allow slider navigating via keyboard left/right keys
    multipleKeyboard: false,        //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present.
    mousewheel: false,              //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
    pausePlay: false,               //Boolean: Create pause/play dynamic element
    pauseText: "Pause",             //String: Set the text for the "pause" pausePlay item
    playText: "Play",               //String: Set the text for the "play" pausePlay item

    // Special properties
    controlsContainer: "",          //{UPDATED} jQuery Object/Selector: Declare which container the navigation elements should be appended too. Default container is the FlexSlider element. Example use would be $(".flexslider-container"). Property is ignored if given element is not found.
    manualControls: "",             //{UPDATED} jQuery Object/Selector: Declare custom control navigation. Examples would be $(".flex-control-nav li") or "#tabs-nav li img", etc. The number of elements in your controlNav should match the number of slides/tabs.
    sync: "",                       //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care.
    asNavFor: "",                   //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider

    // Carousel Options
    itemWidth: 0,                   //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding.
    itemMargin: 0,                  //{NEW} Integer: Margin between carousel items.
    minItems: 1,                    //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.
    maxItems: 0,                    //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit.
    move: 0,                        //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items.
    allowOneSlide: true,           //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide

    // Callback API
    start: function(){},            //Callback: function(slider) - Fires when the slider loads the first slide
    before: function(){},           //Callback: function(slider) - Fires asynchronously with each slider animation
    after: function(){},            //Callback: function(slider) - Fires after each slider animation completes
    end: function(){},              //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous)
    added: function(){},            //{NEW} Callback: function(slider) - Fires after a slide is added
    removed: function(){},           //{NEW} Callback: function(slider) - Fires after a slide is removed
    init: function() {}             //{NEW} Callback: function(slider) - Fires after the slider is initially setup
  };

  //FlexSlider: Plugin Function
  $.fn.flexslider = function (options) {
     
    if (options === undefined) options = {};

    if (typeof options === "object") {
      return this.each(function() {
        var $this = $(this),
            selector = (options.selector) ? options.selector : ".slides > li",
            $slides = $this.find(selector);

      if ( ( $slides.length === 1 && options.allowOneSlide === true ) || $slides.length === 0 ) {
          $slides.fadeIn(400);
          if (options.start) options.start($this);
        } else if ($this.data('flexslider') === undefined) {
          new $.flexslider(this, options);
        }
      });
    } else {
      // Helper strings to quickly perform functions on the slider
      var $slider = $(this).data('flexslider');
      switch (options) {
        case "play": $slider.play(); break;
        case "pause": $slider.pause(); break;
        case "stop": $slider.stop(); break;
        case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;
        case "prev":
        case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;
        default: if (typeof options === "number") $slider.flexAnimate(options, true);
      }
    }
  };
})(jQuery);
;
//https://github.com/thenikso/angular-flexslider
app.directive('flexSlider', [
    '$parse', '$timeout', '$window', function ($parse, $timeout, $window) {
        return {
            restrict: 'AE',
            scope: true,
            replace: true,
            transclude: true,
            template: '<div class="flexslider-container"></div>',
            compile: function (element, attr, linker) {


                return function ($scope, $element) {

                    //$scope.onResizeFunction = function () {
                    //    $scope.windowHeight = $window.innerHeight;
                    //    $scope.windowWidth = $window.innerWidth;

                    //    console.log($scope.windowHeight + "-" + $scope.windowWidth)
                    //};
                    //$scope.onResizeFunction();

                    //angular.element($window).bind('resize', function () {
                    //    $scope.onResizeFunction();
                    //    $scope.$apply();
                    //});
                    // Call to the function when the page is first loaded

                    var addSlide, collectionString, flexsliderDiv, getTrackFromItem, indexString, match, removeSlide, slidesItems, trackBy;

                    match = (attr.slide || attr.flexSlide).match(/^\s*(.+)\s+in\s+(.*?)(?:\s+track\s+by\s+(.+?))?\s*$/);
                    indexString = match[1];
                    collectionString = match[2];
                    trackBy = angular.isDefined(match[3]) ? $parse(match[3]) : $parse("" + indexString);
                    flexsliderDiv = null;
                    slidesItems = {};
                    getTrackFromItem = function (collectionItem, index) {
                        var locals;

                        locals = {};
                        locals[indexString] = collectionItem;
                        locals['$index'] = index;
                        return trackBy($scope, locals);
                    };
                    addSlide = function (collectionItem, index, callback) {
                        var childScope, track;

                        track = getTrackFromItem(collectionItem, index);
                        if (slidesItems[track] != null) {
                            throw "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys.";
                        }
                        childScope = $scope.$new();
                        childScope[indexString] = collectionItem;
                        childScope['$index'] = index;
                        return linker(childScope, function (clone) {
                            var slideItem;

                            slideItem = {
                                collectionItem: collectionItem,
                                childScope: childScope,
                                element: clone
                            };
                            slidesItems[track] = slideItem;
                            return typeof callback === "function" ? callback(slideItem) : void 0;
                        });
                    };
                    removeSlide = function (collectionItem, index) {
                        var slideItem, track;

                        track = getTrackFromItem(collectionItem, index);
                        slideItem = slidesItems[track];
                        if (slideItem == null) {
                            return;
                        }
                        delete slidesItems[track];
                        slideItem.childScope.$destroy();
                        return slideItem;
                    };
                    return $scope.$watchCollection(collectionString, function (collection) {
                        var attrKey, attrVal, c, currentSlidesLength, e, i, idx, n, options, slider, slides, t, toAdd, toRemove, trackCollection, _i, _j, _k, _l, _len, _len1, _len2, _len3;

                        if (!(collection != null ? collection.length : void 0)) {
                            return;
                        }
                        if (flexsliderDiv != null) {
                            slider = flexsliderDiv.data('flexslider');
                            currentSlidesLength = Object.keys(slidesItems).length;
                            if (collection == null) {
                                collection = [];
                            }
                            trackCollection = {};
                            for (i = _i = 0, _len = collection.length; _i < _len; i = ++_i) {
                                c = collection[i];
                                trackCollection[getTrackFromItem(c, i)] = c;
                            }
                            toAdd = (function () {
                                var _j, _len1, _results;

                                _results = [];
                                for (i = _j = 0, _len1 = collection.length; _j < _len1; i = ++_j) {

                                    c = collection[i];
                                    if (slidesItems[getTrackFromItem(c, i)] == null) {
                                        _results.push({
                                            value: c,
                                            index: i
                                        });
                                    }
                                }
                                return _results;
                            })();
                            toRemove = (function () {
                                var _results;

                                _results = [];
                                for (t in slidesItems) {
                                    i = slidesItems[t];
                                    if (trackCollection[t] == null) {
                                        _results.push(i.collectionItem);
                                    }
                                }
                                return _results;
                            })();
                            if ((toAdd.length === 1 && toRemove.length === 0) || toAdd.length === 0) {
                                for (_j = 0, _len1 = toRemove.length; _j < _len1; _j++) {
                                    e = toRemove[_j];
                                    e = removeSlide(e, collection.indexOf(e));
                                    slider.removeSlide(e.element);
                                }
                                for (_k = 0, _len2 = toAdd.length; _k < _len2; _k++) {
                                    e = toAdd[_k];
                                    idx = e.index;
                                    addSlide(e.value, idx, function (item) {
                                        if (idx === currentSlidesLength) {
                                            idx = void 0;
                                        }
                                        return $scope.$evalAsync(function () {
                                            return slider.addSlide(item.element, idx);
                                        });
                                    });
                                }
                                return;
                            }
                        }
                        slidesItems = {};
                        if (flexsliderDiv != null) {
                            flexsliderDiv.remove();
                        }
                        slides = angular.element('<ul class="slides"></ul>');
                        flexsliderDiv = angular.element('<div class="flexslider"></div>');
                        flexsliderDiv.append(slides);
                        $element.append(flexsliderDiv);
                        for (i = _l = 0, _len3 = collection.length; _l < _len3; i = ++_l) {
                            c = collection[i];
                            addSlide(c, i, function (item) {
                                return slides.append(item.element);
                            });
                        }
                        options = {};
                        for (attrKey in attr) {
                            attrVal = attr[attrKey];
                            if (attrKey.indexOf('$') === 0) {
                                continue;
                            }
                            if (!isNaN(n = parseInt(attrVal))) {
                                options[attrKey] = n;
                                continue;
                            }
                            if (attrVal === 'false' || attrVal === 'true') {
                                options[attrKey] = attrVal === 'true';
                                continue;
                            }
                            if (attrKey === 'start' || attrKey === 'before' || attrKey === 'after' || attrKey === 'end' || attrKey === 'added' || attrKey === 'removed') {
                                options[attrKey] = (function (attrVal) {
                                    var f;

                                    f = $parse(attrVal);
                                    return function (slider) {
                                        return $scope.$apply(function () {
                                            return f($scope, {
                                                '$slider': slider
                                            });
                                        });
                                    };
                                })(attrVal);
                                continue;
                            }
                            options[attrKey] = attrVal;
                        }
                        return $timeout((function () {
                            return flexsliderDiv.flexslider(options);
                        }), 0);
                    });
                };
            }
        };
    }
]);
;
var modalInstanceExpresscheckoutCtrl = ['$scope', 'common', '$modalInstance', '$sce',
    function ($scope, common, $modalInstance, $sce) {
        $scope.init = function () {
            $scope.Asiapayposturl = $sce.trustAsResourceUrl($scope.Asiapayposturl);
        }

        $scope.$on('closedialog', function (e, message) {
            $scope.closedialog();
        });
        $scope.$on('successCallback', function (e, message) {

            $scope.successCallback();
        });

        $scope.closedialog = function () {
            $modalInstance.close();
            $scope.$emit('failureMsg', { message: "Payment failure." });
        }

        $scope.successCallback = function () {
            $modalInstance.close();
            $scope.$emit('SuccessMsg', { message: "Payment success." });
        };

        $scope.init();
    }];
