<apex:component > 
 | 
<script> 
 | 
; 
 | 
'use strict'; 
 | 
angular.module('alController', ['alSfdcService', 'alImageService']) 
 | 
  
 | 
.controller('TopCtrl', ['$scope', '$q', '$location', '$log', 'alAppConfig', 'alPhotos', 'sfdcService', 
 | 
  function ($scope, $q, $location, $log, alAppConfig, alPhotos, sfdcService) { 
 | 
      //alert('in topctrl!'); 
 | 
  $scope.working = true; 
 | 
  $scope.config = alAppConfig; 
 | 
  $scope.land = {}; //土地情報 
 | 
  $scope.typeSelecter = {}; 
 | 
  // 土地情報の初期化 
 | 
  $scope.initLnad = function() { 
 | 
    $scope.land = { 
 | 
     'name': new Date() 
 | 
     , 'status' :  null 
 | 
     , 'address' : '' 
 | 
     , 'latLng': {'latitude': null, 'longitude':null} 
 | 
     , 'pid' : '' 
 | 
     , 'photoType' : '' 
 | 
   }; 
 | 
   $scope.type_selecter = { 
 | 
     'ra_type' : '' 
 | 
     , 'rp_type' : '' 
 | 
     , 'ast_type' : '' 
 | 
   }; 
 | 
 }; 
 | 
 $scope.initLnad(); 
 | 
  
 | 
  ///  サービスの呼び出し用関数たち 
 | 
  $scope.config['longSidePixcel'] = {!$Label.s1_longSidePixel}; 
 | 
  $scope.config['maxFileSize'] = 700000;  // ファイルサイズ上限 
 | 
  $scope.config['jpegQuality'] = {!$Label.s1_jpegQuality};  //  JPEGの品質レベル  1/10 して canvas.toDataURL()の第2引数として使う。 
 | 
  $scope.loading = false; 
 | 
  $scope.working = false; 
 | 
   
 | 
}]) 
 | 
// 土地情報入力 
 | 
.controller('LandCtrl', ['$scope', '$log', '$q', '$state', 'alGps',  '$stateParams', 
 | 
  function ($scope, $log, $q, $state, alGps,  $stateParams) { 
 | 
  $scope.nameFilter = null; 
 | 
  $scope.loading = true; 
 | 
  $scope.land.pid = $stateParams.pid; 
 | 
   
 | 
      //alert('in landctrl!   '+$stateParams.pid+'     '+$scope.land.pid);     
 | 
  
 | 
  var getLandStatus = function(value) { 
 | 
    var status =  null; 
 | 
    return status; 
 | 
  } 
 | 
   
 | 
  // GPSで位置情報を取る 
 | 
  var resolvePosition = function() { 
 | 
    var defer = $q.defer(); 
 | 
    if (!$scope.land.latLng['latitude'] || !$scope.land.latLng['longitude']) { 
 | 
      alGps.getCurrentLocation( 
 | 
        function(res) { 
 | 
          $scope.land.latLng['latitude'] = res.lat; 
 | 
          $scope.land.latLng['longitude'] = res.lng; 
 | 
          $scope.$apply(); 
 | 
          defer.resolve(); 
 | 
        }, 
 | 
        function() { 
 | 
          defer.reject(); 
 | 
      }); 
 | 
    } 
 | 
    else { 
 | 
      defer.resolve(); 
 | 
    } 
 | 
    return defer.promise; 
 | 
  } 
 | 
  
 | 
  $scope.loading = false; 
 | 
  
 | 
  // 次へ ボタン クリック 
 | 
  $scope.next = function() { 
 | 
    if($scope.type_selecter.ra_type || $scope.type_selecter.rp_type || $scope.type_selecter.ast_type){ 
 | 
      $state.go('menu.send'); 
 | 
    } else { 
 | 
      alert('请输入照片种类'); 
 | 
    } 
 | 
  } 
 | 
}]) 
 | 
// 画面 写真選択、GPS現在位置取得、送信 
 | 
