/* Copyright 2005-2015 Alfresco Software, Ltd.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
'use strict';

angular.module('flowableAdminApp')
    .directive('autoFocus', ['$timeout', function($timeout) {
        return {
            restrict: 'AC',
            link: function(_scope, _element) {
                $timeout(function(){
                    _element[0].focus();
                }, 100);
            }
        };
    }])
    .directive('loadingIndicator', ['$translate', function($translate) {
        return {
            restrict: 'E',
            template: '<div class=\'loading pull-right\' ng-show=\'status.loading\'><div class=\'l1\'></div><div class=\'l2\'></div><div class=\'l2\'></div></div>'
        };
    }])
    .directive('activeMenu', ['$translate', function($translate) {
        return {
            restrict: 'A',
            link: function(scope, element, attrs, controller) {
                var language = attrs.activeMenu;

                scope.$watch(function() {
                    return $translate.uses();
                }, function(selectedLanguage) {
                    if (language === selectedLanguage) {
                        element.addClass('active');
                    } else {
                        element.removeClass('active');
                    }
                });
            }
        };
    }])
    .directive('activeLink', ['$location', function(location) {
        return {
            restrict: 'A',
            link: function(scope, element, attrs, controller) {
                var clazz = attrs.activeLink;
                var path = attrs.href;
                path = path.substring(1); //hack because path does bot return including hashbang
                scope.location = location;
                scope.$watch('location.path()', function(newPath) {
                    if (path === newPath) {
                        element.addClass(clazz);
                    } else {
                        element.removeClass(clazz);
                    }
                });
            }
        };
    }])
    .directive('hourChart', [function () {
        return {
            restrict: 'E',
            templateUrl: 'views/monitoring-hour-chart.html',
            scope: {
                model : '=model',
            },
            link: function ($scope, element, attributes) {
            }
        };
    }])
    .directive('weekdayChart', [function () {
        return {
            restrict: 'E',
            templateUrl: 'views/monitoring-weekday-chart.html',
            scope: {
                model : '=model',
            },
            link: function ($scope, element, attributes) {
            }
        };
    }])
    /** Typeahead scroll hack
     *  directive used in typeahead custom template that enables scrolling 
     *  Must be used in the outer most element of the template and
     *  passed it's index typeahedScrollItem="$parent.$index" */
    .directive('typeaheadScrollItem', function($timeout) {
        return {link: function(scope, element, attrs) {
        
            scope.$watch(attrs.typeaheadScrollItem, function (index) {
                scope.myIndex = index; // this element's index
            
                if (index === 0) { // if first item scroll to top
                    $timeout(function(){
                        element.parent().parent().scrollTop(0);
                    }, 100);
                }
            });
        
            // listen when parent's active index changes
            scope.$parent.$watch('active', function (active) {
                if (scope.myIndex === active) { // if this is the active item
                    var liElement = element.parent();
                    var ulElement = liElement.parent();
                    var elementTop = liElement.offset().top;
                    var minTop = ulElement.offset().top;
                    var maxTop = minTop + ulElement.height();
                    if(!(elementTop > minTop && elementTop < maxTop)) {
                        liElement[0].scrollIntoView();
                    }
                }
            });
        }};
    })
    // Form field preview
    .directive('fieldPreview', ['RecursionHelper', function (RecursionHelper) {
    return {
        restrict: 'E',
        templateUrl: 'views/field-preview-template.html',
        transclude: false,
        scope: {
            field: '=',
            customFieldTemplates: '='
        },
        compile: function (element) {
            return RecursionHelper.compile(element, this.link);
        },
        link: function ($scope, $element, attributes) {
            
            $scope.getHtmlTemplate = function(field) {
                return $scope.customFieldTemplates[field.type];
            };
            
            // initialize dynamic table if field's type is dynamic-table
            // or references a dynamic table
            
            if ($scope.field.type === 'dynamic-table') {
                if ($scope.field.columnDefinitions && $scope.field.columnDefinitions.length > 0) {
                    initializeDynamicTable($scope.field.columnDefinitions);
                }
            } else if ($scope.field.type === 'readonly') {
                if ($scope.field.params && $scope.field.params.field.columnDefinitions && $scope.field.params.field.columnDefinitions.length > 0) {
                    initializeDynamicTable($scope.field.params.field.columnDefinitions);
                }
            }
            
            function initializeDynamicTable (columnDefinitions) {
                
                var columnDefs = [];
                
                for (var i = 0; i < columnDefinitions.length; i++) {
                    if (columnDefinitions[i].visible) {
                        columnDefs.push({
                            'field': columnDefinitions[i].name,
                            'displayName': columnDefinitions[i].name,
                            'enableColumnMenu': false
                        });
                    }
                }
                
                $scope.gridOptions = {
                        columnDefs: columnDefs,
                        enableColumnResize: true,
                        enableRowSelection: false,
                        enableSorting: false,
                        enableRowHeaderSelection: false,
                        multiSelect: false,
                        enableHorizontalScrollbar: 0,
                        modifierKeysToMultiSelect: false
                    };
            }
        }
    }
}])

    // Form element
    .directive('formElement', ['RecursionHelper', function (RecursionHelper) {
    return {
        restrict: 'E',
        templateUrl: 'views/form-element-template.html',
        transclude: false,
        scope: {
            field: '=',
            customFieldTemplates: '='
        },
        compile: function (element) {
            return RecursionHelper.compile(element, this.link);
        },
        link: function ($scope, $element, attributes) {
            
            $scope.getHtmlTemplate = function(field) {
                return $scope.customFieldTemplates[field.type];
            };
            
            // initialize dynamic table if field's type is dynamic-table
            // or references a dynamic table
            
            if ($scope.field.type === 'dynamic-table') {
                if ($scope.field.columnDefinitions && $scope.field.columnDefinitions.length > 0) {
                    initializeDynamicTable($scope.field.columnDefinitions);
                }
            } else if ($scope.field.type === 'readonly') {
                if ($scope.field.params && $scope.field.params && $scope.field.params.field && $scope.field.params.field.type === 'dynamic-table') {
                    if ($scope.field.columnDefinitions && $scope.field.columnDefinitions.length > 0) {
                        initializeDynamicTable($scope.field.columnDefinitions, $scope.field.value);
                    } else if ($scope.field.params.field.columnDefinitions && $scope.field.params.field.columnDefinitions.length > 0) {
                        initializeDynamicTable($scope.field.params.field.columnDefinitions, $scope.field.value);
                    }
                }
            }
            
            function initializeDynamicTable (columnDefinitions, data) {
                var columnDefs = [];
                
                for (var i = 0; i < columnDefinitions.length; i++) {
                    if (columnDefinitions[i].visible) {
                        columnDefs.push({
                            'field': columnDefinitions[i].id,
                            'displayName': columnDefinitions[i].name,
                            'enableColumnMenu': false
                        });
                    }
                }
                
                $scope.gridOptions = {
                        columnDefs: columnDefs,
                        data: data,
                        enableColumnResize: true,
                        enableRowSelection: false,
                        enableSorting: false,
                        enableRowHeaderSelection: false,
                        multiSelect: false,
                        enableHorizontalScrollbar: 0,
                        modifierKeysToMultiSelect: false
                    };
            }
        }
    }
}])

    .directive('numberInputCheck', function() {

        return {
            require: 'ngModel',
            link: function(scope, element, attrs, modelCtrl) {

                var opts = {
                        positiveOnly: attrs.numberPositiveOnly ? true : false,
                        moneyFraction: attrs.numberMoneyFraction ? true : false
                    };

                modelCtrl.$parsers.push(function (inputValue) {

                    var transformedInput;
                    if (inputValue && inputValue.indexOf('-') === 0 && !opts.positiveOnly) {
                        transformedInput = inputValue.substr(1).replace(/([^0-9])/g, '');
                        transformedInput = '-' + transformedInput;
                    } else {
                        transformedInput = inputValue.replace(/([^0-9])/g, '');
                    }

                    var parsed = parseInt(transformedInput);
                    if (!isNaN(parsed) && !opts.moneyFraction) {
                        transformedInput = parsed.toString();
                    }

                    if (transformedInput != inputValue) {
                        modelCtrl.$setViewValue(transformedInput);
                        modelCtrl.$render();
                    }

                    return transformedInput;
                });
            }
        };
    });