﻿
angular.module('gbdirectives', [])
.directive('ngFocus', ['$parse', function ($parse) {
  return function (scope, element, attr) {
    var fn = $parse(attr['ngFocus']);
    element.bind('focus', function (event) {
      scope.$apply(function () {
        fn(scope, { $event: event });
      });
    });
  }
  }])
  .animation('.slide', [function () {
    return {
      // make note that other events (like addClass/removeClass)
      // have different function input parameters
      enter: function (element, doneFn) {
        jQuery(element).fadeIn(1000, doneFn);

        // remember to call doneFn so that AngularJS
        // knows that the animation has concluded
      },

      move: function (element, doneFn) {
        jQuery(element).fadeIn(1000, doneFn);
      },

      leave: function (element, doneFn) {
        jQuery(element).fadeOut(1000, doneFn);
      }
    }
  }])
  .directive('highlightOnChange', function () {
    return {
      link: function (scope, element, attrs) {
        attrs.$observe('highlightOnChange', function (val) {
          //console.log("Highlighting", val);
          element.effect('highlight');
        });
      }
    };
  })
  .directive('ngBlur', ['$parse', function ($parse) {
  return function (scope, element, attr) {
    var fn = $parse(attr['ngBlur']);
    element.bind('blur', function (event) {
      scope.$apply(function () {
        fn(scope, { $event: event });
      });
    });
  }
  }])
  .directive('routeLoadingIndicator', ['$rootScope', function ($rootScope) {
  return {
    restrict: 'E',
    template: `<div ng-show='isRouteLoading' class='loading-indicator'>
						<div class='loading-indicator-body'>
						<h3 class='loading-title'>Loading...</h3>
						<div class='spinner'><rotating-plane-spinner></rotating-plane-spinner></div>
						</div>
						</div>`,
    replace: true,
    link: function (scope, elem, attrs) {
      scope.isRouteLoading = false;

      $rootScope.$on('$routeChangeStart', function () {
        scope.isRouteLoading = true;
      });
      $rootScope.$on('$routeChangeSuccess', function () {
        scope.isRouteLoading = false;
      });
    }
  };
}])
  .directive('elemReady',['$parse', function ($parse) {
    return {
      restrict: 'A',
      link: function ($scope, elem, attrs) {
        elem.ready(function () {
          $scope.$apply(function () {
            var func = $parse(attrs.elemReady);
            func($scope);
          })
        })
      }
    }
  }])
