/*global angular, moment */
/*jshint globalstrict: true*/
(function () {
    'use strict';

}());
angular.module('labelApp')
    .directive('mobile', function () {
        return {
            require: 'ngModel',
            link: function (scope, elem, attrs, ctrl) {
                ctrl.$parsers.unshift(function (value) {
                    ctrl.$setValidity('invalidMobile', true);

                    var regexp2 = /^[0-9+](?!.*\++)(?!.*--)[0-9 +-]+[^a-z-`^~<>,."'](\d)(?!0\1+$)\d{2}$/;// /^[0-9+](?!.*\++)(?!.*--)[0-9 +-]+[^a-z-`^~<>,"'](\d)(?!\1+$)\d{5}$/      // /^[0-9+](?!.*\++)(?!.*--)[0-9 +-]+[^-]$/ 
                    if (value != "" && !regexp2.test(value)) {
                        ctrl.$setValidity('invalidMobile', false);
                        return value;
                    }

                    return value;
                });
            }
        };
    })
    .directive('email', function () {
        return {
            require: 'ngModel',
            link: function (scope, elem, attrs, ctrl) {
                ctrl.$parsers.unshift(function (value) {

                    ctrl.$setValidity('invalid', true);

                    if (value && value.trim().length > 0) {
                        var regexp2 = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

                        if (!regexp2.test(value)) {
                            ctrl.$setValidity('invalid', false);
                        }
                    }

                    return value;
                });
            }
        };
    })
    .directive('date', ['$filter', function ($filter) {
        return {
            require: 'ngModel',

            link: function ($scope, $element, $attrs, $ctrl, ngModel) {
                var val = "";
                var dateFormat = 'dd/MM/yyyy';
                var regexp2 = /(^(((0?[1-9]|[12][0-8])[\/](0?[1-9]|1[012]))|((29|30|31)[\/](0?[13578]|1[02]))|((29|30)[\/](0?[4,6,9]|11)))[\/](19|[2-9][0-9])\d\d$)|(^29[\/]0?2[\/](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)/;
                var today = new Date();
                var dd = today.getDate();
                var mm = today.getMonth() + 1;
                var yyyy = today.getFullYear();

                if (dd < 10) {
                    dd = '0' + dd
                }

                if (mm < 10) {
                    mm = '0' + mm
                }

                today = dd + '/' + mm + '/' + yyyy;
                var arrStartDate = today.split("/");
                var presentDate = new Date(arrStartDate[2], arrStartDate[1], arrStartDate[0]);

                $ctrl.$parsers.push(function (viewValue) {
                    val = viewValue;
                    $ctrl.$setValidity('invalid', true);
                    if (viewValue != null) {
                        var arrEndDate = viewValue.split("/");
                        var enterDate = new Date(arrEndDate[2], arrEndDate[1], arrEndDate[0]);

                        var pDate = moment(viewValue, "DD/MM/YYYY");//Date.parse(viewValue);


                        if (isNaN(pDate) == false || regexp2.test(viewValue) == true || presentDate > enterDate) {
                            return new Date(pDate);
                        }
                    }
                    return undefined;

                });
                $ctrl.$formatters.push(function (modelValue) {
                    var pDate = Date.parse(modelValue);
                    if (isNaN(pDate) === false) {
                        return $filter('date')(new Date(pDate), dateFormat);
                    }
                    return undefined;
                });
                $element.on('blur', function () {
                    if (val != null && val != '') {
                        var dateValue = val.split('/');
                        var dateForm = new Date(dateValue[2], dateValue[1] - 1, dateValue[0])
                        var enterDate = new Date(dateValue[2], dateValue[1], dateValue[0]);
                        var pDate = Date.parse(dateForm, "DD/MM/YYYY");
                        if (isNaN(pDate) == true || regexp2.test($ctrl.$viewValue) == false || presentDate < enterDate) {
                            $ctrl.$setValidity('invalid', false);
                            $ctrl.$setViewValue(null);
                            $ctrl.$render();
                        } else {
                            var values = $filter('date')(new Date(pDate), dateFormat).toString();
                            //$ctrl.$$rawModelValue = new Date(pDate);
                            //$ctrl.$modelValue = new Date(pDate);
                            $ctrl.$setViewValue(values);
                            $ctrl.$render();

                            // $scope.apply();

                            // ngModel.$setViewValue
                        }
                    }


                });

            }
        }
    }])

    .directive('currencyInput', ['$filter', '$browser', function ($filter, $browser) {
        return {
            require: 'ngModel',
            link: function ($scope, $element, $attrs, ngModelCtrl) {
                var listener = function () {
                    var value = $element.val().replace(/,/g, '');

                    $element.val($filter('number')(value))

                }

                // This runs when we update the text field
                ngModelCtrl.$parsers.push(function (viewValue) {
                    return viewValue.replace(/,/g, '');
                })

                // This runs when the model gets updated on the scope directly and keeps our view in sync
                ngModelCtrl.$render = function () {

                    $element.val($filter('number')(ngModelCtrl.$viewValue))


                }

                $element.bind('change', listener)
                $element.bind('keydown', function (event) {
                    var key = event.keyCode
                    // If the keys include the CTRL, SHIFT, ALT, or META keys, or the arrow keys, do nothing.
                    // This lets us support copy and paste too
                    if (key == 91 || (15 < key && key < 19) || (37 <= key && key <= 40))
                        return
                    $browser.defer(listener) // Have to do this or changes don't get picked up properly
                })

                $element.bind('paste cut', function () {
                    $browser.defer(listener)
                })
            }

        }
    }])
    .directive('text', function () {
        return {
            require: 'ngModel',
            link: function (scope, elem, attrs, ctrl) {
                ctrl.$parsers.unshift(function (value) {
                    ctrl.$setValidity('invalid', true);
                    if (ctrl.$name == "Current_Insurer") {
                        if (value && value.trim().length > 0) {
                            var regexp2 = /^[a-zA-Z,.&\- ]*$/;

                            if (!regexp2.test(value)) {
                                ctrl.$setValidity('invalid', false);
                            }
                        }

                        return value;
                    }
                    else if (ctrl.$name == "Broker_Feedback") {
                        if (value && value.trim().length > 0) {
                            var regexp2 = /^[a-zA-Z0-9,.@#\-/!$%^&*()_=+~`'"><|?;:{} ]*$/;

                            if (!regexp2.test(value)) {
                                ctrl.$setValidity('invalid', false);
                            }
                        }

                        return value;
                    }
                    else {

                        if (value && value.trim().length > 0) {
                            var regexp2 = /^[a-zA-Z ]*$/;

                            if (!regexp2.test(value)) {
                                ctrl.$setValidity('invalid', false);
                            }
                        }

                        return value;
                    }
                });
            }
        };
    })


.directive('notzero', function () {
    return {
        require: 'ngModel',
        link: function (scope, elem, attrs, ctrl) {
            ctrl.$parsers.unshift(function (value) {

                ctrl.$setValidity('invalid', true);

                if (value < 1) {
                    ctrl.$setValidity('invalid', false);
                }

                return value;
            });
        }
    };
})


    .directive('mypopover', ['$compile', '$templateCache', function ($compile, $templateCache) {

        var getTemplate = function (contentType) {
            var template = '';
            switch (contentType) {
                case 'Specific_Items':
                    template = $templateCache.get("templateId.html");
                    break;
                case 'Building_BuildingReplacementValue':
                    template = $templateCache.get("templateId2.html");
                    break;
                case 'agreement':
                    template = $templateCache.get("templateId3.html");
                    break;
                case 'Theft_by_tenant':
                    template = $templateCache.get("templateLAndlordId1.html");
                    break;
                case 'Rent_default':
                    template = $templateCache.get("templateLAndlordId2.html");
                    break;
                case 'Loss_of_rent':
                    template = $templateCache.get("templateLAndlordId3.html");
                    break;
                default:
                    template = $templateCache.get("templateId1.html");
                    break;
            }
            return template;
        }
        return {
            restrict: "A",
            scope: {
                contentType: '@',
                title: '@'
            },
            link: function (scope, element, attrs) {

                var popOverContent;
                var arr = attrs.questioncode;

                popOverContent = getTemplate(attrs.questioncode);

                popOverContent = $compile("<div>" + popOverContent + "</div>")(scope)
                var options = {

                    content: popOverContent,
                    container: 'body',
                    placement: "right",
                    html: true,
                    trigger: "hover",
                    date: scope.arr
                };

                $(element).popover(options);
            }
        };
    }])
    .directive('scrollIf', function () {
        return function (scope, element, attributes) {
            setTimeout(function () {
                if (scope.$eval(attributes.scrollIf)) {
                    window.scrollTo(0, element[0].offsetTop - 100)
                }
            });
        }
    })
    .directive('mdAutocompleteRequired', ['$timeout', function ($timeout) {
        return {
            restrict: 'A',
            require: '^form',
            link: function (scope, element, attr, ctrl) {
                $timeout(function () {
                    var realModel,
                        elemCtrl = ctrl[attr.mdInputName],
                        realValidation = function (model) {
                            elemCtrl.$setValidity('selectedItem', !!realModel);
                            return model;
                        };
                    if (!!attr.mdSelectedItem && !!attr.mdInputName) {
                        scope.$watchCollection(attr.mdSelectedItem, function (obj) {
                            realModel = obj;
                            realValidation()
                        });
                        elemCtrl.$parsers.push(realValidation);
                    }
                })
            }
        }
    }])
    .directive('scrollOnClick', function () {
        return {
            restrict: 'EA',

            link: function (scope, $elm) {
                $(window).scroll(function () {
                    if ($(this).scrollTop() > 300) {
                        $('.scrollup').fadeIn();
                    } else {
                        $('.scrollup').fadeOut();
                    }
                });
                $elm.on('click', function () {
                    document.getElementById("onTop").scrollIntoView();
                    $('html, body').scrollTop();
                    //  $window.scrollTo(0, angular.element('onTop').offsetTop); 
                    $('html, body').animate({ scrollTop: 0 }, 'slow');
                });
            }
        }
    })
    .directive("datepicker", function () {
        return {
            restrict: "A",
            require: "ngModel",
            link: function (scope, elem, attrs, ngModelCtrl) {
                var updateModel = function (dateText) {
                    scope.$apply(function () {
                        ngModelCtrl.$setViewValue(dateText);
                        ngModelCtrl.$render();
                    });
                };
                var options = {
                    dateFormat: "dd/mm/yy",
                    changeMonth: true,
                    changeYear: true,
                    yearRange: "-117:+0",
                    maxDate: "+0w",
                    defaultDate: "01/01/1980",

                };
                // ngModelCtrl.ctrl.$setViewValue(dateSet);
                $(elem).datepicker(options);
            }
        }
    })
.directive('ngRightClick', function ($parse) {
    return function (scope, element, attrs) {
        var fn = $parse(attrs.ngRightClick);
        element.bind('contextmenu', function (event) {
            scope.$apply(function () {
                event.preventDefault();
                fn(scope, { $event: event });
            });
        });
    };
})
.directive('numbersOnly', function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attr, ngModelCtrl) {

            function fromUser(text) {
                if (text) {
                    debugger
                    var transformedInput = '';
                    if (text.length > 2) {
                        transformedInput = '';
                    }
                    else if (text > 10 || text < 0) {
                        transformedInput = '';//text.replace(/[0-9]/g, '');
                    } else {
                        transformedInput = text.replace(/[^0-9]/g, '');
                    }

                    if ((transformedInput !== text)) {
                        ngModelCtrl.$setViewValue(transformedInput);
                        ngModelCtrl.$render();
                    }
                    return transformedInput;
                }
                return undefined;
            }
            ngModelCtrl.$parsers.push(fromUser);
        }
    };
});


(function () {
    'use strict';

    angular.module('labelApp', [])
      .directive('loading', function () {
          return {
              restrict: 'E',
              scope: {
                  show: '=?'
              },
              replace: true,
              template: '<div class="loading"><img src="image/ajax-loader.gif" width="20" height="20" />LOADING...</div>',
              link: function (scope, element, attr) {
                  //console.log("show" + show);
                  //console.log("loading" + val);
                  /*
                  scope.$watch('loading', function (val) {
                      if (val)
                          $(element).show();
                      else
                          $(element).hide();
                  });
                  */
              }
          }
      })
});
