var rowNum = 0;
var files = {};
var swfu;

var FILE_UPLOAD_LIMIT = 40;
var FILE_NAME_LIMIT = 50;
var FILE_UPLOAD_SIZE_LIMIT = 100 * 1024 * 1024;

function is_uploading() {
    var stat = swfu.getStats();
    return (stat.in_progress > 0 || stat.successful_uploads > 0) && stat.files_queued > 0;
}
function showErrMsg(self, file, msg) {
  if (!self.errors[msg]) {
    self.errors[msg] = [];
  }
  if(file){ self.errors[msg].push(file); }
}

function showNotFoundFileMsg(self, file) {
  showErrMsg(self, file, 'ファイルが見つかりません');
}

function showUploadLimitOverMsg(self, file) {
  showErrMsg(self, null, '一度に保存できるファイルは４０個までです。確認画面で表示されていないファイルは再度保存してください。');
}

function showFileNameLengthOverMsg(self, file) {
  showErrMsg(self, file, 'ファイル名の長さが50文字を超えています');
}

function showFileSizeZeroMsg(self, file) {
  showErrMsg(self, file, 'ファイルサイズが0です');
}

function showFileSizeOverMsg(self, file) {
  showErrMsg(self, file, '保存できるファイルサイズは100MBまでです');
}

function showTotalFileSizeOverMsg(self, file) {
  showErrMsg(self, file, '一度に保存できるファイルサイズは合計100MBまでです');
}

function showDenyAudioFileMsg(self, file) {
  showErrMsg(self, file, '音楽ファイルは送信できません');
}

function showNotExistsExitFileMsg(self, file) {
  showErrMsg(self, file, '拡張子の無いファイルはアップロードできません');
}

// アップするファイルサイズが限界値を超えてないか
function isOverUploadFileTotalSize(self, file) {
  var filesize = file.size;
  for (var k in files) {
    try {
      var file = files[k];
      if (file.isUpload) {
        filesize += file.size;
      }
    } catch (e) { /* isUloadがないのはとばす */ }
  }
  return FILE_UPLOAD_SIZE_LIMIT < filesize;
}

function getExtention(name) {
	var arr = name.split('.');
	if (arr.length == 1)
		return '';
	return arr[arr.length - 1];
}

function isAudioFile(file) {
	var exts = new Array('wma', 'mp3', 'wav', 'aac', 'asf');
	var fileext = getExtention(file.name);

	for (i = 0; i < exts.length; i++) {
		if (exts[i] == fileext)
			return true;
	}
	return false;
}

function existsExt(file) {
    return getExtention(file.name).length > 0;
}

function checkUploadFile(self, file, deny_audio_file) {
    if ($('#upload_file_table input.isUpload:checked').length > FILE_UPLOAD_LIMIT - 1) {
        showUploadLimitOverMsg(self, file);
    } else if (file.name.length > FILE_NAME_LIMIT) {
        showFileNameLengthOverMsg(self, file);
    } else if (isOverUploadFileTotalSize(self, file)) {
        showTotalFileSizeOverMsg(self, file);
    } else if (deny_audio_file && isAudioFile(file)) {
        showDenyAudioFileMsg(self, file);
    } else if (!existsExt(file)) {
        showNotExistsExitFileMsg(self, file);
	} else {
        return true;
    }
    return false;
}

function convertDisplayBytes(bytes) {
    var display_value = bytes;
    var display_unit = 'B';
    if (bytes > 1024) {
        display_unit = 'KB';
        display_value = Math.round(display_value / 1024);
        if (display_value > 1024) {
            display_value = Math.round(display_value / 1024);
            display_unit = 'MB';
        }
    }
    return display_value + display_unit;
}