.controller('SendCtrl', ['$scope', '$log', '$q', '$location', 'alPhotos', 'alHistory', 'alGps', 'alModal', 'sfdcService','$stateParams', 
 | 
  function ($scope, $log, $q,$location, alPhotos, alHistory, alGps, alModal, sfdcService, $stateParams) { 
 | 
  $scope.editMode = false; 
 | 
  $scope.photos = alPhotos.all(); 
 | 
       
 | 
   switch ($scope.land.pid.substr(0,3)){ 
 | 
       case 'a0t': 
 | 
            $scope.land.photoType = $scope.type_selecter.ra_type; 
 | 
            break; 
 | 
       case 'a0J': 
 | 
            $scope.land.photoType = $scope.type_selecter.rp_type; 
 | 
            break; 
 | 
       case '02i': 
 | 
            $scope.land.photoType = $scope.type_selecter.ast_type; 
 | 
            break; 
 | 
  } 
 | 
       
 | 
  if (angular.isUndefined($scope.land.latLng)) { 
 | 
    $scope.land.latLng = {}; 
 | 
  } 
 | 
  // 送信中ステーす情報の初期化関数 
 | 
  var initUploadStatus = function() { 
 | 
    $scope.showOption = false; 
 | 
    $scope.status ={"title": "送信中", "msg": "", "finished": false, "success": false, "showLog": false, "logs": [], "max":0, "value":0}; 
 | 
  } 
 | 
  
 | 
  // SFDC 添付ファイル追加 
 | 
  var createAttachment = function(id, photo, photoType, dt, longitude, latitude) { 
 | 
    //alert('~~~~~ longitude='+longitude+'\nlatitude='+latitude); 
 | 
    var defer = $q.defer(); 
 | 
    $scope.status.logs.push((new Date()).toLocaleString() + ': ' + photo.no + '枚目 写真登録開始'); 
 | 
    sfdcService.createAttachment( 
 | 
      id, photo, photoType, dt, longitude, latitude, 
 | 
      function (response) { 
 | 
        $scope.status.logs.push((new Date()).toLocaleString() + ': ' + photo.no + '枚目 写真登録完了 ID=' + response.id); 
 | 
        $scope.$apply(); 
 | 
        $log.info($scope.status.logs[$scope.status.logs.length-1]); 
 | 
        var res = {"attachmentId": response.id}; 
 | 
        defer.resolve(res); 
 | 
      }, 
 | 
      function(e) { 
 | 
        $scope.status.logs.push((new Date()).toLocaleString() + ': ' + photo.no + '枚目 写真登録失敗'); 
 | 
        $scope.status.logs.push('statusCode: ' + e.statusCode + ', type: ' + e.type + ', message: ' + e.message); 
 | 
        if(e.status){ 
 | 
            $scope.errMsg = '发生了以下错误。请联系系统管理员。\n'+e.result.error; 
 | 
        }else{ 
 | 
            $scope.errMsg = '请检查网络连接。'; 
 | 
        } 
 | 
         
 | 
        $scope.$apply(); 
 | 
        $log.error($scope.status.logs[$scope.status.logs.length-1]); 
 | 
        defer.reject(); 
 | 
    }); 
 | 
    return defer.promise; 
 | 
  }; 
 | 
  
 | 
  // 送信処理 
 | 
  var sfdcUpload = function(log, photos) { 
 | 
    log.name = $scope.land.name; 
 | 
    log.location.lat = $scope.land.latLng.latitude; 
 | 
    log.location.lng = $scope.land.latLng.longitude; 
 | 
       
 | 
    // 写真の登録 
 | 
     
 | 
    var photo = photos[0]; 
 | 
    var promise = createAttachment($scope.land.pid, photo, $scope.land.photoType, $scope.land.name, $scope.land.latLng.longitude, $scope.land.latLng.latitude); 
 | 
    promise.then( 
 | 
        function(res) { 
 | 
          log.attachmentIds.push(res.Id); 
 | 
            log.success = true; 
 | 
            //alHistory.append(log); 
 | 
            $scope.status.msg = "上传成功。"; 
 | 
            $scope.status.finished =true; 
 | 
            $scope.status.success = true; 
 | 
        },function(err){ 
 | 
          log.success = false; 
 | 
          //alHistory.append(log); 
 | 
          $scope.status.msg = "上传失败。"+$scope.errMsg; 
 | 
          $scope.status.finished =true; 
 | 
          $scope.status.success = false; 
 | 
    }); 
 | 
  } 
 | 
  
 | 
  var openProgress = function(photos) { 
 | 
    $scope.status.max = 2 + photos.length; 
 | 
    alModal.openProgress($scope).then( 
 | 
      function(res) { 
 | 
        // 成功 
 | 
        if ($scope.status.success) {    // 成功終了 
 | 
          alPhotos.clear(); 
 | 
          $scope.initLnad(); 
 | 
          $location.path('/menu/land'); 
 | 
        } 
 | 
        initUploadStatus(); 
 | 
      } 
 | 
    ); 
 | 
  } 
 | 
   
 | 
  var resolvePosition = function() { 
 | 
    var defer = $q.defer(); 
 | 
    if (!$scope.land.latLng['latitude'] || !$scope.land.latLng['longitude']) { 
 | 
      $scope.status.logs.push((new Date()).toLocaleString() + ': ' + '位置情報取得開始'); 
 | 
      alGps.getCurrentLocation( 
 | 
        function(res) { 
 | 
          $scope.status.value++; 
 | 
          $scope.land.latLng['latitude'] = res.lat; 
 | 
          $scope.land.latLng['longitude'] = res.lng; 
 | 
          $scope.status.logs.push((new Date()).toLocaleString() + ': ' + '位置情報取得完了 ' + $scope.land.latLng['latitude'] + ',' + $scope.land.latLng['longitude']); 
 | 
          $scope.$apply(); 
 | 
          defer.resolve(); 
 | 
        }, 
 | 
        function() { 
 | 
          $scope.status.logs.push((new Date()).toLocaleString() + ': ' + '位置情報取得失敗'); 
 | 
          $scope.status.msg = "无法取得现在位置。请开启设备的定位服务(GPS),并重新启动本应用";  // 2015.08.03 追加 
 | 
          $scope.status.finished =true;     // 2015.08.03 追加 
 | 
          $scope.status.success = false;    // 2015.08.03 追加 
 | 
          $scope.$apply(); 
 | 
          defer.reject(); 
 | 
      }); 
 | 
    } 
 | 
    else { 
 | 
      defer.resolve(); 
 | 
    } 
 | 
    return defer.promise; 
 | 
  } 
 | 
  
 | 
  // 送信ボタンを押した後の処理(確認画面を表示) 
 | 
  /*$scope.upload = function() { 
 | 
    $log.info('upload'); 
 | 
    var photos = alPhotos.all(); 
 | 
    // 確認して 
 | 
    alModal.openConfirm($scope, 'confirmSend.html').then( 
 | 
      function() { 
 | 
        // OK 
 | 
        // モーダル表示 
 | 
        $scope.status.msg = "正在上传..."; 
 | 
        openProgress(photos); 
 | 
        // 履歴の雛形 
 | 
        var log = alHistory.getTemplate($scope.land.latLng); 
 | 
        // 送信処理 
 | 
        sfdcUpload(log, photos); 
 | 
      }, 
 | 
      function() { 
 | 
        // CANCEL 
 | 
        initUploadStatus(); 
 | 
      } 
 | 
    ); 
 | 
  }*/ 
 | 
  $scope.upload = function() { 
 | 
    $log.info('upload'); 
 | 
    var photos = alPhotos.all(); 
 | 
    // 確認して 
 | 
    alModal.openConfirm($scope, 'confirmSend.html').then( 
 | 
      function() { 
 | 
        // OK 
 | 
        // モーダル表示 
 | 
        $scope.status.msg = "正在上传..."; 
 | 
        openProgress(photos); 
 | 
        // 位置情報取得 
 | 
        resolvePosition().then( 
 | 
          function() { 
 | 
            // 履歴の雛形 
 | 
            var log = alHistory.getTemplate($scope.land.latLng); 
 | 
              // 送信処理 
 | 
            sfdcUpload(log, photos); 
 | 
          }, 
 | 
          function() { 
 | 
            // 失敗 
 | 
            // alModal.openWarning('无法取得位置信息。请检查GPS设置。'); 
 | 
            $log.error('getCurrentLocation failed.'); 
 | 
          } 
 | 
        ); 
 | 
      }, 
 | 
      function() { 
 | 
        // CANCEL 
 | 
        initUploadStatus(); 
 | 
      } 
 | 
    ); 
 | 
  } 
 | 
   
 | 
   
 | 
  // ロングタップした。 
 | 
  $scope.buttonOnLongPress = function() { 
 | 
    if ($scope.editMode == true) return;   // 削除モード中に押されると反応してしまうので、 
 | 
    $scope.showOption = true; 
 | 
    $scope.status.showLog = true; 
 | 
  } 
 | 
  
 | 
  $scope.buttonOnTouchEnd = function() { 
 | 
    if ($scope.editMode == true) return;   // 削除モード中に押されると反応してしまうので、 
 | 
    $scope.upload(); 
 | 
  } 
 | 
  
 | 
  $scope.cancel = function() { 
 | 
    $location.path('/menu/land'); 
 | 
  } 
 | 
  
 | 
  $scope.toggleEditMode = function() { 
 | 
    $scope.editMode = !$scope.editMode; 
 | 
  } 
 | 
  
 | 
  // 送信中ステータス情報の初期化 
 | 
  initUploadStatus(); 
 | 
  
 | 
}]) 
 | 
