// Generated by CoffeeScript 1.12.8

/*
 * LemonLDAP::NG Notifications Explorer client
 */

(function() {
  var llapp, max, menu, overScheme, scheme;

  max = 25;

  scheme = [
    function(v) {
      return "groupBy=substr(uid,1)";
    }, function(v) {
      return "uid=" + v + "*&groupBy=uid";
    }, function(v) {
      return "uid=" + v;
    }
  ];

  overScheme = function(v, level, over) {
    console.log('overScheme => level', level, 'over', over);
    if (level === 1 && v.length > over) {
      return "uid=" + v + "*&groupBy=substr(uid," + (level + over + 1) + ")";
    } else {
      return null;
    }
  };

  menu = {
    actives: [
      {
        title: 'markAsDone',
        icon: 'check'
      }
    ],
    done: [
      {
        title: 'deleteNotification',
        icon: 'trash'
      }
    ],
    "new": [
      {
        title: 'save',
        icon: 'save'
      }
    ],
    home: []
  };

  llapp = angular.module('llngNotificationsExplorer', ['ui.tree', 'ui.bootstrap', 'llApp']);

  llapp.controller('NotificationsExplorerCtrl', [
    '$scope', '$translator', '$location', '$q', '$http', '$uibModal', function($scope, $translator, $location, $q, $http, $uibModal) {
      var autoId, c, dateToString;
      $scope.links = links;
      $scope.menulinks = menulinks;
      $scope.staticPrefix = staticPrefix;
      $scope.scriptname = scriptname;
      $scope.formPrefix = formPrefix;
      $scope.availableLanguages = availableLanguages;
      $scope.waiting = true;
      $scope.showM = false;
      $scope.showT = true;
      $scope.showForm = false;
      $scope.data = [];
      $scope.form = {};
      $scope.formPost = {};
      $scope.currentScope = null;
      $scope.currentNotification = null;
      $scope.menu = menu;
      $scope.translateP = $translator.translateP;
      $scope.translate = $translator.translate;
      $scope.translateTitle = function(node) {
        return $translator.translateField(node, 'title');
      };
      $scope.menuClick = function(button) {
        if (button.popup) {
          window.open(button.popup);
        } else {
          button.action || (button.action = button.title);
          switch (typeof button.action) {
            case 'function':
              button.action($scope.currentNode, $scope);
              break;
            case 'string':
              $scope[button.action]();
              break;
            default:
              console.log(typeof button.action);
          }
        }
        return $scope.showM = false;
      };
      $scope.markAsDone = function() {
        $scope.waiting = true;
        return $http.put(scriptname + "notifications/" + $scope.type + "/" + $scope.currentNotification.uid + "_" + $scope.currentNotification.reference, {
          done: 1
        }).then(function(response) {
          $scope.currentNotification = null;
          $scope.currentScope.remove();
          $scope.message = {
            title: 'notificationDeleted'
          };
          $scope.showModal("alert.html");
          $scope.waiting = false;
          return $scope.init();
        }, function(response) {
          $scope.message = {
            title: 'notificationNotDeleted',
            message: response.statusText
          };
          $scope.showModal("alert.html");
          $scope.waiting = false;
          return $scope.init();
        });
      };
      $scope.deleteNotification = function() {
        $scope.waiting = true;
        return $http['delete'](scriptname + "notifications/" + $scope.type + "/" + $scope.currentNotification.uid + "_" + $scope.currentNotification.reference + "_" + $scope.currentNotification.done).then(function(response) {
          $scope.currentNotification = null;
          $scope.currentScope.remove();
          $scope.message = {
            title: 'notificationPurged'
          };
          $scope.showModal("alert.html");
          $scope.waiting = false;
          return $scope.init();
        }, function(response) {
          $scope.message = {
            title: 'notificationNotPurged',
            message: response.statusText
          };
          $scope.showModal("alert.html");
          $scope.waiting = false;
          return $scope.init();
        });
      };
      $scope.stoggle = function(scope) {
        var node;
        node = scope.$modelValue;
        if (node.nodes.length === 0) {
          $scope.updateTree(node.value, node.nodes, node.level, node.over, node.query, node.count);
        }
        return scope.toggle();
      };
      $scope.notifDate = function(s) {
        var d;
        if (s != null) {
          if (s.match(/(\d{4})-(\d{2})-(\d{2})/)) {
            s = s.substr(0, 4) + s.substr(5, 2) + s.substr(8, 2);
          }
          d = new Date(s.substr(0, 4), s.substr(4, 2) - 1, s.substr(6, 2));
          return d.toLocaleDateString();
        }
        return '';
      };
      $scope.getLanguage = function(lang) {
        $scope.lang = lang;
        if ($scope.form.date) {
          $scope.form.date = new Date();
        } else {
          $scope.form = 'white';
        }
        $scope.init();
        return $scope.showM = false;
      };
      $scope.$on('$locationChangeSuccess', function(event, next, current) {
        var n;
        n = next.match(/#!?\/(\w+)/);
        $scope.type = n != null ? n[1] : 'actives';
        if ($scope.type === 'new') {
          return $scope.displayCreateForm();
        } else {
          $scope.showForm = false;
          return $scope.init();
        }
      });
      autoId = 0;
      $scope.updateTree = function(value, node, level, over, currentQuery, count) {
        var query, tmp;
        $scope.waiting = true;
        query = scheme[level](value, currentQuery);
        if (count > max) {
          if (tmp = overScheme(value, level, over)) {
            over++;
            query = tmp;
            level = level - 1;
          } else {
            over = 0;
          }
        } else {
          over = 0;
        }
        if ($scope.type === 'done' || $scope.type === 'actives') {
          $http.get(scriptname + "notifications/" + $scope.type + "?" + query).then(function(response) {
            var data, i, len, n, ref;
            data = response.data;
            if (data.result) {
              ref = data.values;
              for (i = 0, len = ref.length; i < len; i++) {
                n = ref[i];
                autoId++;
                n.id = "node" + autoId;
                if (level < scheme.length - 1) {
                  n.nodes = [];
                  n.level = level + 1;
                  n.query = query;
                  n.over = over;
                }
                node.push(n);
              }
              if (value === '') {
                $scope.total = data.total;
              }
            }
            return $scope.waiting = false;
          }, function(resp) {
            return $scope.waiting = false;
          });
        }
        console.log("Selection", $scope.type);
        $scope.activesStyle = {
          color: '#777'
        };
        $scope.doneStyle = {
          color: '#777'
        };
        $scope.newStyle = {
          color: '#777'
        };
        if ($scope.type === 'actives') {
          $scope.activesStyle = {
            color: '#333'
          };
        }
        if ($scope.type === 'done') {
          return $scope.doneStyle = {
            color: '#333'
          };
        }
      };
      $scope.displayNotification = function(scope) {
        var node, notificationId;
        $scope.waiting = true;
        $scope.currentScope = scope;
        node = scope.$modelValue;
        notificationId = node.notification.replace(/#/g, '_');
        if ($scope.type === 'actives') {
          notificationId = node.uid + "_" + node.reference;
        }
        $http.get(scriptname + "notifications/" + $scope.type + "/" + notificationId).then(function(response) {
          var e, notif;
          $scope.currentNotification = {
            uid: node.uid,
            reference: node.reference,
            condition: node.condition
          };
          if ($scope.type === 'done') {
            $scope.currentNotification.done = response.data.done;
          }
          try {
            console.log("Try to parse a JSON formated notification...");
            notif = JSON.parse(response.data.notifications);
            $scope.currentNotification.date = $scope.notifDate(notif.date);
            $scope.currentNotification.text = notif.text;
            $scope.currentNotification.title = notif.title;
            $scope.currentNotification.subtitle = notif.subtitle;
            $scope.currentNotification.check = notif.check;
          } catch (error) {
            e = error;
            console.log("Unable to parse JSON");
            $scope.currentNotification.notifications = response.data.notifications;
          }
          return $scope.waiting = false;
        }, function(resp) {
          return $scope.waiting = false;
        });
        return $scope.showT = false;
      };
      $scope.showModal = function(tpl, init) {
        var d, modalInstance;
        modalInstance = $uibModal.open({
          templateUrl: tpl,
          controller: 'ModalInstanceCtrl',
          size: 'lg',
          resolve: {
            elem: function() {
              return function(s) {
                return $scope[s];
              };
            },
            set: function() {
              return function(f, s) {
                return $scope[f] = s;
              };
            },
            init: function() {
              return init;
            }
          }
        });
        d = $q.defer();
        return modalInstance.result.then(function(msgok) {
          $scope.message = {
            title: '',
            message: ''
          };
          return d.resolve(msgok);
        }, function(msgnok) {
          $scope.message = {
            title: '',
            message: ''
          };
          return d.reject(msgnok);
        });
      };
      $scope.save = function() {
        if ($scope.form.uid && $scope.form.reference && $scope.form.xml) {
          $scope.waiting = true;
          $scope.formPost.uid = $scope.form.uid;
          if ($scope.form.date) {
            $scope.formPost.date = dateToString($scope.form.date);
          }
          $scope.formPost.reference = $scope.form.reference;
          $scope.formPost.condition = $scope.form.condition;
          $scope.formPost.xml = $scope.form.xml;
          $http.post('notifications/actives', $scope.formPost).then(function(response) {
            var data;
            data = response.data;
            $scope.form = {};
            if (data.result === 1) {
              $scope.message = {
                title: 'notificationCreated'
              };
            } else {
              $scope.message = {
                title: 'notificationNotCreated',
                message: data.error
              };
            }
            $scope.showModal("alert.html");
            $scope.waiting = false;
            return $scope.form.date = new Date();
          }, function(response) {
            $scope.message = {
              title: 'notificationNotCreated',
              message: response.statusText
            };
            $scope.showModal("alert.html");
            $scope.waiting = false;
            return $scope.form.date = new Date();
          });
        } else {
          $scope.message = {
            title: 'incompleteForm'
          };
          $scope.showModal("alert.html");
        }
        return $scope.form.date = new Date();
      };
      $scope.init = function() {
        $scope.waiting = true;
        $scope.showM = false;
        $scope.showT = false;
        $scope.data = [];
        $scope.currentScope = null;
        $scope.currentNotification = null;
        $q.all([$translator.init($scope.lang), $scope.updateTree('', $scope.data, 0, 0)]).then(function() {
          return $scope.waiting = false;
        }, function(resp) {
          return $scope.waiting = false;
        });
        $scope.activeModule = "notifications";
        return $scope.myStyle = {
          color: '#ffb84d'
        };
      };
      $scope.displayCreateForm = function() {
        $scope.activesStyle = {
          color: '#777'
        };
        $scope.doneStyle = {
          color: '#777'
        };
        $scope.newStyle = {
          color: '#333'
        };
        $scope.waiting = true;
        return $translator.init($scope.lang).then(function() {
          $scope.currentNotification = null;
          $scope.showForm = true;
          $scope.data = [];
          $scope.waiting = false;
          return $scope.form.date = new Date();
        });
      };
      c = $location.path().match(/^\/(\w+)/);
      $scope.type = c ? c[1] : 'actives';
      $scope.popupopen = function() {
        return $scope.popup.opened = true;
      };
      $scope.dateOptions = {
        startingDay: 1,
        minDate: new Date()
      };
      $scope.popup = {
        opened: false
      };
      return dateToString = function(dt) {
        var day, month, year;
        year = dt.getFullYear();
        month = dt.getMonth() + 1;
        if (month < 10) {
          month = "0" + month;
        }
        day = dt.getDate();
        if (day < 10) {
          day = "0" + day;
        }
        return year + "-" + month + "-" + day;
      };
    }
  ]);

}).call(this);