function init_swfupload(options) {

	var settings = {
        flash_url: "/swfupload/swfupload_fp10/swfupload.swf",
        upload_url: "/file_upload/upload/",
        file_size_limit: "100 MB",
//        file_upload_limit: 40,
        file_types_description: "All Files",
        file_queue_limit: 0,
        custom_settings: {
            progressTarget: "fsUploadProgress",
            cancelButtonId: "btnCancel"
        },
        debug: false,

        // Button settings
        button_image_url: "/img/fhtml_selectfile_btn2.jpg",
        button_width: "216",
        button_height: "48",
        button_placeholder_id: "swfuPlaceHolder",
        button_text: '',
        button_text_style: "",
//        button_text_left_padding: 12,
//        button_text_top_padding: 3,

        file_dialog_start_handler: function(file) {
	        this.errors = {};
        },
        file_dialog_complete_handler:function(file) {
	        var msgs = "";
        	for (var msg in this.errors){
                msgs += msg;
                var files = this.errors[msg];
                if(files.length > 0) {
                    msgs += ': ';
	            for (var i=0;i < files.length; ++i){
	                msgs += files[i].name + " ";
	            }
	            msgs += "\n";
                }
    	    }
	        if (msgs.length){
                alert(msgs);
    	    }
	        this.errors = null;
        },
        file_queued_handler: function(file) {
            if (checkUploadFile(this, file, options['deny_audio_file'])) {
                file.isUpload = true;
                files[file.id] = file;
                var file_list = $('#upload_file_table tbody');
                file_list.find('tr.noadd').remove();
                var rowStyleClass = rowNum % 2 == 0 ? 'even' : 'odd';
                $('<tr>').addClass(rowStyleClass).append(
                    $('<td>').addClass('checkbox').append(
                        $('<input type="checkbox" class="isUpload" value="' + file.id + '" checked >').click(function(e) {
                            var file_id = $(this).val();
                            var file = files[file_id];
                            var isUpload = $(this).attr('checked');
                            if (isUpload && $('#file_upload_confirm_list input.isUpload:checked').length > FILE_UPLOAD_LIMIT) {
                                showUploadLimitOverMsg(this, file);
                                return false;
                            }
                            file.isUpload = $(this).attr('checked');
                            files[file_id] = file;
                        })
                    )
                ).append(
                    $('<td>').addClass('filename').append($('<p>').text(file.name))
                ).append(
                    $('<td>').addClass('filesize').append($('<p>').text(convertDisplayBytes(file.size)))
                ).appendTo(file_list);
                rowNum += 1;
            }
        },
        file_queue_error_handler: function(file, errorCode, message) {
            switch (errorCode) {
                case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
                    showFileSizeOverMsg(this, file);
                    break;
                case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
                    showFileSizeZeroMsg(this, file);
                    break;
                default:
                    if (file !== null) {
                        showNotFoundFileMsg(this, file);
                    }
                    break;
            }
        },
        upload_start_handler: function(file) {
            var cancel = false;
            try {
                if (!files[file.id].isUpload) {
                    cancel = true;
                }
            } catch (e) {
                // ここにくる場合は、swfuploadの入力チェックでエラーになったファイル
                // 問答無用でキャンセルにする
                cancel = true;
            }
            if (cancel) {
                this.cancelUpload(file.id);
            } else if (options["upload_start_handler"]) {
                options["upload_start_handler"](file);
            }
        },
        upload_progress_handler: function(file, bytes, total) {
            var per = Math.ceil(bytes / total * 100);
            var file_row = $('#file_upload_confirm_list').find('#confirmItem-' + file.id);
            if (file_row.find('.progress').length == 0) {
                file_row.find('.statusbar').append($('<p class="progress" style="width: 1%;"></p>'));
            } else {
                file_row.find('.progress').css('width', per + '%');
            }
        },
        upload_error_handler: function(file, code, message) {
            switch (code) {
                case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
                    break;
                default:
                    var file_row = $('#fhtml_contents_upload_file_upload_confirm #confirmItem-' + file.id);
    	            file_row.find('.progress').append($('<span>').text('エラー'));
                    file_row.find('.progress').append(
                        $('<span>').text('エラー')
                    );
                    break;
            }
        },
        upload_complete_handler: function(file) {
			if (options["upload_complete_handler"])
				options["upload_complete_handler"](file);
        },
        upload_success_handler: function(file, serverData, responseReceived) {
            var json = $.parseJSON(serverData);
			if (options['fhtml_contents_id'] == null)
				var contents = $('#fhtml_contents_upload_file_upload_confirm');
			else
				var contents = $('#' + options['fhtml_contents_id']);

            var file_row = contents.find('#confirmItem-' + file.id);
            var fail = false;

            if (null == json) {
                if (!responseReceived) {
                    fail = true;
                }
            } else if ('success' != json['result']) {
                fail = true;
            }
            if (fail) {
		        file_row.find('.progress').append($('<span>').text('エラー'));
                try {
                    alert(json['cause']);
                } catch (e) {
                    alert('ファイルの保存に失敗しました。');
                }
            } else {
                file_row.find('.progress').css('width', '100%');
                if (file_row.find('.progress span').length == 0) {
                    file_row.find('.progress').append($('<span>').text('完了'));
                }

				if (options["upload_success_handler"])
					options["upload_success_handler"](file, json, responseReceived);
	         }
        },
      queue_complete_handler : function(file) {
            files = {};
            if (options["queue_complete_handler"]){
                options["queue_complete_handler"](file);
            }
        }
    };
    swfu = new SWFUpload(settings);
}