// 撮影画面 
 | 
.controller('PhotosCtrl', ['$scope', '$log', '$q', 'alPhotos', 'alModal', 
 | 
  function ($scope, $log, $q, alPhotos, alModal) { 
 | 
  $scope.photos = alPhotos.all(); 
 | 
  $scope.objs = null; 
 | 
  $scope.disableInput = false;    // INPUT ボタン無効状態 識別用 
 | 
  
 | 
  // 画像の削除 
 | 
  $scope.removePhoto = function(index) { 
 | 
    $scope.photos.splice(index, 1); 
 | 
    if ($scope.photos.length ==0) { 
 | 
      $scope.toggleEditMode(); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  $scope.send =function() { 
 | 
    $location.path('/menu/upload'); 
 | 
  } 
 | 
  
 | 
  // ファイル・タイプのチェック 
 | 
  var isValidFileType = function(file) { 
 | 
    if (!file || !(file instanceof File) || !file.type.match("image.*")) { 
 | 
      return false; 
 | 
    } 
 | 
    return true; 
 | 
  } 
 | 
  
 | 
  // 画像ファイル かチェック して エラーなら 
 | 
  var checkValidFileType = function(files) { 
 | 
    if (!files) return false; 
 | 
    if (files instanceof FileList) { 
 | 
      // 複数ファイル 
 | 
      for(var i =0; i < files.length; i++) { 
 | 
        if (isValidFileType(files[i]) ==false) { 
 | 
          alModal.openWarning((i+1).toString() +'番目のファイルの種類が違います。'); 
 | 
          return false; 
 | 
        } 
 | 
        if(!angular.isDefined(files[i].size) || files[i].size == 0) { 
 | 
          alModal.openWarning((i+1).toString() +'番目のファイルが読み込めません。'); 
 | 
          return false; 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    else { 
 | 
      // 単一ファイル 
 | 
      if (isValidFileType(files) == false) { 
 | 
        alModal.openWarning('ファイルの種類が違います。'); 
 | 
        return false; 
 | 
      } 
 | 
    } 
 | 
    return true; 
 | 
  } 
 | 
  
 | 
  // 追加できるファイル数を取得 
 | 
  var getAcceptableFileCount = function(files) { 
 | 
    var defer = $q.defer(); 
 | 
    if (files.length + $scope.photos.length <= 1) { 
 | 
      defer.resolve(files.length); 
 | 
    } 
 | 
    else if ($scope.photos.length < 1) { 
 | 
      // 超過してるるが、まだ追加可能のとき 
 | 
      // 確認ダイアログ OK、なら 追加可能なだけ追加する。 
 | 
      alModal.openConfirm($scope, 'confirmMaxFileCount.html') 
 | 
      .then( 
 | 
        function() { 
 | 
          defer.resolve(1 - $scope.photos.length); 
 | 
        }, 
 | 
        function() { 
 | 
          defer.reject(); 
 | 
        } 
 | 
      ); 
 | 
    } 
 | 
    else { 
 | 
      alModal.openWarning('添付できるファイル数を超過しています。'); 
 | 
      defer.reject(); 
 | 
    } 
 | 
    return defer.promise; 
 | 
  } 
 | 
  
 | 
  
 | 
  // INPUT ファイル へ反応して、ファイルデータの取り込み 
 | 
  $scope.$watch("imageFiles", function(imageFiles) { 
 | 
    if (!imageFiles) return; 
 | 
    if (imageFiles.length == 0 ) return; 
 | 
    $scope.disableInput = true; 
 | 
  
 | 
    if (checkValidFileType(imageFiles) == true) { 
 | 
      getAcceptableFileCount(imageFiles) 
 | 
      .then( 
 | 
        function(max) { 
 | 
          // ファイル・タイプ OK 
 | 
          alModal.openLoading();    // ローディング中ダイアログ 
 | 
          var cnt = 0; 
 | 
          for (var i = 0; i< imageFiles.length && i < max ; i++) { 
 | 
  
 | 
            alPhotos.appendFile(imageFiles[i], $scope.config, 
 | 
              function(file) { 
 | 
                $log.info(file); 
 | 
                cnt++; 
 | 
                if (cnt == imageFiles.length || cnt == max) { 
 | 
                  alModal.closeLoading();  // ローディング中ダイアログ を閉じる 
 | 
                } 
 | 
              }, function(err) { 
 | 
                $log.error(err); 
 | 
                cnt++; 
 | 
                alModal.closeLoading();  // ローディング中ダイアログ を閉じる 
 | 
              }); 
 | 
          } 
 | 
        } 
 | 
      ); 
 | 
    } 
 | 
    $scope.disableInput = false; 
 | 
  }); 
 | 
}]) 
 | 
//ok画面(リダイレクト用) 
 | 
.controller('redirectCtrl', ['$scope',  
 | 
  function ($scope) { 
 | 
  $scope.redirect = function() { 
 | 
    sforce.one.navigateToSObject($scope.land.pid); 
 | 
  } 
 | 
  
 | 
}]) 
 | 
// 撮影画面 
 | 
.controller('PhotosOldCtrl', ['$scope', '$log', '$location', 'alPhotos', 'alModal',  
 | 
  function ($scope, $log, $location, alPhotos, alModal) { 
 | 
  $scope.editMode = false; 
 | 
  $scope.photos = alPhotos.all(); 
 | 
  $scope.objs = null; 
 | 
  $scope.nameFilter = null; 
 | 
   
 | 
  // 絞込み 
 | 
  $scope.searchFilter = function (obj) { 
 | 
      var re = new RegExp($scope.nameFilter, 'i'); 
 | 
      return !$scope.nameFilter || re.test(obj.Name); 
 | 
  }; 
 | 
  
 | 
  $scope.doDetail = function (objId) { 
 | 
  
 | 
  } 
 | 
  
 | 
  // 画像の削除 
 | 
  $scope.removePhoto = function(index) { 
 | 
    $scope.photos.splice(index, 1); 
 | 
    if ($scope.photos.length ==0) { 
 | 
      $scope.editMode = false; 
 | 
    } 
 | 
  } 
 | 
  
 | 
  $scope.send =function() { 
 | 
    $location.path('/menu/upload'); 
 | 
  } 
 | 
  
 | 
  // INPUT ファイル へ反応して、ファイルデータの取り込み 
 | 
  $scope.$watch("imageFile", function (imageFile) { 
 | 
    $scope.barValue = 0; 
 | 
    $scope.Max =0; 
 | 
    if (!imageFile || !imageFile.type.match("image.*")) { 
 | 
        return; 
 | 
    } 
 | 
    alModal.openLoading(); 
 | 
    alPhotos.appendFile(imageFile, $scope.config, 
 | 
      function(file) { 
 | 
        $log.info(file); 
 | 
        alModal.closeLoading(); 
 | 
      }, function(err) { 
 | 
        $log.error(err); 
 | 
        alModal.closeLoading(); 
 | 
      }); 
 | 
  }); 
 | 
}]) 
 | 
; 
 | 
</script> 
 | 
</apex:component> 
 |