.directive('onEnterClick', function () {
  return function (scope, element, attrs) {
    element.bind("keydown keypress focusout", function (event) {      
      if (event.which === 13 || event.type==='focusout') {
        scope.$apply(function () {
          scope.$eval(attrs.onEnterClick);
        });
        event.preventDefault();
      }
    });    
  };
})
  .directive("mgConfirmClick", [function () {
    return {
      priority: -1,
      restrict: 'A',
      scope: { confirmFunction: "&mgConfirmClick" },
      link: function (scope, element, attrs) {
        element.bind('click', function (e) {
          e.preventDefault();
          var message = attrs.mgConfirmClickMessage ? attrs.mgConfirmClickMessage : "Are you sure?";
          if (confirm(message)) {
            scope.confirmFunction();
          }
        });
      }
    }
  }])
    .directive('recommendItem', [function () {
      return {
        restrict: 'A',
        link: function (scope, element) {
          var items = parseInt(element.attr('data-items')) > 0 ? parseInt(element.attr('data-items')) : 3;
          if (scope.$last) {
            $(element.parent()).flexisel({
              visibleItems: items,
              itemsToScroll: 1,
              autoPlay: {
                enable: false,
                interval: 5000,
                pauseOnHover: true
              },
              infinite: false
            });
          }
        }
      };
    }])
    .directive('financialsItems', [function () {
        return {
            restrict: 'A',
            link: function (scope, element) {
                if (scope.$last) {
                    $(element.parent().parent().parent()).stickyTableHeaders({ fixedOffset: 140 });
                }
            }
        };
    }])
    .directive('googleAd',['$timeout', function ($timeout) {
      return {
        templateUrl: '/content/theme/ng/partials/ads.html'
      };
    }])
    .directive('enterSubmit', function () {
      return {
        restrict: 'A',
        link: function (scope, elem, attrs) {
          elem.bind('keydown', function (event) {
            var code = event.keyCode || event.which;
            if (code === 13) {
              if (!event.shiftKey) {
                event.preventDefault();
                scope.$apply(attrs.enterSubmit);
              }
            }
          });
        }
      }
    })
    .directive('onLastRepeat', function () {
      return function (scope, element, attrs) {
        if (scope.$last) setTimeout(function () {
          scope.$emit('onRepeatLast', element, attrs);
        }, 1);
      };
    })
  .directive('onFinishRender', ['$timeout', function ($timeout) {
      return {
        restrict: 'A',
        link: function (scope, element, attr) {
          if (scope.$last === true) {
            $timeout(function () {
              scope.$emit(attr.broadcasteventname ? attr.broadcasteventname : 'ngQ4RepeatFinish');
            });
          }
        }
      }
    }])
    .directive('companyHeader', function () {
      return {           
        template: "<div class=\"col-md-12 allpages\"  ng-controller=\"companyHeaderInfoCtrl\" ng-show=\"show\">"
        + "<div class=\"col-md-7 col-sm-12 col-xs-12 no-padding\"><h3><label ng-bind-html='chInfo.companyInfo.Company|grabWord'/> - <strong ng-bind-template='({{chInfo.companyInfo.Ticker}})'></strong></h3> <p class='font-12 text-bold' ng-bind-template='{{chInfo.companyInfo.StockMarket}} ({{chInfo.companyInfo.Country}})'></p>"
        + "<p><strong class='text-bold'>{{chInfo.priceInfo.ClosePrice | number:2}}</strong> <label ng-bind-html=\"chInfo.priceInfo.ChangePer|successhtml\"></label> <label ng-class=\"chInfo.priceInfo.Change|successclass\" ng-bind-template=\"{{chInfo.priceInfo.Change}} ({{chInfo.priceInfo.ChangePer|number:2|suffix:'%'}})\"/> {{'lblLastUpdate'|getLabel}} {{chInfo.priceInfo.PriceDate.slice(6,-2)|date:'dd/MM/yyyy HH:mm'}} {{'lblKSA'|getLabel}} </p>"
        + "</div><div class=\"col-md-5 col-sm-12 col-xs-12 padding-top-20\">"
        + "<div class=\"form-group\"><div class=\"\"><div class='col-md-4 no-padding text-right'><label class='margin-right-5' style='margin-top:7px;' ng-bind-template=\"{{'lblSwitchToOtherCompany'|getLabel}}\">Switch to Other Company</label></div>"
        + "<div class='col-md-8 no-padding'> <angucomplete-alt id=\"drp-profile-summary-nav\" placeholder=\"{{'lblSearchCompanies'|getLabel}}\" pause=\"300\" minlength=\"1\" selected-object=\"callback\" remote-url=\"{{'company/SearchCompany/?searchText='|getCompanyURL}}\" remote-url-data-field=\"results\" title-field=\"Dispay\" description-field=\"Ticker, StockTicker\" match-class=\"highlight\" focus-in=\"focusIn()\" focus-out=\"focusOut()\" input-class=\"form-control-small\" /></div>"
        + "<div class='col-md-0 no-padding'><a class=\"btn-profile-nav ng-hide\" ng-href=\"{{url}}\">Navigate</a></div></div><div ng-show='companyMessage.length>0' class=\"alert alert-warning\"> <a href=\"#\" class=\"close\" data-dismiss=\"alert\">&times;</a><strong>Warning!</strong> {{companyMessage}}</div></div></div><div class=\"visible-md visible-sm visible-xs space-10\"></div>"
        };
    })
    .directive('companySidebar', function () {        
        return {                      
          template:"<div class=\"company-sidebar accordion\" ng-controller=\"companySideBarCtrl\">"
                  +"<div class=\"option\"><label class=\"title1\"><a ng-class=\"aname === 'companyprofile'?'activemenu':''\" ng-href='{{sideBarURLs.Profile_Url|getURL}}'>{{'lblProfileSummary'|getLabel}}</a></label></div><div class=\"option\"><input type=\"checkbox\" id=\"toggle2\" class=\"toggle\" ng-checked=\"isStockInfo?'checked':''\" /><label class=\"title\" for=\"toggle2\">"
                  +"{{'lblStockInfo'|getLabel}}</label><div class=\"content\"><ul><li><a ng-class=\"aname === 'priceperformance'?'activemenu':''\" ng-href='{{sideBarURLs.PricePerformance_URL|getURL}}'>{{'lblPricePerformance'|getLabel}}</a></li><li><a ng-class=\"aname === 'performancecomparison'?'activemenu':''\" ng-href='{{sideBarURLs.PerformanceComparison_URL|getURL}}'>{{'lblPerformanceComparison'|getLabel}}</a></li><li><a ng-class=\"aname === 'technicalanalysis'?'activemenu':''\" ng-href='{{sideBarURLs.TechnicalAnalysis_URL|getURL}}'>{{'lblTechnicalAnalysis'|getLabel}}</a></li></ul></div></div><div class=\"option\"><input type=\"checkbox\" id=\"toggle3\" class=\"toggle\" ng-checked=\"isFinancials\" /><label class=\"title\" for=\"toggle3\">"
                  +"{{'lblFinancials'|getLabel}}"
                  + "</label><div class=\"content\"><ul><li><a ng-class=\"aname === 'keydata'?'activemenu':''\" ng-href='{{sideBarURLs.KeyData_URL|getURL}}'>{{'lblKeyData'|getLabel}}</a></li><li><a ng-class=\"aname === 'financials'?'activemenu':''\" ng-href='{{sideBarURLs.Financials_URL|getURL}}'>{{'lblFinancialStatements'|getLabel}}</a></li><li><a ng-class=\"aname === 'scorecard'?'activemenu':''\" ng-href='{{sideBarURLs.ScoreCard_URL|getURL}}'>{{'lblScoreCard'|getLabel}}</a></li><li><a ng-class=\"aname === 'ratioanalysis'?'activemenu':''\" ng-href='{{sideBarURLs.RatioAnalysis_URL|getURL}}'>{{'lblRatioAnalysis'|getLabel}}</a></li><li><a ng-class=\"aname === 'historicaldividends'?'activemenu':''\" ng-href='{{sideBarURLs.HistoricalDividends_URL|getURL}}'>{{'lblHistoricalDividends'|getLabel}}</a></li><li><a ng-class=\"aname === 'factsheet'?'activemenu':''\" ng-href='{{sideBarURLs.Factsheet_URL|getURL}}'>{{'lblFactSheet'|getLabel}}</a></li></ul></div></div>"
                  +"<div class=\"option\"><label class=\"title1\"><a ng-class=\"aname === 'recommendations'?'activemenu':''\" ng-href='{{sideBarURLs.Recommendations_URL|getURL}}'>{{'lblRecommendations'|getLabel}}</a></label></div>"
                  +"<div class=\"option\"><input type=\"checkbox\" id=\"toggle4\" class=\"toggle\" ng-checked=\"isCompanyInfo\" /><label class=\"title\" for=\"toggle4\">"
                  +"{{'lblCompanyInfo'|getLabel}}"
          + "</label><div class=\"content\"><ul><li><a ng-class=\"aname === 'meetings'?'activemenu':''\" ng-href='{{sideBarURLs.Meetings_URL|getURL}}'>{{'lblMeetings'|getLabel}}</a></li><li ng-show='sideBarURLs.BranchesCount>0'><a ng-class=\"aname === 'branches'?'activemenu':''\" ng-href='{{sideBarURLs.Branches_URL|getURL}}'>{{'lblBranches'|getLabel}}</a></li><li ng-show='sideBarURLs.SubsidiaryCount>0'><a ng-class=\"aname === 'freesubsidiary'?'activemenu':''\" ng-href='{{sideBarURLs.Subsidiary_URL|getURL}}'>{{'lblSubsidiary'|getLabel}}</a></li><li><a ng-class=\"aname === 'newsannouncements'?'activemenu':''\" ng-href='{{sideBarURLs.News_Ann_URL|getURL}}'>{{'lblNewsAndAnnouncements'|getLabel}}</a></li><li><a ng-class=\"aname === 'eventcalendar'?'activemenu':''\" ng-href='{{sideBarURLs.EventCalendar_URL|getURL}}'>{{'lblEventCalendar'|getLabel}}</a></li></ul></div></div><div  ng-show='sideBarURLs.FundsCount>0' class=\"option\"><label class=\"title1\"><a ng-class=\"aname === 'mutualfund'?'activemenu':''\" ng-href='{{sideBarURLs.MutualFund_URL|getURL}}'>{{'lblMutualFund'|getLabel}}</a></label></div></div><div class=\"visible-md visible-sm visible-xs space-10\"></div>"
        };
  })
    .directive('customRanger',[function () {
        return  {
          restrict: 'E',
          link: function (scope, element, attributes) {
            scope.scaleModel = jQuery.parseJSON(attributes["rangemodel"]);
          
            let divWidth = scope.scaleModel.High > 0 && (scope.scaleModel.High - scope.scaleModel.Low) > 0 ? (scope.scaleModel.High - scope.scaleModel.Low) / 100 : 0;
            let actualWidth = (scope.scaleModel.High - scope.scaleModel.Low) != 0 ? ((scope.scaleModel.Val - scope.scaleModel.Low) / (scope.scaleModel.High - scope.scaleModel.Low)) * 100 : 0;
              actualWidth = actualWidth > 100 ? 100 : actualWidth;  
              scope.actualWidth = actualWidth;
          },       
          template: function (elem, attr) {                   
              return `<div class="scale-parent-wrapper"><table class="width-100p"><tbody class="no-border">
             <!--<tr>
              <td colspan="2"><small class="pull-left">{{scaleModel.LowLabel}}</small></td>
              <td colspan="2"><small class="pull-right">{{scaleModel.HighLabel}}</small></td>
              </tr>-->
               <tr>
                <td colspan="4"><div style="width:{{actualWidth}}%" class="value-wrapper"><span class="pull-right font-9">{{scaleModel.Val|WNOrDec:2}}</span></div></td>
              </tr> 
              <tr>
                <td style="height:22px;" colspan="4"><div class="scale-wrapper"><div style="width:{{actualWidth}}%" class="inner-wrapper"><i class="fa fa-circle pull-right"></i></div></div></td>
              </tr>
              <tr>
               <td style="height:20px;vertical-align:middle;" colspan="2"><small class="pull-left" ng-bind="scaleModel.Low|WNOrDec:2"></small></td>
                <td style="height:20px;vertical-align:middle;" colspan="2"><small class="pull-right" ng-bind="scaleModel.High|WNOrDec:2"></small></td>
              </tr></tbody>
              </table></div>`
          }          
      };
  }])
  .directive('marketDataScreenerCustomRanger', [function () {
    return {
      restrict: 'E',
      link: function (scope, element, attributes) {
        scope.scaleModel = jQuery.parseJSON(attributes["rangemodel"]);

        let divWidth = scope.scaleModel.High > 0 && (scope.scaleModel.High - scope.scaleModel.Low) > 0 ? (scope.scaleModel.High - scope.scaleModel.Low) / 100 : 0;
        let actualWidth = (scope.scaleModel.High - scope.scaleModel.Low) != 0 ? ((scope.scaleModel.Val - scope.scaleModel.Low) / (scope.scaleModel.High - scope.scaleModel.Low)) * 100 : 0;
        actualWidth = actualWidth > 100 ? 100 : actualWidth;
        scope.actualWidth = actualWidth;
      },
      template: function (elem, attr) {
        return `<div class="scale-parent-wrapper"><table class="width-100p"><tbody class="no-border">
             <!--<tr>
              <td colspan="2"><small class="pull-left">{{scaleModel.LowLabel}}</small></td>
              <td colspan="2"><small class="pull-right">{{scaleModel.HighLabel}}</small></td>
              </tr>
               <tr>
                <td colspan="4"><div style="width:{{actualWidth}}%" class="value-wrapper"><span class="pull-right font-9">{{scaleModel.Val|WNOrDec:2}}</span></div></td>
              </tr> -->
              <tr>
                <td style="height:22px;" colspan="4"><div class="scale-wrapper"><div style="width:{{actualWidth}}%" class="inner-wrapper"><i class="fa fa-circle pull-right"></i></div></div></td>
              </tr>
              <tr>
               <td style="height:20px;vertical-align:middle;" colspan="2"><small class="pull-left" ng-bind="scaleModel.Low|WNOrDec:2"></small></td>
                <td style="height:20px;vertical-align:middle;" colspan="2"><small class="pull-right" ng-bind="scaleModel.High|WNOrDec:2"></small></td>
              </tr></tbody>
              </table></div>`
      }
    };
  }])
    .directive('companyAnalyticsSidebar', function () {

      return {
        template: `
        <div class="company-sidebar accordion" ng-controller="companyAnalyticsSideBarCtrl">
          <div class="option ng-hide">
            <label class="title1"><a ng-class="aname === 'marketvaluation'?'activemenu':''" ng-href='{{sideBarURLs.marketValuationURL|getURL}}'>{{'lblMarketValuationDrillDown'|getLabel}}</a></label>
          </div>
        <div class="option">
            <input type="checkbox" id="toggle2" class="toggle" ng-checked="isBubbleChartAnalysis?'checked':''" />
            <label class="title" for="toggle2">{{'lblBubbleChartAnalysis'|getLabel}}</label>
        <div class="content">
            <ul>
              <li class='padding-left-15 padding-right-5'><a ng-class="aname === 'marketvaluation'?'activemenu':''" ng-href='{{sideBarURLs.marketValuationURL|getURL}}'>{{'lblMarketValuationDrillDown'|getLabel}}</a></li>   
              <li class='padding-left-15 padding-right-5'><a ng-class="aname === 'marketvaluationscreener'?'activemenu':''" ng-href='{{sideBarURLs.marketValuationScreenerURL|getURL}}'>{{'lblMarketValuationScreener'|getLabel}}</a></li>
            </ul>
        </div>
        </div>
        <div class="option">
          <input type="checkbox" id="toggle3" class="toggle" ng-checked="isAramcoIndicators" />
          <label class="title" for="toggle3">{{'lblAramcoIndicators'|getLabel}}</label>
          <div class="content">
              <ul>
                <li class="indicator-li" ng-repeat="ind in indHeadings.headings"><a ng-click="loadAramcoIndicator($event,ind.ESDFactID)" ng-class="ratioId===ind.ESDFactID? 'activemenu':'' " ng-href='{{ind.URL|getURL}}'>{{ind.ESDFact}}</a></li>
              </ul>
          </div>
        </div>
        <div class="option ng-hide">
          <label class="title1"><a ng-class="aname === 'recommendations'?'activemenu':''" ng-href='{{sideBarURLs.Recommendations_URL|getURL}}'>{{'lblRecommendations'|getLabel}}</a></label>
        </div>
        <div class="option ng-hide">  
          <input type="checkbox" id="toggle4" class="toggle" ng-checked="isCompanyInfo" />
          <label class="title" for="toggle4">{{'lblCompanyInfo'|getLabel}}</label>
        <div class="content">
            <ul>
            
            
            </ul>
          </div>
        </div>
          <div class="option ng-hide"><label class="title1"><a ng-class="aname === 'customizablechart'?'activemenu':''" ng-href='{{sideBarURLs.customizableChartURL|getURL}}'>{{'lblCustomizableChart'|getLabel}}</a></label></div>
      
      </div>`
      };
    })
    .directive('generalSearchControl', ['$timeout', function ($timeout) {
          return {
              //template: "<div class='topbar' ng-controller='generalSearchCtrl'> "
              //    + "<div class='searchdiv'> <div class='inlineblock searchcontainer topBarSearch'>"
              //    + " <form method='post' enctype='application/x-www-form-urlencoded' ng-submit='gsearch_click($event)'>"
              //    + " <div class='input-group stylish-input-group'>"
              //    + " <input type='text' class='form-control BorderPadding' placeholder='GulfBase Search' ng-click='loadData()'"
              //    + " ng-keyup='loadData()' ng-model='search_text' autocomplete='off' value='' autofocus> <span class='input-group-addon'>"
              //    + " <button ng-show='focus==1 || focus==0'> <span class='glyphicon glyphicon-search'></span> </button>"
              //    + " <button ng-show='focus==2' ng-click=\"search_text='';focus=1\"> <i class='glyphicon glyphicon-remove'></i> "
              //    + "</button> </span> </div></form> </div><div class='searchresults' style='display:none;' ng-show='focus>=1'>"
              //    + " <ul class='nav nav-tabs nav-results' ng-show='focus==2'>"
              //    + " <li ng-click=\"gsTabChange('all')\" ng-class=\"currentTab=='all' ?'active':null\" data-name='-1'>"
              //    + "<a class='cursor-pointer' data-toggle='tab'>All</a></li>"
              //    + "<li ng-click=\"gsTabChange('equities')\" ng-class=\"currentTab=='equities' ?'active':null\" data-name='equities'>"
              //    + "<a class='cursor-pointer' data-toggle='tab'>Equities</a></li>"
              //    + "<li ng-click=\"gsTabChange('indices')\" ng-class=\"currentTab=='indices' ?'active':null\" data-name='indices'>"
              //    + "<a class='cursor-pointer' data-toggle='tab'>Indices</a></li>"
              //    + "<li ng-click=\"gsTabChange('commodities')\" ng-class=\"currentTab=='commodities' ?'active':null\" data-name='commodities'>"
              //    + "<a class='cursor-pointer' data-toggle='tab'>Commodities</a></li>"
              //    + "<li ng-click=\"gsTabChange('funds')\" ng-class=\"currentTab=='funds' ?'active':null\" data-name='funds'>"
              //    + "<a class='cursor-pointer' data-toggle='tab'>Funds</a></li></ul>"
              //    + " <ul class='nav nav-tabs nav-popular ng-hide' ng-init='focus=0' ng-show='focus==1'> "
              //    + "<li><h4>Recent Searches</h4></li></ul> "
              //    + "<div class='tab-content nicescroll no-padding search-tab-content'> "
              //    + "<div id='ps' class='min-height-30' ng-show='focus==1'> <div ng-show='loading' class='showLoading'>"
              //    + "<img src='/Content/theme/images/loading-bar.gif'/> Please wait...</div>"
              //    + "<table ng-show='!loading' class='table table-condensed table-hover tbl-search table-search'> <tbody>"
              //    + " <tr ng-repeat='ps in psResults'> <td ng-click='gsearch_sr_click(ps)' class='cursor-pointer'>{{ps.Name}}</td>"
              //    + "<td ng-if='ps.URL==null'>{{ps.Ticker}}</td>"
              //    + "<td ng-if='ps.URL!=null'><a href='{{ps.URL}}'>{{ps.Ticker}}</a></td></tr>"
              //    + "</tbody> </table> </div><div id='all' class='min-height-30' ng-show='focus==2'> <div ng-show='loading' class='showLoading'>"
              //    + "<img src='/Content/theme/images/loading-bar.gif'/> Please wait...</div>"
              //    + "<table ng-show='!loading' class='table table-condensed table-hover tbl-search table-search'"
              //    + " <tbody> <tr ng-repeat='sr in searchResults'>"
              //    + " <td ng-click='gsearch_sr_click(sr)' class='cursor-pointer'>{{sr.Name}}</td>"
              //    + "<td ng-if='sr.URL==null'>{{sr.Ticker}}</td>"
              //    + "<td ng-if='sr.URL!=null'><a href='{{sr.URL}}'> {{sr.Ticker}}</a></td></tr></tbody> </table>"
              //    + " </div></div><div class='searchResultsFooter'> <a href='/'> <i class='fa fa-angle-double-right'></i> </a>"
              //    + "</div></div><div class='clear'></div></div></div>",
              //templateUrl:"/content/ng/partials/modal.html"
              templateUrl:"/content/theme/ng/partials/search.html"
          };
      }])
    .directive('datadate', function () {
        return function (scope, element, attr) {
            $timeout(function () {
                element.val("data-date = " + scope.$eval(attr.val));
            });
        }
    })
    .directive('blankAnchorTarget', function () {
        return {
            restrict: 'A',
            link: function (scope, elem, attrs) {
                var a = elem[0];
                if (a.hostname != location.host)
                    a.target = '_blank';
            }
        }
    })
    .directive('popup', function () {
        return {
            restrict: 'A',
            require: 'ngModel',
            scope: {
                ngModel: '=',
                options: '=popup'
            },
            link: function (scope, element) {
                scope.$watch('ngModel', function (val) {
                    element.attr('data-content', val);
                });

                var options = scope.options || {};

                var title = options.title || null;
                var placement = options.placement || 'right';
                var html = options.html || false;
                var delay = options.delay ? angular.toJson(options.delay) : null;
                var trigger = options.trigger || 'hover';

                element.attr('title', title);
                element.attr('data-placement', placement);
                element.attr('data-html', html);
                element.attr('data-delay', delay);
                element.popover({ trigger: trigger });
            }
        };
    })
    .directive('scrolly', function () {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            var raw = element[0];      
            element.bind('scroll', function () {             
                if (raw.scrollTop + raw.offsetHeight >= raw.scrollHeight) {
                    scope.$apply(attrs.scrolly);
                }
            });
        }
    };
    })
    .directive('validNumber', function () {
    return {
        require: '?ngModel',
        link: function (scope, element, attrs, ngModelCtrl) {
            if (!ngModelCtrl) {
                return;
            }

            ngModelCtrl.$parsers.push(function (val) {
                if (angular.isUndefined(val)) {
                    var val = '';
                }
                var clean = val.replace(/[^0-9\.]/g, '');
                var decimalCheck = clean.split('.');

                if (!angular.isUndefined(decimalCheck[1])) {
                    decimalCheck[1] = decimalCheck[1].slice(0, 2);
                    clean = decimalCheck[0] + '.' + decimalCheck[1];
                }

                if (val !== clean) {
                    ngModelCtrl.$setViewValue(clean);
                    ngModelCtrl.$render();
                }
                return clean;
            });

            element.bind('keypress', function (event) {
                if (event.keyCode === 32) {
                    event.preventDefault();
                }
            });
        }
    };
    })
    .directive("datepicker", function () {
        return {
            restrict: "A",
            require: "ngModel",
            link: function (scope, elem, attrs, ngModelCtrl) {
                var updateModel = function (dateText) {
                    scope.$apply(function () {
                        ngModelCtrl.$setViewValue(dateText);
                    });
                };
                var options = {
                    dateFormat: "mm/dd/yy",
                    onSelect: function (dateText) {
                        updateModel(dateText);
                    }
                };
                elem.datepicker(options);
            }
        }
  })
    .directive('fileModel', ['$parse', function ($parse) {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {
                var model = $parse(attrs.fileModel);
                var modelSetter = model.assign;

                element.bind('change', function () {
                    scope.$apply(function () {
                        modelSetter(scope, element[0].files[0]);
                    });
                });
            }
        };
  }])
    .factory('urlToBase64', ['$q', function ($q) {

    var obj = {};
    // function to convert URL to Base64 representation
    function URLtoBase64(url, callback) {
      var defer = $q.defer();

      var img = new Image();
      img.crossOrigin = 'Anonymous';
      img.onload = function () {
        var canvas = document.createElement('CANVAS');
        var ctx = canvas.getContext('2d');
        canvas.height = this.height;
        canvas.width = this.width;
        ctx.drawImage(this, 0, 0);
        try {
          defer.resolve(canvas.toDataURL());
        } catch (e) {
          defer.reject(e);
        }
        canvas = null;
      };
      img.src = url;

      return defer.promise;
    }

    obj.getData = URLtoBase64;
    return obj;
  }])
  ;