How to use addDot method in Cypress

Best JavaScript code snippet using cypress

telnumber.js

Source:telnumber.js Github

copy

Full Screen

...291 // プレビュー画面の初期設定292 Preview.load();293 // カテゴリ編集のドラッグアンドドロップの有効化294 $(Names.mdlCateTable.addHash()).sortable({295 handle: Names.mdlCateSort.addDot()296 });297298 // ページ選択用のメニューを選択した時の処理299 $('.cnt h3').on('mouseenter', function() {300 $(this).next('ul').removeClass(Names.hidden).slideDown('fast');301 }).on('mouseleave', function() {302 $(this).next('ul').slideUp('fast');303 });304305 // 初期表示で社内用 受付全般を表示するようにする306 /*Ajaxs.get('html/get/index');*/307 };308309310 // イベント311 var Events = {312 // 初期化時に登録するイベント313 add: function() {314 /* 上部のボタンの固定 ----------------------------------------------- */315 var $head = $('.cnt-head').first();316 $(window).on('scroll', function() {317 if ($(window).scrollTop() > $('.site-header').first().outerHeight(true)) {318 $head.addClass(Names.fixed);319 } else {320 $head.removeClass(Names.fixed);321 }322 });323324325 /* 表のイベント ----------------------------------------------------- */326 // ホバー327 var hovers =[328 Names.tblWrap.addDot() + ' tbody tr',329 Names.tblWrap.addDot() + ' tbody th',330 Names.tblWrap.addDot() + ' tbody td'331 ];332 // 行・セルのホバー時にホバークラスの付与333 $(document).on('mouseenter', hovers.join(','), function (e) {334 $(this).addClass(Names.hover);335 }).on('mouseleave', hovers.join(','), function () {336 $(this).removeClass(Names.hover);337 });338 // 行のホバー時に枠線を表示339 // $(document).on('mouseenter', Names.tblWrap.addDot() + ' tbody tr', function () {340 // DataTable.hoverRow(this);341 // });342 // セルのホバー時に追加ボタンを表示343 hovers.shift();344 $(document).on('mouseenter.hover', hovers.join(','), function () {345 Cells.addAddBoxBtn(this);346 }).on('mouseleave.hover', hovers.join(','), function () {347 Cells.removeAddBoxBtn();348 });349 // セル内コンテンツの追加ボタンを押した時の処理350 $(document).on('click', Names.btnAddBox.addHash(), function() {351 Cells.addBox(this);352 });353354355 /* セル内コンテンツでの処理 ---------------------------------------------*/356 // セル内コンテンツのドラッグアンドドロップ処理357 Events.addCellHovers();358 // セル内のコンテンツブロック用のイベント359 Events.addContentsBlock();360361362 /* theadでの処理 ---------------------------------------------------*/363 $(document).on('mouseenter', Names.tblWrap.addDot() + 'thead th', function() {364 $(this).append($(Names.btnsPanelThead.addHash()).removeClass(Names.hidden));365 }).on('mouseleave', 'thead th', function() {366 $('body').append($(Names.btnsPanelThead.addHash()).addClass(Names.hidden));367 });368 // 編集ボタンを押した時の処理369 $(Names.btnEditThead.addHash()).on('click', function() {370 Cells.editThead($(this).parents('th').first());371 $('body').append($(Names.btnsPanelThead.addHash()).addClass(Names.hidden));372 });373 // theadのthをダブルクリックした時の処理374 $(document).on('dblclick', 'thead th', function() {375 Cells.editThead(this);376 });377 // theadのthの編集パネルで反映するボタンを押した時の処理378 $(Names.headEdit.addHash() + '-reflection').on('click', function() {379 Cells.updateThead(this);380 });381 // theadのthの編集パネルでキャンセルボタンを押した時の処理382 $(Names.headEdit.addHash() + '-cancel').on('click', function() {383 Cells.cancelThead(this);384 });385 // 編集パネル上のクリックの時は何もしない386 $(Names.headEdit.addHash()).on('click', function() {387 return false;388 });389 // thead編集パネルのラップをクリックした時に閉じる390 $(Names.headEdit.addHash() + '-wrap').on('click', function() {391 Cells.cancelThead(this);392 });393394395 /* tfootでの処理 ---------------------------------------------------*/396 // tfootのセルをダブルクリックした時の処理397 Events.addTfoot();398 // tfootからフォーカスが外れたときの処理399 $(document).on('blur', 'tfoot textarea', function() {400 Cells.updateTfoot(this);401 });402403404 /* セル内コンテンツの編集パネル -------------------------------------------------- */405 // セル内コンテンツ編集パネルを閉じる時の処理406 $(EditNames.panel.addHash()).on('hidden.bs.modal', function(e) {407 EditPanel.hide(e);408 });409 // セル内コンテンツの編集パネル内のテキストエリアをWYSIWYGエディタに変換410 EditPanel.setWyswyg();411 // セル内コンテンツの編集パネル内のイベント412 Events.addModalEdit();413414415 /* コンテキストメニュー ------------------------------------------------- */416 // 表示417 $(document).on('contextmenu', Names.tblWrap.addDot() + ' tbody', function (e) {418 Context.show(this, e);419 // 標準のコンテキストメニューのキャンセル420 return false;421 });422 // 非表示423 $(document).on('click', Names.ctm.addHash(), function () {424 $('tbody').find(Names.hover.addDot()).removeClass(Names.hover);425 $('tbody').find(Names.ctmHover.addDot()).removeClass(Names.ctmHover);426 $('tbody').find(Names.uiSelected.addDot() + Names.hidden.addDot()).removeClass(Names.uiSelected);427 Context.hide(this);428 }).on('contextmenu', Names.ctm.addHash(), function() {429 $(this).trigger('click');430 return false;431 });432 // コンテキストメニュー内のイベントを登録433 Events.addContext();434435436 /* カテゴリの編集関係イベント ------------------------------------------- */437 // カテゴリ編集用モーダル表示時の処理438 $(Names.mdlCate.addHash()).on('show.bs.modal', function(e) {439 ModalCate.show(this);440 });441 // カテゴリ編集用モーダル内のイベント442 Events.addModalCategory();443444445 /* 問合せ先一覧関係イベント ------------------------------------------- */446 // 問合せ先一覧用モーダル表示時の処理447 // $(Names.mdlMenu.addHash()).on('show.bs.modal', function(e) {448 // ModalMenu.show($(this).find('table').first());449 // });450 // 問合せ一覧選択用モーダル画面内のイベント451 Events.addModalMenu();452453 $('.title').on('mouseenter', function() {454 $(this).children('ul').stop().slideDown();455 }).on('mouseleave', function() {456 $(this).children('ul').stop().slideUp();457 });458459460 /* プレビュー画面でのイベント ------------------------------------------- */461 // 閉じるボタンを押した時の処理462 $(Names.btnCancel.addHash()).on('click', function() {463 Preview.hide();464 });465 // 本番環境に公開するボタンを押した時の処理466 $(Names.btnPublishing.addHash()).on('click', function() {467 Contents.publishing();468 });469470471 /* 「下書き保存する」ボタンイベント ---------------------------------------------- */472 $(Names.btnSave.addHash()).on('click', function() {473 Contents.save();474 });475476 /* 「プレビュー」ボタンイベント --- ------------------------------------------- */477 $(Names.btnPreview.addHash()).on('click', function() {478 Preview.show();479 });480 },481 // tfootエリアのイベント482 addTfoot: function() {483 $(document).on('dblclick', 'tfoot td', function() {484 Cells.editTfoot(this);485 });486 },487 removeTfoot: function() {488 $(document).off('dblclick', 'tfoot td');489 },490 // コンテキストメニュー内のイベント491 addContext: function() {492 // コンテキストの行の上へ移動493 $(Names.ctmMoveUp.addHash()).on('click', function () {494 if ($(this).hasClass(Names.disabled)) {495 return false;496 }497 DataTable.moveUpRow();498 }).on('mouseenter', function () {499 if (!$(this).hasClass(Names.disabled)) {500 DataTable.hoverUpRow();501 }502 }).on('mouseleave', function () {503 // セパレータと背景を非表示504 $(Names.showMoveRow.addDot()).removeClass(Names.showMoveRow);505 $(Names.rowSeparator.addHash()).hide();506 });507 // コンテキストの行の下へ移動508 $(Names.ctmMoveDown.addHash()).on('click', function () {509 if ($(this).hasClass(Names.disabled)) {510 return false;511 }512 DataTable.moveDownRow();513 }).on('mouseenter', function () {514 if (!$(this).hasClass(Names.disabled)) {515 DataTable.hoverDownRow();516 }517 }).on('mouseleave', function () {518 // セパレータと背景を非表示519 $(Names.showMoveRow.addDot()).removeClass(Names.showMoveRow);520 $(Names.rowSeparator.addHash()).hide();521 });522 // コンテキストのセルの結合イベント523 $(Names.ctmJoinCell.addHash()).on('click', function () {524 if ($(this).hasClass(Names.disabled)) {525 return false;526 }527 DataTable.joinCell();528 });529 // コンテキストのセルの分割イベント530 $(Names.ctmSplitCell.addHash()).on('click', function () {531 if ($(this).hasClass(Names.disabled)) {532 return false;533 }534 DataTable.splitCell();535 });536 // コンテキストのセルの列分割イベント537 $(Names.ctmSplitCol.addHash()).on('click', function () {538 if ($(this).hasClass(Names.disabled)) {539 return false;540 }541 DataTable.splitCol();542 });543 // コンテキストの行の追加イベント544 $(Names.ctmAddRow.addHash()).on('click', function () {545 if ($(this).hasClass(Names.disabled)) {546 return false;547 }548 DataTable.addRow(this);549 }).on('mouseenter', function () {550 if (!$(this).hasClass(Names.disabled)) {551 DataTable.hoverAddRow();552 }553 }).on('mouseleave', function () {554 $(Names.rowSeparator.addHash()).hide();555 });556 // コンテキストの行の削除イベント557 $(Names.ctmDelRow.addHash()).on('click', function () {558 if ($(this).hasClass(Names.disabled)) {559 return false;560 }561 DataTable.delRow(this);562 }).on('mouseenter', function () {563 DataTable.hoverDelRow();564 }).on('mouseleave', function () {565 $(Names.showDelRow.addDot()).removeClass(Names.showDelRow);566 });567 // 2列表示568 $(Names.ctmTitle2Col.addHash()).on('click', function () {569 if ($(this).hasClass(Names.disabled)) {570 return false;571 }572 DataTable.show2Col();573 });574 // 3列表示575 $(Names.ctmTitle3Col.addHash()).on('click', function () {576 if ($(this).hasClass(Names.disabled)) {577 return false;578 }579 DataTable.show3Col();580 });581 // フッター行の追加582 $(Names.ctmAddTfoot.addHash()).on('click', function () {583 if ($(this).hasClass(Names.disabled)) {584 return false;585 }586 DataTable.addTfoot();587 });588 // フッター行の削除589 $(Names.ctmDelTfoot.addHash()).on('click', function () {590 if ($(this).hasClass(Names.disabled)) {591 return false;592 }593 DataTable.removeTfoot();594 });595 },596 // セル内のコンテンツブロック用のイベント597 addContentsBlock: function() {598 // セル内コンテンツの削除ボタンを押した時の処理599 $(document).on('click', Names.btnDelBox.addHash(), function() {600 var $parentBox = $(this).parents(BoxNames.wrap.addDot()).first();601 if (confirm("削除すると元に戻せません。\n削除しますか?")) {602 Cells.removeBox($parentBox);603 }604 });605 // セル内コンテンツの編集画面表示の際の処理606 $(document).on('click', Names.btnEditBox.addHash(), function() {607 EditPanel.show(this);608 }).on('dblclick', BoxNames.wrap.addDot(), function() {609 // セル内コンテンツをダブルクリックした時の処理610 EditPanel.show($(this).children().first());611 });612 },613 // セルのブロック編集用モーダル画面内のイベント614 addModalEdit: function() {615 // セル内コンテンツの内容を更新した時の処理616 $(document).on('click', EditNames.btnUpdate.addHash(), function() {617 EditPanel.update();618 });619 $(document).on('click', EditNames.btnCancel.addHash(), function() {620 var $editBox = $(EditNames.panel.addHash()).data(Names.dataTargetElm);621 if ($(EditNames.panel.addHash()).data('addState')) {622 $editBox.remove();623 }624 });625 // 編集パネルの値が変わった時の処理626 var changes =[627 EditNames.panel.addHash() + ' input',628 EditNames.panel.addHash() + ' textarea',629 EditNames.panel.addHash() + ' select',630 ];631 $(document).on('change enter.imeEnter', changes.join(','), function() {632 EditPanel.setVal(this);633 });634 // 電話番号の追加635 $(document).on('click', EditNames.btnPhoneAdd.addHash(), function () {636 EditPanel.addPhone(this);637 });638 // 電話番号の削除639 $(document).on('click', EditNames.btnPhoneDel.addDot(), function () {640 EditPanel.delPhone(this);641 });642 // メールアドレスの追加643 $(document).on('click', EditNames.btnMailAdd.addHash(), function () {644 EditPanel.addMail(this);645 });646 // メールアドレスの削除647 $(document).on('click', EditNames.btnMailDel.addDot(), function () {648 EditPanel.delMail(this);649 });650 // テキストエリアの説明文の開閉651 $(document).on('click', '.edit-note-title', function() {652 $(this).next('.edit-note-wrap').slideToggle('fast');653 });654 // fieldsetの開閉655 $(document).on('click', '.edit-section-title', function() {656 if ($(this).hasClass('close')) {657 $(this).removeClass('close');658 } else {659 $(this).addClass('close');660 }661 $(this).next('fieldset').slideToggle('fast');662 });663664 //文字が選択されているか判断665 var checkSelectionText = function () {666 return getSelection().toString().length > 0;667 };668 var getSelection = function () {669 if (window.getSelection) {670 return window.getSelection();671 } else if (document.getSelection) {672 return document.getSelection();673 } else if (document.selection) {674 return document.selection;675 }676 };677 // 小文字ボタン678 $(document).on('click', '.small', function () {679 if (checkSelectionText()) {680 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()681 .find(EditNames.editBox.addDot() + '-editbox').first();682 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()683 .find(EditNames.editBox.addDot()).first();684 $inputArea.focus();685686 var selection = getSelection();687 var range = selection.getRangeAt(0);688 var font = document.createElement('font');689 font.style.fontSize = 'smaller';690 range.surroundContents(font);691692 $textArea.val($inputArea.html()).trigger('input');693 }694 });695 // 赤字ボタン696 $(document).on('click', '.red', function () {697 if (checkSelectionText()) {698 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()699 .find(EditNames.editBox.addDot() + '-editbox').first();700 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()701 .find(EditNames.editBox.addDot()).first();702 $inputArea.focus();703704 var selection = getSelection();705 var range = selection.getRangeAt(0);706 var font = document.createElement('font');707 font.style.color = 'rgb(204,0,0)';708 range.surroundContents(font);709710 $textArea.val($inputArea.html()).trigger('input');711 }712 });713 // 太字ボタン714 $(document).on('click', '.bold', function () {715 if (checkSelectionText()) {716 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()717 .find(EditNames.editBox.addDot() + '-editbox').first();718 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()719 .find(EditNames.editBox.addDot()).first();720 $inputArea.focus();721722 var selection = getSelection();723 var range = selection.getRangeAt(0);724 var font = document.createElement('font');725 font.style.fontWeight = 'bold';726 range.surroundContents(font);727728 $textArea.val($inputArea.html()).trigger('input');729 }730 });731 var rng;732 // リンクボタン733 $(document).on('click', '.link', function () {734 // if (checkSelectionText()) {735 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()736 .find(EditNames.editBox.addDot() + '-editbox').first();737 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()738 .find(EditNames.editBox.addDot()).first();739 $inputArea.focus();740741 var selection = getSelection();742 rng = selection.getRangeAt(0);743744 var $inputPanel = $(this).parents(EditNames.editBox.addDot() + '-wrap').first().find('.edit-link').first();745 $inputPanel.data('state', 'link');746 $inputPanel.find('.edit-link-blank-label').first().show();747 $inputPanel.find('.edit-link-blank').first().prop('checked', false);748 $(this).parent().append($('#modal-back'));749 $('#modal-back').show();750 $inputPanel.show();751 $inputPanel.find('input').first().val('').focus();752 // }753 });754 // メール挿入ボタン755 $(document).on('click', '.mail', function () {756 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()757 .find(EditNames.editBox.addDot() + '-editbox').first();758 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()759 .find(EditNames.editBox.addDot()).first();760 $inputArea.focus();761762 var selection = getSelection();763 rng = selection.getRangeAt(0);764765 var $inputPanel = $(this).parents(EditNames.editBox.addDot() + '-wrap').first().find('.edit-link').first();766 $inputPanel.data('state', 'mail');767 $inputPanel.find('.edit-link-blank-label').first().hide();768 $(this).parent().append($('#modal-back'));769 $('#modal-back').show();770 $inputPanel.show();771 $inputPanel.find('input').first().val('').focus();772 });773 // リンク挿入パネル更新774 $(document).on('click', '.edit-link-submit', function() {775 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()776 .find(EditNames.editBox.addDot() + '-editbox').first();777 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()778 .find(EditNames.editBox.addDot()).first();779 var $inputPanel = $(this).parents('.edit-link').first();780 var val = $(this).parents('div').first().find('input').first().val();781782 if (val !== '') {783 var a = document.createElement('a');784 var hrefVal = $inputPanel.data('state') === 'link' ? val : 'mailto:' + val;785 a.setAttribute('href', hrefVal);786 if ($inputPanel.find('.edit-link-blank').first().prop('checked')) {787 a.setAttribute('target', '_blank');788 }789 $inputArea.focus();790 if (rng.collapsed) {791 a.innerHTML = val;792 rng.insertNode(a);793 } else {794 try {795 rng.surroundContents(a);796 } catch(e) {797 alert('同じ範囲にすでにリンクが挿入されています');798 }799 }800801 $textArea.val($inputArea.html()).trigger('input');802 }803804 $('body').append($('#modal-back'));805 $('#modal-back').hide();806 $(this).parents('.edit-link').first().hide();807 });808 // リンク挿入パネルキャンセル809 $(document).on('click', '.edit-link-cancel', function() {810 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()811 .find(EditNames.editBox.addDot() + '-editbox').first();812813 $('body').append($('#modal-back'));814 $('#modal-back').hide();815 $(this).parents('.edit-link').first().hide();816 });817 // 背景をクリックした時にリンク挿入パネルを閉じる818 $('#modal-back').on('click', function() {819 $('body').append($('#modal-back'));820 $('#modal-back').hide();821 $('.edit-link').hide();822 });823 // アンセットボタン824 $(document).on('click', '.reset', function () {825 if (checkSelectionText()) {826 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()827 .find(EditNames.editBox.addDot() + '-editbox').first();828 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()829 .find(EditNames.editBox.addDot()).first();830 $inputArea.focus();831 document.execCommand('removeformat');832 document.execCommand('unlink');833834 $textArea.val($inputArea.html()).trigger('input');835 }836 });837 // ソースの表示ボタン838 $(document).on('click', '.source', function () {839 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()840 .find(EditNames.editBox.addDot() + '-editbox').first();841 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()842 .find(EditNames.editBox.addDot()).first();843 if ($inputArea.is(':visible')) {844 $(this).parent().children('button').each(function() {845 if (!$(this).hasClass('source')) {846 $(this).addClass('hidden');847 }848 });849 $inputArea.hide();850 $textArea.show().focus();851 $(this).text('編集エリアの表示');852 } else {853 $(this).parent().children('button').each(function() {854 if (!$(this).hasClass('source')) {855 $(this).removeClass('hidden');856 }857 });858 var val = $textArea.val();859 // scriptという文字を削除860 val = val.replace(/(<\/?)script/gi, "$1span");861 $textArea.val(val);862 $inputArea.html(val);863 $textArea.hide();864 $inputArea.show().focus();865 $(this).text('ソースの表示');866 }867 });868 },869 // カテゴリ編集モーダル内のイベント870 addModalCategory: function() {871 // カテゴリー編集モーダルの行の「表示」「削除」の値が変わった時の処理872 $(document).on('change', Names.mdlCateEnable.addDot(), function() {873 ModalCate.changeCateEnable(this);874 });875876 // カテゴリの追加ボタンを押した時の処理877 $(Names.mdlCateBtnAdd.addHash()).on('click', function() {878 ModalCate.addRow();879 });880881 // カテゴリの反映するボタンを押した時の処理882 $(Names.mdlCateBtnRef.addHash()).on('click', function() {883 ModalCate.reflect();884 });885886 // カテゴリの名前のバリデーション処理887 $(document).on('change', Names.mdlCateName.addDot(), function() {888 ModalCate.validateName(this);889 });890891 // カテゴリのidのバリデーション処理892 $(document).on('change', Names.mdlCateId.addDot(), function() {893 ModalCate.validateId(this);894 });895896 // カテゴリのclassのバリデーション処理897 $(document).on('change', Names.mdlCateClass.addDot(), function() {898 ModalCate.validateClass(this);899 });900901 // 編集パネルのドラッグ処理902 var $modal = $(EditNames.panel.addHash());903 var $dragElm = $modal.find(".modal-header").first();904 var $moveElm = $modal.find(".modal-content").first();905 var moveFlag;906 var offsetTop;907 var offsetLeft;908 // ドラッグクラスの付与909 $dragElm.addClass(Names.drag);910 // マウスダウンした時に座標を取得911 $dragElm.on("mousedown", function (event) {912 moveFlag = true;913 event = (event) || window.event;914 offsetTop = event.clientY - $moveElm.offset().top;915 offsetLeft = event.clientX - $moveElm.offset().left;916 });917 // マウスアップした時に移動フラグを無効にする918 $(document).on("mouseup", function () {919 moveFlag = false;920 });921 // マウスが動いた時に移動する922 $(document).on("mousemove", function (event) {923 event = (event) || window.event;924 if (moveFlag) {925 $moveElm.offset({926 top: event.clientY - offsetTop,927 left: event.clientX - offsetLeft928 });929 }930 });931 },932 // 問合せ一覧ページの選択用モーダル内のイベント933 addModalMenu: function() {934 // 問合せ一覧のリストを選択した時の処理935 // $(document).on('click', Names.mdlMenu.addHash() + ' li', function() {936 // ModalMenu.liSelect(this);937 // });938 $(document).on('click', Names.mdlMenu.addHash() + ' .title li', function() {939 ModalMenu.liSelect(this);940 ModalMenu.getPage(this);941 });942943 // 選択したページを表示するボタンを押した時の処理944 // $(Names.mdlMenuBtnShow.addHash()).on('click', function() {945 // ModalMenu.getPage();946 // });947 },948 /* セル内コンテンツのドラッグアンドドロップ時のイベント -------------------------------- */949 // イベントの追加950 addCellHovers: function() {951 // 編集用ページが表示されているときはselectableを有効にする952 if ($(Names.cntBody.addDot()).first().find('table').length > 0) {953 $('tbody').selectable('enable');954 }955 // セル内コンテンツにホバーした際に移動バーを挿入956 $(document).on('mouseenter', BoxNames.wrap.addDot(), function () {957 $('tbody').selectable('disable');958 if (!isSorting) {959 // 移動バーの挿入960 Cells.addMoveBox(this);961 // ホバークラスの付与962 $(this).parents('tbody').first().find(Names.ctmHover.addDot()).removeClass(Names.ctmHover);963 $(this).addClass(Names.hover);964 // ドラッグアンドドロップの有効化965 Cells.enableSortableCol(this);966 }967 }).on('mouseleave', BoxNames.wrap.addDot(), function () {968 $('tbody').selectable('enable');969 if (!isSorting) {970 // 移動バーの削除971 Cells.removeMoveBox();972 // ホバークラスの削除973 $(this).removeClass(Names.hover);974 // ドラッグアンドドロップの無効化975 Cells.disableSortableCol(this);976 }977 });978 },979 // イベントの削除980 removeCellHovers: function(colClasses) {981 // テーブルセルの選択を無効化982 $('tbody').selectable('disable');983 // セル内のボックスがホバーされた時のイベントを無効化984 $(document).off('mouseenter.hover', BoxNames.wrap.addDot());985 }986 };987988// ★ajax設定ここから・・・・・989990 // ajaxの初期値991 $.ajaxSetup({992 'type' : 'GET',993 'dataType': 'json',994 'cache': false,995 'headers': {996 'Pragma': 'no-cache'997 }998 });999 // ajax処理1000 var Ajaxs = {1001 get: function(url) {1002 Loading.show();1003 $.ajax({1004 url: url,1005 }).done(function(res) {1006 // コンテンツのクリア1007 Contents.clearBody();1008 // メッセージのある場合はダイアログを表示1009 if (res.message) {1010 alert(res.message);1011 }1012 // 受け取ったステータスにより画像の表示・非表示1013 if (res.state == 200) {1014 ImgInduction.hide();1015 TopButtons.show();1016 } else {1017 ImgInduction.show();1018 TopButtons.hide();1019 return;1020 }1021 // コンテンツのセット1022 Contents.setBody(res.Data);1023 // 編集フラグのリセット1024 isEdit = false;1025 }).always(function() {1026 // ローディングの非表示1027 Loading.hide();1028 });1029 },1030 update: function(url, data) {1031 Loading.show();1032 $.ajax({1033 url: url,1034 type: 'POST',1035 data: data1036 }).done(function(res) {1037 // エラーの時はメッセージを表示して終了する1038 if (res.state == 404) {1039 alert(res.message);1040 return;1041 }1042 // コンテンツのクリア1043 Contents.clearBody();1044 // コンテンツの再セット1045 Contents.setBody(res.Data, true);1046 // 編集フラグのリセット1047 isEdit = false;1048 }).always(function() {1049 // ローディングの非表示1050 Loading.hide();1051 });1052 }1053 };10541055 // ローディング1056 var Loading = {1057 // ローディング画面の表示1058 show: function() {1059 $(Names.mdlLoading.addHash()).removeClass(Names.hidden);1060 },1061 // ローディング画面の非表示1062 hide: function() {1063 $(Names.mdlLoading.addHash()).addClass(Names.hidden);1064 }1065 };10661067 // 画面上部のボタン群1068 var TopButtons = {1069 // ボタンを有効化1070 show: function() {1071 $(Names.cntHeadBtns.addHash()).children('button').removeClass(Names.disabled);1072 },1073 // ボタンを無効化1074 hide: function() {1075 $(Names.cntHeadBtns.addHash()).children('button').addClass(Names.disabled);1076 }1077 };10781079 // 誘導用画像の表示・非表示1080 var ImgInduction ={1081 // 誘導用画像のテンプレート(実際にはindexから取得する為空文字でOK)1082 tmp: '<img id="' + Names.cntBodyEmptyImg + '" src="img/page-select.png">',1083 // indexから誘導画像エレメントをクローンする1084 copy: function() {1085 ImgInduction.tmp = $(Names.cntBodyEmptyImg.addHash()).clone();1086 },1087 // 誘導画像の表示1088 show: function() {1089 $(Names.cntBody.addDot()).first().append($(ImgInduction.tmp));1090 },1091 // 誘導画像の非表示1092 hide: function() {1093 $(Names.cntBody.addDot()).find(Names.cntBodyEmptyImg.addHash()).remove();1094 }1095 };10961097 var Contents = {1098 // 表示しているコンテンツのクリア1099 clearBody: function() {1100 $(Names.cntBody.addDot()).empty();1101 },1102 // コンテンツの再セット1103 setBody: function(Data, showSuccess) {1104 $(window).scrollTop(0);1105 // テーブルデータを挿入1106 var $wrap = $('<div></div>').attr('id', Names.cntBodyDataWrap);1107 $wrap.append($(Data.html));1108 $(Names.cntBody.addDot()).first().append($wrap);1109 // セレクタブルの設定1110 DataTable.addSelectEvent();1111 // コンテンツボックスのドラッグアンドドロップ有効化1112 Cells.addSortableCol();1113 // タイトルを挿入1114 var title = Data.in_ex == 1 ? '社内用 ' : 'お客さま用 ';1115 var dates = '<div class="date-update"><span>下書き保存日時</span>:' + (Data.updated !== '0000-00-00 00:00:00' ? Data.updated : '未保存') + '</div>';1116 dates += '<div class="date-release"><span>最終更新日時</span>:' + (Data.released !== '0000-00-00 00:00:00' ? Data.released : '未公開') + '</div>';1117 title += Data.title;1118 $(Names.cntBody.addDot()).first()1119 .prepend(1120 $('<div class="note"></div>').text('※セルの結合や行の追加、移動等の操作は、テーブル上で右クリックで表示されるメニューから行ってください。')1121 )1122 .prepend(1123 $('<div class="dates"></div>').append($(dates))1124 )1125 .prepend(1126 $('<h2></h2>').text(title)1127 .addClass('h2-default')1128 .append(1129 $('<span></span>').text(Data.name)1130 .attr('id', Names.cntName)1131 .data(Names.dataUpdate, Data.updated)1132 )1133 );1134 // 公開していない場合はアラートパネルを表示1135 if (Data.is_release === '0') {1136 $(Names.cntBody.addDot()).first().prepend(1137 $('<div></div>').text('公開されていません').addClass(Names.cntBodyPnlAlert)1138 );1139 $(Names.cntBody.addDot()).first().find('.date-release').first().addClass('alert');1140 } else {1141 // 公開されている場合は公開済みページへのリンクを表示1142 var $h2 = $(Names.cntBody.addDot()).first().find('.h2-default').first();1143 $h2.append(1144 $('<a></a>').addClass('pull-right')1145 .addClass('now-page')1146 .attr('href', $('body').data('href') + '/telnumber/' + Data.name)1147 .attr('target', '_blank')1148 .text('本番ページを見る')1149 ).append(1150 $('<a></a>').addClass('pull-right')1151 .addClass('now-page')1152 .addClass('now-page')1153 .attr('href', $('body').data('href') + '/staging/bbnavi/telnumber/' + Data.name)1154 .attr('target', '_blank')1155 .text('Stagingページを見る')1156 );1157 // 一時保存後公開されていない場合はアラートを表示1158 if (Data.updated > Data.released) {1159 var updateStr = '下書き保存したデータがStaging環境に公開されていません' + '<br>';1160 updateStr += '<span>下書き保存日時</span>:' + Data.updated + '<br>';1161 updateStr += '<span>最終更新日時</span>:' + Data.released;1162 $(Names.cntBody.addDot()).first().prepend(1163 $('<div></div>').addClass(Names.cntBodyPnlAlert).html(updateStr)1164 );1165 $(Names.cntBody.addDot()).first().find('.date-update').first().addClass('alert');1166 $(Names.cntBody.addDot()).first().find('.date-release').first().addClass('alert');1167 }1168 }1169 // 未保存の場合は下書き保存日の背景を赤にする1170 if (Data.updated === '0000-00-00 00:00:00') {1171 $(Names.cntBody.addDot()).first().find('.date-update').first().addClass('alert');1172 }1173 // 削除されている場合はアラートを表示1174 if (Data.is_delete === '1') {1175 $(Names.cntBody.addDot()).first().prepend(1176 $('<div></div>').text('削除済みデータです').addClass(Names.cntBodyPnlAlert)1177 );1178 }1179 // 完了パネルの表示1180 if (showSuccess) {1181 // 成功した旨を伝えるパネルの表示1182 $(Names.cntBody.addDot()).first().prepend(1183 $('<div></div>').text('更新しました')1184 .addClass(Names.cntBodyPnlSuccess)1185 );1186 // 2秒後に消えるようにセットする1187 $(Names.cntBodyPnlSuccess.addDot()).fadeOut(2000, function() {$(this).remove();});1188 }1189 },1190 // 下書き保存するボタンを押した時の処理1191 save: function() {1192 // ページのリンク名等のエレメント1193 var $elmName = $(Names.cntName.addHash());1194 var url = 'html/save/' + $elmName.text();1195 var data = {1196 html : Contents.createSave(),1197 updated: $elmName.data(Names.dataUpdate)1198 };1199 Ajaxs.update(url, data);1200 },1201 // 本番公開用ページの作成1202 publishing: function() {1203 // ページのリンク名等のエレメント1204 var $elmName = $(Names.cntName.addHash());1205 var url = 'html/update/' + $elmName.text();1206 var data = {1207 html : Contents.createSave(),1208 publish : Contents.createPublish(),1209 updated: $elmName.data(Names.dataUpdate)1210 };1211 Ajaxs.update(url, data);1212 Preview.hide();1213 },1214 // 一時保存用コンテンツの作成1215 createSave: function() {1216 // htmlコンテンツのラッパーをクローン1217 var $html = $(Names.cntBodyDataWrap.addHash()).clone();1218 // 不要なクラス等を削除1219 $html = Contents.removeRedundant($html);1220 // 中身のみを返す1221 return $html.html();1222 },1223 // プレビュー用のコンテンツの作成1224 createPreview: function($wrap) {1225 var $content = $(Names.cntBodyDataWrap.addHash()).clone();1226 // 不要なクラス等を削除1227 $content = Contents.removeRedundant($content);1228 // 不要なdata属性等を削除1229 $content = Contents.removeRedundantData($content);1230 // 非表示のエレメントを削除(colspan・rowspanがおかしくなる為削除しない)1231 // $content.find(Names.hidden.addDot()).remove();1232 // 中に何もないコンテンツの削除1233 $content.find(BoxNames.wrap.addDot()).each(function() {1234 if ($(this).text().trim() === '') {1235 $(this).remove();1236 }1237 });1238 // ページTOPへコンテンツの挿入1239 var pageName = Contents.getPageName();1240 var $pagetop = $('<p></p>').addClass('topagetop')1241 .append(1242 $('<a></a>').attr('href', 'telnumber/' + pageName)1243 .text('ページTOPへ')1244 );1245 $content.find(Names.section.addDot()).append($pagetop);1246 $wrap.empty();1247 // ページ内リンクの挿入1248 $wrap.append(Contents.createUl(pageName));1249 // コンテンツを挿入する1250 $content.find(Names.section.addDot()).each(function() {1251 $wrap.append($(this));1252 });1253 return $wrap;1254 },1255 // 本番公開用コンテンツの作成1256 createPublish: function() {1257 // 本番用のラップコンテンツ1258 var $publish = $('<div></div>').attr('id', 'mainmenu')1259 .attr('name', 'layoutitem_2')1260 .addClass('layoutitem_a');12611262 // プレビューと同じものを取得1263 var $content = Contents.createPreview($publish);1264 // PHPのタグ等を挿入してサーバへ送信したいが、それがPHPのタグを挿入しようとするとエスケープされる為1265 // 中身のみをサーバに送信し、サーバ側でその他のタグを足すようにしています1266 return $content.html();1267 },1268 // ページのファイル名を取得1269 getPageName: function() {1270 var pageName = '';1271 if ($(Names.cntName.addHash()).text() !== 'index') {1272 pageName = $(Names.cntName.addHash()).text();1273 }1274 return pageName;1275 },1276 // ページ内リンクの作成1277 createUl: function(pageName) {1278 pageName = pageName ? pageName + '/#' : '#';1279 var $ul = $('<ul></ul>').attr('id', 'inpage-links');1280 $(Names.cntBody.addDot()).first().find(Names.section.addDot()).each(function() {1281 var href = 'telnumber/' + pageName + $(this).attr('id');1282 $ul.append(1283 $('<li></li>').append(1284 $('<a></a>').attr('href', href)1285 .text($(this).children('h3').text())1286 )1287 );1288 });1289 return $ul;1290 },1291 // 不要なクラス等の削除(保存用)1292 removeRedundant: function($html) {1293 $html.find(Names.hover.addDot()).removeClass(Names.hover);1294 $html.find(Names.ctmHover.addDot()).removeClass(Names.ctmHover);1295 // jQueryUI selectable関係クラスの削除1296 $html.find(Names.uiSelecting.addDot()).removeClass(Names.uiSelecting);1297 $html.find(Names.uiSelected.addDot()).removeClass(Names.uiSelected);1298 $html.find(Names.uiSelectee.addDot()).removeClass(Names.uiSelectee);1299 // 削除予定のクラスの削除1300 $html.find(Names.showDelRow.addDot()).removeClass(Names.showDelRow);1301 // 移動予定のクラスの削除1302 $html.find(Names.showMoveRow.addDot()).removeClass(Names.showMoveRow);1303 // セパレータの削除1304 $html.find(Names.rowSeparator.addHash()).remove();1305 // 行ガイドの削除1306 $html.find(Names.hoverRowTop.addHash()).remove();1307 $html.find(Names.hoverRowBottom.addHash()).remove();13081309 return $html;1310 },1311 // 不要なdata属性等の削除(公開用)1312 removeRedundantData: function($html) {1313 $html.find('[' + BoxNames.receptionWeekday + ']').removeAttr(BoxNames.receptionWeekday);1314 $html.find('[' + BoxNames.receptionSaturday + ']').removeAttr(BoxNames.receptionSaturday);1315 $html.find('[' + BoxNames.receptionSunday + ']').removeAttr(BoxNames.receptionSunday);1316 $html.find('[' + BoxNames.receptionHoliday + ']').removeAttr(BoxNames.receptionHoliday);1317 $html.find('[' + BoxNames.reception365days + ']').removeAttr(BoxNames.reception365days);1318 $html.find('[' + BoxNames.receptionAllowed + ']').removeAttr(BoxNames.receptionAllowed);1319 $html.find('[' + BoxNames.receptionHourFrom + ']').removeAttr(BoxNames.receptionHourFrom);1320 $html.find('[' + BoxNames.receptionTimeFrom + ']').removeAttr(BoxNames.receptionTimeFrom);1321 $html.find('[' + BoxNames.receptionTimeTo + ']').removeAttr(BoxNames.receptionTimeTo);1322 $html.find('[' + BoxNames.receptionLunch + ']').removeAttr(BoxNames.receptionLunch);1323 $html.find('[' + BoxNames.blackOutMay + ']').removeAttr(BoxNames.blackOutMay);1324 $html.find('[' + BoxNames.blackOutEndYear + ']').removeAttr(BoxNames.blackOutEndYear);1325 $html.find('[' + BoxNames.blackOutOther + ']').removeAttr(BoxNames.blackOutOther);13261327 // fontタグをspanに変更1328 var html = $html.html();1329 html = html.replace(/(<\/?)font/gi, "$1span");1330 return $html.html(html);1331 }1332 };13331334 // プレビュー画面1335 var Preview = {1336 load: function () {1337 $(Names.cntPreview.addHash() + '-wrap').height(($(window).height() - 60));1338 var frameHeight = $(Names.cntPreview.addHash() + '-wrap').height() -1339 $(Names.cntPreview.addHash() + '-head').outerHeight() - 30;1340 $(Names.cntPreview.addHash() + '-frame-wrap').height(frameHeight - 40);1341 $(Names.cntPreview.addHash() + '-frame').height(frameHeight - 40);1342 },1343 // プレビューの表示1344 show: function() {1345 $(Names.cntPreview.addHash() + '-frame').attr('src', '');1346 $(Names.cntPreview.addHash() + '-frame').attr('src', 'preview').load(function() {1347 var $insertContent = $(Names.cntPreview.addHash() + '-frame').contents().find('#mainmenu');1348 // プレビューコンテンツの作成1349 Contents.createPreview($insertContent);1350 // プレビュー画面を表示する1351 $(Names.cntPreview.addHash()).show();1352 });1353 },1354 // プレビューの非表示1355 hide: function() {1356 $(Names.cntPreview.addHash()).hide();1357 }1358 };1359136013611362 // テーブルのセル内の操作1363 var Cells = {1364 // セル内ボックスのテンプレート1365 boxTmp: '<div class="' + BoxNames.wrap + '">' +1366 ' <div class="' + BoxNames.center + '"></div>' +1367 ' <div class="' + BoxNames.address + '"></div>' +1368 ' <div class="' + BoxNames.free + '"></div>' +1369 ' <div class="' + BoxNames.wrapPhone + '"></div>' +1370 ' <div class="' + BoxNames.wrapHp + '">' +1371 ' <span class="' + BoxNames.hpPrefix + '"></span>' +1372 ' <span class="' + BoxNames.hpAddress + '"></span>' +1373 ' </div>' +1374 ' <div class="' + BoxNames.wrapMail + '"></div>' +1375 ' <div class="' + BoxNames.wrapReception + '">' +1376 ' <span class="' + BoxNames.receptionTime + '" ' + BoxNames.receptionAllowed + '="1" ' + BoxNames.receptionHourFrom + '="9" ' + BoxNames.receptionTimeFrom + '="0" ' + BoxNames.receptionHourTo + '="17" ' + BoxNames.receptionTimeTo + '="0" ' + BoxNames.receptionLunch + '="false"></span>' +1377 ' <span class="' + BoxNames.receptionDate + '" ' + BoxNames.receptionWeekday + '="false" ' + BoxNames.receptionSaturday + '="false" ' + BoxNames.receptionSunday + '="false" ' + BoxNames.receptionHoliday + '="false" ' + BoxNames.reception365days + '="false"></span>' +1378 ' <span class="' + BoxNames.blackOut + '" ' + BoxNames.blackOutMay + '="false" ' + BoxNames.blackOutEndYear + '="false" ' + BoxNames.blackOutOther + '=""></span>' +1379 ' </div>' +1380 ' <div class="' + BoxNames.other + '"></div>' +1381 '</div>',1382 // 電話番号用のテンプレート1383 phoneTmp: '<div class="' + BoxNames.phoneGroup + '" ' + BoxNames.phoneOtherDate + '="" ' + BoxNames.phoneOtherNumber + '="" ' + BoxNames.phoneOtherState + '="1"' + BoxNames.phoneDefaultNumber + '="">' +1384 ' <span class="' + BoxNames.phonePrefix + '"></span>' +1385 ' <span class="' + BoxNames.phoneNumber + '"></span>' +1386 ' <span class="' + BoxNames.phoneSuffix + '"></span>' +1387 '</div>',1388 // メールアドレス用のテンプレート1389 mailTmp: '<div class="' + BoxNames.mailGroup + '">' +1390 ' <span class="' + BoxNames.mailPrefix + '"></span>' +1391 ' <span class="' + BoxNames.mailAdress + '"></span>' +1392 '</div>',1393 // セル内のコンテンツボックスの移動処理1394 addSortableCol: function() {1395 var cols = [1396 'col1',1397 'col2',1398 'col3'1399 ];1400 $.each(cols, function(i, col) {1401 $(Names.tblWrap.addDot()).find(col.addDot()).sortable({1402 connectWith: col.addDot(),1403 handle: BoxNames.moveHandle.addHash(),1404 start: function () {1405 isSorting = true;1406 isEdit = true;1407 Events.removeCellHovers();1408 // 不要なクラスの削除1409 var $tables = $(Names.tblWrap.addDot());1410 $tables.find(Names.hover.addDot()).removeClass(Names.hover);1411 $tables.find(Names.ctmHover.addDot()).removeClass(Names.ctmHover);1412 $tables.find(Names.uiSelecting.addDot()).removeClass(Names.uiSelecting);1413 $tables.find(Names.uiSelected.addDot()).removeClass(Names.uiSelected);1414 },1415 stop: function () {1416 isSorting = false;1417 Events.addCellHovers();1418 }1419 });1420 });1421 },1422 // 行ごとのコンテンツのドラッグアンドドロップを有効化1423 enableSortableCol: function(box) {1424 var $table = $(box).parents(Names.tblWrap.addDot()).first();1425 var $cell = $(box).parents('th,td').first();1426 var cellClass ='';1427 switch (true) {1428 case $cell.hasClass('col1'):1429 cellClass = 'col1';1430 break;1431 case $cell.hasClass('col2'):1432 cellClass = 'col2';1433 break;1434 case $cell.hasClass('col3'):1435 cellClass = 'col3';1436 break;1437 }1438 $(cellClass.addDot()).sortable('enable');1439 // $table.find('th,td').sortable('enable');1440 },1441 // 行ごとのコンテンツのドラッグアンドドロップを無効化1442 disableSortableCol: function(box) {1443 var $table = $(box).parents(Names.tblWrap.addDot()).first();1444 var $cell = $(box).parents('th,td').first();1445 var cellClass ='';1446 switch (true) {1447 case $cell.hasClass('col1'):1448 cellClass = 'col1';1449 break;1450 case $cell.hasClass('col2'):1451 cellClass = 'col2';1452 break;1453 case $cell.hasClass('col3'):1454 cellClass = 'col3';1455 break;1456 }1457 $(cellClass.addDot()).sortable('disable');1458 // $table.find('th,td').sortable('disable');1459 },1460 // ボックスの追加ボタンの挿入1461 addAddBoxBtn: function(elm) {1462 $(elm).append($(Names.btnAddBox.addHash()).removeClass(Names.hidden));1463 },1464 // ボックスの追加ボタンの削除1465 removeAddBoxBtn: function() {1466 $('body').append($(Names.btnAddBox.addHash()).addClass(Names.hidden));1467 },1468 // ボックスの移動用のバーを表示1469 addMoveBox: function(elm) {1470 $(elm).append($(BoxNames.moveHandle.addHash()).removeClass(Names.hidden));1471 },1472 // ボックスの移動用のバーの非表示1473 removeMoveBox: function() {1474 $('body').append($(BoxNames.moveHandle.addHash()).addClass(Names.hidden));1475 },1476 // ボックスの追加処理1477 addBox: function(elm) {1478 var $boxTmp = $(Cells.boxTmp);1479 $boxTmp.find(BoxNames.wrapPhone.addDot()).first().append($(Cells.phoneTmp));1480 $boxTmp.find(BoxNames.wrapMail.addDot()).first().append($(Cells.mailTmp));1481 $(elm).before($boxTmp);1482 // 追加と同時に編集画面にする1483 EditPanel.show($boxTmp.find(BoxNames.wrapPhone.addDot()).first(), true);1484 // 編集フラグをセット1485 isEdit = true;1486 },1487 // ボックスの削除処理1488 removeBox: function(elm) {1489 // 移動バーの避難1490 Cells.removeMoveBox();1491 // ボックスの削除1492 $(elm).remove();1493 // 編集フラグをセット1494 isEdit = true;1495 },1496 // ヘッダ編集時に退避しておくクラスのキャッシュ1497 cashClass: [],1498 // theadの編集開始1499 editThead: function(elm) {1500 var $elm = $(elm);1501 var thWidth = $elm.width() - 30;1502 var thTop = $elm.offset().top - $(window).scrollTop() + $elm.height() + 10;1503 var thLeft = $elm.offset().left - $(window).scrollLeft();1504 var thTitle = $elm.text();1505 var thClass = $elm.attr('class');1506 var classArr = thClass.split(' ');1507 // 退避しておくクラスのリスト1508 var delClass = [1509 'col1',1510 'col2',1511 'col3',1512 'ui-sortable',1513 'ui-sortable-disabled'1514 ];1515 // キャッシュ用配列の初期化1516 Cells.cashClass = [];1517 // 退避しておくものと、表示するものに切り分ける1518 for (var i = 0, len = classArr.length; i < len; i++) {1519 if ($.inArray(classArr[i], delClass) > -1) {1520 // 退避1521 Cells.cashClass.push(classArr[i]);1522 // 削除1523 delete(classArr[i]);1524 }1525 }1526 $elm.addClass(Names.selected);1527 $(Names.headEdit.addHash() + '-title').val(thTitle);1528 $(Names.headEdit.addHash() + '-class').val(classArr.join(' ').trim());1529 $(Names.headEdit.addHash()).data(Names.dataTargetElm, $elm);1530 $(Names.headEdit.addHash()).css({1531 top: thTop,1532 left: thLeft,1533 width: thWidth1534 });1535 $(Names.headEdit.addHash() + '-wrap').show();1536 },1537 // theadの編集確定1538 updateThead: function(elm) {1539 var $elm = $($(Names.headEdit.addHash()).data(Names.dataTargetElm));1540 $elm.text($(Names.headEdit.addHash() + '-title').val());1541 $elm.attr('class', '');1542 $elm.addClass($(Names.headEdit.addHash() + '-class').val());1543 for (var i = 0, len = Cells.cashClass.length; i < len; i++) {1544 $elm.addClass(Cells.cashClass[i]);1545 }1546 Cells.cancelThead();1547 // 編集フラグをセット1548 isEdit = true;1549 },1550 // theadの編集キャンセル1551 cancelThead: function(elm) {1552 var pnl = $(Names.headEdit.addHash()).data(Names.dataTargetElm);1553 $(pnl).removeClass(Names.selected);1554 $(Names.headEdit.addHash() + '-wrap').hide();1555 },1556 // tfootの編集開始1557 editTfoot: function(elm) {1558 Events.removeTfoot();1559 var html = $(elm).html() || '';1560 $(elm).empty().addClass('edit');1561 var $textarea = $('<textarea></textarea>');1562 $(elm).append($textarea.val(html.br2nl()));1563 $textarea.trigger('focus');1564 },1565 // tfootの編集終了1566 updateTfoot: function(elm) {1567 Events.addTfoot();1568 var html = $(elm).val();1569 var $td = $(elm).parents('td').first();1570 $td.empty();1571 $td.removeClass('edit').html(html.nl2br());1572 // 編集フラグをセット1573 isEdit = true;1574 }1575 };15761577 // セルの編集パネルでの処理1578 var EditPanel = {1579 // 電話部分のテンプレート1580 phoneTmp: '<fieldset class="' + EditNames.phoneGroup + '">' +1581 ' <label class="pull-left w-170">' +1582 ' 見出し' +1583 ' <input class="' + EditNames.phonePrefix + '" type="text">' +1584 ' </label>' +1585 ' <label class="pull-left w-155 mg-l-5">' +1586 ' 番号' +1587 ' <input class="' + EditNames.phoneNumber + '" type="text">' +1588 ' </label>' +1589 ' <label class="pull-left w-170 mg-l-5">' +1590 ' 後カッコ' +1591 ' <input class="' + EditNames.phoneSuffix + '" type="text">' +1592 ' </label>' +1593 ' <label class="pull-left w-170">' +1594 ' <input class="' + EditNames.phoneOtherDate + '" type="text" readonly>' +1595 ' </label>' +1596 ' <div class="pull-left central w-140 mg-b-5" readonly>' +1597 ' <select class="' + EditNames.phoneOtherState + '">' +1598 ' <option value="1">からの</option>' +1599 ' <option value="2">までの</option>' +1600 ' </select>' +1601 ' 電話番号' +1602 ' </div>' +1603 ' <label class="pull-left w-140">' +1604 ' <input class="' + EditNames.phoneOtherNumber + '" type="text" placeholder="電話番号">' +1605 ' </label>' +1606 ' <button class="btn-del-phone btn btn-danger pull-left mg-l-5" type="button">削除</button>' +1607 '</fieldset>',1608 // メール部分のテンプレート1609 mailTmp: '<fieldset class="' + EditNames.mailGroup + '">' +1610 ' <label class="pull-left w-160">' +1611 ' 見出し' +1612 ' <input class="' + EditNames.mailPrefix + '" type="text">' +1613 ' </label>' +1614 ' <label class="pull-left w-285 mg-l-5">' +1615 ' アドレス' +1616 ' <input class="' + EditNames.mailAdress + '" type="text">' +1617 ' </label>' +1618 ' <label class="btn-del-mail-wrap">' +1619 '  ' +1620 ' <button class="btn-del-mail btn btn-danger pull-left mg-l-5" type="button">削除</button>' +1621 ' </label>' +1622 '</fieldset>',1623 // セル内コンテンツブロックの編集パネル表示1624 show: function(elm, state) {1625 var $editBox = $(elm).parents(BoxNames.wrap.addDot()).first();1626 $(EditNames.panel.addHash()).data(Names.dataTargetElm, $editBox);1627 // 新規追加で開いたか、編集で開いたかの確認用(新規の時はキャンセルボタンで削除)1628 $(EditNames.panel.addHash()).data('addState', state || false);1629 Cells.removeMoveBox();1630 // パネルの高さを設定1631 var boxHeight = $(window).height() - 150;1632 $(EditNames.panel.addHash() + '-left').height(boxHeight);1633 $(EditNames.panel.addHash() + '-right').height(boxHeight - 40);1634 $(EditNames.panel.addHash() + '-preview-wrap').height(boxHeight - 60);1635 // プレビュー画面と編集パネルにデータを反映1636 var $boxData = $editBox.clone().removeClass(BoxNames.wrap);1637 $(EditNames.panel.addHash() + '-preview').empty();1638 $(EditNames.panel.addHash() + '-preview').append($boxData.html());16391640 // パネル内のデータの初期化1641 EditPanel.reset($(EditNames.panel.addHash()));1642 // 読み込んだデータをパネルに反映1643 EditPanel.readVal($(EditNames.panel.addHash()));1644 // カラムにより編集項目を変更する1645 EditPanel.setEditItem($(EditNames.panel.addHash()), $editBox);1646 // モーダルの表示1647 $(EditNames.panel.addHash()).modal();1648 console.log("通過");1649 // モーダルのキャッシュ削除1650 /*$(document).on('.btn.btn-warning', '.modal', function(){1651 $(this).removeData('.modal').empty();165216531654 });*/16551656 // パネルを最上部にスクロール1657 $(EditNames.panel.addHash() + '-left').scrollTop(0);1658 // 先頭のセルにフォーカスを移動1659 $(EditNames.panel.addHash()).find('input').first().focus();1660 },1661 // 編集パネルを閉じるときの処理1662 hide: function(e) {1663 var $editBox = $(EditNames.panel.addHash()).data(Names.dataTargetElm);1664 var $targetTable = $editBox.parents('table').first();1665 // ホバークラスの削除1666 $targetTable.find(Names.hover.addDot()).removeClass(Names.hover);1667 $targetTable.find(Names.ctmHover.addDot()).removeClass(Names.ctmHover);1668 },1669 // テキストエリアをWYSWYGに変換1670 setWyswyg: function() {1671 $(EditNames.editBox.addDot()).each(function () {1672 var $this = $(this);1673 // ボタンを挿入するためのラップ1674 var $wrap = $('<div></div>').addClass(EditNames.editBox + '-wrap');1675 // 編集エリア用のラップ1676 var $editBox = $('<div></div>').addClass(EditNames.editBox + '-editbox');1677 $editBox.data('composition', false);1678 $editBox.prop('contenteditable', true);1679 $editBox.on('keyup cut paste', function () {1680 setTimeout(function () {1681 if (!$this.data('composition')) {1682 $this.val($editBox.html()).trigger('input');1683 }1684 }, 0);1685 }).on('compositionstart', function () {1686 $editBox.data('composition', true);1687 }).on('compositionend', function () {1688 $editBox.data('composition', false);1689 });1690 // リンク挿入用のボックス1691 var $linkbox = $('<div></div>').addClass('edit-link').css({'display': 'none'});1692 $linkbox.append($('<input>').attr('type', 'text').addClass('edit-link-input'));1693 $linkbox.append(1694 $('<label></label>').html('<input type="checkbox", class="edit-link-blank"> target=&quot;_blank&quot;にする').addClass('edit-link-blank-label')1695 );1696 $linkbox.append($('<button></button>').attr('type', 'button').addClass('edit-link-submit').text('更新'));1697 $linkbox.append($('<button></button>').attr('type', 'button').addClass('edit-link-cancel').text('キャンセル'));1698 // ボタン群1699 var $btns = $('<div></div>').addClass('edit-link-btns')1700 .append(1701 $('<button></button>').attr('type', 'button').addClass('small').text('小文字')1702 ).append(1703 $('<button></button>').attr('type', 'button').addClass('red').text('赤字')1704 ).append(1705 $('<button></button>').attr('type', 'button').addClass('bold').text('太字')1706 ).append(1707 $('<button></button>').attr('type', 'button').addClass('link').text('リンク')1708 ).append(1709 $('<button></button>').attr('type', 'button').addClass('mail').text('メール')1710 ).append(1711 $('<button></button>').attr('type', 'button').addClass('reset').text('書式の取消')1712 ).append(1713 $('<button></button>').attr('type', 'button').addClass('source').text('ソースの表示')1714 );17151716 // エレメントの後ろにラップを挿入1717 $this.after($wrap);1718 // ラップにボタンを挿入1719 $wrap.append($btns);1720 // リンク編集パネルを表示1721 $wrap.append($linkbox);1722 // 編集パネルを挿入1723 $wrap.append($editBox);1724 // 入力エリアをラップに挿入1725 $wrap.append($this);1726 $this.hide();1727 });1728 },1729 // セル内コンテンツの編集内容の更新処理1730 update: function() {1731 var $editBox = $(EditNames.panel.addHash()).data(Names.dataTargetElm);1732 $editBox.empty();1733 $editBox.append($($(EditNames.panel.addHash() + '-preview').html()));1734 $(EditNames.panel.addHash()).modal('hide');1735 // 編集フラグのセット1736 isEdit = true;1737 },1738 // 編集のあった時にプレビューに反映する1739 setVal: function(elm) {1740 var $elm = $(elm);1741 var $preview = $(EditNames.panel.addHash() + '-preview');1742 var val = $elm.val();1743 var $boxElm;1744 var $val;1745 // scriptという文字を削除1746 val = val.replace(/(<\/?)script/gi, "$1span");1747 if ($elm.is('[id="' + EditNames.center + '"]')) {1748 // センタ名1749 $boxElm = $preview.find(BoxNames.center.addDot()).first();1750 $boxElm.empty();1751 if (val !== '') {1752 $boxElm.html(val.addSumi());1753 }1754 } else if ($elm.is('[id="' + EditNames.address + '"]')) {1755 // 住所1756 $boxElm = $preview.find(BoxNames.address.addDot()).first();1757 $boxElm.empty();1758 if (val !== '') {1759 // 文字数を確認1760 $val = $('<div>' + val + '</div>');1761 if ($val.text().length > 200) {1762 // 200文字より多い場合は前の値をそのまま使用1763 val = $elm.data('prevVal');1764 // テキストエリアの値を元に戻す1765 $elm.val(val);1766 // 入力エリアの値を元に戻す1767 $elm.parents(EditNames.editBox.addDot() + '-wrap').first()1768 .find(EditNames.editBox.addDot() + '-editbox').first()1769 .html(val);1770 alert('文字数は200文字以内で入力してください');1771 }1772 $boxElm.html(val);1773 $boxElm.nextAll().each(function() {1774 if ($(this).text().trim() !== '') {1775 $boxElm.append('<br><br>');1776 return false;1777 }1778 });1779 }1780 // 前回値としての値をセット1781 $elm.data('prevVal', val);1782 } else if ($elm.is('[id="' + EditNames.hpPrefix + '"]')) {1783 // ホームページの接頭句1784 $boxElm = $preview.find(BoxNames.hpPrefix.addDot()).first();1785 $boxElm.empty();1786 if (val !== '') {1787 $boxElm.html(val.addSumi() + '<br>');1788 }1789 } else if ($elm.is('[id="' + EditNames.hpAddress + '"]')) {1790 // ホームページアドレス1791 $boxElm = $preview.find(BoxNames.hpAddress.addDot()).first();1792 $boxElm.empty();1793 if (val !== '') {1794 $boxElm.append(1795 $('<a></a>').text(val)1796 .attr('href', val)1797 );1798 }1799 } else if ($elm.is('[id="' + EditNames.other + '"]')) {1800 // その他項目1801 $boxElm = $preview.find(BoxNames.other.addDot()).first();1802 $boxElm.empty();1803 if (val !== '') {1804 // 文字数を確認1805 $val = $('<div>' + val + '</div>');1806 if ($val.text().length >= 200) {1807 // 200文字より多い場合は前の値をそのまま使用1808 val = $elm.data('prevVal');1809 // テキストエリアの値を元に戻す1810 $elm.val(val);1811 // 入力エリアの値を元に戻す1812 $elm.parents(EditNames.editBox.addDot() + '-wrap').first()1813 .find(EditNames.editBox.addDot() + '-editbox').first()1814 .html(val);1815 alert('文字数は200文字以内で入力してください');1816 }1817 $boxElm.html(val);1818 }1819 // 前回値としての値をセット1820 $elm.data('prevVal', val);1821 } else if ($elm.is('[class|="edit-phone"]')) {1822 // 電話番号項目1823 EditPanel.setPhoneVal();1824 } else if ($elm.is('[class|="edit-mail"]')) {1825 // メールアドレス項目1826 EditPanel.setMailVal();1827 } else if ($elm.is('[id|="rcpd"]')) {1828 // 受付日項目1829 EditPanel.setReceptionDateVal($(elm));1830 } else if ($elm.is('[id|="rcpt"]')) {1831 // 受付時間項目1832 EditPanel.setReceptionTimeVal($(elm));1833 } else if ($elm.is('[id|="bko"]')) {1834 // 除外日項目1835 EditPanel.setReceptionBlackOutVal();1836 }1837 },1838 // 日付が正しいかのチェック1839 // 電話番号の値をセット1840 setPhoneVal: function() {1841 var $wrap = $(EditNames.panel.addHash() + '-preview').find(BoxNames.wrapPhone.addDot()).first();1842 $wrap.empty();18431844 $(EditNames.phoneGroup.addDot()).each(function() {1845 var $phoneTmp = $(Cells.phoneTmp);1846 var pre = $(this).find(EditNames.phonePrefix.addDot()).first().val();1847 var num = $(this).find(EditNames.phoneNumber.addDot()).first().val();1848 var suf = $(this).find(EditNames.phoneSuffix.addDot()).first().val();1849 $phoneTmp.find(BoxNames.phonePrefix.addDot()).first().html(pre === ''? '': pre.addSumi() + '<br>');1850 $phoneTmp.find(BoxNames.phoneNumber.addDot()).first().html(num === ''? '': '<em>' + num + '</em>');1851 $phoneTmp.find(BoxNames.phoneSuffix.addDot()).first().html(suf === ''? '': '(' + suf + ')<br>');18521853 var otherState = $(this).find(EditNames.phoneOtherState.addDot()).first().val();1854 var otherDate = $(this).find(EditNames.phoneOtherDate.addDot()).first().val();1855 var otherNum = $(this).find(EditNames.phoneOtherNumber.addDot()).first().val();1856 $phoneTmp.attr(BoxNames.phoneDefaultNumber, num);1857 $phoneTmp.attr(BoxNames.phoneOtherState, otherState);1858 $phoneTmp.attr(BoxNames.phoneOtherDate, otherDate);1859 $phoneTmp.attr(BoxNames.phoneOtherNumber, otherNum);18601861 $wrap.append($phoneTmp);1862 });1863 // 電話番号の○○○○年○○月○○日までの表示1864 phoneOther.set();1865 },1866 // メールアドレスをセット1867 setMailVal: function() {1868 var $wrap = $(EditNames.panel.addHash() + '-preview').find(BoxNames.wrapMail.addDot()).first();1869 $wrap.empty();18701871 $(EditNames.mailGroup.addDot()).each(function() {1872 var $mailTmp = $(Cells.mailTmp);1873 var prefix = $(this).find(EditNames.mailPrefix.addDot()).first().val();1874 var address = $(this).find(EditNames.mailAdress.addDot()).first().val();1875 $mailTmp.find(BoxNames.mailPrefix.addDot()).first().html(prefix === ''? '': prefix.addSumi() + '<br>');1876 $mailTmp.find(BoxNames.mailAdress.addDot()).first().empty();1877 if (address !== '') {1878 $mailTmp.find(BoxNames.mailAdress.addDot()).first().append(1879 $('<a></a>').text(address)1880 .attr('href', 'mailto:' + address)1881 );1882 }18831884 $wrap.append($mailTmp);1885 });1886 },1887 // 受付日をセット1888 setReceptionDateVal: function($elm) {1889 var $wrap = $(EditNames.panel.addHash() + '-preview').find(BoxNames.receptionDate.addDot()).first();1890 $wrap.empty($wrap);18911892 var str = '';1893 var strArr = [];1894 // var id = $elm.attr('id');1895 if ($(EditNames.reception365days.addHash()).prop('checked')) {1896 strArr.push('年中無休');1897 } else {1898 if ($(EditNames.receptionWeekday.addHash()).prop('checked')) {1899 strArr.push('平日');1900 }1901 if ($(EditNames.receptionSaturday.addHash()).prop('checked')) {1902 strArr.push('土曜');1903 }1904 if ($(EditNames.receptionSunday.addHash()).prop('checked')) {1905 strArr.push('日曜');1906 }1907 if ($(EditNames.receptionHoliday.addHash()).prop('checked')) {1908 strArr.push('祝日');1909 }1910 }1911 str = strArr.join('・');1912 if (str) {1913 str = '受付日:' + str + '<br>';1914 }1915 $wrap.attr(BoxNames.receptionWeekday, $(EditNames.receptionWeekday.addHash()).prop('checked'));1916 $wrap.attr(BoxNames.receptionSaturday, $(EditNames.receptionSaturday.addHash()).prop('checked'));1917 $wrap.attr(BoxNames.receptionSunday, $(EditNames.receptionSunday.addHash()).prop('checked'));1918 $wrap.attr(BoxNames.receptionHoliday, $(EditNames.receptionHoliday.addHash()).prop('checked'));1919 $wrap.attr(BoxNames.reception365days, $(EditNames.reception365days.addHash()).prop('checked'));1920 $wrap.html(str);1921 EditPanel.setReceptionDateCheck();1922 },1923 // 受付日のチェックボックスをセット1924 setReceptionDateCheck: function() {1925 if ($(EditNames.reception365days.addHash()).prop('checked')) {1926 // 年中無休にチェックが入っているときの処理1927 $(EditNames.receptionWeekday.addHash()).prop('checked', false).prop('disabled', true);1928 $(EditNames.receptionSaturday.addHash()).prop('checked', false).prop('disabled', true);1929 $(EditNames.receptionSunday.addHash()).prop('checked', false).prop('disabled', true);1930 $(EditNames.receptionHoliday.addHash()).prop('checked', false).prop('disabled', true);1931 } else if ($(EditNames.receptionWeekday.addHash()).prop('checked') &&1932 $(EditNames.receptionSaturday.addHash()).prop('checked') &&1933 $(EditNames.receptionSunday.addHash()).prop('checked') &&1934 $(EditNames.receptionHoliday.addHash()).prop('checked')) {1935 // 年中無休以外の全てにチェックが入っているときの処理 //1936 $(EditNames.reception365days.addHash()).prop('checked', true);1937 EditPanel.setReceptionDateVal();1938 } else {1939 $(EditNames.receptionWeekday.addHash()).prop('disabled', false);1940 $(EditNames.receptionSaturday.addHash()).prop('disabled', false);1941 $(EditNames.receptionSunday.addHash()).prop('disabled', false);1942 $(EditNames.receptionHoliday.addHash()).prop('disabled', false);1943 }1944 },1945 // 受付時間をセット1946 setReceptionTimeVal: function($elm) {1947 var $wrap = $(EditNames.panel.addHash() + '-preview').find(BoxNames.receptionTime.addDot()).first();1948 $wrap.empty();19491950 var str = '';1951 var state = $('[name="' + EditNames.receptionTimeName + '"]:checked').val();19521953 switch (state) {1954 case '2':1955 $(EditNames.receptionHourFrom.addHash()).prop('disabled', false);1956 $(EditNames.receptionTimeFrom.addHash()).prop('disabled', false);1957 $(EditNames.receptionHourTo.addHash()).prop('disabled', false);1958 $(EditNames.receptionTimeTo.addHash()).prop('disabled', false);1959 $(EditNames.receptionLunch.addHash()).prop('disabled', false);1960 str += $(EditNames.receptionHourFrom.addHash()).val() + ':';1961 str += $(EditNames.receptionTimeFrom.addHash()).val().padZero() + '~';1962 str += $(EditNames.receptionHourTo.addHash()).val() + ':';1963 str += $(EditNames.receptionTimeTo.addHash()).val().padZero();1964 if ($(EditNames.receptionLunch.addHash()).prop('checked')) {1965 str += '(12時~13時を除く)';1966 }1967 break;1968 case '3':1969 str = '24時間';1970 case '1':1971 $(EditNames.receptionHourFrom.addHash()).prop('disabled', true);1972 $(EditNames.receptionTimeFrom.addHash()).prop('disabled', true);1973 $(EditNames.receptionHourTo.addHash()).prop('disabled', true);1974 $(EditNames.receptionTimeTo.addHash()).prop('disabled', true);1975 $(EditNames.receptionLunch.addHash()).prop('disabled', true);1976 break;1977 }1978 $wrap.attr(BoxNames.receptionAllowed, state);1979 $wrap.attr(BoxNames.receptionHourFrom, $(EditNames.receptionHourFrom.addHash()).val());1980 $wrap.attr(BoxNames.receptionTimeFrom, $(EditNames.receptionTimeFrom.addHash()).val());1981 $wrap.attr(BoxNames.receptionHourTo, $(EditNames.receptionHourTo.addHash()).val());1982 $wrap.attr(BoxNames.receptionTimeTo, $(EditNames.receptionTimeTo.addHash()).val());1983 $wrap.attr(BoxNames.receptionLunch, $(EditNames.receptionLunch.addHash()).prop('checked'));1984 if (str) {1985 str = '受付時間:' + str + '<br>';1986 }1987 $wrap.html(str);1988 },1989 // 除外日をセット1990 setReceptionBlackOutVal: function() {1991 var $wrap = $(EditNames.panel.addHash() + '-preview').find(BoxNames.blackOut.addDot()).first();1992 $wrap.empty();19931994 var str = '';1995 var strArr = [];1996 if ($(EditNames.blackOutOther.addHash()).val() !== '') {1997 strArr.push($(EditNames.blackOutOther.addHash()).val());1998 }1999 if ($(EditNames.blackOutMay.addHash()).prop('checked')) {2000 strArr.push('5/3~5/5');2001 }2002 if ($(EditNames.blackOutEndYear.addHash()).prop('checked')) {2003 strArr.push('年末年始12/29~1/3');2004 }2005 $wrap.attr(BoxNames.blackOutOther, $(EditNames.blackOutOther.addHash()).val());2006 $wrap.attr(BoxNames.blackOutMay, $(EditNames.blackOutMay.addHash()).prop('checked'));2007 $wrap.attr(BoxNames.blackOutEndYear, $(EditNames.blackOutEndYear.addHash()).prop('checked'));2008 str = strArr.join('・');2009 if (str) {2010 str = '(' + str + 'を除く)';2011 }2012 $wrap.html(str);2013 },2014 // 読み込んだデータをパネルの入力画面にセットする2015 readVal: function($elm) {2016 var $preview = $elm.find(EditNames.panel.addHash() + '-preview');2017 // センタ名2018 var centerVal = $preview.find(BoxNames.center.addDot()).first().text().trimEx();2019 if (centerVal !== '') {2020 $(EditNames.center.addHash()).val(centerVal);2021 EditPanel.showInputParentSection($(EditNames.center.addHash()));2022 }2023 // 住所等2024 var addressVal = $preview.find(BoxNames.address.addDot()).first().html();2025 // 前回値としての値をセット2026 $(EditNames.address.addHash()).data('prevVal', addressVal);2027 if (addressVal !== '') {2028 $(EditNames.address.addHash()).val(addressVal);2029 $(EditNames.address.addHash()).parents(EditNames.editBox.addDot() + '-wrap').first().find(EditNames.editBox.addDot() + '-editbox').first().html(addressVal);2030 EditPanel.showInputParentSection($(EditNames.address.addHash()));2031 }2032 // 電話番号2033 $preview.find(BoxNames.phoneGroup.addDot()).each(function(iPhone) {2034 if (iPhone < 1) {2035 EditPanel.showInputParentSection($(EditNames.phoneGroupWrap.addHash()));2036 }2037 var $phoneTmp = $(EditPanel.phoneTmp);2038 var phonePre = $(this).children(BoxNames.phonePrefix.addDot()).first().text().trimEx();2039 var phoneSuf = $(this).children(BoxNames.phoneSuffix.addDot()).first().text().trimEx();2040 $phoneTmp.find(EditNames.phonePrefix.addDot()).first().val(phonePre);2041 $phoneTmp.find(EditNames.phoneSuffix.addDot()).first().val(phoneSuf);20422043 var otherState = $(this).attr(BoxNames.phoneOtherState) || '';2044 var otherDate = $(this).attr(BoxNames.phoneOtherDate) || '';2045 var otherNum = $(this).attr(BoxNames.phoneOtherNumber) || '';2046 var defaultNum = $(this).attr(BoxNames.phoneDefaultNumber) || '';2047 $phoneTmp.find(EditNames.phoneNumber.addDot()).first().val(defaultNum);2048 $phoneTmp.find(EditNames.phoneOtherState.addDot()).first().val(otherState.toInt());2049 $phoneTmp.find(EditNames.phoneOtherDate.addDot()).first().val(otherDate);2050 $phoneTmp.find(EditNames.phoneOtherNumber.addDot()).first().val(otherNum);20512052 $(EditNames.phoneGroupWrap.addHash()).append($phoneTmp);2053 });2054 EditPanel.setPhoneDelBtn();2055 // ホームページプレフィクス2056 var hpPreVal = $preview.find(BoxNames.hpPrefix.addDot()).first().text().trimEx();2057 if (hpPreVal !== '') {2058 $(EditNames.hpPrefix.addHash()).val(hpPreVal);2059 EditPanel.showInputParentSection($(EditNames.hpPrefix.addHash()));2060 }2061 // ホームページ2062 var hpVal = $preview.find(BoxNames.hpAddress.addDot()).first().children('a').first().text();2063 if (hpVal !== '') {2064 $(EditNames.hpAddress.addHash()).val(hpVal);2065 EditPanel.showInputParentSection($(EditNames.hpAddress.addHash()));2066 }2067 // メール2068 $preview.find(BoxNames.mailGroup.addDot()).each(function(iMail) {2069 var $mailTmp = $(EditPanel.mailTmp);2070 var mailPre = $(this).children(BoxNames.mailPrefix.addDot()).first().text().trimEx();2071 var mailAdrs = $(this).children(BoxNames.mailAdress.addDot()).first().children('a').first().text();2072 $mailTmp.find(EditNames.mailPrefix.addDot()).first().val(mailPre);2073 $mailTmp.find(EditNames.mailAdress.addDot()).first().val(mailAdrs);2074 $(EditNames.mailGroupWrap.addHash()).append($mailTmp);2075 if (iMail < 1 && mailPre !== '' && mailAdrs !== '') {2076 EditPanel.showInputParentSection($(EditNames.mailGroupWrap.addHash()));2077 }2078 });2079 EditPanel.setMailDelBtn();2080 // 受付時間2081 var $brt = $preview.find(BoxNames.receptionTime.addDot()).first();2082 $(EditNames.receptionHourFrom.addHash()).val($brt.attr(BoxNames.receptionHourFrom) || 9);2083 $(EditNames.receptionTimeFrom.addHash()).val($brt.attr(BoxNames.receptionTimeFrom) || 0);2084 $(EditNames.receptionHourTo.addHash()).val($brt.attr(BoxNames.receptionHourTo) || 17);2085 $(EditNames.receptionTimeTo.addHash()).val($brt.attr(BoxNames.receptionTimeTo) || 0);2086 $(EditNames.receptionLunch.addHash()).prop('checked', $brt.attr(BoxNames.receptionLunch) === "true" ? true : false);2087 if ($('input[name="' + EditNames.receptionTimeName + '"]:checked').val() !== '1') {2088 EditPanel.showInputParentSection($(EditNames.receptionHourFrom.addHash()));2089 }2090 $('input[name="' + EditNames.receptionTimeName + '"]').val([$brt.attr(BoxNames.receptionAllowed) || 1]).change();2091 // 受付日2092 var $brd = $preview.find(BoxNames.receptionDate.addDot()).first();2093 $(EditNames.receptionWeekday.addHash()).prop('checked', $brd.attr(BoxNames.receptionWeekday) === "true" ? true : false);2094 $(EditNames.receptionSaturday.addHash()).prop('checked', $brd.attr(BoxNames.receptionSaturday) === "true" ? true : false);2095 $(EditNames.receptionSunday.addHash()).prop('checked', $brd.attr(BoxNames.receptionSunday) === "true" ? true : false);2096 $(EditNames.receptionHoliday.addHash()).prop('checked', $brd.attr(BoxNames.receptionHoliday) === "true" ? true : false);2097 $(EditNames.reception365days.addHash()).prop('checked', $brd.attr(BoxNames.reception365days) === "true" ? true : false);2098 if ($(EditNames.receptionWeekday.addHash()).prop('checked') ||2099 $(EditNames.receptionSaturday.addHash()).prop('checked') ||2100 $(EditNames.receptionSunday.addHash()).prop('checked') ||2101 $(EditNames.receptionHoliday.addHash()).prop('checked') ||2102 $(EditNames.reception365days.addHash()).prop('checked')) {2103 EditPanel.showInputParentSection($(EditNames.receptionWeekday.addHash()));2104 }2105 // 受付休み2106 var $brb = $preview.find(BoxNames.blackOut.addDot()).first();2107 $(EditNames.blackOutMay.addHash()).prop('checked', $brb.attr(BoxNames.blackOutMay) === "true" ? true : false);2108 $(EditNames.blackOutEndYear.addHash()).prop('checked', $brb.attr(BoxNames.blackOutEndYear) === "true" ? true : false);2109 $(EditNames.blackOutOther.addHash()).val($brb.attr(BoxNames.blackOutOther));2110 if ($(EditNames.blackOutMay.addHash()).prop('checked') ||2111 $(EditNames.blackOutEndYear.addHash()).prop('checked') ||2112 $(EditNames.blackOutOther.addHash()).val() !== '') {2113 EditPanel.showInputParentSection($(EditNames.blackOutMay.addHash()));2114 }2115 // その他2116 var otherVal = $preview.find(BoxNames.other.addDot()).first().html();2117 // 前回値としての値をセット2118 $(EditNames.other.addHash()).data('prevVal', otherVal);2119 if (otherVal !== '') {2120 $(EditNames.other.addHash()).val(otherVal);2121 $(EditNames.other.addHash()).parents(EditNames.editBox.addDot() + '-wrap').first().find(EditNames.editBox.addDot() + '-editbox').first().html(otherVal);2122 EditPanel.showInputParentSection($(EditNames.other.addHash()));2123 }2124 // 受付日のチェックボックスをセットする2125 EditPanel.setReceptionDateVal($elm);2126 // 電話の日付プラグインを初期化する2127 EditPanel.setDatePicker();2128 },2129 // 編集パネル内項目の表示2130 showInputParentSection: function($elm) {2131 $elm.parents('.edit-section').first().children('.edit-section-title').first().removeClass('close');2132 $elm.parents('.edit-section').first().children('fieldset').show();2133 },2134 // 編集パネル内のデータのクリア2135 reset: function($elm) {2136 $elm.find(EditNames.center.addHash()).val('');2137 $elm.find(EditNames.address.addHash()).val('');2138 $elm.find(EditNames.phoneGroup.addDot()).remove();2139 $elm.find(EditNames.hpPrefix.addHash()).val('');2140 $elm.find(EditNames.hpAddress.addHash()).val('');2141 $elm.find(EditNames.hpAddress.addHash()).parents(EditNames.editBox.addDot() + '-wrap').first().find(EditNames.editBox.addDot() + '-editbox').first().html('');2142 $elm.find(EditNames.mailGroup.addDot()).remove();2143 $elm.find(EditNames.receptionWeekday.addHash()).first().prop('checked', false).prop('disabled', false);2144 $elm.find(EditNames.receptionSaturday.addHash()).first().prop('checked', false).prop('disabled', false);2145 $elm.find(EditNames.receptionSunday.addHash()).first().prop('checked', false).prop('disabled', false);2146 $elm.find(EditNames.receptionHoliday.addHash()).first().prop('checked', false).prop('disabled', false);2147 $elm.find(EditNames.reception365days.addHash()).first().prop('checked', false).prop('disabled', false);2148 $elm.find(EditNames.receptionNothing.addHash()).first().prop('checked', true);2149 $elm.find(EditNames.receptionHourFrom.addHash()).val(9).prop('disabled', true);2150 $elm.find(EditNames.receptionTimeFrom.addHash()).val(0).prop('disabled', true);2151 $elm.find(EditNames.receptionHourTo.addHash()).val(17).prop('disabled', true);2152 $elm.find(EditNames.receptionTimeTo.addHash()).val(0).prop('disabled', true);2153 $elm.find(EditNames.receptionLunch.addHash()).first().prop('checked', false);2154 $elm.find(EditNames.blackOutMay.addHash()).first().prop('checked', false);2155 $elm.find(EditNames.blackOutEndYear.addHash()).first().prop('checked', false);2156 $elm.find(EditNames.blackOutOther.addHash()).val('');2157 $elm.find(EditNames.other.addHash()).val('');2158 $elm.find(EditNames.other.addHash()).parents(EditNames.editBox.addDot() + '-wrap').first().find(EditNames.editBox.addDot() + '-editbox').first().html('');21592160 // テキストエリアの入力を編集エリアに変更2161 $(EditNames.editBox.addDot() + '-editbox').hide();2162 $('.source').click();2163 // 編集パネルのフィールドをいったん閉じる2164 $elm.find('.edit-section-title').addClass('close');2165 $elm.find('fieldset[id|=field]').hide();2166 },2167 // 編集項目のセット2168 setEditItem: function($edit, $box) {2169 var colClass = '';2170 var $col = $box.parents('th,td').first();2171 if ($col.hasClass('col1')) {2172 colClass = 'col1';2173 } else if ($col.hasClass('col2')) {2174 colClass = 'col2';2175 } else if ($col.hasClass('col3')) {2176 colClass = 'col3';2177 }21782179 if (colClass === 'col1') {2180 $edit.find('.edit-section').addClass(Names.hidden);2181 // 住所項目をデフォルトでオープンにする2182 $edit.find(EditNames.fieldAddress.addHash()).prev().removeClass('close');2183 $edit.find(EditNames.fieldAddress.addHash()).show();2184 } else {2185 $edit.find('.edit-section').removeClass(Names.hidden);2186 }2187 // 住所項目のみ入力可とする2188 $edit.find(EditNames.fieldAddress.addHash()).parents('.edit-section').first().removeClass(Names.hidden);2189 },2190 // 電話番号の追加2191 addPhone: function(elm) {2192 $(EditNames.phoneGroupWrap.addHash()).append($(EditPanel.phoneTmp));2193 EditPanel.setPhoneDelBtn();2194 EditPanel.setDatePicker();2195 },2196 // 電話番号の削除2197 delPhone: function(elm) {2198 $(elm).parents('fieldset').first().remove();2199 EditPanel.setPhoneDelBtn();2200 EditPanel.setPhoneVal();2201 },2202 // 電話番号の削除ボタンのセット2203 setPhoneDelBtn: function() {2204 // 一旦全てのボタンの削除2205 $(EditNames.btnPhoneDel.addDot()).remove();2206 // 2個以上なら削除ボタンのセット2207 if ($(EditNames.phoneGroup.addDot()).length > 1) {2208 $(EditNames.phoneGroup.addDot()).each(function() {2209 $(this).append(2210 $('<button></button>').text('削除')2211 .attr('type', 'button')2212 .addClass('btn-del-phone btn btn-danger pull-left mg-l-5')2213 );2214 });2215 }2216 EditPanel.addChangeEvent();2217 },2218 // メールアドレスの追加2219 addMail: function(elm) {2220 $(EditNames.mailGroupWrap.addHash()).append($(EditPanel.mailTmp));2221 EditPanel.setMailDelBtn();2222 },2223 // メールアドレスの削除2224 delMail: function(elm) {2225 $(elm).parents('fieldset').first().remove();2226 EditPanel.setMailDelBtn();2227 EditPanel.setMailVal();2228 },2229 // メールの削除ボタンのセット2230 setMailDelBtn: function() {2231 // 一旦全てのボタンの削除2232 $(EditNames.btnMailDelWrap.addDot()).remove();2233 // 2個以上なら削除ボタンのセット2234 if ($(EditNames.mailGroup.addDot()).length > 1) {2235 $(EditNames.mailGroup.addDot()).each(function() {2236 var $lavel = $('<label></label>').addClass(EditNames.btnMailDelWrap);2237 $lavel.append(' ')2238 .append(2239 $('<button></button>')2240 .text('削除')2241 .attr('type', 'button')2242 .addClass('btn-del-mail btn btn-danger pull-left mg-l-5')2243 );2244 $(this).append($lavel);2245 });2246 }2247 EditPanel.addChangeEvent();2248 },2249 // リアルタイム入力用のイベントの登録2250 addChangeEvent: function() {2251 $(EditNames.panel.addHash() + ' input, ' + EditNames.panel.addHash() + ' textarea').imeEnter();2252 },2253 // デイトピッカーのセット2254 setDatePicker: function() {2255 $(EditNames.phoneOtherDate.addDot()).datepicker({2256 format: "yyyy-mm-dd",2257 todayBtn: true,2258 clearBtn: true,2259 language: "ja",2260 autoclose: true,2261 todayHighlight: true,2262 orientation: "top auto",2263 beforeShowDay: function (date){2264 date = new UltraDate(date);2265 var holidays = UltraDate.getHolidays(date.getFullYear());2266 var ret = {2267 tooltip: '',2268 classes: ''2269 };2270 var holiday = holidays[date.format(UltraDate.getDefaultFormat())];2271 if (holiday) {2272 ret.tooltip = holiday;2273 ret.classes = 'holiday';2274 }2275 switch (date.getDay()) {2276 case 0:2277 ret.classes += ' sunday';2278 break;2279 case 6:2280 ret.classes += ' saturday';2281 break;2282 }2283 return ret;2284 }2285 });2286 }2287 };22882289 // テーブル操作2290 var DataTable = {2291 dataBlock: '',2292 // タイトル行のテンプレート2293 tHeadRowTmp:'<tr>' +2294 ' <th class="col1">部署名</th>' +2295 ' <th class="col2">内容</th>' +2296 ' <th class="col3">電話番号</th>' +2297 '</tr>',2298 // 行のテンプレート2299 tBodyRowTmp: '<tr>' +2300 ' <th class="col1 col1_1"></th>' +2301 ' <td class="col1 col1_2 hidden"></td>' +2302 ' <td class="col2 "></td>' +2303 ' <td class="col3"></td>' +2304 '</tr>',23052306 /* ここからコンテキストメニュー用のイベント処理 ---------------------------------------------------------------------------- */2307 // 行を上移動2308 moveUpRow: function() {2309 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2310 var $rows = $tbody.find('tr');2311 var indexs = DataTable.getSelectRowLength($tbody);2312 var $row = $rows.eq(DataTable.getMoveUpRow($tbody, indexs.start));2313 var $moveRows = $tbody.find(Names.showMoveRow.addDot());23142315 for (var i = 0, len = $moveRows.length; i < len; i++) {2316 $row.before($moveRows.eq(i));2317 }2318 },2319 // 行を下移動2320 moveDownRow: function() {2321 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2322 var indexs = DataTable.getSelectRowLength($tbody);2323 var $rows = $tbody.find('tr');2324 var $row = $rows.eq(DataTable.getMoveDownRow($tbody, indexs.end));2325 var $moveRows = $tbody.find(Names.showMoveRow.addDot());23262327 for (var i = $moveRows.length; i >= 0; i--) {2328 $row.after($moveRows.eq(i));2329 }2330 },2331 // セルの結合2332 joinCell: function() {2333 // コンファームで結合するか確認2334 if (!confirm('結合元になるセル以外のデータは削除されます。よろしいですか?')) {2335 return false;2336 }2337 // 該当テーブルのtbody2338 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2339 // 選択しているセル群2340 var $selectCells = $tbody.find(Names.uiSelected.addDot()).not('tr');2341 // 結合セルの行数2342 var rowspan = 0;2343 var colName = '';2344 // rowspanの数を数える2345 $.each(Names.colClasses, function(i, col) {2346 $selectCells.filter(col.addDot()).each(function(index, elm) {2347 rowspan += $(elm).getRowspan();2348 });2349 if (rowspan > 0) {2350 colName = col;2351 // braek2352 return false;2353 }2354 });2355 // 最初のセルにrowspanをセット2356 $selectCells.first().attr('rowspan', rowspan)2357 .removeClass(Names.hidden);2358 // 次のセルが選択されているかどうか確認2359 var col1_2Select = ($selectCells.first().next().hasClass(Names.uiSelected));2360 // 次のセルが選択されている=col1クラスのセルで複数列選択されている2361 if (col1_2Select) {2362 $selectCells.first().next().attr('rowspan', 1)2363 .addClass(Names.hidden);2364 }2365 // 見えていないセルも含めて非表示処理とrowspan処理を行う2366 var $cell = $selectCells.first().parent().find(colName.addDot()).first();2367 for (var i=rowspan; i>1; i--) {2368 $cell = $cell.parent().next().find(colName.addDot()).first();2369 $cell.attr('rowspan', 1)2370 .addClass(Names.hidden);2371 if (col1_2Select) {2372 $cell.next().attr('rowspan', 1)2373 .addClass(Names.hidden);2374 }2375 }23762377 // 空白行の削除処理2378 DataTable.removeEmptyRow($tbody);23792380 // colspanのセット2381 DataTable.setColspan($tbody);23822383 var $table = $tbody.parents('table').first();2384 $table.find('tfoot').first().find('td').first().attr('colspan', DataTable.getTfootColspan($table));2385 },2386 // セルの分割2387 splitCell: function() {2388 // 選択しているセルをループ2389 $(Names.uiSelected.addDot()).each(function() {2390 // 該当行2391 var $row = $(this).parent('tr');2392 // rowspanを取得2393 var rowspan = $(this).getRowspan();2394 // 各列に付与されるクラス2395 var colClass = '';2396 // 分割するセルがどの列のセルかを確認2397 for (var col in Names.colClasses) {2398 if ($(this).hasClass(Names.colClasses[col])) {2399 colClass = Names.colClasses[col];2400 break;2401 }2402 }2403 // セルのrowspanをクリア2404 $(this).attr('rowspan', 1);2405 // rowspanの数だけ行にタグを追加2406 for (var i = 0; i < (rowspan - 1); i++) {2407 $row = $row.next();2408 $row.children(colClass.addDot()).removeClass(Names.hidden);2409 }2410 });2411 },2412 // 1列目の列分割2413 splitCol: function() {2414 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2415 // 選択されたセルをループ2416 $tbody.find('th' + Names.uiSelected.addDot()).each(function() {2417 // thの次のtd(col1_2)のhiddenクラスを削除2418 $(this).next().removeClass(Names.hidden)2419 .addClass(Names.uiSelected)2420 .attr('rowspan', $(this).getRowspan());2421 });2422 DataTable.setColspan($tbody);2423 var $table = $tbody.parents('table').first();2424 $table.find('tfoot').first().find('td').first().attr('colspan', DataTable.getTfootColspan($table));2425 },2426 // 行の追加2427 addRow: function(elm) {2428 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2429 var $rows = $tbody.find('tr');2430 var $row;2431 // 現在ホバーしている行を取得2432 var $hoverRow = $tbody.find('tr' + Names.ctmHover.addDot()).first();2433 var rowIndex = $rows.index($hoverRow);2434 var $addRow = DataTable.createNewRow();2435 // 行のセル確認2436 $.each(Names.colClasses, function(i, col) {2437 var hoverRowSpan = $hoverRow.find(col.addDot()).getRowspan();2438 if (!$hoverRow.find(col.addDot()).isShown()) {2439 // セルの非表示2440 $addRow.find(col.addDot()).addClass(Names.hidden);2441 // rowspanの変更2442 for (var index = rowIndex; index >= 0; index--) {2443 // 前の行のrowspanを確認し、1より大きければその行のrowspanから1引いた値に設定する2444 $row = $rows.eq(index).children(col.addDot()).first();2445 if ($row.getRowspan() > 1) {2446 $row.attr('rowspan', $row.getRowspan() + 1);2447 // これより上にはさかのぼらない2448 break;2449 }2450 }2451 } else if (hoverRowSpan > 1) {2452 // セルの非表示2453 $addRow.find(col.addDot()).addClass(Names.hidden);2454 $hoverRow.find(col.addDot()).attr('rowspan', hoverRowSpan + 1);2455 }2456 });2457 // colspanの確認2458 if ($($(Names.ctm.addHash()).data(Names.dataTargetElm)).find('.col1_2').isShown()) {2459 $addRow.find('.col1_1').first().attr('colspan', 2);2460 }2461 // 行の追加2462 $hoverRow.after($addRow);2463 // ドラッグアンドドロップイベントの追加2464 Cells.addSortableCol();2465 },2466 // 行の削除2467 delRow: function(elm) {2468 if (!confirm('削除すると元に戻せません。よろしいですか?')) {2469 return false;2470 }24712472 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2473 var $rows = $tbody.find('tr');2474 var $row;2475 var $cell;2476 var $nextCell;2477 var $removeRow = $tbody.find('tr' + Names.ctmHover.addDot()).first();2478 var rowIndex = $rows.index($removeRow);2479 var index = 0;24802481 $.each(Names.colClasses, function(i, col) {2482 // 削除する行のセルを取得2483 $cell = $removeRow.children(col.addDot()).first();24842485 if (!$cell.isShown()) {2486 // セルが表示されていない時(rowspanでまとめられている)2487 for (index = rowIndex; index >= 0; index--) {2488 // 前の行のrowspanを確認し、1より大きければその行のrowspanから1引いた値に設定する2489 $row = $rows.eq(index).children(col.addDot()).first();2490 if ($row.getRowspan() > 1) {2491 $row.attr('rowspan', $row.getRowspan() - 1);2492 // これより上にはさかのぼらない2493 break;2494 }2495 }2496 } else if ($cell.getRowspan() > 1) {2497 // rowspanが設定されているときは次の行にコピーしてrowspanを一つ減らす2498 //2499 // 次の行のセルを取得2500 $nextCell = $removeRow.next().children(col.addDot()).first();2501 // 次の行のセルの後ろにクローンしたものを挿入2502 $nextCell.after($cell.clone().attr('rowspan', $cell.getRowspan() -1));2503 // 元の次の行のセルを削除2504 $nextCell.remove();2505 }2506 });25072508 $removeRow.fadeOut('slow', function() {2509 $removeRow.remove();2510 });2511 },2512 // 2行表示2513 show2Col: function() {2514 var $table = $($(Names.ctm.addHash()).data(Names.dataTargetElm)).parents('table').first();2515 $table.find('.col2').addClass(Names.hidden);2516 DataTable.removeEmptyRow($table.find('tbody').first());2517 $table.find('tfoot').first().find('td').first().attr('colspan', DataTable.getTfootColspan($table));2518 },2519 // 3行表示2520 show3Col: function() {2521 var $table = $($(Names.ctm.addHash()).data(Names.dataTargetElm)).parents('table').first();2522 var rowspaning = 1;2523 $table.find('.col2').each(function() {2524 // rowspanが1より大きい時はrowspaningに値をセットする2525 if ($(this).getRowspan() > 1) {2526 rowspaning = $(this).getRowspan();2527 $(this).removeClass(Names.hidden);2528 }2529 rowspaning -= 1;2530 // rowspaningが1より小さい時は非表示のまま、そうで無い時はhiddenクラスを削除2531 if (rowspaning < 1) {2532 $(this).removeClass(Names.hidden);2533 }2534 });2535 $table.find('tfoot').first().find('td').first().attr('colspan', DataTable.getTfootColspan($table));2536 },2537 // フッター行の追加2538 addTfoot: function() {2539 var $table = $($(Names.ctm.addHash()).data(Names.dataTargetElm)).parents('table').first();2540 var $td = $('<td></td>').attr('colspan', DataTable.getTfootColspan($table));2541 var $tfoot = $('<tfoot></tfoot>').append(2542 $('<tr></tr>').append($td)2543 );2544 $table.append($tfoot);2545 },2546 // フッター行の削除2547 removeTfoot: function() {2548 var $table = $($(Names.ctm.addHash()).data(Names.dataTargetElm)).parents('table').first();2549 $table.find('tfoot').remove();2550 },2551 /* ここまでコンテキストメニュー用のイベント処理 ---------------------------------------------------------------------------- */2552 // 選択が始まっているときにどのクラスを含んでいたかの確認用2553 selectStart: '',2554 // セルの選択(jQueryUIのselectable)2555 addSelectEvent: function() {2556 $('tbody').selectable({2557 filter: 'th, td',2558 // 選択開始時のイベント2559 start: function() {2560 $(Names.uiSelected.addDot()).removeClass(Names.uiSelected);2561 },2562 // 選択完了時のイベント2563 stop: function(e, ui) {2564 // 選択完了時に値のクリア2565 DataTable.selectStart = '';2566 },2567 // 選択中のイベント2568 selecting: function(e, ui) {2569 // 最初に選択を始めた列のクラスを設定2570 if (!DataTable.selectStart) {2571 switch (true) {2572 case $(ui.selecting).hasClass('col1'):2573 DataTable.selectStart = 'col1';2574 break;2575 case $(ui.selecting).hasClass('col2'):2576 DataTable.selectStart = 'col2';2577 break;2578 case $(ui.selecting).hasClass('col3'):2579 DataTable.selectStart = 'col3';2580 break;2581 }2582 }2583 // 同じ列のもの以外は選択できないようにする2584 if (!$(ui.selecting).hasClass(DataTable.selectStart)) {2585 $(ui.selecting).removeClass(Names.uiSelecting);2586 }2587 },2588 // 選択が終わって選択中から選択済みに変わる時のイベント2589 selected: function(e, ui) {2590 if (!$(ui.selected).hasClass(DataTable.selectStart)) {2591 $(ui.selected).removeClass(Names.uiSelected);2592 }2593 $(Names.hover.addDot()).removeClass(Names.hover);2594 $(ui.selected).parents('tr').first().addClass(Names.hover);2595 }2596 });2597 },2598 // 1列目のcolspanをセット・リセット2599 setColspan: function($tbody) {2600 // col1_2クラスのある場合はcolspanをセット2601 if ($tbody.find('.col1_2').isShown()) {2602 $tbody.prev('thead').find('th').first().attr('colspan', 2);2603 var rowspaning = 0;2604 $tbody.find('.col1_1').each(function() {2605 if ($(this).next().getRowspan() > 1) {2606 rowspaning = $(this).next().getRowspan();2607 }2608 if ($(this).next().isShown()) {2609 $(this).attr('colspan', 1);2610 } else if (rowspaning > 0) {2611 $(this).attr('colspan', 1);2612 } else {2613 $(this).attr('colspan', 2);2614 }2615 rowspaning -= 1;2616 });2617 } else {2618 $tbody.prev('thead').find('th').first().attr('colspan', 1);2619 $tbody.find('.col1_1').attr('colspan', 1);2620 }2621 },2622 // 空行の削除2623 removeEmptyRow: function($tbody) {2624 var $rows = $tbody.find('tr');2625 // 空白の行の削除処理2626 $rows.each(function() {2627 if (!$(this).isEmptyRow()) {2628 // continu2629 return true;2630 }26312632 var rowIndex = $rows.index(this);2633 rowspan = 0;2634 $.each(Names.colClasses, function(i, colName) {2635 // セルが表示されていない時(rowspanでまとめられている)2636 for (var index = rowIndex; index >= 0; index--) {2637 // 前の行のrowspanを確認し、1より大きければその行のrowspanから1引いた値に設定する2638 $prevCell = $rows.eq(index).children(colName.addDot()).first();2639 rowspan = $prevCell.getRowspan();2640 if (rowspan > 1) {2641 $prevCell.attr('rowspan', rowspan - 1);2642 // これより上にはさかのぼらない2643 break;2644 }2645 }2646 });26472648 // 行を削除する2649 $(this).remove();2650 });2651 },2652 // 行をホバーした時2653 hoverRow: function(elm) {2654 // 行を見やすいように行の上下を線で挟む2655 $(elm).parents(Names.tblWrap).first()2656 .append($(Names.hoverRowTop.addHash()))2657 .append($(Names.hoverRowBottom.addHash()));2658 $(Names.hoverRowTop.addHash()).css({2659 top: $(elm).offset().top - 1,2660 left: $(elm).offset().left,2661 width: $(elm).width() + 'px'2662 }).show();2663 $(Names.hoverRowBottom.addHash()).css({2664 top: $(elm).offset().top + $(elm).height() -1,2665 left: $(elm).offset().left,2666 width: $(elm).width() + 'px'2667 }).show();2668 },2669 // コンテキストメニューの「行の追加」をホバーした時に挿入場所の線を表示2670 hoverUpRow: function() {2671 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2672 var $rows = $tbody.find('tr');26732674 var indexs = DataTable.getSelectRowLength($tbody);2675 // indexsの最初から最後の行まで選択クラスを付与する2676 for (var i = indexs.start, len = indexs.end; i <= len; i++) {2677 $rows.eq(i).addClass(Names.showMoveRow);2678 }2679 // 上の移動先の行を取得する2680 var $row = $rows.eq(DataTable.getMoveUpRow($tbody, indexs.start));26812682 // セパレータを挿入して表示2683 $tbody.parents(Names.tblWrap).first().append($(Names.rowSeparator.addHash()));2684 $(Names.rowSeparator.addHash()).css({2685 top: $row.offset().top,2686 left: $row.offset().left,2687 background: '#744199',2688 width: $tbody.width() + 'px'2689 }).show();2690 },2691 // コンテキストメニューの「行の追加」をホバーした時に挿入場所の線を表示2692 hoverDownRow: function() {2693 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2694 var $rows = $tbody.find('tr');26952696 // 現在選択されている行から移動するブロックを取得する2697 var indexs = DataTable.getSelectRowLength($tbody);2698 // indexsの最初から最後の行まで選択クラスを付与する2699 for (var i = indexs.start, len = indexs.end; i <= len; i++) {2700 $rows.eq(i).addClass(Names.showMoveRow);2701 }2702 // 下の移動先の行を取得する2703 var $row = $rows.eq(DataTable.getMoveDownRow($tbody, indexs.end));27042705 // セパレータを挿入して表示2706 $tbody.parents(Names.tblWrap).first().append($(Names.rowSeparator.addHash()));2707 $(Names.rowSeparator.addHash()).css({2708 top: $row.offset().top + $row.height(),2709 left: $row.offset().left,2710 background: '#744199',2711 width: $tbody.width() + 'px'2712 }).show();2713 },2714 // コンテキストメニューの「行の追加」をホバーした時に挿入場所の線を表示2715 hoverAddRow: function() {2716 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2717 var $row = $tbody.find('tr' + Names.ctmHover.addDot()).first();2718 $tbody.parents(Names.tblWrap).first().append($(Names.rowSeparator.addHash()));2719 $(Names.rowSeparator.addHash()).css({2720 top: $row.offset().top + $row.height(),2721 left: $row.offset().left,2722 background: '#f00',2723 width: $tbody.width() + 'px'2724 }).show();2725 },2726 // コンテキストメニューの「行の削除」をホバーした時に削除行の実際に削除されるセルに削除クラスを付与2727 hoverDelRow: function() {2728 // 行を見やすいように行の上にパネルを表示2729 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2730 var $row = $tbody.find('tr' + Names.ctmHover.addDot()).first();2731 $row.children().each(function() {2732 if (!$(this).isShown() || $(this).getRowspan() === 1) {2733 $(this).addClass(Names.showDelRow);2734 }2735 });2736 // コンテンツの追加ボタンの退避2737 Cells.removeAddBoxBtn();2738 },2739 // 移動する行の範囲を取得2740 getSelectRowLength: function($tbody) {2741 var $rows = $tbody.find('tr');2742 var ret = {2743 start: 0,2744 end: -12745 };2746 var $selectRow = $tbody.find('tr' + Names.ctmHover.addDot()).first();2747 var selectIndex = $rows.index($selectRow);2748 var i = 0;2749 var len = 0;2750 // 検索をかける列の取得2751 var cols = DataTable.getColClass($tbody);2752 // 列が全て表示されているかどうかの判定用関数2753 var isAllShow = function($row){2754 var ret = true;2755 $.each(cols, function(i, col) {2756 if (!$row.find(col.addDot()).isShown()) {2757 ret = false;2758 return false;2759 }2760 });2761 return ret;2762 };2763 // 全ての行が表示されているところまでさかのぼる2764 for (i = selectIndex; i >= 0; i--) {2765 if (isAllShow($rows.eq(i))) {2766 // すべての列が表示されているところをスタートインデックスとする2767 ret.start = i;2768 break;2769 }2770 }27712772 // 次の全ての行が表示されている前の行を終わりの行とする2773 for (i = ret.start + 1, len = $rows.length; i < len; i++) {2774 if (isAllShow($rows.eq(i))) {2775 // すべての列が表示されているところを最終2776 ret.end = i - 1;2777 break;2778 }2779 }2780 if (ret.end === -1) {2781 ret.end = $rows.length - 1;2782 }2783 return ret;2784 },2785 // 上の行に移動するときの移動先の行2786 getMoveUpRow: function($tbody, index) {2787 var $rows = $tbody.find('tr');2788 var rowIndex = index - 1;27892790 // 検索をかける列の取得2791 var cols = DataTable.getColClass($tbody);2792 // 列が全て表示されているかどうかの判定用関数2793 var isAllShow = function($row){2794 var ret = true;2795 $.each(cols, function(i, col) {2796 if (!$row.find(col.addDot()).isShown()) {2797 ret = false;2798 return false;2799 }2800 });2801 return ret;2802 };2803 // 全ての行が表示されているところまでさかのぼる2804 for (var i = rowIndex; i >= 0; i--) {2805 if (isAllShow($rows.eq(i))) {2806 // すべての列が表示されているところをスタートインデックスとする2807 rowIndex = i;2808 break;2809 }2810 }28112812 return rowIndex;2813 },2814 // 下の行に移動するときの移動先の行2815 getMoveDownRow: function($tbody, index) {2816 var $rows = $tbody.find('tr');2817 var rowIndex = index + 1;28182819 // 検索をかける列の取得2820 var cols = DataTable.getColClass($tbody);2821 var rowspans = {};2822 $.each(cols, function(i, col) {2823 rowspans[col] = 0;2824 });2825 // 各カラムのrowspanを個別に計算し、すべてのrowspanが一致するかどうかの確認2826 var matchRowspanNums = function($row){2827 var ret = true;2828 // rowspanの数を計算する2829 $.each(cols, function(i, col) {2830 if ($row.find(col.addDot()).isShown()) {2831 rowspans[col] += $row.find(col.addDot()).getRowspan();2832 }2833 });2834 loop: for (var keys in rowspans) {2835 for (var key in rowspans) {2836 if (rowspans[keys] !== rowspans[key]) {2837 ret = false;2838 break loop;2839 }2840 }2841 }2842 return ret;2843 };2844 // 全ての列のrowspanがマッチするまでループ2845 for (var i = rowIndex, len = $rows.length; i < len; i++) {2846 if (matchRowspanNums($rows.eq(i))) {2847 rowIndex = i;2848 break;2849 }2850 }28512852 return rowIndex;2853 },2854 // 表示されている列のクラス群を取得2855 getColClass: function($tbody) {2856 var $theadRow = $tbody.parents('table').first()2857 .find('thead').first()2858 .find('tr').first();2859 // 検索をかける列の取得2860 var cols = [];2861 cols.push('col1_1');2862 if ($theadRow.find('.col1').getColspan() > 1) {2863 cols.push('col1_2');2864 }2865 if ($theadRow.find('.col2').isShown()) {2866 cols.push('col2');2867 }2868 cols.push('col3');28692870 return cols;2871 },2872 // tfoot用のcolspanを取得2873 getTfootColspan: function($table) {2874 var colspan = 0;2875 $table.find('thead').first().find('th').each(function() {2876 if ($(this).isShown()) {2877 colspan += $(this).getColspan();2878 }2879 });2880 return colspan;2881 },2882 createNewRow: function() {2883 var $newRow = $(DataTable.tBodyRowTmp);2884 $newRow.children().each(function() {2885 var $boxTmp = $(Cells.boxTmp);2886 $boxTmp.find(BoxNames.wrapPhone.addDot()).first().append($(Cells.phoneTmp));2887 $boxTmp.find(BoxNames.wrapMail.addDot()).first().append($(Cells.mailTmp));2888 $(this).append($boxTmp);2889 });2890 return $newRow;2891 }2892 };28932894 // コンテキストメニュー2895 var Context = {2896 // コンテキストメニューの表示2897 show: function(tbody, e) {2898 var $tbody = $(tbody);2899 // ホバークラスのついたものにコンテキストメニュー用のホバーを付ける2900 // ホバー行を固定する為2901 $tbody.find(Names.hover.addDot()).addClass(Names.ctmHover);2902 // ホバー中のセル(行以外)を取得2903 var $cmtHoverCells = $tbody.find(Names.ctmHover.addDot()).filter('th, td');2904 var $cmtHoverRow = $tbody.find(Names.ctmHover.addDot()).filter('tr');2905 // ホバークラスに選択クラスが無い場合はホバーしているセルを選択中セルにする2906 $cmtHoverCells.each(function(i, cell) {2907 if (!$(this).hasClass(Names.uiSelected)) {2908 $tbody.find(Names.uiSelected.addDot())2909 .removeClass(Names.uiSelected);2910 $(this).addClass(Names.uiSelected);2911 }2912 });2913 // コンテキストに該当tbodyをセット2914 $(Names.ctm.addHash()).data(Names.dataTargetElm, tbody);29152916 /* ここから各メニューの表示・非表示 ---------------------------------------- */2917 var $trs = $tbody.find('tr');2918 var indexs = DataTable.getSelectRowLength($tbody);2919 // ▲行を上に移動 ------------------------------------------------------2920 $(Names.ctmMoveUp.addHash()).removeClass(Names.disabled);2921 if (indexs.start === 0) {2922 $(Names.ctmMoveUp.addHash()).addClass(Names.disabled);2923 }29242925 // ▼行を下に移動 ------------------------------------------------------2926 $(Names.ctmMoveDown.addHash()).removeClass(Names.disabled);2927 if (indexs.end === ($trs.length - 1)) {2928 $(Names.ctmMoveDown.addHash()).addClass(Names.disabled);2929 }29302931 // セルの結合 ---------------------------------------------------------2932 if ($trs.find(Names.uiSelected.addDot()).length > 1) {2933 $(Names.ctmJoinCell.addHash()).removeClass(Names.disabled);2934 } else {2935 $(Names.ctmJoinCell.addHash()).addClass(Names.disabled);2936 }2937 // col1_1とcol1_2の最初と最後の行がそろっていない場合はセルの結合設定を無効にする2938 var $selected = $(Names.uiSelected.addDot());2939 if ($selected.filter('.col1_1').length > 0 &&2940 $selected.filter('.col1_2').length > 0) {2941 var col1_1_start = $selected.filter('.col1_1').first().parent().index();2942 var col1_2_start = $selected.filter('.col1_2').first().parent().index();2943 if (col1_1_start !== col1_2_start) {2944 $(Names.ctmJoinCell.addHash()).addClass(Names.disabled);2945 }2946 var col1_1_end = $selected.filter('.col1_1').last().parent().index() +2947 $selected.filter('.col1_1').last().getRowspan();2948 var col1_2_end = $selected.filter('.col1_2').last().parent().index() +2949 $selected.filter('.col1_2').last().getRowspan();2950 if (col1_1_end !== col1_2_end) {2951 $(Names.ctmJoinCell.addHash()).addClass(Names.disabled);2952 }2953 }29542955 // セルの分割 ---------------------------------------------------------2956 $(Names.ctmSplitCell.addHash()).addClass(Names.disabled);2957 $tbody.find(Names.ctmHover.addDot() + ' ' + Names.uiSelected.addDot()).each(function () {2958 var rspan = $(this).getRowspan();2959 if ($(this).getRowspan() > 1) {2960 $(Names.ctmSplitCell.addHash()).removeClass(Names.disabled);2961 return false;2962 }2963 });29642965 // セルの列分割 -------------------------------------------------------2966 $(Names.ctmSplitCol.addHash()).addClass(Names.disabled);2967 $tbody.find('th' + Names.uiSelected.addDot()).each(function() {2968 if ($(this).next().hasClass(Names.hidden)) {2969 $(Names.ctmSplitCol.addHash()).removeClass(Names.disabled);2970 return false;2971 }2972 });29732974 // 行の追加 ----------------------------------------------------------2975 var colBool = true;2976 $.each(Names.colClasses, function(i, col) {2977 var $cell = $cmtHoverRow.children(col.addDot());2978 colBool = ($cell.isShown() && $cell.getRowspan() === 1) ? false : true;2979 });2980 if (colBool) {2981 $(Names.ctmAddRow.addHash()).addClass(Names.disabled);2982 } else {2983 $(Names.ctmAddRow.addHash()).removeClass(Names.disabled);2984 }29852986 // 行の削除 ----------------------------------------------------------2987 if ($trs.length > 1) {2988 $(Names.ctmDelRow.addHash()).removeClass(Names.disabled);2989 } else {2990 $(Names.ctmDelRow.addHash()).addClass(Names.disabled);2991 }29922993 // 2列・3列表示 ------------------------------------------------------2994 if ($tbody.find('.col2').isShown()) {2995 $(Names.ctmTitle2Col.addHash()).removeClass(Names.disabled);2996 $(Names.ctmTitle3Col.addHash()).addClass(Names.disabled);2997 } else {2998 $(Names.ctmTitle2Col.addHash()).addClass(Names.disabled);2999 $(Names.ctmTitle3Col.addHash()).removeClass(Names.disabled);3000 }30013002 // フッター行の追加・削除 ------------------------------------------------3003 if ($tbody.next('tfoot').length > 0) {3004 $(Names.ctmDelTfoot.addHash()).removeClass(Names.disabled);3005 $(Names.ctmAddTfoot.addHash()).addClass(Names.disabled);3006 } else {3007 $(Names.ctmAddTfoot.addHash()).removeClass(Names.disabled);3008 $(Names.ctmDelTfoot.addHash()).addClass(Names.disabled);3009 }30103011 /* ここまで各メニューの表示・非表示 ---------------------------------------- */30123013 // コンテキストメニューを表示3014 $(Names.ctm.addHash()).fadeIn('fast');3015 var pageY = e.pageY - $(window).scrollTop();3016 var pageX = e.pageX - $(window).scrollLeft();3017 // パディング、ボーダーを含めた高さを取得3018 var ulBottom = $(Names.ctm.addHash()).find('ul').outerHeight();3019 // パディング、ボーダーを含めた幅を取得3020 var ulLeft = $(Names.ctm.addHash()).find('ul').outerWidth();3021 // 画面から高さがはみ出る場合は位置を調整3022 if ($(window).height() < pageY + ulBottom) {3023 pageY -= ulBottom;3024 }3025 // 画面から幅がはみ出る場合は位置を調整3026 if ($(window).width() < pageX + ulLeft) {3027 pageX -= ulLeft;3028 }3029 $(Names.ctm.addHash()).children('ul')3030 .css({3031 top: pageY,3032 left: pageX3033 });3034 },3035 // コンテキストメニューの非表示3036 hide: function(elm) {3037 $(elm).fadeOut('fast', function () {3038 $($(Names.ctm.addHash()).data(Names.dataTargetElm))3039 .find(Names.ctmHover.addDot())3040 .removeClass(Names.ctmHover)3041 .addClass(Names.hover);3042 });3043 }3044 };30453046 // 「カテゴリの編集」モーダル用3047 var ModalCate = {3048 // カテゴリ行のテンプレート3049 row: '<tr>' +3050 ' <td class="' + Names.mdlCateSort + '">⇕</td>' +3051 ' <td><input type="text" class="' + Names.mdlCateName + '"></td>' +3052 ' <td><input type="text" class="' + Names.mdlCateId + '"></td>' +3053 ' <td><input type="text" class="' + Names.mdlCateClass + '"></td>' +3054 ' <td>' +3055 ' <select class="' + Names.mdlCateEnable + '">' +3056 ' <option value="0">-</option>' +3057 ' <option value="1">削除</option>' +3058 ' </select>' +3059 ' </td>' +3060 '</tr>',3061 // 表に追加するときのテンプレート3062 sectionTmp: '<div class="tn-section" id="">' +3063 ' <h3>総合</h3>' +3064 ' <div class="' + Names.tblWrap + '">' +3065 ' <table>' +3066 ' <thead>' +3067 ' </thead>' +3068 ' <tbody>' +3069 ' </tbody>' +3070 ' </table>' +3071 ' </div>' +3072 '</div>',3073 // モーダルの表示3074 show: function(table) {3075 // 一旦行の全削除3076 $(Names.mdlCateTable.addHash()).empty();3077 $(Names.cntBody.addDot()).first().find(Names.section.addDot()).each(function() {3078 ModalCate.addRow(3079 $(this).children('h3').text(),3080 $(this).attr('id'),3081 $(this).attr('class')3082 );3083 });3084 },3085 // カテゴリの「表示・削除」の値が変わった時の処理3086 changeCateEnable: function(elm) {3087 // カテゴリを削除するかどうかの値を確認してクラスを設定する3088 if ($(elm).children('option:selected').first().val() === '0') {3089 $(elm).removeClass(Names.mdlCateDel);3090 } else {3091 $(elm).addClass(Names.mdlCateDel);3092 }3093 },3094 // 行の追加処理3095 addRow: function(cateName, cateId, cateClass) {3096 // カテゴリ一覧のテーブルを選択3097 var $cateTable = $(Names.mdlCateTable.addHash());3098 // 追加する行のテンプレートをjQueryオブジェクトとして取得3099 var $row = $(ModalCate.row);3100 // 行のinput要素に値を設定3101 $row.find(Names.mdlCateName.addDot()).first().val(cateName || '');3102 $row.find(Names.mdlCateId.addDot()).first().val(cateId ? cateId.split('-')[1] : '')3103 .attr(Names.mdlCateNowId, cateId || '');3104 // sectionタグの代わりに付けているtn-sectionを削除3105 cateClass = cateClass || '';3106 cateClass = cateClass.replace(Names.section, '').trim();3107 $row.find(Names.mdlCateClass.addDot()).first().val(cateClass || '');3108 // 新規行の時は必須エラーを付与3109 if (!cateName) {3110 $row.find(Names.mdlCateName.addDot())3111 .addClass(Names.mdlCateErrInput)3112 .after($('<div></div>')3113 .text('※必須項目です')3114 .addClass(Names.mdlCateErrPnl));3115 }3116 if (!cateId) {3117 $row.find(Names.mdlCateId.addDot())3118 .addClass(Names.mdlCateErrInput)3119 .after($('<div></div>')3120 .text('※必須項目です')3121 .addClass(Names.mdlCateErrPnl));3122 }3123 // テーブルの最後に追加3124 $cateTable.append($row);3125 // 追加した行の名前にフォーカスを移動3126 $cateTable.find(Names.mdlCateName.addDot()).last().focus();3127 },3128 // 名前の確認3129 validateName: function(elm) {3130 // 空文字の確認3131 if (ModalCate.validateEmpty(elm)) {3132 return;3133 }3134 // 重複チェック3135 ModalCate.validateOverlap(Names.mdlCateName);3136 },3137 // idの確認3138 validateId: function(elm) {3139 // 空文字の確認3140 if (ModalCate.validateEmpty(elm)) {3141 return;3142 }3143 // 入力文字種のチェック3144 if ($(elm).val().match(/[^a-zA-Z0-9_-]+/)) {3145 $(elm).addClass(Names.mdlCateErrInput)3146 .after($('<div></div>')3147 .text('※使用できる文字は英数字とハイフン、アンダースコアのみです')3148 .addClass(Names.mdlCateErrPnl));3149 return;3150 } else if ($(elm).val().match(/^[0-9_-]+/)) {3151 $(elm).addClass(Names.mdlCateErrInput)3152 .after($('<div></div>')3153 .text('※数字・記号から始まるものは設定できません')3154 .addClass(Names.mdlCateErrPnl));3155 } else {3156 $(elm).removeClass(Names.mdlCateErrInput)3157 .next(Names.mdlCateErrPnl.addDot()).remove();3158 }3159 // 重複チェック3160 ModalCate.validateOverlap(Names.mdlCateId);3161 },3162 // idの確認3163 validateClass: function(elm) {3164 $(elm).removeClass(Names.mdlCateErrInput)3165 .parents('td').first().find(Names.mdlCateErrPnl.addDot()).remove();3166 if ($(elm).val().match(/^[0-9_-]+/)) {3167 $(elm).addClass(Names.mdlCateErrInput)3168 .after($('<div></div>')3169 .text('※数字・記号から始まるものは設定できません')3170 .addClass(Names.mdlCateErrPnl));3171 }3172 },3173 // 空白かどうかの確認3174 validateEmpty: function(elm) {3175 $(elm).removeClass(Names.mdlCateErrInput)3176 .parents('td').first().find(Names.mdlCateErrPnl.addDot()).remove();3177 if ($(elm).val()) {3178 return false;3179 } else {3180 $(elm).addClass(Names.mdlCateErrInput)3181 .after($('<div></div>')3182 .text('※必須項目です')3183 .addClass(Names.mdlCateErrPnl));3184 return true;3185 }3186 },3187 // 重複チェック3188 validateOverlap: function(col) {3189 var vals = [];3190 var overlaps = [];3191 var i, len;3192 // 重複エラーを一旦初期化3193 $(Names.mdlCateTable.addHash()).find(col.addDot()).each(function() {3194 $(this).removeClass(Names.mdlCateErrOverlap);3195 $(this).parents('td').first().find(Names.mdlCateErrOverlap.addDot()).remove();3196 if ($(this).parents('td').first().find(Names.mdlCateErrInput.addDot()).length === 0) {3197 $(this).removeClass(Names.mdlCateErrInput);3198 }3199 });32003201 // 列の値を配列に保存3202 $(Names.mdlCateTable.addHash()).find(col.addDot()).each(function() {3203 if ($.inArray($(this).val(), vals) === -1) {3204 vals.push($(this).val());3205 } else {3206 if ($.inArray($(this).val(), overlaps) === -1 && $(this).val() !== '') {3207 overlaps.push($(this).val());3208 }3209 }3210 });3211 for (i = 0, len = overlaps.length; i < len; i++) {3212 $(Names.mdlCateTable.addHash()).find(col.addDot()).each(function() {3213 if ($(this).val() === overlaps[i]) {3214 $(this).addClass(Names.mdlCateErrInput)3215 .addClass(Names.mdlCateErrOverlap)3216 .after(3217 $('<div></div>').text('※値が重複しています')3218 .addClass(Names.mdlCateErrPnl)3219 .addClass(Names.mdlCateErrOverlap)3220 );3221 }3222 });3223 }3224 },3225 // ページ内リンクの作成3226 createUl: function(pageName) {3227 var $ul = $('<ul></ul>').attr('id', 'inpage-links');3228 $(Names.cntBody.addDot()).first().find(Names.section.addDot()).each(function() {3229 var href = $(this).attr('id');3230 $ul.append(3231 $('<li></li>').append(3232 $('<a></a>').attr('href', href)3233 .text($(this).children('h3').text())3234 )3235 );3236 });3237 return $ul;3238 },3239 // カテゴリの表への反映3240 reflect: function() {3241 // エラーの存在する場合は何もしない3242 if ($(Names.mdlCateTable.addHash()).find(Names.mdlCateErrInput.addDot()).length > 0) {3243 alert('エラーを修正してください');3244 return false;3245 }3246 var hasDel = false;3247 var delElm = $(Names.mdlCateTable.addHash()).find('option:selected').each(function() {3248 if ($(this).attr('value') === '1') {3249 hasDel = true;3250 return true;3251 }3252 });32533254 if (hasDel) {3255 if (!confirm("削除項目があります。\n更新してもよろしいですか?")) {3256 return false;3257 }3258 }32593260 // ページ内リンク3261 var $ul = $('<ul></ul>').attr('id', 'inpage-links');32623263 // パネルの入れ替え3264 var newArr = [];3265 $(Names.mdlCateTable.addHash()).children('tr').each(function() {3266 if ($(this).find(Names.mdlCateEnable.addDot()).first().val() === '1') {3267 return true;3268 }3269 var nowval = $(this).find(Names.mdlCateId.addDot()).first().attr(Names.mdlCateNowId);3270 var $obj;3271 if (nowval) {3272 $obj = $(nowval.addHash()).clone();3273 } else {3274 $obj = $(ModalCate.sectionTmp);3275 $obj.find('thead').first().append($(DataTable.tHeadRowTmp));3276 $obj.find('tbody').first().append(DataTable.createNewRow());3277 }3278 var id = Names.mdlCateIdPre + $(this).find(Names.mdlCateId.addDot()).first().val();3279 var name = $(this).find(Names.mdlCateName.addDot()).first().val();3280 $obj.attr(Names.mdlCateNowId, Names.mdlCateIdPre + $(this).find(Names.mdlCateId.addDot()).first().val())3281 .attr('id', id)3282 // addClassにしないのは現在のものとの置き換えを目的としている為3283 .attr('class', $(this).find(Names.mdlCateClass.addDot()).first().val())3284 .addClass(Names.section)3285 .children('h3').text(name);3286 newArr.push($obj);32873288 $ul.append(3289 $('<li></li>').append(3290 $('<a></a>').attr('href', '#' + id)3291 .text(name)3292 )3293 );3294 });32953296 // 一旦データを空にする3297 $(Names.cntBodyDataWrap.addHash()).empty();3298 // ナビゲーションの挿入3299 $(Names.cntBodyDataWrap.addHash()).first().append($ul);3300 // 新規に挿入3301 $.each(newArr, function(i, val) {3302 $(Names.cntBodyDataWrap.addHash()).append(val);3303 });3304 // 編集フラグをセット3305 isEdit = true;3306 // テーブル選択の有効化3307 DataTable.addSelectEvent();3308 // コンテンツボックスのドラッグアンドドロップ有効化3309 Cells.addSortableCol();3310 $(Names.mdlCate.addHash()).modal('hide');3311 }3312 };33133314 // 「問合せ一覧」モーダル用3315 var ModalMenu = {3316 // 表示処理3317 show: function() {3318 // モーダル表示時に選択したリストのクリア、ボタンの無効化を行う3319 ModalMenu.removeSelect();3320 $(Names.mdlMenuBtnShow.addHash()).addClass(Names.disabled);3321 },3322 // リストを選択した時の処理3323 liSelect: function(elm) {3324 // リストをクリックした際に選択クラスの付与とボタンの有効化を行う3325 ModalMenu.removeSelect();3326 $(elm).addClass(Names.selected);3327 $(Names.mdlMenuBtnShow.addHash()).removeClass(Names.disabled);3328 },3329 // 選択されているリストのクリア3330 removeSelect: function() {3331 // 選択されているリストをクリアする3332 $(Names.mdlMenu.addHash()).find('li').removeClass(Names.selected);3333 },3334 // 選択されているページの取得3335 getPage: function(elm) {3336 var $modalMenu = $(Names.mdlMenu.addHash());3337 if (isEdit) {3338 if (!confirm("現在表示中のページは編集されているようです。\n編集を保存せずにページを取得しますか?")) {3339 $modalMenu.modal('hide');3340 return;3341 }3342 }3343 // 選択されているリストのページを取得して表示する3344 // var $menuSelect = $modalMenu.find('li' + Names.selected.addDot()).first();3345 var $menuSelect = $(elm);3346 var url = 'html/get/' + $menuSelect.attr(Names.dataMenuName);3347 $modalMenu.modal('hide');3348 Ajaxs.get(url);3349 }3350 };335133523353 // 本番用のJSと合わせること!3354 // BoxNamesオブジェクトも忘れずに!3355 var phoneOther = {3356 // ○○○○年○○月○○日[から・まで]を表示するようのテンプレート3357 tmp: '<div class="until-phone">' +3358 ' <span class="' + BoxNames.phoneOtherDateClass + '"></span>' +3359 ' <span>:</span>' +3360 ' <span class="' + BoxNames.phoneOtherNumberClass + '"></span>' +3361 '</div>',3362 set: function() {3363 // 更新システム用3364 // $(EditNames.panel.addHash() + '-preview').find('['+ BoxNames.phoneOtherDate +']')3365 //3366 // 本番用3367 // $('['+ BoxNames.phoneOtherDate +']')3368 $(EditNames.panel.addHash() + '-preview').find('['+ BoxNames.phoneOtherDate +']').each(function() {3369 var date = $(this).attr(BoxNames.phoneOtherDate) || '1900-01-01';3370 var phoneState = $(this).attr(BoxNames.phoneOtherState);3371 var stateStr = phoneState === '1' ? 'から' : 'まで';3372 var otherNum = $(this).attr(BoxNames.phoneOtherNumber);3373 var defaultNum = $(this).attr(BoxNames.phoneDefaultNumber);3374 var $boxPhoneNum = $(this).find(BoxNames.phoneNumber.addDot()).first();3375 $boxPhoneNum.empty();3376 $boxPhoneNum.append($('<em></em>').text(defaultNum));33773378 if (phoneOther.validDate(date) && otherNum) {3379 var checkDate = new Date(date);3380 var today = new Date();33813382 if (phoneState === '1') {3383 if (today >= checkDate) {3384 $boxPhoneNum.empty();3385 $boxPhoneNum.append($('<em></em>').text(otherNum));3386 } else {3387 phoneOther.setAfter(this, otherNum, stateStr, checkDate);3388 }3389 } else if (phoneState === '2') {3390 if (today <= checkDate) {3391 phoneOther.setAfter(this, otherNum, stateStr, checkDate);3392 }3393 }3394 }3395 });3396 },3397 setAfter: function(elm, phoneNumber, stateStr, checkDate) {3398 var $div = $(phoneOther.tmp);3399 var viewDate = checkDate.getFullYear() + '年' +3400 (checkDate.getMonth() + 1) + '月' +3401 checkDate.getDate() + '日' +3402 stateStr;3403 $div.find(BoxNames.phoneOtherDateClass.addDot()).first().text(viewDate);3404 $div.find(BoxNames.phoneOtherNumberClass.addDot()).first().text(phoneNumber);3405 $(elm).append($div);3406 },3407 validDate: function(date) {3408 var dateArr = date.split('-');3409 var y = parseInt(dateArr[0], 10) || 0;3410 var m = parseInt(dateArr[1], 10) || 0;3411 var d = parseInt(dateArr[2], 10) || 0;3412 var dt = new Date(y, m - 1, d);3413 return (dt.getFullYear() === y, dt.getMonth() === m, dt.getDate() === d);3414 }3415 };34163417 // 初期化の実行3418 Init(); ...

Full Screen

Full Screen

telnumber_bk20160616.js

Source:telnumber_bk20160616.js Github

copy

Full Screen

...291 // プレビュー画面の初期設定292 Preview.load();293 // カテゴリ編集のドラッグアンドドロップの有効化294 $(Names.mdlCateTable.addHash()).sortable({295 handle: Names.mdlCateSort.addDot()296 });297298 // ページ選択用のメニューを選択した時の処理299 $('.cnt h3').on('mouseenter', function() {300 $(this).next('ul').removeClass(Names.hidden).slideDown('fast');301 }).on('mouseleave', function() {302 $(this).next('ul').slideUp('fast');303 });304305 // 初期表示で社内用 受付全般を表示するようにする306 Ajaxs.get('html/get/index');307 };308309310 // イベント311 var Events = {312 // 初期化時に登録するイベント313 add: function() {314 /* 上部のボタンの固定 ----------------------------------------------- */315 var $head = $('.cnt-head').first();316 $(window).on('scroll', function() {317 if ($(window).scrollTop() > $('.site-header').first().outerHeight(true)) {318 $head.addClass(Names.fixed);319 } else {320 $head.removeClass(Names.fixed);321 }322 });323324325 /* 表のイベント ----------------------------------------------------- */326 // ホバー327 var hovers =[328 Names.tblWrap.addDot() + ' tbody tr',329 Names.tblWrap.addDot() + ' tbody th',330 Names.tblWrap.addDot() + ' tbody td'331 ];332 // 行・セルのホバー時にホバークラスの付与333 $(document).on('mouseenter', hovers.join(','), function (e) {334 $(this).addClass(Names.hover);335 }).on('mouseleave', hovers.join(','), function () {336 $(this).removeClass(Names.hover);337 });338 // 行のホバー時に枠線を表示339 // $(document).on('mouseenter', Names.tblWrap.addDot() + ' tbody tr', function () {340 // DataTable.hoverRow(this);341 // });342 // セルのホバー時に追加ボタンを表示343 hovers.shift();344 $(document).on('mouseenter.hover', hovers.join(','), function () {345 Cells.addAddBoxBtn(this);346 }).on('mouseleave.hover', hovers.join(','), function () {347 Cells.removeAddBoxBtn();348 });349 // セル内コンテンツの追加ボタンを押した時の処理350 $(document).on('click', Names.btnAddBox.addHash(), function() {351 Cells.addBox(this);352 });353354355 /* セル内コンテンツでの処理 ---------------------------------------------*/356 // セル内コンテンツのドラッグアンドドロップ処理357 Events.addCellHovers();358 // セル内のコンテンツブロック用のイベント359 Events.addContentsBlock();360361362 /* theadでの処理 ---------------------------------------------------*/363 $(document).on('mouseenter', Names.tblWrap.addDot() + 'thead th', function() {364 $(this).append($(Names.btnsPanelThead.addHash()).removeClass(Names.hidden));365 }).on('mouseleave', 'thead th', function() {366 $('body').append($(Names.btnsPanelThead.addHash()).addClass(Names.hidden));367 });368 // 編集ボタンを押した時の処理369 $(Names.btnEditThead.addHash()).on('click', function() {370 Cells.editThead($(this).parents('th').first());371 $('body').append($(Names.btnsPanelThead.addHash()).addClass(Names.hidden));372 });373 // theadのthをダブルクリックした時の処理374 $(document).on('dblclick', 'thead th', function() {375 Cells.editThead(this);376 });377 // theadのthの編集パネルで反映するボタンを押した時の処理378 $(Names.headEdit.addHash() + '-reflection').on('click', function() {379 Cells.updateThead(this);380 });381 // theadのthの編集パネルでキャンセルボタンを押した時の処理382 $(Names.headEdit.addHash() + '-cancel').on('click', function() {383 Cells.cancelThead(this);384 });385 // 編集パネル上のクリックの時は何もしない386 $(Names.headEdit.addHash()).on('click', function() {387 return false;388 });389 // thead編集パネルのラップをクリックした時に閉じる390 $(Names.headEdit.addHash() + '-wrap').on('click', function() {391 Cells.cancelThead(this);392 });393394395 /* tfootでの処理 ---------------------------------------------------*/396 // tfootのセルをダブルクリックした時の処理397 Events.addTfoot();398 // tfootからフォーカスが外れたときの処理399 $(document).on('blur', 'tfoot textarea', function() {400 Cells.updateTfoot(this);401 });402403404 /* セル内コンテンツの編集パネル -------------------------------------------------- */405 // セル内コンテンツ編集パネルを閉じる時の処理406 $(EditNames.panel.addHash()).on('hidden.bs.modal', function(e) {407 EditPanel.hide(e);408 });409 // セル内コンテンツの編集パネル内のテキストエリアをWYSIWYGエディタに変換410 EditPanel.setWyswyg();411 // セル内コンテンツの編集パネル内のイベント412 Events.addModalEdit();413414415 /* コンテキストメニュー ------------------------------------------------- */416 // 表示417 $(document).on('contextmenu', Names.tblWrap.addDot() + ' tbody', function (e) {418 Context.show(this, e);419 // 標準のコンテキストメニューのキャンセル420 return false;421 });422 // 非表示423 $(document).on('click', Names.ctm.addHash(), function () {424 $('tbody').find(Names.hover.addDot()).removeClass(Names.hover);425 $('tbody').find(Names.ctmHover.addDot()).removeClass(Names.ctmHover);426 $('tbody').find(Names.uiSelected.addDot() + Names.hidden.addDot()).removeClass(Names.uiSelected);427 Context.hide(this);428 }).on('contextmenu', Names.ctm.addHash(), function() {429 $(this).trigger('click');430 return false;431 });432 // コンテキストメニュー内のイベントを登録433 Events.addContext();434435436 /* カテゴリの編集関係イベント ------------------------------------------- */437 // カテゴリ編集用モーダル表示時の処理438 $(Names.mdlCate.addHash()).on('show.bs.modal', function(e) {439 ModalCate.show(this);440 });441 // カテゴリ編集用モーダル内のイベント442 Events.addModalCategory();443444445 /* 問合せ先一覧関係イベント ------------------------------------------- */446 // 問合せ先一覧用モーダル表示時の処理447 // $(Names.mdlMenu.addHash()).on('show.bs.modal', function(e) {448 // ModalMenu.show($(this).find('table').first());449 // });450 // 問合せ一覧選択用モーダル画面内のイベント451 Events.addModalMenu();452453 $('.title').on('mouseenter', function() {454 $(this).children('ul').stop().slideDown();455 }).on('mouseleave', function() {456 $(this).children('ul').stop().slideUp();457 });458459460 /* プレビュー画面でのイベント ------------------------------------------- */461 // 閉じるボタンを押した時の処理462 $(Names.btnCancel.addHash()).on('click', function() {463 Preview.hide();464 });465 // 本番環境に公開するボタンを押した時の処理466 $(Names.btnPublishing.addHash()).on('click', function() {467 Contents.publishing();468 });469470471 /* 「下書き保存する」ボタンイベント ---------------------------------------------- */472 $(Names.btnSave.addHash()).on('click', function() {473 Contents.save();474 });475476 /* 「プレビュー」ボタンイベント --- ------------------------------------------- */477 $(Names.btnPreview.addHash()).on('click', function() {478 Preview.show();479 });480 },481 // tfootエリアのイベント482 addTfoot: function() {483 $(document).on('dblclick', 'tfoot td', function() {484 Cells.editTfoot(this);485 });486 },487 removeTfoot: function() {488 $(document).off('dblclick', 'tfoot td');489 },490 // コンテキストメニュー内のイベント491 addContext: function() {492 // コンテキストの行の上へ移動493 $(Names.ctmMoveUp.addHash()).on('click', function () {494 if ($(this).hasClass(Names.disabled)) {495 return false;496 }497 DataTable.moveUpRow();498 }).on('mouseenter', function () {499 if (!$(this).hasClass(Names.disabled)) {500 DataTable.hoverUpRow();501 }502 }).on('mouseleave', function () {503 // セパレータと背景を非表示504 $(Names.showMoveRow.addDot()).removeClass(Names.showMoveRow);505 $(Names.rowSeparator.addHash()).hide();506 });507 // コンテキストの行の下へ移動508 $(Names.ctmMoveDown.addHash()).on('click', function () {509 if ($(this).hasClass(Names.disabled)) {510 return false;511 }512 DataTable.moveDownRow();513 }).on('mouseenter', function () {514 if (!$(this).hasClass(Names.disabled)) {515 DataTable.hoverDownRow();516 }517 }).on('mouseleave', function () {518 // セパレータと背景を非表示519 $(Names.showMoveRow.addDot()).removeClass(Names.showMoveRow);520 $(Names.rowSeparator.addHash()).hide();521 });522 // コンテキストのセルの結合イベント523 $(Names.ctmJoinCell.addHash()).on('click', function () {524 if ($(this).hasClass(Names.disabled)) {525 return false;526 }527 DataTable.joinCell();528 });529 // コンテキストのセルの分割イベント530 $(Names.ctmSplitCell.addHash()).on('click', function () {531 if ($(this).hasClass(Names.disabled)) {532 return false;533 }534 DataTable.splitCell();535 });536 // コンテキストのセルの列分割イベント537 $(Names.ctmSplitCol.addHash()).on('click', function () {538 if ($(this).hasClass(Names.disabled)) {539 return false;540 }541 DataTable.splitCol();542 });543 // コンテキストの行の追加イベント544 $(Names.ctmAddRow.addHash()).on('click', function () {545 if ($(this).hasClass(Names.disabled)) {546 return false;547 }548 DataTable.addRow(this);549 }).on('mouseenter', function () {550 if (!$(this).hasClass(Names.disabled)) {551 DataTable.hoverAddRow();552 }553 }).on('mouseleave', function () {554 $(Names.rowSeparator.addHash()).hide();555 });556 // コンテキストの行の削除イベント557 $(Names.ctmDelRow.addHash()).on('click', function () {558 if ($(this).hasClass(Names.disabled)) {559 return false;560 }561 DataTable.delRow(this);562 }).on('mouseenter', function () {563 DataTable.hoverDelRow();564 }).on('mouseleave', function () {565 $(Names.showDelRow.addDot()).removeClass(Names.showDelRow);566 });567 // 2列表示568 $(Names.ctmTitle2Col.addHash()).on('click', function () {569 if ($(this).hasClass(Names.disabled)) {570 return false;571 }572 DataTable.show2Col();573 });574 // 3列表示575 $(Names.ctmTitle3Col.addHash()).on('click', function () {576 if ($(this).hasClass(Names.disabled)) {577 return false;578 }579 DataTable.show3Col();580 });581 // フッター行の追加582 $(Names.ctmAddTfoot.addHash()).on('click', function () {583 if ($(this).hasClass(Names.disabled)) {584 return false;585 }586 DataTable.addTfoot();587 });588 // フッター行の削除589 $(Names.ctmDelTfoot.addHash()).on('click', function () {590 if ($(this).hasClass(Names.disabled)) {591 return false;592 }593 DataTable.removeTfoot();594 });595 },596 // セル内のコンテンツブロック用のイベント597 addContentsBlock: function() {598 // セル内コンテンツの削除ボタンを押した時の処理599 $(document).on('click', Names.btnDelBox.addHash(), function() {600 var $parentBox = $(this).parents(BoxNames.wrap.addDot()).first();601 if (confirm("削除すると元に戻せません。\n削除しますか?")) {602 Cells.removeBox($parentBox);603 }604 });605 // セル内コンテンツの編集画面表示の際の処理606 $(document).on('click', Names.btnEditBox.addHash(), function() {607 EditPanel.show(this);608 }).on('dblclick', BoxNames.wrap.addDot(), function() {609 // セル内コンテンツをダブルクリックした時の処理610 EditPanel.show($(this).children().first());611 });612 },613 // セルのブロック編集用モーダル画面内のイベント614 addModalEdit: function() {615 // セル内コンテンツの内容を更新した時の処理616 $(document).on('click', EditNames.btnUpdate.addHash(), function() {617 EditPanel.update();618 });619 $(document).on('click', EditNames.btnCancel.addHash(), function() {620 var $editBox = $(EditNames.panel.addHash()).data(Names.dataTargetElm);621 if ($(EditNames.panel.addHash()).data('addState')) {622 $editBox.remove();623 }624 });625 // 編集パネルの値が変わった時の処理626 var changes =[627 EditNames.panel.addHash() + ' input',628 EditNames.panel.addHash() + ' textarea',629 EditNames.panel.addHash() + ' select',630 ];631 $(document).on('change enter.imeEnter', changes.join(','), function() {632 EditPanel.setVal(this);633 });634 // 電話番号の追加635 $(document).on('click', EditNames.btnPhoneAdd.addHash(), function () {636 EditPanel.addPhone(this);637 });638 // 電話番号の削除639 $(document).on('click', EditNames.btnPhoneDel.addDot(), function () {640 EditPanel.delPhone(this);641 });642 // メールアドレスの追加643 $(document).on('click', EditNames.btnMailAdd.addHash(), function () {644 EditPanel.addMail(this);645 });646 // メールアドレスの削除647 $(document).on('click', EditNames.btnMailDel.addDot(), function () {648 EditPanel.delMail(this);649 });650 // テキストエリアの説明文の開閉651 $(document).on('click', '.edit-note-title', function() {652 $(this).next('.edit-note-wrap').slideToggle('fast');653 });654 // fieldsetの開閉655 $(document).on('click', '.edit-section-title', function() {656 if ($(this).hasClass('close')) {657 $(this).removeClass('close');658 } else {659 $(this).addClass('close');660 }661 $(this).next('fieldset').slideToggle('fast');662 });663664 //文字が選択されているか判断665 var checkSelectionText = function () {666 return getSelection().toString().length > 0;667 };668 var getSelection = function () {669 if (window.getSelection) {670 return window.getSelection();671 } else if (document.getSelection) {672 return document.getSelection();673 } else if (document.selection) {674 return document.selection;675 }676 };677 // 小文字ボタン678 $(document).on('click', '.small', function () {679 if (checkSelectionText()) {680 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()681 .find(EditNames.editBox.addDot() + '-editbox').first();682 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()683 .find(EditNames.editBox.addDot()).first();684 $inputArea.focus();685686 var selection = getSelection();687 var range = selection.getRangeAt(0);688 var font = document.createElement('font');689 font.style.fontSize = 'smaller';690 range.surroundContents(font);691692 $textArea.val($inputArea.html()).trigger('input');693 }694 });695 // 赤字ボタン696 $(document).on('click', '.red', function () {697 if (checkSelectionText()) {698 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()699 .find(EditNames.editBox.addDot() + '-editbox').first();700 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()701 .find(EditNames.editBox.addDot()).first();702 $inputArea.focus();703704 var selection = getSelection();705 var range = selection.getRangeAt(0);706 var font = document.createElement('font');707 font.style.color = 'rgb(204,0,0)';708 range.surroundContents(font);709710 $textArea.val($inputArea.html()).trigger('input');711 }712 });713 // 太字ボタン714 $(document).on('click', '.bold', function () {715 if (checkSelectionText()) {716 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()717 .find(EditNames.editBox.addDot() + '-editbox').first();718 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()719 .find(EditNames.editBox.addDot()).first();720 $inputArea.focus();721722 var selection = getSelection();723 var range = selection.getRangeAt(0);724 var font = document.createElement('font');725 font.style.fontWeight = 'bold';726 range.surroundContents(font);727728 $textArea.val($inputArea.html()).trigger('input');729 }730 });731 var rng;732 // リンクボタン733 $(document).on('click', '.link', function () {734 // if (checkSelectionText()) {735 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()736 .find(EditNames.editBox.addDot() + '-editbox').first();737 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()738 .find(EditNames.editBox.addDot()).first();739 $inputArea.focus();740741 var selection = getSelection();742 rng = selection.getRangeAt(0);743744 var $inputPanel = $(this).parents(EditNames.editBox.addDot() + '-wrap').first().find('.edit-link').first();745 $inputPanel.data('state', 'link');746 $inputPanel.find('.edit-link-blank-label').first().show();747 $inputPanel.find('.edit-link-blank').first().prop('checked', false);748 $(this).parent().append($('#modal-back'));749 $('#modal-back').show();750 $inputPanel.show();751 $inputPanel.find('input').first().val('').focus();752 // }753 });754 // メール挿入ボタン755 $(document).on('click', '.mail', function () {756 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()757 .find(EditNames.editBox.addDot() + '-editbox').first();758 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()759 .find(EditNames.editBox.addDot()).first();760 $inputArea.focus();761762 var selection = getSelection();763 rng = selection.getRangeAt(0);764765 var $inputPanel = $(this).parents(EditNames.editBox.addDot() + '-wrap').first().find('.edit-link').first();766 $inputPanel.data('state', 'mail');767 $inputPanel.find('.edit-link-blank-label').first().hide();768 $(this).parent().append($('#modal-back'));769 $('#modal-back').show();770 $inputPanel.show();771 $inputPanel.find('input').first().val('').focus();772 });773 // リンク挿入パネル更新774 $(document).on('click', '.edit-link-submit', function() {775 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()776 .find(EditNames.editBox.addDot() + '-editbox').first();777 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()778 .find(EditNames.editBox.addDot()).first();779 var $inputPanel = $(this).parents('.edit-link').first();780 var val = $(this).parents('div').first().find('input').first().val();781782 if (val !== '') {783 var a = document.createElement('a');784 var hrefVal = $inputPanel.data('state') === 'link' ? val : 'mailto:' + val;785 a.setAttribute('href', hrefVal);786 if ($inputPanel.find('.edit-link-blank').first().prop('checked')) {787 a.setAttribute('target', '_blank');788 }789 $inputArea.focus();790 if (rng.collapsed) {791 a.innerHTML = val;792 rng.insertNode(a);793 } else {794 try {795 rng.surroundContents(a);796 } catch(e) {797 alert('同じ範囲にすでにリンクが挿入されています');798 }799 }800801 $textArea.val($inputArea.html()).trigger('input');802 }803804 $('body').append($('#modal-back'));805 $('#modal-back').hide();806 $(this).parents('.edit-link').first().hide();807 });808 // リンク挿入パネルキャンセル809 $(document).on('click', '.edit-link-cancel', function() {810 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()811 .find(EditNames.editBox.addDot() + '-editbox').first();812813 $('body').append($('#modal-back'));814 $('#modal-back').hide();815 $(this).parents('.edit-link').first().hide();816 });817 // 背景をクリックした時にリンク挿入パネルを閉じる818 $('#modal-back').on('click', function() {819 $('body').append($('#modal-back'));820 $('#modal-back').hide();821 $('.edit-link').hide();822 });823 // アンセットボタン824 $(document).on('click', '.reset', function () {825 if (checkSelectionText()) {826 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()827 .find(EditNames.editBox.addDot() + '-editbox').first();828 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()829 .find(EditNames.editBox.addDot()).first();830 $inputArea.focus();831 document.execCommand('removeformat');832 document.execCommand('unlink');833834 $textArea.val($inputArea.html()).trigger('input');835 }836 });837 // ソースの表示ボタン838 $(document).on('click', '.source', function () {839 var $inputArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()840 .find(EditNames.editBox.addDot() + '-editbox').first();841 var $textArea = $(this).parents(EditNames.editBox.addDot() + '-wrap').first()842 .find(EditNames.editBox.addDot()).first();843 if ($inputArea.is(':visible')) {844 $(this).parent().children('button').each(function() {845 if (!$(this).hasClass('source')) {846 $(this).addClass('hidden');847 }848 });849 $inputArea.hide();850 $textArea.show().focus();851 $(this).text('編集エリアの表示');852 } else {853 $(this).parent().children('button').each(function() {854 if (!$(this).hasClass('source')) {855 $(this).removeClass('hidden');856 }857 });858 var val = $textArea.val();859 // scriptという文字を削除860 val = val.replace(/(<\/?)script/gi, "$1span");861 $textArea.val(val);862 $inputArea.html(val);863 $textArea.hide();864 $inputArea.show().focus();865 $(this).text('ソースの表示');866 }867 });868 },869 // カテゴリ編集モーダル内のイベント870 addModalCategory: function() {871 // カテゴリー編集モーダルの行の「表示」「削除」の値が変わった時の処理872 $(document).on('change', Names.mdlCateEnable.addDot(), function() {873 ModalCate.changeCateEnable(this);874 });875876 // カテゴリの追加ボタンを押した時の処理877 $(Names.mdlCateBtnAdd.addHash()).on('click', function() {878 ModalCate.addRow();879 });880881 // カテゴリの反映するボタンを押した時の処理882 $(Names.mdlCateBtnRef.addHash()).on('click', function() {883 ModalCate.reflect();884 });885886 // カテゴリの名前のバリデーション処理887 $(document).on('change', Names.mdlCateName.addDot(), function() {888 ModalCate.validateName(this);889 });890891 // カテゴリのidのバリデーション処理892 $(document).on('change', Names.mdlCateId.addDot(), function() {893 ModalCate.validateId(this);894 });895896 // カテゴリのclassのバリデーション処理897 $(document).on('change', Names.mdlCateClass.addDot(), function() {898 ModalCate.validateClass(this);899 });900901 // 編集パネルのドラッグ処理902 var $modal = $(EditNames.panel.addHash());903 var $dragElm = $modal.find(".modal-header").first();904 var $moveElm = $modal.find(".modal-content").first();905 var moveFlag;906 var offsetTop;907 var offsetLeft;908 // ドラッグクラスの付与909 $dragElm.addClass(Names.drag);910 // マウスダウンした時に座標を取得911 $dragElm.on("mousedown", function (event) {912 moveFlag = true;913 event = (event) || window.event;914 offsetTop = event.clientY - $moveElm.offset().top;915 offsetLeft = event.clientX - $moveElm.offset().left;916 });917 // マウスアップした時に移動フラグを無効にする918 $(document).on("mouseup", function () {919 moveFlag = false;920 });921 // マウスが動いた時に移動する922 $(document).on("mousemove", function (event) {923 event = (event) || window.event;924 if (moveFlag) {925 $moveElm.offset({926 top: event.clientY - offsetTop,927 left: event.clientX - offsetLeft928 });929 }930 });931 },932 // 問合せ一覧ページの選択用モーダル内のイベント933 addModalMenu: function() {934 // 問合せ一覧のリストを選択した時の処理935 // $(document).on('click', Names.mdlMenu.addHash() + ' li', function() {936 // ModalMenu.liSelect(this);937 // });938 $(document).on('click', Names.mdlMenu.addHash() + ' .title li', function() {939 ModalMenu.liSelect(this);940 ModalMenu.getPage(this);941 });942943 // 選択したページを表示するボタンを押した時の処理944 // $(Names.mdlMenuBtnShow.addHash()).on('click', function() {945 // ModalMenu.getPage();946 // });947 },948 /* セル内コンテンツのドラッグアンドドロップ時のイベント -------------------------------- */949 // イベントの追加950 addCellHovers: function() {951 // 編集用ページが表示されているときはselectableを有効にする952 if ($(Names.cntBody.addDot()).first().find('table').length > 0) {953 $('tbody').selectable('enable');954 }955 // セル内コンテンツにホバーした際に移動バーを挿入956 $(document).on('mouseenter', BoxNames.wrap.addDot(), function () {957 $('tbody').selectable('disable');958 if (!isSorting) {959 // 移動バーの挿入960 Cells.addMoveBox(this);961 // ホバークラスの付与962 $(this).parents('tbody').first().find(Names.ctmHover.addDot()).removeClass(Names.ctmHover);963 $(this).addClass(Names.hover);964 // ドラッグアンドドロップの有効化965 Cells.enableSortableCol(this);966 }967 }).on('mouseleave', BoxNames.wrap.addDot(), function () {968 $('tbody').selectable('enable');969 if (!isSorting) {970 // 移動バーの削除971 Cells.removeMoveBox();972 // ホバークラスの削除973 $(this).removeClass(Names.hover);974 // ドラッグアンドドロップの無効化975 Cells.disableSortableCol(this);976 }977 });978 },979 // イベントの削除980 removeCellHovers: function(colClasses) {981 // テーブルセルの選択を無効化982 $('tbody').selectable('disable');983 // セル内のボックスがホバーされた時のイベントを無効化984 $(document).off('mouseenter.hover', BoxNames.wrap.addDot());985 }986 };987988989 // ajaxの初期値990 $.ajaxSetup({991 'type' : 'GET',992 'dataType': 'json',993 'cache': false,994 'headers': {995 'Pragma': 'no-cache'996 }997 });998 // ajax処理999 var Ajaxs = {1000 get: function(url) {1001 Loading.show();1002 $.ajax({1003 url: url,1004 }).done(function(res) {1005 // コンテンツのクリア1006 Contents.clearBody();1007 // メッセージのある場合はダイアログを表示1008 if (res.message) {1009 alert(res.message);1010 }1011 // 受け取ったステータスにより画像の表示・非表示1012 if (res.state == 200) {1013 ImgInduction.hide();1014 TopButtons.show();1015 } else {1016 ImgInduction.show();1017 TopButtons.hide();1018 return;1019 }1020 // コンテンツのセット1021 Contents.setBody(res.Data);1022 // 編集フラグのリセット1023 isEdit = false;1024 }).always(function() {1025 // ローディングの非表示1026 Loading.hide();1027 });1028 },1029 update: function(url, data) {1030 Loading.show();1031 $.ajax({1032 url: url,1033 type: 'POST',1034 data: data1035 }).done(function(res) {1036 // エラーの時はメッセージを表示して終了する1037 if (res.state == 404) {1038 alert(res.message);1039 return;1040 }1041 // コンテンツのクリア1042 Contents.clearBody();1043 // コンテンツの再セット1044 Contents.setBody(res.Data, true);1045 // 編集フラグのリセット1046 isEdit = false;1047 }).always(function() {1048 // ローディングの非表示1049 Loading.hide();1050 });1051 }1052 };10531054 // ローディング1055 var Loading = {1056 // ローディング画面の表示1057 show: function() {1058 $(Names.mdlLoading.addHash()).removeClass(Names.hidden);1059 },1060 // ローディング画面の非表示1061 hide: function() {1062 $(Names.mdlLoading.addHash()).addClass(Names.hidden);1063 }1064 };10651066 // 画面上部のボタン群1067 var TopButtons = {1068 // ボタンを有効化1069 show: function() {1070 $(Names.cntHeadBtns.addHash()).children('button').removeClass(Names.disabled);1071 },1072 // ボタンを無効化1073 hide: function() {1074 $(Names.cntHeadBtns.addHash()).children('button').addClass(Names.disabled);1075 }1076 };10771078 // 誘導用画像の表示・非表示1079 var ImgInduction ={1080 // 誘導用画像のテンプレート(実際にはindexから取得する為空文字でOK)1081 tmp: '<img id="' + Names.cntBodyEmptyImg + '" src="img/page-select.png">',1082 // indexから誘導画像エレメントをクローンする1083 copy: function() {1084 ImgInduction.tmp = $(Names.cntBodyEmptyImg.addHash()).clone();1085 },1086 // 誘導画像の表示1087 show: function() {1088 $(Names.cntBody.addDot()).first().append($(ImgInduction.tmp));1089 },1090 // 誘導画像の非表示1091 hide: function() {1092 $(Names.cntBody.addDot()).find(Names.cntBodyEmptyImg.addHash()).remove();1093 }1094 };10951096 var Contents = {1097 // 表示しているコンテンツのクリア1098 clearBody: function() {1099 $(Names.cntBody.addDot()).empty();1100 },1101 // コンテンツの再セット1102 setBody: function(Data, showSuccess) {1103 $(window).scrollTop(0);1104 // テーブルデータを挿入1105 var $wrap = $('<div></div>').attr('id', Names.cntBodyDataWrap);1106 $wrap.append($(Data.html));1107 $(Names.cntBody.addDot()).first().append($wrap);1108 // セレクタブルの設定1109 DataTable.addSelectEvent();1110 // コンテンツボックスのドラッグアンドドロップ有効化1111 Cells.addSortableCol();1112 // タイトルを挿入1113 var title = Data.in_ex == 1 ? '社内用 ' : 'お客さま用 ';1114 var dates = '<div class="date-update"><span>下書き保存日時</span>:' + (Data.updated !== '0000-00-00 00:00:00' ? Data.updated : '未保存') + '</div>';1115 dates += '<div class="date-release"><span>最終更新日時</span>:' + (Data.released !== '0000-00-00 00:00:00' ? Data.released : '未公開') + '</div>';1116 title += Data.title;1117 $(Names.cntBody.addDot()).first()1118 .prepend(1119 $('<div class="note"></div>').text('※セルの結合や行の追加、移動等の操作は、テーブル上で右クリックで表示されるメニューから行ってください。')1120 )1121 .prepend(1122 $('<div class="dates"></div>').append($(dates))1123 )1124 .prepend(1125 $('<h2></h2>').text(title)1126 .addClass('h2-default')1127 .append(1128 $('<span></span>').text(Data.name)1129 .attr('id', Names.cntName)1130 .data(Names.dataUpdate, Data.updated)1131 )1132 );1133 // 公開していない場合はアラートパネルを表示1134 if (Data.is_release === '0') {1135 $(Names.cntBody.addDot()).first().prepend(1136 $('<div></div>').text('公開されていません').addClass(Names.cntBodyPnlAlert)1137 );1138 $(Names.cntBody.addDot()).first().find('.date-release').first().addClass('alert');1139 } else {1140 // 公開されている場合は公開済みページへのリンクを表示1141 var $h2 = $(Names.cntBody.addDot()).first().find('.h2-default').first();1142 $h2.append(1143 $('<a></a>').addClass('pull-right')1144 .addClass('now-page')1145 .attr('href', $('body').data('href') + '/telnumber/' + Data.name)1146 .attr('target', '_blank')1147 .text('本番ページを見る')1148 ).append(1149 $('<a></a>').addClass('pull-right')1150 .addClass('now-page')1151 .addClass('now-page')1152 .attr('href', $('body').data('href') + '/staging/bbnavi/telnumber/' + Data.name)1153 .attr('target', '_blank')1154 .text('Stagingページを見る')1155 );1156 // 一時保存後公開されていない場合はアラートを表示1157 if (Data.updated > Data.released) {1158 var updateStr = '下書き保存したデータがStaging環境に公開されていません' + '<br>';1159 updateStr += '<span>下書き保存日時</span>:' + Data.updated + '<br>';1160 updateStr += '<span>最終更新日時</span>:' + Data.released;1161 $(Names.cntBody.addDot()).first().prepend(1162 $('<div></div>').addClass(Names.cntBodyPnlAlert).html(updateStr)1163 );1164 $(Names.cntBody.addDot()).first().find('.date-update').first().addClass('alert');1165 $(Names.cntBody.addDot()).first().find('.date-release').first().addClass('alert');1166 }1167 }1168 // 未保存の場合は下書き保存日の背景を赤にする1169 if (Data.updated === '0000-00-00 00:00:00') {1170 $(Names.cntBody.addDot()).first().find('.date-update').first().addClass('alert');1171 }1172 // 削除されている場合はアラートを表示1173 if (Data.is_delete === '1') {1174 $(Names.cntBody.addDot()).first().prepend(1175 $('<div></div>').text('削除済みデータです').addClass(Names.cntBodyPnlAlert)1176 );1177 }1178 // 完了パネルの表示1179 if (showSuccess) {1180 // 成功した旨を伝えるパネルの表示1181 $(Names.cntBody.addDot()).first().prepend(1182 $('<div></div>').text('更新しました')1183 .addClass(Names.cntBodyPnlSuccess)1184 );1185 // 2秒後に消えるようにセットする1186 $(Names.cntBodyPnlSuccess.addDot()).fadeOut(2000, function() {$(this).remove();});1187 }1188 },1189 // 下書き保存するボタンを押した時の処理1190 save: function() {1191 // ページのリンク名等のエレメント1192 var $elmName = $(Names.cntName.addHash());1193 var url = 'html/save/' + $elmName.text();1194 var data = {1195 html : Contents.createSave(),1196 updated: $elmName.data(Names.dataUpdate)1197 };1198 Ajaxs.update(url, data);1199 },1200 // 本番公開用ページの作成1201 publishing: function() {1202 // ページのリンク名等のエレメント1203 var $elmName = $(Names.cntName.addHash());1204 var url = 'html/update/' + $elmName.text();1205 var data = {1206 html : Contents.createSave(),1207 publish : Contents.createPublish(),1208 updated: $elmName.data(Names.dataUpdate)1209 };1210 Ajaxs.update(url, data);1211 Preview.hide();1212 },1213 // 一時保存用コンテンツの作成1214 createSave: function() {1215 // htmlコンテンツのラッパーをクローン1216 var $html = $(Names.cntBodyDataWrap.addHash()).clone();1217 // 不要なクラス等を削除1218 $html = Contents.removeRedundant($html);1219 // 中身のみを返す1220 return $html.html();1221 },1222 // プレビュー用のコンテンツの作成1223 createPreview: function($wrap) {1224 var $content = $(Names.cntBodyDataWrap.addHash()).clone();1225 // 不要なクラス等を削除1226 $content = Contents.removeRedundant($content);1227 // 不要なdata属性等を削除1228 $content = Contents.removeRedundantData($content);1229 // 非表示のエレメントを削除(colspan・rowspanがおかしくなる為削除しない)1230 // $content.find(Names.hidden.addDot()).remove();1231 // 中に何もないコンテンツの削除1232 $content.find(BoxNames.wrap.addDot()).each(function() {1233 if ($(this).text().trim() === '') {1234 $(this).remove();1235 }1236 });1237 // ページTOPへコンテンツの挿入1238 var pageName = Contents.getPageName();1239 var $pagetop = $('<p></p>').addClass('topagetop')1240 .append(1241 $('<a></a>').attr('href', 'telnumber/' + pageName)1242 .text('ページTOPへ')1243 );1244 $content.find(Names.section.addDot()).append($pagetop);1245 $wrap.empty();1246 // ページ内リンクの挿入1247 $wrap.append(Contents.createUl(pageName));1248 // コンテンツを挿入する1249 $content.find(Names.section.addDot()).each(function() {1250 $wrap.append($(this));1251 });1252 return $wrap;1253 },1254 // 本番公開用コンテンツの作成1255 createPublish: function() {1256 // 本番用のラップコンテンツ1257 var $publish = $('<div></div>').attr('id', 'mainmenu')1258 .attr('name', 'layoutitem_2')1259 .addClass('layoutitem_a');12601261 // プレビューと同じものを取得1262 var $content = Contents.createPreview($publish);1263 // PHPのタグ等を挿入してサーバへ送信したいが、それがPHPのタグを挿入しようとするとエスケープされる為1264 // 中身のみをサーバに送信し、サーバ側でその他のタグを足すようにしています1265 return $content.html();1266 },1267 // ページのファイル名を取得1268 getPageName: function() {1269 var pageName = '';1270 if ($(Names.cntName.addHash()).text() !== 'index') {1271 pageName = $(Names.cntName.addHash()).text();1272 }1273 return pageName;1274 },1275 // ページ内リンクの作成1276 createUl: function(pageName) {1277 pageName = pageName ? pageName + '/#' : '#';1278 var $ul = $('<ul></ul>').attr('id', 'inpage-links');1279 $(Names.cntBody.addDot()).first().find(Names.section.addDot()).each(function() {1280 var href = 'telnumber/' + pageName + $(this).attr('id');1281 $ul.append(1282 $('<li></li>').append(1283 $('<a></a>').attr('href', href)1284 .text($(this).children('h3').text())1285 )1286 );1287 });1288 return $ul;1289 },1290 // 不要なクラス等の削除(保存用)1291 removeRedundant: function($html) {1292 $html.find(Names.hover.addDot()).removeClass(Names.hover);1293 $html.find(Names.ctmHover.addDot()).removeClass(Names.ctmHover);1294 // jQueryUI selectable関係クラスの削除1295 $html.find(Names.uiSelecting.addDot()).removeClass(Names.uiSelecting);1296 $html.find(Names.uiSelected.addDot()).removeClass(Names.uiSelected);1297 $html.find(Names.uiSelectee.addDot()).removeClass(Names.uiSelectee);1298 // 削除予定のクラスの削除1299 $html.find(Names.showDelRow.addDot()).removeClass(Names.showDelRow);1300 // 移動予定のクラスの削除1301 $html.find(Names.showMoveRow.addDot()).removeClass(Names.showMoveRow);1302 // セパレータの削除1303 $html.find(Names.rowSeparator.addHash()).remove();1304 // 行ガイドの削除1305 $html.find(Names.hoverRowTop.addHash()).remove();1306 $html.find(Names.hoverRowBottom.addHash()).remove();13071308 return $html;1309 },1310 // 不要なdata属性等の削除(公開用)1311 removeRedundantData: function($html) {1312 $html.find('[' + BoxNames.receptionWeekday + ']').removeAttr(BoxNames.receptionWeekday);1313 $html.find('[' + BoxNames.receptionSaturday + ']').removeAttr(BoxNames.receptionSaturday);1314 $html.find('[' + BoxNames.receptionSunday + ']').removeAttr(BoxNames.receptionSunday);1315 $html.find('[' + BoxNames.receptionHoliday + ']').removeAttr(BoxNames.receptionHoliday);1316 $html.find('[' + BoxNames.reception365days + ']').removeAttr(BoxNames.reception365days);1317 $html.find('[' + BoxNames.receptionAllowed + ']').removeAttr(BoxNames.receptionAllowed);1318 $html.find('[' + BoxNames.receptionHourFrom + ']').removeAttr(BoxNames.receptionHourFrom);1319 $html.find('[' + BoxNames.receptionTimeFrom + ']').removeAttr(BoxNames.receptionTimeFrom);1320 $html.find('[' + BoxNames.receptionTimeTo + ']').removeAttr(BoxNames.receptionTimeTo);1321 $html.find('[' + BoxNames.receptionLunch + ']').removeAttr(BoxNames.receptionLunch);1322 $html.find('[' + BoxNames.blackOutMay + ']').removeAttr(BoxNames.blackOutMay);1323 $html.find('[' + BoxNames.blackOutEndYear + ']').removeAttr(BoxNames.blackOutEndYear);1324 $html.find('[' + BoxNames.blackOutOther + ']').removeAttr(BoxNames.blackOutOther);13251326 // fontタグをspanに変更1327 var html = $html.html();1328 html = html.replace(/(<\/?)font/gi, "$1span");1329 return $html.html(html);1330 }1331 };13321333 // プレビュー画面1334 var Preview = {1335 load: function () {1336 $(Names.cntPreview.addHash() + '-wrap').height(($(window).height() - 60));1337 var frameHeight = $(Names.cntPreview.addHash() + '-wrap').height() -1338 $(Names.cntPreview.addHash() + '-head').outerHeight() - 30;1339 $(Names.cntPreview.addHash() + '-frame-wrap').height(frameHeight - 40);1340 $(Names.cntPreview.addHash() + '-frame').height(frameHeight - 40);1341 },1342 // プレビューの表示1343 show: function() {1344 $(Names.cntPreview.addHash() + '-frame').attr('src', '');1345 $(Names.cntPreview.addHash() + '-frame').attr('src', 'preview').load(function() {1346 var $insertContent = $(Names.cntPreview.addHash() + '-frame').contents().find('#mainmenu');1347 // プレビューコンテンツの作成1348 Contents.createPreview($insertContent);1349 // プレビュー画面を表示する1350 $(Names.cntPreview.addHash()).show();1351 });1352 },1353 // プレビューの非表示1354 hide: function() {1355 $(Names.cntPreview.addHash()).hide();1356 }1357 };1358135913601361 // テーブルのセル内の操作1362 var Cells = {1363 // セル内ボックスのテンプレート1364 boxTmp: '<div class="' + BoxNames.wrap + '">' +1365 ' <div class="' + BoxNames.center + '"></div>' +1366 ' <div class="' + BoxNames.address + '"></div>' +1367 ' <div class="' + BoxNames.free + '"></div>' +1368 ' <div class="' + BoxNames.wrapPhone + '"></div>' +1369 ' <div class="' + BoxNames.wrapHp + '">' +1370 ' <span class="' + BoxNames.hpPrefix + '"></span>' +1371 ' <span class="' + BoxNames.hpAddress + '"></span>' +1372 ' </div>' +1373 ' <div class="' + BoxNames.wrapMail + '"></div>' +1374 ' <div class="' + BoxNames.wrapReception + '">' +1375 ' <span class="' + BoxNames.receptionTime + '" ' + BoxNames.receptionAllowed + '="1" ' + BoxNames.receptionHourFrom + '="9" ' + BoxNames.receptionTimeFrom + '="0" ' + BoxNames.receptionHourTo + '="17" ' + BoxNames.receptionTimeTo + '="0" ' + BoxNames.receptionLunch + '="false"></span>' +1376 ' <span class="' + BoxNames.receptionDate + '" ' + BoxNames.receptionWeekday + '="false" ' + BoxNames.receptionSaturday + '="false" ' + BoxNames.receptionSunday + '="false" ' + BoxNames.receptionHoliday + '="false" ' + BoxNames.reception365days + '="false"></span>' +1377 ' <span class="' + BoxNames.blackOut + '" ' + BoxNames.blackOutMay + '="false" ' + BoxNames.blackOutEndYear + '="false" ' + BoxNames.blackOutOther + '=""></span>' +1378 ' </div>' +1379 ' <div class="' + BoxNames.other + '"></div>' +1380 '</div>',1381 // 電話番号用のテンプレート1382 phoneTmp: '<div class="' + BoxNames.phoneGroup + '" ' + BoxNames.phoneOtherDate + '="" ' + BoxNames.phoneOtherNumber + '="" ' + BoxNames.phoneOtherState + '="1"' + BoxNames.phoneDefaultNumber + '="">' +1383 ' <span class="' + BoxNames.phonePrefix + '"></span>' +1384 ' <span class="' + BoxNames.phoneNumber + '"></span>' +1385 ' <span class="' + BoxNames.phoneSuffix + '"></span>' +1386 '</div>',1387 // メールアドレス用のテンプレート1388 mailTmp: '<div class="' + BoxNames.mailGroup + '">' +1389 ' <span class="' + BoxNames.mailPrefix + '"></span>' +1390 ' <span class="' + BoxNames.mailAdress + '"></span>' +1391 '</div>',1392 // セル内のコンテンツボックスの移動処理1393 addSortableCol: function() {1394 var cols = [1395 'col1',1396 'col2',1397 'col3'1398 ];1399 $.each(cols, function(i, col) {1400 $(Names.tblWrap.addDot()).find(col.addDot()).sortable({1401 connectWith: col.addDot(),1402 handle: BoxNames.moveHandle.addHash(),1403 start: function () {1404 isSorting = true;1405 isEdit = true;1406 Events.removeCellHovers();1407 // 不要なクラスの削除1408 var $tables = $(Names.tblWrap.addDot());1409 $tables.find(Names.hover.addDot()).removeClass(Names.hover);1410 $tables.find(Names.ctmHover.addDot()).removeClass(Names.ctmHover);1411 $tables.find(Names.uiSelecting.addDot()).removeClass(Names.uiSelecting);1412 $tables.find(Names.uiSelected.addDot()).removeClass(Names.uiSelected);1413 },1414 stop: function () {1415 isSorting = false;1416 Events.addCellHovers();1417 }1418 });1419 });1420 },1421 // 行ごとのコンテンツのドラッグアンドドロップを有効化1422 enableSortableCol: function(box) {1423 var $table = $(box).parents(Names.tblWrap.addDot()).first();1424 var $cell = $(box).parents('th,td').first();1425 var cellClass ='';1426 switch (true) {1427 case $cell.hasClass('col1'):1428 cellClass = 'col1';1429 break;1430 case $cell.hasClass('col2'):1431 cellClass = 'col2';1432 break;1433 case $cell.hasClass('col3'):1434 cellClass = 'col3';1435 break;1436 }1437 $(cellClass.addDot()).sortable('enable');1438 // $table.find('th,td').sortable('enable');1439 },1440 // 行ごとのコンテンツのドラッグアンドドロップを無効化1441 disableSortableCol: function(box) {1442 var $table = $(box).parents(Names.tblWrap.addDot()).first();1443 var $cell = $(box).parents('th,td').first();1444 var cellClass ='';1445 switch (true) {1446 case $cell.hasClass('col1'):1447 cellClass = 'col1';1448 break;1449 case $cell.hasClass('col2'):1450 cellClass = 'col2';1451 break;1452 case $cell.hasClass('col3'):1453 cellClass = 'col3';1454 break;1455 }1456 $(cellClass.addDot()).sortable('disable');1457 // $table.find('th,td').sortable('disable');1458 },1459 // ボックスの追加ボタンの挿入1460 addAddBoxBtn: function(elm) {1461 $(elm).append($(Names.btnAddBox.addHash()).removeClass(Names.hidden));1462 },1463 // ボックスの追加ボタンの削除1464 removeAddBoxBtn: function() {1465 $('body').append($(Names.btnAddBox.addHash()).addClass(Names.hidden));1466 },1467 // ボックスの移動用のバーを表示1468 addMoveBox: function(elm) {1469 $(elm).append($(BoxNames.moveHandle.addHash()).removeClass(Names.hidden));1470 },1471 // ボックスの移動用のバーの非表示1472 removeMoveBox: function() {1473 $('body').append($(BoxNames.moveHandle.addHash()).addClass(Names.hidden));1474 },1475 // ボックスの追加処理1476 addBox: function(elm) {1477 var $boxTmp = $(Cells.boxTmp);1478 $boxTmp.find(BoxNames.wrapPhone.addDot()).first().append($(Cells.phoneTmp));1479 $boxTmp.find(BoxNames.wrapMail.addDot()).first().append($(Cells.mailTmp));1480 $(elm).before($boxTmp);1481 // 追加と同時に編集画面にする1482 EditPanel.show($boxTmp.find(BoxNames.wrapPhone.addDot()).first(), true);1483 // 編集フラグをセット1484 isEdit = true;1485 },1486 // ボックスの削除処理1487 removeBox: function(elm) {1488 // 移動バーの避難1489 Cells.removeMoveBox();1490 // ボックスの削除1491 $(elm).remove();1492 // 編集フラグをセット1493 isEdit = true;1494 },1495 // ヘッダ編集時に退避しておくクラスのキャッシュ1496 cashClass: [],1497 // theadの編集開始1498 editThead: function(elm) {1499 var $elm = $(elm);1500 var thWidth = $elm.width() - 30;1501 var thTop = $elm.offset().top - $(window).scrollTop() + $elm.height() + 10;1502 var thLeft = $elm.offset().left - $(window).scrollLeft();1503 var thTitle = $elm.text();1504 var thClass = $elm.attr('class');1505 var classArr = thClass.split(' ');1506 // 退避しておくクラスのリスト1507 var delClass = [1508 'col1',1509 'col2',1510 'col3',1511 'ui-sortable',1512 'ui-sortable-disabled'1513 ];1514 // キャッシュ用配列の初期化1515 Cells.cashClass = [];1516 // 退避しておくものと、表示するものに切り分ける1517 for (var i = 0, len = classArr.length; i < len; i++) {1518 if ($.inArray(classArr[i], delClass) > -1) {1519 // 退避1520 Cells.cashClass.push(classArr[i]);1521 // 削除1522 delete(classArr[i]);1523 }1524 }1525 $elm.addClass(Names.selected);1526 $(Names.headEdit.addHash() + '-title').val(thTitle);1527 $(Names.headEdit.addHash() + '-class').val(classArr.join(' ').trim());1528 $(Names.headEdit.addHash()).data(Names.dataTargetElm, $elm);1529 $(Names.headEdit.addHash()).css({1530 top: thTop,1531 left: thLeft,1532 width: thWidth1533 });1534 $(Names.headEdit.addHash() + '-wrap').show();1535 },1536 // theadの編集確定1537 updateThead: function(elm) {1538 var $elm = $($(Names.headEdit.addHash()).data(Names.dataTargetElm));1539 $elm.text($(Names.headEdit.addHash() + '-title').val());1540 $elm.attr('class', '');1541 $elm.addClass($(Names.headEdit.addHash() + '-class').val());1542 for (var i = 0, len = Cells.cashClass.length; i < len; i++) {1543 $elm.addClass(Cells.cashClass[i]);1544 }1545 Cells.cancelThead();1546 // 編集フラグをセット1547 isEdit = true;1548 },1549 // theadの編集キャンセル1550 cancelThead: function(elm) {1551 var pnl = $(Names.headEdit.addHash()).data(Names.dataTargetElm);1552 $(pnl).removeClass(Names.selected);1553 $(Names.headEdit.addHash() + '-wrap').hide();1554 },1555 // tfootの編集開始1556 editTfoot: function(elm) {1557 Events.removeTfoot();1558 var html = $(elm).html() || '';1559 $(elm).empty().addClass('edit');1560 var $textarea = $('<textarea></textarea>');1561 $(elm).append($textarea.val(html.br2nl()));1562 $textarea.trigger('focus');1563 },1564 // tfootの編集終了1565 updateTfoot: function(elm) {1566 Events.addTfoot();1567 var html = $(elm).val();1568 var $td = $(elm).parents('td').first();1569 $td.empty();1570 $td.removeClass('edit').html(html.nl2br());1571 // 編集フラグをセット1572 isEdit = true;1573 }1574 };15751576 // セルの編集パネルでの処理1577 var EditPanel = {1578 // 電話部分のテンプレート1579 phoneTmp: '<fieldset class="' + EditNames.phoneGroup + '">' +1580 ' <label class="pull-left w-170">' +1581 ' 見出し' +1582 ' <input class="' + EditNames.phonePrefix + '" type="text">' +1583 ' </label>' +1584 ' <label class="pull-left w-155 mg-l-5">' +1585 ' 番号' +1586 ' <input class="' + EditNames.phoneNumber + '" type="text">' +1587 ' </label>' +1588 ' <label class="pull-left w-170 mg-l-5">' +1589 ' 後カッコ' +1590 ' <input class="' + EditNames.phoneSuffix + '" type="text">' +1591 ' </label>' +1592 ' <label class="pull-left w-170">' +1593 ' <input class="' + EditNames.phoneOtherDate + '" type="text" readonly>' +1594 ' </label>' +1595 ' <div class="pull-left central w-140 mg-b-5" readonly>' +1596 ' <select class="' + EditNames.phoneOtherState + '">' +1597 ' <option value="1">からの</option>' +1598 ' <option value="2">までの</option>' +1599 ' </select>' +1600 ' 電話番号' +1601 ' </div>' +1602 ' <label class="pull-left w-140">' +1603 ' <input class="' + EditNames.phoneOtherNumber + '" type="text" placeholder="電話番号">' +1604 ' </label>' +1605 ' <button class="btn-del-phone btn btn-danger pull-left mg-l-5" type="button">削除</button>' +1606 '</fieldset>',1607 // メール部分のテンプレート1608 mailTmp: '<fieldset class="' + EditNames.mailGroup + '">' +1609 ' <label class="pull-left w-160">' +1610 ' 見出し' +1611 ' <input class="' + EditNames.mailPrefix + '" type="text">' +1612 ' </label>' +1613 ' <label class="pull-left w-285 mg-l-5">' +1614 ' アドレス' +1615 ' <input class="' + EditNames.mailAdress + '" type="text">' +1616 ' </label>' +1617 ' <label class="btn-del-mail-wrap">' +1618 '  ' +1619 ' <button class="btn-del-mail btn btn-danger pull-left mg-l-5" type="button">削除</button>' +1620 ' </label>' +1621 '</fieldset>',1622 // セル内コンテンツブロックの編集パネル表示1623 show: function(elm, state) {1624 var $editBox = $(elm).parents(BoxNames.wrap.addDot()).first();1625 $(EditNames.panel.addHash()).data(Names.dataTargetElm, $editBox);1626 // 新規追加で開いたか、編集で開いたかの確認用(新規の時はキャンセルボタンで削除)1627 $(EditNames.panel.addHash()).data('addState', state || false);1628 Cells.removeMoveBox();1629 // パネルの高さを設定1630 var boxHeight = $(window).height() - 150;1631 $(EditNames.panel.addHash() + '-left').height(boxHeight);1632 $(EditNames.panel.addHash() + '-right').height(boxHeight - 40);1633 $(EditNames.panel.addHash() + '-preview-wrap').height(boxHeight - 60);1634 // プレビュー画面と編集パネルにデータを反映1635 var $boxData = $editBox.clone().removeClass(BoxNames.wrap);1636 $(EditNames.panel.addHash() + '-preview').empty();1637 $(EditNames.panel.addHash() + '-preview').append($boxData.html());16381639 // パネル内のデータの初期化1640 EditPanel.reset($(EditNames.panel.addHash()));1641 // 読み込んだデータをパネルに反映1642 EditPanel.readVal($(EditNames.panel.addHash()));1643 // カラムにより編集項目を変更する1644 EditPanel.setEditItem($(EditNames.panel.addHash()), $editBox);1645 // モーダルの表示1646 $(EditNames.panel.addHash()).modal();1647 // パネルを最上部にスクロール1648 $(EditNames.panel.addHash() + '-left').scrollTop(0);1649 // 先頭のセルにフォーカスを移動1650 $(EditNames.panel.addHash()).find('input').first().focus();1651 },1652 // 編集パネルを閉じるときの処理1653 hide: function(e) {1654 var $editBox = $(EditNames.panel.addHash()).data(Names.dataTargetElm);1655 var $targetTable = $editBox.parents('table').first();1656 // ホバークラスの削除1657 $targetTable.find(Names.hover.addDot()).removeClass(Names.hover);1658 $targetTable.find(Names.ctmHover.addDot()).removeClass(Names.ctmHover);1659 },1660 // テキストエリアをWYSWYGに変換1661 setWyswyg: function() {1662 $(EditNames.editBox.addDot()).each(function () {1663 var $this = $(this);1664 // ボタンを挿入するためのラップ1665 var $wrap = $('<div></div>').addClass(EditNames.editBox + '-wrap');1666 // 編集エリア用のラップ1667 var $editBox = $('<div></div>').addClass(EditNames.editBox + '-editbox');1668 $editBox.data('composition', false);1669 $editBox.prop('contenteditable', true);1670 $editBox.on('keyup cut paste', function () {1671 setTimeout(function () {1672 if (!$this.data('composition')) {1673 $this.val($editBox.html()).trigger('input');1674 }1675 }, 0);1676 }).on('compositionstart', function () {1677 $editBox.data('composition', true);1678 }).on('compositionend', function () {1679 $editBox.data('composition', false);1680 });1681 // リンク挿入用のボックス1682 var $linkbox = $('<div></div>').addClass('edit-link').css({'display': 'none'});1683 $linkbox.append($('<input>').attr('type', 'text').addClass('edit-link-input'));1684 $linkbox.append(1685 $('<label></label>').html('<input type="checkbox", class="edit-link-blank"> target=&quot;_blank&quot;にする').addClass('edit-link-blank-label')1686 );1687 $linkbox.append($('<button></button>').attr('type', 'button').addClass('edit-link-submit').text('更新'));1688 $linkbox.append($('<button></button>').attr('type', 'button').addClass('edit-link-cancel').text('キャンセル'));1689 // ボタン群1690 var $btns = $('<div></div>').addClass('edit-link-btns')1691 .append(1692 $('<button></button>').attr('type', 'button').addClass('small').text('小文字')1693 ).append(1694 $('<button></button>').attr('type', 'button').addClass('red').text('赤字')1695 ).append(1696 $('<button></button>').attr('type', 'button').addClass('bold').text('太字')1697 ).append(1698 $('<button></button>').attr('type', 'button').addClass('link').text('リンク')1699 ).append(1700 $('<button></button>').attr('type', 'button').addClass('mail').text('メール')1701 ).append(1702 $('<button></button>').attr('type', 'button').addClass('reset').text('書式の取消')1703 ).append(1704 $('<button></button>').attr('type', 'button').addClass('source').text('ソースの表示')1705 );17061707 // エレメントの後ろにラップを挿入1708 $this.after($wrap);1709 // ラップにボタンを挿入1710 $wrap.append($btns);1711 // リンク編集パネルを表示1712 $wrap.append($linkbox);1713 // 編集パネルを挿入1714 $wrap.append($editBox);1715 // 入力エリアをラップに挿入1716 $wrap.append($this);1717 $this.hide();1718 });1719 },1720 // セル内コンテンツの編集内容の更新処理1721 update: function() {1722 var $editBox = $(EditNames.panel.addHash()).data(Names.dataTargetElm);1723 $editBox.empty();1724 $editBox.append($($(EditNames.panel.addHash() + '-preview').html()));1725 $(EditNames.panel.addHash()).modal('hide');1726 // 編集フラグのセット1727 isEdit = true;1728 },1729 // 編集のあった時にプレビューに反映する1730 setVal: function(elm) {1731 var $elm = $(elm);1732 var $preview = $(EditNames.panel.addHash() + '-preview');1733 var val = $elm.val();1734 var $boxElm;1735 var $val;1736 // scriptという文字を削除1737 val = val.replace(/(<\/?)script/gi, "$1span");1738 if ($elm.is('[id="' + EditNames.center + '"]')) {1739 // センタ名1740 $boxElm = $preview.find(BoxNames.center.addDot()).first();1741 $boxElm.empty();1742 if (val !== '') {1743 $boxElm.html(val.addSumi());1744 }1745 } else if ($elm.is('[id="' + EditNames.address + '"]')) {1746 // 住所1747 $boxElm = $preview.find(BoxNames.address.addDot()).first();1748 $boxElm.empty();1749 if (val !== '') {1750 // 文字数を確認1751 $val = $('<div>' + val + '</div>');1752 if ($val.text().length > 200) {1753 // 200文字より多い場合は前の値をそのまま使用1754 val = $elm.data('prevVal');1755 // テキストエリアの値を元に戻す1756 $elm.val(val);1757 // 入力エリアの値を元に戻す1758 $elm.parents(EditNames.editBox.addDot() + '-wrap').first()1759 .find(EditNames.editBox.addDot() + '-editbox').first()1760 .html(val);1761 alert('文字数は200文字以内で入力してください');1762 }1763 $boxElm.html(val);1764 $boxElm.nextAll().each(function() {1765 if ($(this).text().trim() !== '') {1766 $boxElm.append('<br><br>');1767 return false;1768 }1769 });1770 }1771 // 前回値としての値をセット1772 $elm.data('prevVal', val);1773 } else if ($elm.is('[id="' + EditNames.hpPrefix + '"]')) {1774 // ホームページの接頭句1775 $boxElm = $preview.find(BoxNames.hpPrefix.addDot()).first();1776 $boxElm.empty();1777 if (val !== '') {1778 $boxElm.html(val.addSumi() + '<br>');1779 }1780 } else if ($elm.is('[id="' + EditNames.hpAddress + '"]')) {1781 // ホームページアドレス1782 $boxElm = $preview.find(BoxNames.hpAddress.addDot()).first();1783 $boxElm.empty();1784 if (val !== '') {1785 $boxElm.append(1786 $('<a></a>').text(val)1787 .attr('href', val)1788 );1789 }1790 } else if ($elm.is('[id="' + EditNames.other + '"]')) {1791 // その他項目1792 $boxElm = $preview.find(BoxNames.other.addDot()).first();1793 $boxElm.empty();1794 if (val !== '') {1795 // 文字数を確認1796 $val = $('<div>' + val + '</div>');1797 if ($val.text().length >= 200) {1798 // 200文字より多い場合は前の値をそのまま使用1799 val = $elm.data('prevVal');1800 // テキストエリアの値を元に戻す1801 $elm.val(val);1802 // 入力エリアの値を元に戻す1803 $elm.parents(EditNames.editBox.addDot() + '-wrap').first()1804 .find(EditNames.editBox.addDot() + '-editbox').first()1805 .html(val);1806 alert('文字数は200文字以内で入力してください');1807 }1808 $boxElm.html(val);1809 }1810 // 前回値としての値をセット1811 $elm.data('prevVal', val);1812 } else if ($elm.is('[class|="edit-phone"]')) {1813 // 電話番号項目1814 EditPanel.setPhoneVal();1815 } else if ($elm.is('[class|="edit-mail"]')) {1816 // メールアドレス項目1817 EditPanel.setMailVal();1818 } else if ($elm.is('[id|="rcpd"]')) {1819 // 受付日項目1820 EditPanel.setReceptionDateVal($(elm));1821 } else if ($elm.is('[id|="rcpt"]')) {1822 // 受付時間項目1823 EditPanel.setReceptionTimeVal($(elm));1824 } else if ($elm.is('[id|="bko"]')) {1825 // 除外日項目1826 EditPanel.setReceptionBlackOutVal();1827 }1828 },1829 // 日付が正しいかのチェック1830 // 電話番号の値をセット1831 setPhoneVal: function() {1832 var $wrap = $(EditNames.panel.addHash() + '-preview').find(BoxNames.wrapPhone.addDot()).first();1833 $wrap.empty();18341835 $(EditNames.phoneGroup.addDot()).each(function() {1836 var $phoneTmp = $(Cells.phoneTmp);1837 var pre = $(this).find(EditNames.phonePrefix.addDot()).first().val();1838 var num = $(this).find(EditNames.phoneNumber.addDot()).first().val();1839 var suf = $(this).find(EditNames.phoneSuffix.addDot()).first().val();1840 $phoneTmp.find(BoxNames.phonePrefix.addDot()).first().html(pre === ''? '': pre.addSumi() + '<br>');1841 $phoneTmp.find(BoxNames.phoneNumber.addDot()).first().html(num === ''? '': '<em>' + num + '</em>');1842 $phoneTmp.find(BoxNames.phoneSuffix.addDot()).first().html(suf === ''? '': '(' + suf + ')<br>');18431844 var otherState = $(this).find(EditNames.phoneOtherState.addDot()).first().val();1845 var otherDate = $(this).find(EditNames.phoneOtherDate.addDot()).first().val();1846 var otherNum = $(this).find(EditNames.phoneOtherNumber.addDot()).first().val();1847 $phoneTmp.attr(BoxNames.phoneDefaultNumber, num);1848 $phoneTmp.attr(BoxNames.phoneOtherState, otherState);1849 $phoneTmp.attr(BoxNames.phoneOtherDate, otherDate);1850 $phoneTmp.attr(BoxNames.phoneOtherNumber, otherNum);18511852 $wrap.append($phoneTmp);1853 });1854 // 電話番号の○○○○年○○月○○日までの表示1855 phoneOther.set();1856 },1857 // メールアドレスをセット1858 setMailVal: function() {1859 var $wrap = $(EditNames.panel.addHash() + '-preview').find(BoxNames.wrapMail.addDot()).first();1860 $wrap.empty();18611862 $(EditNames.mailGroup.addDot()).each(function() {1863 var $mailTmp = $(Cells.mailTmp);1864 var prefix = $(this).find(EditNames.mailPrefix.addDot()).first().val();1865 var address = $(this).find(EditNames.mailAdress.addDot()).first().val();1866 $mailTmp.find(BoxNames.mailPrefix.addDot()).first().html(prefix === ''? '': prefix.addSumi() + '<br>');1867 $mailTmp.find(BoxNames.mailAdress.addDot()).first().empty();1868 if (address !== '') {1869 $mailTmp.find(BoxNames.mailAdress.addDot()).first().append(1870 $('<a></a>').text(address)1871 .attr('href', 'mailto:' + address)1872 );1873 }18741875 $wrap.append($mailTmp);1876 });1877 },1878 // 受付日をセット1879 setReceptionDateVal: function($elm) {1880 var $wrap = $(EditNames.panel.addHash() + '-preview').find(BoxNames.receptionDate.addDot()).first();1881 $wrap.empty($wrap);18821883 var str = '';1884 var strArr = [];1885 // var id = $elm.attr('id');1886 if ($(EditNames.reception365days.addHash()).prop('checked')) {1887 strArr.push('年中無休');1888 } else {1889 if ($(EditNames.receptionWeekday.addHash()).prop('checked')) {1890 strArr.push('平日');1891 }1892 if ($(EditNames.receptionSaturday.addHash()).prop('checked')) {1893 strArr.push('土曜');1894 }1895 if ($(EditNames.receptionSunday.addHash()).prop('checked')) {1896 strArr.push('日曜');1897 }1898 if ($(EditNames.receptionHoliday.addHash()).prop('checked')) {1899 strArr.push('祝日');1900 }1901 }1902 str = strArr.join('・');1903 if (str) {1904 str = '受付日:' + str + '<br>';1905 }1906 $wrap.attr(BoxNames.receptionWeekday, $(EditNames.receptionWeekday.addHash()).prop('checked'));1907 $wrap.attr(BoxNames.receptionSaturday, $(EditNames.receptionSaturday.addHash()).prop('checked'));1908 $wrap.attr(BoxNames.receptionSunday, $(EditNames.receptionSunday.addHash()).prop('checked'));1909 $wrap.attr(BoxNames.receptionHoliday, $(EditNames.receptionHoliday.addHash()).prop('checked'));1910 $wrap.attr(BoxNames.reception365days, $(EditNames.reception365days.addHash()).prop('checked'));1911 $wrap.html(str);1912 EditPanel.setReceptionDateCheck();1913 },1914 // 受付日のチェックボックスをセット1915 setReceptionDateCheck: function() {1916 if ($(EditNames.reception365days.addHash()).prop('checked')) {1917 // 年中無休にチェックが入っているときの処理1918 $(EditNames.receptionWeekday.addHash()).prop('checked', false).prop('disabled', true);1919 $(EditNames.receptionSaturday.addHash()).prop('checked', false).prop('disabled', true);1920 $(EditNames.receptionSunday.addHash()).prop('checked', false).prop('disabled', true);1921 $(EditNames.receptionHoliday.addHash()).prop('checked', false).prop('disabled', true);1922 } else if ($(EditNames.receptionWeekday.addHash()).prop('checked') &&1923 $(EditNames.receptionSaturday.addHash()).prop('checked') &&1924 $(EditNames.receptionSunday.addHash()).prop('checked') &&1925 $(EditNames.receptionHoliday.addHash()).prop('checked')) {1926 // 年中無休以外の全てにチェックが入っているときの処理 //1927 $(EditNames.reception365days.addHash()).prop('checked', true);1928 EditPanel.setReceptionDateVal();1929 } else {1930 $(EditNames.receptionWeekday.addHash()).prop('disabled', false);1931 $(EditNames.receptionSaturday.addHash()).prop('disabled', false);1932 $(EditNames.receptionSunday.addHash()).prop('disabled', false);1933 $(EditNames.receptionHoliday.addHash()).prop('disabled', false);1934 }1935 },1936 // 受付時間をセット1937 setReceptionTimeVal: function($elm) {1938 var $wrap = $(EditNames.panel.addHash() + '-preview').find(BoxNames.receptionTime.addDot()).first();1939 $wrap.empty();19401941 var str = '';1942 var state = $('[name="' + EditNames.receptionTimeName + '"]:checked').val();19431944 switch (state) {1945 case '2':1946 $(EditNames.receptionHourFrom.addHash()).prop('disabled', false);1947 $(EditNames.receptionTimeFrom.addHash()).prop('disabled', false);1948 $(EditNames.receptionHourTo.addHash()).prop('disabled', false);1949 $(EditNames.receptionTimeTo.addHash()).prop('disabled', false);1950 $(EditNames.receptionLunch.addHash()).prop('disabled', false);1951 str += $(EditNames.receptionHourFrom.addHash()).val() + ':';1952 str += $(EditNames.receptionTimeFrom.addHash()).val().padZero() + '~';1953 str += $(EditNames.receptionHourTo.addHash()).val() + ':';1954 str += $(EditNames.receptionTimeTo.addHash()).val().padZero();1955 if ($(EditNames.receptionLunch.addHash()).prop('checked')) {1956 str += '(12時~13時を除く)';1957 }1958 break;1959 case '3':1960 str = '24時間';1961 case '1':1962 $(EditNames.receptionHourFrom.addHash()).prop('disabled', true);1963 $(EditNames.receptionTimeFrom.addHash()).prop('disabled', true);1964 $(EditNames.receptionHourTo.addHash()).prop('disabled', true);1965 $(EditNames.receptionTimeTo.addHash()).prop('disabled', true);1966 $(EditNames.receptionLunch.addHash()).prop('disabled', true);1967 break;1968 }1969 $wrap.attr(BoxNames.receptionAllowed, state);1970 $wrap.attr(BoxNames.receptionHourFrom, $(EditNames.receptionHourFrom.addHash()).val());1971 $wrap.attr(BoxNames.receptionTimeFrom, $(EditNames.receptionTimeFrom.addHash()).val());1972 $wrap.attr(BoxNames.receptionHourTo, $(EditNames.receptionHourTo.addHash()).val());1973 $wrap.attr(BoxNames.receptionTimeTo, $(EditNames.receptionTimeTo.addHash()).val());1974 $wrap.attr(BoxNames.receptionLunch, $(EditNames.receptionLunch.addHash()).prop('checked'));1975 if (str) {1976 str = '受付時間:' + str + '<br>';1977 }1978 $wrap.html(str);1979 },1980 // 除外日をセット1981 setReceptionBlackOutVal: function() {1982 var $wrap = $(EditNames.panel.addHash() + '-preview').find(BoxNames.blackOut.addDot()).first();1983 $wrap.empty();19841985 var str = '';1986 var strArr = [];1987 if ($(EditNames.blackOutOther.addHash()).val() !== '') {1988 strArr.push($(EditNames.blackOutOther.addHash()).val());1989 }1990 if ($(EditNames.blackOutMay.addHash()).prop('checked')) {1991 strArr.push('5/3~5/5');1992 }1993 if ($(EditNames.blackOutEndYear.addHash()).prop('checked')) {1994 strArr.push('年末年始12/29~1/3');1995 }1996 $wrap.attr(BoxNames.blackOutOther, $(EditNames.blackOutOther.addHash()).val());1997 $wrap.attr(BoxNames.blackOutMay, $(EditNames.blackOutMay.addHash()).prop('checked'));1998 $wrap.attr(BoxNames.blackOutEndYear, $(EditNames.blackOutEndYear.addHash()).prop('checked'));1999 str = strArr.join('・');2000 if (str) {2001 str = '(' + str + 'を除く)';2002 }2003 $wrap.html(str);2004 },2005 // 読み込んだデータをパネルの入力画面にセットする2006 readVal: function($elm) {2007 var $preview = $elm.find(EditNames.panel.addHash() + '-preview');2008 // センタ名2009 var centerVal = $preview.find(BoxNames.center.addDot()).first().text().trimEx();2010 if (centerVal !== '') {2011 $(EditNames.center.addHash()).val(centerVal);2012 EditPanel.showInputParentSection($(EditNames.center.addHash()));2013 }2014 // 住所等2015 var addressVal = $preview.find(BoxNames.address.addDot()).first().html();2016 // 前回値としての値をセット2017 $(EditNames.address.addHash()).data('prevVal', addressVal);2018 if (addressVal !== '') {2019 $(EditNames.address.addHash()).val(addressVal);2020 $(EditNames.address.addHash()).parents(EditNames.editBox.addDot() + '-wrap').first().find(EditNames.editBox.addDot() + '-editbox').first().html(addressVal);2021 EditPanel.showInputParentSection($(EditNames.address.addHash()));2022 }2023 // 電話番号2024 $preview.find(BoxNames.phoneGroup.addDot()).each(function(iPhone) {2025 if (iPhone < 1) {2026 EditPanel.showInputParentSection($(EditNames.phoneGroupWrap.addHash()));2027 }2028 var $phoneTmp = $(EditPanel.phoneTmp);2029 var phonePre = $(this).children(BoxNames.phonePrefix.addDot()).first().text().trimEx();2030 var phoneSuf = $(this).children(BoxNames.phoneSuffix.addDot()).first().text().trimEx();2031 $phoneTmp.find(EditNames.phonePrefix.addDot()).first().val(phonePre);2032 $phoneTmp.find(EditNames.phoneSuffix.addDot()).first().val(phoneSuf);20332034 var otherState = $(this).attr(BoxNames.phoneOtherState) || '';2035 var otherDate = $(this).attr(BoxNames.phoneOtherDate) || '';2036 var otherNum = $(this).attr(BoxNames.phoneOtherNumber) || '';2037 var defaultNum = $(this).attr(BoxNames.phoneDefaultNumber) || '';2038 $phoneTmp.find(EditNames.phoneNumber.addDot()).first().val(defaultNum);2039 $phoneTmp.find(EditNames.phoneOtherState.addDot()).first().val(otherState.toInt());2040 $phoneTmp.find(EditNames.phoneOtherDate.addDot()).first().val(otherDate);2041 $phoneTmp.find(EditNames.phoneOtherNumber.addDot()).first().val(otherNum);20422043 $(EditNames.phoneGroupWrap.addHash()).append($phoneTmp);2044 });2045 EditPanel.setPhoneDelBtn();2046 // ホームページプレフィクス2047 var hpPreVal = $preview.find(BoxNames.hpPrefix.addDot()).first().text().trimEx();2048 if (hpPreVal !== '') {2049 $(EditNames.hpPrefix.addHash()).val(hpPreVal);2050 EditPanel.showInputParentSection($(EditNames.hpPrefix.addHash()));2051 }2052 // ホームページ2053 var hpVal = $preview.find(BoxNames.hpAddress.addDot()).first().children('a').first().text();2054 if (hpVal !== '') {2055 $(EditNames.hpAddress.addHash()).val(hpVal);2056 EditPanel.showInputParentSection($(EditNames.hpAddress.addHash()));2057 }2058 // メール2059 $preview.find(BoxNames.mailGroup.addDot()).each(function(iMail) {2060 var $mailTmp = $(EditPanel.mailTmp);2061 var mailPre = $(this).children(BoxNames.mailPrefix.addDot()).first().text().trimEx();2062 var mailAdrs = $(this).children(BoxNames.mailAdress.addDot()).first().children('a').first().text();2063 $mailTmp.find(EditNames.mailPrefix.addDot()).first().val(mailPre);2064 $mailTmp.find(EditNames.mailAdress.addDot()).first().val(mailAdrs);2065 $(EditNames.mailGroupWrap.addHash()).append($mailTmp);2066 if (iMail < 1 && mailPre !== '' && mailAdrs !== '') {2067 EditPanel.showInputParentSection($(EditNames.mailGroupWrap.addHash()));2068 }2069 });2070 EditPanel.setMailDelBtn();2071 // 受付時間2072 var $brt = $preview.find(BoxNames.receptionTime.addDot()).first();2073 $(EditNames.receptionHourFrom.addHash()).val($brt.attr(BoxNames.receptionHourFrom) || 9);2074 $(EditNames.receptionTimeFrom.addHash()).val($brt.attr(BoxNames.receptionTimeFrom) || 0);2075 $(EditNames.receptionHourTo.addHash()).val($brt.attr(BoxNames.receptionHourTo) || 17);2076 $(EditNames.receptionTimeTo.addHash()).val($brt.attr(BoxNames.receptionTimeTo) || 0);2077 $(EditNames.receptionLunch.addHash()).prop('checked', $brt.attr(BoxNames.receptionLunch) === "true" ? true : false);2078 if ($('input[name="' + EditNames.receptionTimeName + '"]:checked').val() !== '1') {2079 EditPanel.showInputParentSection($(EditNames.receptionHourFrom.addHash()));2080 }2081 $('input[name="' + EditNames.receptionTimeName + '"]').val([$brt.attr(BoxNames.receptionAllowed) || 1]).change();2082 // 受付日2083 var $brd = $preview.find(BoxNames.receptionDate.addDot()).first();2084 $(EditNames.receptionWeekday.addHash()).prop('checked', $brd.attr(BoxNames.receptionWeekday) === "true" ? true : false);2085 $(EditNames.receptionSaturday.addHash()).prop('checked', $brd.attr(BoxNames.receptionSaturday) === "true" ? true : false);2086 $(EditNames.receptionSunday.addHash()).prop('checked', $brd.attr(BoxNames.receptionSunday) === "true" ? true : false);2087 $(EditNames.receptionHoliday.addHash()).prop('checked', $brd.attr(BoxNames.receptionHoliday) === "true" ? true : false);2088 $(EditNames.reception365days.addHash()).prop('checked', $brd.attr(BoxNames.reception365days) === "true" ? true : false);2089 if ($(EditNames.receptionWeekday.addHash()).prop('checked') ||2090 $(EditNames.receptionSaturday.addHash()).prop('checked') ||2091 $(EditNames.receptionSunday.addHash()).prop('checked') ||2092 $(EditNames.receptionHoliday.addHash()).prop('checked') ||2093 $(EditNames.reception365days.addHash()).prop('checked')) {2094 EditPanel.showInputParentSection($(EditNames.receptionWeekday.addHash()));2095 }2096 // 受付休み2097 var $brb = $preview.find(BoxNames.blackOut.addDot()).first();2098 $(EditNames.blackOutMay.addHash()).prop('checked', $brb.attr(BoxNames.blackOutMay) === "true" ? true : false);2099 $(EditNames.blackOutEndYear.addHash()).prop('checked', $brb.attr(BoxNames.blackOutEndYear) === "true" ? true : false);2100 $(EditNames.blackOutOther.addHash()).val($brb.attr(BoxNames.blackOutOther));2101 if ($(EditNames.blackOutMay.addHash()).prop('checked') ||2102 $(EditNames.blackOutEndYear.addHash()).prop('checked') ||2103 $(EditNames.blackOutOther.addHash()).val() !== '') {2104 EditPanel.showInputParentSection($(EditNames.blackOutMay.addHash()));2105 }2106 // その他2107 var otherVal = $preview.find(BoxNames.other.addDot()).first().html();2108 // 前回値としての値をセット2109 $(EditNames.other.addHash()).data('prevVal', otherVal);2110 if (otherVal !== '') {2111 $(EditNames.other.addHash()).val(otherVal);2112 $(EditNames.other.addHash()).parents(EditNames.editBox.addDot() + '-wrap').first().find(EditNames.editBox.addDot() + '-editbox').first().html(otherVal);2113 EditPanel.showInputParentSection($(EditNames.other.addHash()));2114 }2115 // 受付日のチェックボックスをセットする2116 EditPanel.setReceptionDateVal($elm);2117 // 電話の日付プラグインを初期化する2118 EditPanel.setDatePicker();2119 },2120 // 編集パネル内項目の表示2121 showInputParentSection: function($elm) {2122 $elm.parents('.edit-section').first().children('.edit-section-title').first().removeClass('close');2123 $elm.parents('.edit-section').first().children('fieldset').show();2124 },2125 // 編集パネル内のデータのクリア2126 reset: function($elm) {2127 $elm.find(EditNames.center.addHash()).val('');2128 $elm.find(EditNames.address.addHash()).val('');2129 $elm.find(EditNames.phoneGroup.addDot()).remove();2130 $elm.find(EditNames.hpPrefix.addHash()).val('');2131 $elm.find(EditNames.hpAddress.addHash()).val('');2132 $elm.find(EditNames.hpAddress.addHash()).parents(EditNames.editBox.addDot() + '-wrap').first().find(EditNames.editBox.addDot() + '-editbox').first().html('');2133 $elm.find(EditNames.mailGroup.addDot()).remove();2134 $elm.find(EditNames.receptionWeekday.addHash()).first().prop('checked', false).prop('disabled', false);2135 $elm.find(EditNames.receptionSaturday.addHash()).first().prop('checked', false).prop('disabled', false);2136 $elm.find(EditNames.receptionSunday.addHash()).first().prop('checked', false).prop('disabled', false);2137 $elm.find(EditNames.receptionHoliday.addHash()).first().prop('checked', false).prop('disabled', false);2138 $elm.find(EditNames.reception365days.addHash()).first().prop('checked', false).prop('disabled', false);2139 $elm.find(EditNames.receptionNothing.addHash()).first().prop('checked', true);2140 $elm.find(EditNames.receptionHourFrom.addHash()).val(9).prop('disabled', true);2141 $elm.find(EditNames.receptionTimeFrom.addHash()).val(0).prop('disabled', true);2142 $elm.find(EditNames.receptionHourTo.addHash()).val(17).prop('disabled', true);2143 $elm.find(EditNames.receptionTimeTo.addHash()).val(0).prop('disabled', true);2144 $elm.find(EditNames.receptionLunch.addHash()).first().prop('checked', false);2145 $elm.find(EditNames.blackOutMay.addHash()).first().prop('checked', false);2146 $elm.find(EditNames.blackOutEndYear.addHash()).first().prop('checked', false);2147 $elm.find(EditNames.blackOutOther.addHash()).val('');2148 $elm.find(EditNames.other.addHash()).val('');2149 $elm.find(EditNames.other.addHash()).parents(EditNames.editBox.addDot() + '-wrap').first().find(EditNames.editBox.addDot() + '-editbox').first().html('');21502151 // テキストエリアの入力を編集エリアに変更2152 $(EditNames.editBox.addDot() + '-editbox').hide();2153 $('.source').click();2154 // 編集パネルのフィールドをいったん閉じる2155 $elm.find('.edit-section-title').addClass('close');2156 $elm.find('fieldset[id|=field]').hide();2157 },2158 // 編集項目のセット2159 setEditItem: function($edit, $box) {2160 var colClass = '';2161 var $col = $box.parents('th,td').first();2162 if ($col.hasClass('col1')) {2163 colClass = 'col1';2164 } else if ($col.hasClass('col2')) {2165 colClass = 'col2';2166 } else if ($col.hasClass('col3')) {2167 colClass = 'col3';2168 }21692170 if (colClass === 'col1') {2171 $edit.find('.edit-section').addClass(Names.hidden);2172 // 住所項目をデフォルトでオープンにする2173 $edit.find(EditNames.fieldAddress.addHash()).prev().removeClass('close');2174 $edit.find(EditNames.fieldAddress.addHash()).show();2175 } else {2176 $edit.find('.edit-section').removeClass(Names.hidden);2177 }2178 // 住所項目のみ入力可とする2179 $edit.find(EditNames.fieldAddress.addHash()).parents('.edit-section').first().removeClass(Names.hidden);2180 },2181 // 電話番号の追加2182 addPhone: function(elm) {2183 $(EditNames.phoneGroupWrap.addHash()).append($(EditPanel.phoneTmp));2184 EditPanel.setPhoneDelBtn();2185 EditPanel.setDatePicker();2186 },2187 // 電話番号の削除2188 delPhone: function(elm) {2189 $(elm).parents('fieldset').first().remove();2190 EditPanel.setPhoneDelBtn();2191 EditPanel.setPhoneVal();2192 },2193 // 電話番号の削除ボタンのセット2194 setPhoneDelBtn: function() {2195 // 一旦全てのボタンの削除2196 $(EditNames.btnPhoneDel.addDot()).remove();2197 // 2個以上なら削除ボタンのセット2198 if ($(EditNames.phoneGroup.addDot()).length > 1) {2199 $(EditNames.phoneGroup.addDot()).each(function() {2200 $(this).append(2201 $('<button></button>').text('削除')2202 .attr('type', 'button')2203 .addClass('btn-del-phone btn btn-danger pull-left mg-l-5')2204 );2205 });2206 }2207 EditPanel.addChangeEvent();2208 },2209 // メールアドレスの追加2210 addMail: function(elm) {2211 $(EditNames.mailGroupWrap.addHash()).append($(EditPanel.mailTmp));2212 EditPanel.setMailDelBtn();2213 },2214 // メールアドレスの削除2215 delMail: function(elm) {2216 $(elm).parents('fieldset').first().remove();2217 EditPanel.setMailDelBtn();2218 EditPanel.setMailVal();2219 },2220 // メールの削除ボタンのセット2221 setMailDelBtn: function() {2222 // 一旦全てのボタンの削除2223 $(EditNames.btnMailDelWrap.addDot()).remove();2224 // 2個以上なら削除ボタンのセット2225 if ($(EditNames.mailGroup.addDot()).length > 1) {2226 $(EditNames.mailGroup.addDot()).each(function() {2227 var $lavel = $('<label></label>').addClass(EditNames.btnMailDelWrap);2228 $lavel.append(' ')2229 .append(2230 $('<button></button>')2231 .text('削除')2232 .attr('type', 'button')2233 .addClass('btn-del-mail btn btn-danger pull-left mg-l-5')2234 );2235 $(this).append($lavel);2236 });2237 }2238 EditPanel.addChangeEvent();2239 },2240 // リアルタイム入力用のイベントの登録2241 addChangeEvent: function() {2242 $(EditNames.panel.addHash() + ' input, ' + EditNames.panel.addHash() + ' textarea').imeEnter();2243 },2244 // デイトピッカーのセット2245 setDatePicker: function() {2246 $(EditNames.phoneOtherDate.addDot()).datepicker({2247 format: "yyyy-mm-dd",2248 todayBtn: true,2249 clearBtn: true,2250 language: "ja",2251 autoclose: true,2252 todayHighlight: true,2253 orientation: "top auto",2254 beforeShowDay: function (date){2255 date = new UltraDate(date);2256 var holidays = UltraDate.getHolidays(date.getFullYear());2257 var ret = {2258 tooltip: '',2259 classes: ''2260 };2261 var holiday = holidays[date.format(UltraDate.getDefaultFormat())];2262 if (holiday) {2263 ret.tooltip = holiday;2264 ret.classes = 'holiday';2265 }2266 switch (date.getDay()) {2267 case 0:2268 ret.classes += ' sunday';2269 break;2270 case 6:2271 ret.classes += ' saturday';2272 break;2273 }2274 return ret;2275 }2276 });2277 }2278 };22792280 // テーブル操作2281 var DataTable = {2282 dataBlock: '',2283 // タイトル行のテンプレート2284 tHeadRowTmp:'<tr>' +2285 ' <th class="col1">部署名</th>' +2286 ' <th class="col2">内容</th>' +2287 ' <th class="col3">電話番号</th>' +2288 '</tr>',2289 // 行のテンプレート2290 tBodyRowTmp: '<tr>' +2291 ' <th class="col1 col1_1"></th>' +2292 ' <td class="col1 col1_2 hidden"></td>' +2293 ' <td class="col2 "></td>' +2294 ' <td class="col3"></td>' +2295 '</tr>',22962297 /* ここからコンテキストメニュー用のイベント処理 ---------------------------------------------------------------------------- */2298 // 行を上移動2299 moveUpRow: function() {2300 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2301 var $rows = $tbody.find('tr');2302 var indexs = DataTable.getSelectRowLength($tbody);2303 var $row = $rows.eq(DataTable.getMoveUpRow($tbody, indexs.start));2304 var $moveRows = $tbody.find(Names.showMoveRow.addDot());23052306 for (var i = 0, len = $moveRows.length; i < len; i++) {2307 $row.before($moveRows.eq(i));2308 }2309 },2310 // 行を下移動2311 moveDownRow: function() {2312 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2313 var indexs = DataTable.getSelectRowLength($tbody);2314 var $rows = $tbody.find('tr');2315 var $row = $rows.eq(DataTable.getMoveDownRow($tbody, indexs.end));2316 var $moveRows = $tbody.find(Names.showMoveRow.addDot());23172318 for (var i = $moveRows.length; i >= 0; i--) {2319 $row.after($moveRows.eq(i));2320 }2321 },2322 // セルの結合2323 joinCell: function() {2324 // コンファームで結合するか確認2325 if (!confirm('結合元になるセル以外のデータは削除されます。よろしいですか?')) {2326 return false;2327 }2328 // 該当テーブルのtbody2329 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2330 // 選択しているセル群2331 var $selectCells = $tbody.find(Names.uiSelected.addDot()).not('tr');2332 // 結合セルの行数2333 var rowspan = 0;2334 var colName = '';2335 // rowspanの数を数える2336 $.each(Names.colClasses, function(i, col) {2337 $selectCells.filter(col.addDot()).each(function(index, elm) {2338 rowspan += $(elm).getRowspan();2339 });2340 if (rowspan > 0) {2341 colName = col;2342 // braek2343 return false;2344 }2345 });2346 // 最初のセルにrowspanをセット2347 $selectCells.first().attr('rowspan', rowspan)2348 .removeClass(Names.hidden);2349 // 次のセルが選択されているかどうか確認2350 var col1_2Select = ($selectCells.first().next().hasClass(Names.uiSelected));2351 // 次のセルが選択されている=col1クラスのセルで複数列選択されている2352 if (col1_2Select) {2353 $selectCells.first().next().attr('rowspan', 1)2354 .addClass(Names.hidden);2355 }2356 // 見えていないセルも含めて非表示処理とrowspan処理を行う2357 var $cell = $selectCells.first().parent().find(colName.addDot()).first();2358 for (var i=rowspan; i>1; i--) {2359 $cell = $cell.parent().next().find(colName.addDot()).first();2360 $cell.attr('rowspan', 1)2361 .addClass(Names.hidden);2362 if (col1_2Select) {2363 $cell.next().attr('rowspan', 1)2364 .addClass(Names.hidden);2365 }2366 }23672368 // 空白行の削除処理2369 DataTable.removeEmptyRow($tbody);23702371 // colspanのセット2372 DataTable.setColspan($tbody);23732374 var $table = $tbody.parents('table').first();2375 $table.find('tfoot').first().find('td').first().attr('colspan', DataTable.getTfootColspan($table));2376 },2377 // セルの分割2378 splitCell: function() {2379 // 選択しているセルをループ2380 $(Names.uiSelected.addDot()).each(function() {2381 // 該当行2382 var $row = $(this).parent('tr');2383 // rowspanを取得2384 var rowspan = $(this).getRowspan();2385 // 各列に付与されるクラス2386 var colClass = '';2387 // 分割するセルがどの列のセルかを確認2388 for (var col in Names.colClasses) {2389 if ($(this).hasClass(Names.colClasses[col])) {2390 colClass = Names.colClasses[col];2391 break;2392 }2393 }2394 // セルのrowspanをクリア2395 $(this).attr('rowspan', 1);2396 // rowspanの数だけ行にタグを追加2397 for (var i = 0; i < (rowspan - 1); i++) {2398 $row = $row.next();2399 $row.children(colClass.addDot()).removeClass(Names.hidden);2400 }2401 });2402 },2403 // 1列目の列分割2404 splitCol: function() {2405 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2406 // 選択されたセルをループ2407 $tbody.find('th' + Names.uiSelected.addDot()).each(function() {2408 // thの次のtd(col1_2)のhiddenクラスを削除2409 $(this).next().removeClass(Names.hidden)2410 .addClass(Names.uiSelected)2411 .attr('rowspan', $(this).getRowspan());2412 });2413 DataTable.setColspan($tbody);2414 var $table = $tbody.parents('table').first();2415 $table.find('tfoot').first().find('td').first().attr('colspan', DataTable.getTfootColspan($table));2416 },2417 // 行の追加2418 addRow: function(elm) {2419 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2420 var $rows = $tbody.find('tr');2421 var $row;2422 // 現在ホバーしている行を取得2423 var $hoverRow = $tbody.find('tr' + Names.ctmHover.addDot()).first();2424 var rowIndex = $rows.index($hoverRow);2425 var $addRow = DataTable.createNewRow();2426 // 行のセル確認2427 $.each(Names.colClasses, function(i, col) {2428 var hoverRowSpan = $hoverRow.find(col.addDot()).getRowspan();2429 if (!$hoverRow.find(col.addDot()).isShown()) {2430 // セルの非表示2431 $addRow.find(col.addDot()).addClass(Names.hidden);2432 // rowspanの変更2433 for (var index = rowIndex; index >= 0; index--) {2434 // 前の行のrowspanを確認し、1より大きければその行のrowspanから1引いた値に設定する2435 $row = $rows.eq(index).children(col.addDot()).first();2436 if ($row.getRowspan() > 1) {2437 $row.attr('rowspan', $row.getRowspan() + 1);2438 // これより上にはさかのぼらない2439 break;2440 }2441 }2442 } else if (hoverRowSpan > 1) {2443 // セルの非表示2444 $addRow.find(col.addDot()).addClass(Names.hidden);2445 $hoverRow.find(col.addDot()).attr('rowspan', hoverRowSpan + 1);2446 }2447 });2448 // colspanの確認2449 if ($($(Names.ctm.addHash()).data(Names.dataTargetElm)).find('.col1_2').isShown()) {2450 $addRow.find('.col1_1').first().attr('colspan', 2);2451 }2452 // 行の追加2453 $hoverRow.after($addRow);2454 // ドラッグアンドドロップイベントの追加2455 Cells.addSortableCol();2456 },2457 // 行の削除2458 delRow: function(elm) {2459 if (!confirm('削除すると元に戻せません。よろしいですか?')) {2460 return false;2461 }24622463 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2464 var $rows = $tbody.find('tr');2465 var $row;2466 var $cell;2467 var $nextCell;2468 var $removeRow = $tbody.find('tr' + Names.ctmHover.addDot()).first();2469 var rowIndex = $rows.index($removeRow);2470 var index = 0;24712472 $.each(Names.colClasses, function(i, col) {2473 // 削除する行のセルを取得2474 $cell = $removeRow.children(col.addDot()).first();24752476 if (!$cell.isShown()) {2477 // セルが表示されていない時(rowspanでまとめられている)2478 for (index = rowIndex; index >= 0; index--) {2479 // 前の行のrowspanを確認し、1より大きければその行のrowspanから1引いた値に設定する2480 $row = $rows.eq(index).children(col.addDot()).first();2481 if ($row.getRowspan() > 1) {2482 $row.attr('rowspan', $row.getRowspan() - 1);2483 // これより上にはさかのぼらない2484 break;2485 }2486 }2487 } else if ($cell.getRowspan() > 1) {2488 // rowspanが設定されているときは次の行にコピーしてrowspanを一つ減らす2489 //2490 // 次の行のセルを取得2491 $nextCell = $removeRow.next().children(col.addDot()).first();2492 // 次の行のセルの後ろにクローンしたものを挿入2493 $nextCell.after($cell.clone().attr('rowspan', $cell.getRowspan() -1));2494 // 元の次の行のセルを削除2495 $nextCell.remove();2496 }2497 });24982499 $removeRow.fadeOut('slow', function() {2500 $removeRow.remove();2501 });2502 },2503 // 2行表示2504 show2Col: function() {2505 var $table = $($(Names.ctm.addHash()).data(Names.dataTargetElm)).parents('table').first();2506 $table.find('.col2').addClass(Names.hidden);2507 DataTable.removeEmptyRow($table.find('tbody').first());2508 $table.find('tfoot').first().find('td').first().attr('colspan', DataTable.getTfootColspan($table));2509 },2510 // 3行表示2511 show3Col: function() {2512 var $table = $($(Names.ctm.addHash()).data(Names.dataTargetElm)).parents('table').first();2513 var rowspaning = 1;2514 $table.find('.col2').each(function() {2515 // rowspanが1より大きい時はrowspaningに値をセットする2516 if ($(this).getRowspan() > 1) {2517 rowspaning = $(this).getRowspan();2518 $(this).removeClass(Names.hidden);2519 }2520 rowspaning -= 1;2521 // rowspaningが1より小さい時は非表示のまま、そうで無い時はhiddenクラスを削除2522 if (rowspaning < 1) {2523 $(this).removeClass(Names.hidden);2524 }2525 });2526 $table.find('tfoot').first().find('td').first().attr('colspan', DataTable.getTfootColspan($table));2527 },2528 // フッター行の追加2529 addTfoot: function() {2530 var $table = $($(Names.ctm.addHash()).data(Names.dataTargetElm)).parents('table').first();2531 var $td = $('<td></td>').attr('colspan', DataTable.getTfootColspan($table));2532 var $tfoot = $('<tfoot></tfoot>').append(2533 $('<tr></tr>').append($td)2534 );2535 $table.append($tfoot);2536 },2537 // フッター行の削除2538 removeTfoot: function() {2539 var $table = $($(Names.ctm.addHash()).data(Names.dataTargetElm)).parents('table').first();2540 $table.find('tfoot').remove();2541 },2542 /* ここまでコンテキストメニュー用のイベント処理 ---------------------------------------------------------------------------- */2543 // 選択が始まっているときにどのクラスを含んでいたかの確認用2544 selectStart: '',2545 // セルの選択(jQueryUIのselectable)2546 addSelectEvent: function() {2547 $('tbody').selectable({2548 filter: 'th, td',2549 // 選択開始時のイベント2550 start: function() {2551 $(Names.uiSelected.addDot()).removeClass(Names.uiSelected);2552 },2553 // 選択完了時のイベント2554 stop: function(e, ui) {2555 // 選択完了時に値のクリア2556 DataTable.selectStart = '';2557 },2558 // 選択中のイベント2559 selecting: function(e, ui) {2560 // 最初に選択を始めた列のクラスを設定2561 if (!DataTable.selectStart) {2562 switch (true) {2563 case $(ui.selecting).hasClass('col1'):2564 DataTable.selectStart = 'col1';2565 break;2566 case $(ui.selecting).hasClass('col2'):2567 DataTable.selectStart = 'col2';2568 break;2569 case $(ui.selecting).hasClass('col3'):2570 DataTable.selectStart = 'col3';2571 break;2572 }2573 }2574 // 同じ列のもの以外は選択できないようにする2575 if (!$(ui.selecting).hasClass(DataTable.selectStart)) {2576 $(ui.selecting).removeClass(Names.uiSelecting);2577 }2578 },2579 // 選択が終わって選択中から選択済みに変わる時のイベント2580 selected: function(e, ui) {2581 if (!$(ui.selected).hasClass(DataTable.selectStart)) {2582 $(ui.selected).removeClass(Names.uiSelected);2583 }2584 $(Names.hover.addDot()).removeClass(Names.hover);2585 $(ui.selected).parents('tr').first().addClass(Names.hover);2586 }2587 });2588 },2589 // 1列目のcolspanをセット・リセット2590 setColspan: function($tbody) {2591 // col1_2クラスのある場合はcolspanをセット2592 if ($tbody.find('.col1_2').isShown()) {2593 $tbody.prev('thead').find('th').first().attr('colspan', 2);2594 var rowspaning = 0;2595 $tbody.find('.col1_1').each(function() {2596 if ($(this).next().getRowspan() > 1) {2597 rowspaning = $(this).next().getRowspan();2598 }2599 if ($(this).next().isShown()) {2600 $(this).attr('colspan', 1);2601 } else if (rowspaning > 0) {2602 $(this).attr('colspan', 1);2603 } else {2604 $(this).attr('colspan', 2);2605 }2606 rowspaning -= 1;2607 });2608 } else {2609 $tbody.prev('thead').find('th').first().attr('colspan', 1);2610 $tbody.find('.col1_1').attr('colspan', 1);2611 }2612 },2613 // 空行の削除2614 removeEmptyRow: function($tbody) {2615 var $rows = $tbody.find('tr');2616 // 空白の行の削除処理2617 $rows.each(function() {2618 if (!$(this).isEmptyRow()) {2619 // continu2620 return true;2621 }26222623 var rowIndex = $rows.index(this);2624 rowspan = 0;2625 $.each(Names.colClasses, function(i, colName) {2626 // セルが表示されていない時(rowspanでまとめられている)2627 for (var index = rowIndex; index >= 0; index--) {2628 // 前の行のrowspanを確認し、1より大きければその行のrowspanから1引いた値に設定する2629 $prevCell = $rows.eq(index).children(colName.addDot()).first();2630 rowspan = $prevCell.getRowspan();2631 if (rowspan > 1) {2632 $prevCell.attr('rowspan', rowspan - 1);2633 // これより上にはさかのぼらない2634 break;2635 }2636 }2637 });26382639 // 行を削除する2640 $(this).remove();2641 });2642 },2643 // 行をホバーした時2644 hoverRow: function(elm) {2645 // 行を見やすいように行の上下を線で挟む2646 $(elm).parents(Names.tblWrap).first()2647 .append($(Names.hoverRowTop.addHash()))2648 .append($(Names.hoverRowBottom.addHash()));2649 $(Names.hoverRowTop.addHash()).css({2650 top: $(elm).offset().top - 1,2651 left: $(elm).offset().left,2652 width: $(elm).width() + 'px'2653 }).show();2654 $(Names.hoverRowBottom.addHash()).css({2655 top: $(elm).offset().top + $(elm).height() -1,2656 left: $(elm).offset().left,2657 width: $(elm).width() + 'px'2658 }).show();2659 },2660 // コンテキストメニューの「行の追加」をホバーした時に挿入場所の線を表示2661 hoverUpRow: function() {2662 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2663 var $rows = $tbody.find('tr');26642665 var indexs = DataTable.getSelectRowLength($tbody);2666 // indexsの最初から最後の行まで選択クラスを付与する2667 for (var i = indexs.start, len = indexs.end; i <= len; i++) {2668 $rows.eq(i).addClass(Names.showMoveRow);2669 }2670 // 上の移動先の行を取得する2671 var $row = $rows.eq(DataTable.getMoveUpRow($tbody, indexs.start));26722673 // セパレータを挿入して表示2674 $tbody.parents(Names.tblWrap).first().append($(Names.rowSeparator.addHash()));2675 $(Names.rowSeparator.addHash()).css({2676 top: $row.offset().top,2677 left: $row.offset().left,2678 background: '#744199',2679 width: $tbody.width() + 'px'2680 }).show();2681 },2682 // コンテキストメニューの「行の追加」をホバーした時に挿入場所の線を表示2683 hoverDownRow: function() {2684 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2685 var $rows = $tbody.find('tr');26862687 // 現在選択されている行から移動するブロックを取得する2688 var indexs = DataTable.getSelectRowLength($tbody);2689 // indexsの最初から最後の行まで選択クラスを付与する2690 for (var i = indexs.start, len = indexs.end; i <= len; i++) {2691 $rows.eq(i).addClass(Names.showMoveRow);2692 }2693 // 下の移動先の行を取得する2694 var $row = $rows.eq(DataTable.getMoveDownRow($tbody, indexs.end));26952696 // セパレータを挿入して表示2697 $tbody.parents(Names.tblWrap).first().append($(Names.rowSeparator.addHash()));2698 $(Names.rowSeparator.addHash()).css({2699 top: $row.offset().top + $row.height(),2700 left: $row.offset().left,2701 background: '#744199',2702 width: $tbody.width() + 'px'2703 }).show();2704 },2705 // コンテキストメニューの「行の追加」をホバーした時に挿入場所の線を表示2706 hoverAddRow: function() {2707 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2708 var $row = $tbody.find('tr' + Names.ctmHover.addDot()).first();2709 $tbody.parents(Names.tblWrap).first().append($(Names.rowSeparator.addHash()));2710 $(Names.rowSeparator.addHash()).css({2711 top: $row.offset().top + $row.height(),2712 left: $row.offset().left,2713 background: '#f00',2714 width: $tbody.width() + 'px'2715 }).show();2716 },2717 // コンテキストメニューの「行の削除」をホバーした時に削除行の実際に削除されるセルに削除クラスを付与2718 hoverDelRow: function() {2719 // 行を見やすいように行の上にパネルを表示2720 var $tbody = $($(Names.ctm.addHash()).data(Names.dataTargetElm));2721 var $row = $tbody.find('tr' + Names.ctmHover.addDot()).first();2722 $row.children().each(function() {2723 if (!$(this).isShown() || $(this).getRowspan() === 1) {2724 $(this).addClass(Names.showDelRow);2725 }2726 });2727 // コンテンツの追加ボタンの退避2728 Cells.removeAddBoxBtn();2729 },2730 // 移動する行の範囲を取得2731 getSelectRowLength: function($tbody) {2732 var $rows = $tbody.find('tr');2733 var ret = {2734 start: 0,2735 end: -12736 };2737 var $selectRow = $tbody.find('tr' + Names.ctmHover.addDot()).first();2738 var selectIndex = $rows.index($selectRow);2739 var i = 0;2740 var len = 0;2741 // 検索をかける列の取得2742 var cols = DataTable.getColClass($tbody);2743 // 列が全て表示されているかどうかの判定用関数2744 var isAllShow = function($row){2745 var ret = true;2746 $.each(cols, function(i, col) {2747 if (!$row.find(col.addDot()).isShown()) {2748 ret = false;2749 return false;2750 }2751 });2752 return ret;2753 };2754 // 全ての行が表示されているところまでさかのぼる2755 for (i = selectIndex; i >= 0; i--) {2756 if (isAllShow($rows.eq(i))) {2757 // すべての列が表示されているところをスタートインデックスとする2758 ret.start = i;2759 break;2760 }2761 }27622763 // 次の全ての行が表示されている前の行を終わりの行とする2764 for (i = ret.start + 1, len = $rows.length; i < len; i++) {2765 if (isAllShow($rows.eq(i))) {2766 // すべての列が表示されているところを最終2767 ret.end = i - 1;2768 break;2769 }2770 }2771 if (ret.end === -1) {2772 ret.end = $rows.length - 1;2773 }2774 return ret;2775 },2776 // 上の行に移動するときの移動先の行2777 getMoveUpRow: function($tbody, index) {2778 var $rows = $tbody.find('tr');2779 var rowIndex = index - 1;27802781 // 検索をかける列の取得2782 var cols = DataTable.getColClass($tbody);2783 // 列が全て表示されているかどうかの判定用関数2784 var isAllShow = function($row){2785 var ret = true;2786 $.each(cols, function(i, col) {2787 if (!$row.find(col.addDot()).isShown()) {2788 ret = false;2789 return false;2790 }2791 });2792 return ret;2793 };2794 // 全ての行が表示されているところまでさかのぼる2795 for (var i = rowIndex; i >= 0; i--) {2796 if (isAllShow($rows.eq(i))) {2797 // すべての列が表示されているところをスタートインデックスとする2798 rowIndex = i;2799 break;2800 }2801 }28022803 return rowIndex;2804 },2805 // 下の行に移動するときの移動先の行2806 getMoveDownRow: function($tbody, index) {2807 var $rows = $tbody.find('tr');2808 var rowIndex = index + 1;28092810 // 検索をかける列の取得2811 var cols = DataTable.getColClass($tbody);2812 var rowspans = {};2813 $.each(cols, function(i, col) {2814 rowspans[col] = 0;2815 });2816 // 各カラムのrowspanを個別に計算し、すべてのrowspanが一致するかどうかの確認2817 var matchRowspanNums = function($row){2818 var ret = true;2819 // rowspanの数を計算する2820 $.each(cols, function(i, col) {2821 if ($row.find(col.addDot()).isShown()) {2822 rowspans[col] += $row.find(col.addDot()).getRowspan();2823 }2824 });2825 loop: for (var keys in rowspans) {2826 for (var key in rowspans) {2827 if (rowspans[keys] !== rowspans[key]) {2828 ret = false;2829 break loop;2830 }2831 }2832 }2833 return ret;2834 };2835 // 全ての列のrowspanがマッチするまでループ2836 for (var i = rowIndex, len = $rows.length; i < len; i++) {2837 if (matchRowspanNums($rows.eq(i))) {2838 rowIndex = i;2839 break;2840 }2841 }28422843 return rowIndex;2844 },2845 // 表示されている列のクラス群を取得2846 getColClass: function($tbody) {2847 var $theadRow = $tbody.parents('table').first()2848 .find('thead').first()2849 .find('tr').first();2850 // 検索をかける列の取得2851 var cols = [];2852 cols.push('col1_1');2853 if ($theadRow.find('.col1').getColspan() > 1) {2854 cols.push('col1_2');2855 }2856 if ($theadRow.find('.col2').isShown()) {2857 cols.push('col2');2858 }2859 cols.push('col3');28602861 return cols;2862 },2863 // tfoot用のcolspanを取得2864 getTfootColspan: function($table) {2865 var colspan = 0;2866 $table.find('thead').first().find('th').each(function() {2867 if ($(this).isShown()) {2868 colspan += $(this).getColspan();2869 }2870 });2871 return colspan;2872 },2873 createNewRow: function() {2874 var $newRow = $(DataTable.tBodyRowTmp);2875 $newRow.children().each(function() {2876 var $boxTmp = $(Cells.boxTmp);2877 $boxTmp.find(BoxNames.wrapPhone.addDot()).first().append($(Cells.phoneTmp));2878 $boxTmp.find(BoxNames.wrapMail.addDot()).first().append($(Cells.mailTmp));2879 $(this).append($boxTmp);2880 });2881 return $newRow;2882 }2883 };28842885 // コンテキストメニュー2886 var Context = {2887 // コンテキストメニューの表示2888 show: function(tbody, e) {2889 var $tbody = $(tbody);2890 // ホバークラスのついたものにコンテキストメニュー用のホバーを付ける2891 // ホバー行を固定する為2892 $tbody.find(Names.hover.addDot()).addClass(Names.ctmHover);2893 // ホバー中のセル(行以外)を取得2894 var $cmtHoverCells = $tbody.find(Names.ctmHover.addDot()).filter('th, td');2895 var $cmtHoverRow = $tbody.find(Names.ctmHover.addDot()).filter('tr');2896 // ホバークラスに選択クラスが無い場合はホバーしているセルを選択中セルにする2897 $cmtHoverCells.each(function(i, cell) {2898 if (!$(this).hasClass(Names.uiSelected)) {2899 $tbody.find(Names.uiSelected.addDot())2900 .removeClass(Names.uiSelected);2901 $(this).addClass(Names.uiSelected);2902 }2903 });2904 // コンテキストに該当tbodyをセット2905 $(Names.ctm.addHash()).data(Names.dataTargetElm, tbody);29062907 /* ここから各メニューの表示・非表示 ---------------------------------------- */2908 var $trs = $tbody.find('tr');2909 var indexs = DataTable.getSelectRowLength($tbody);2910 // ▲行を上に移動 ------------------------------------------------------2911 $(Names.ctmMoveUp.addHash()).removeClass(Names.disabled);2912 if (indexs.start === 0) {2913 $(Names.ctmMoveUp.addHash()).addClass(Names.disabled);2914 }29152916 // ▼行を下に移動 ------------------------------------------------------2917 $(Names.ctmMoveDown.addHash()).removeClass(Names.disabled);2918 if (indexs.end === ($trs.length - 1)) {2919 $(Names.ctmMoveDown.addHash()).addClass(Names.disabled);2920 }29212922 // セルの結合 ---------------------------------------------------------2923 if ($trs.find(Names.uiSelected.addDot()).length > 1) {2924 $(Names.ctmJoinCell.addHash()).removeClass(Names.disabled);2925 } else {2926 $(Names.ctmJoinCell.addHash()).addClass(Names.disabled);2927 }2928 // col1_1とcol1_2の最初と最後の行がそろっていない場合はセルの結合設定を無効にする2929 var $selected = $(Names.uiSelected.addDot());2930 if ($selected.filter('.col1_1').length > 0 &&2931 $selected.filter('.col1_2').length > 0) {2932 var col1_1_start = $selected.filter('.col1_1').first().parent().index();2933 var col1_2_start = $selected.filter('.col1_2').first().parent().index();2934 if (col1_1_start !== col1_2_start) {2935 $(Names.ctmJoinCell.addHash()).addClass(Names.disabled);2936 }2937 var col1_1_end = $selected.filter('.col1_1').last().parent().index() +2938 $selected.filter('.col1_1').last().getRowspan();2939 var col1_2_end = $selected.filter('.col1_2').last().parent().index() +2940 $selected.filter('.col1_2').last().getRowspan();2941 if (col1_1_end !== col1_2_end) {2942 $(Names.ctmJoinCell.addHash()).addClass(Names.disabled);2943 }2944 }29452946 // セルの分割 ---------------------------------------------------------2947 $(Names.ctmSplitCell.addHash()).addClass(Names.disabled);2948 $tbody.find(Names.ctmHover.addDot() + ' ' + Names.uiSelected.addDot()).each(function () {2949 var rspan = $(this).getRowspan();2950 if ($(this).getRowspan() > 1) {2951 $(Names.ctmSplitCell.addHash()).removeClass(Names.disabled);2952 return false;2953 }2954 });29552956 // セルの列分割 -------------------------------------------------------2957 $(Names.ctmSplitCol.addHash()).addClass(Names.disabled);2958 $tbody.find('th' + Names.uiSelected.addDot()).each(function() {2959 if ($(this).next().hasClass(Names.hidden)) {2960 $(Names.ctmSplitCol.addHash()).removeClass(Names.disabled);2961 return false;2962 }2963 });29642965 // 行の追加 ----------------------------------------------------------2966 var colBool = true;2967 $.each(Names.colClasses, function(i, col) {2968 var $cell = $cmtHoverRow.children(col.addDot());2969 colBool = ($cell.isShown() && $cell.getRowspan() === 1) ? false : true;2970 });2971 if (colBool) {2972 $(Names.ctmAddRow.addHash()).addClass(Names.disabled);2973 } else {2974 $(Names.ctmAddRow.addHash()).removeClass(Names.disabled);2975 }29762977 // 行の削除 ----------------------------------------------------------2978 if ($trs.length > 1) {2979 $(Names.ctmDelRow.addHash()).removeClass(Names.disabled);2980 } else {2981 $(Names.ctmDelRow.addHash()).addClass(Names.disabled);2982 }29832984 // 2列・3列表示 ------------------------------------------------------2985 if ($tbody.find('.col2').isShown()) {2986 $(Names.ctmTitle2Col.addHash()).removeClass(Names.disabled);2987 $(Names.ctmTitle3Col.addHash()).addClass(Names.disabled);2988 } else {2989 $(Names.ctmTitle2Col.addHash()).addClass(Names.disabled);2990 $(Names.ctmTitle3Col.addHash()).removeClass(Names.disabled);2991 }29922993 // フッター行の追加・削除 ------------------------------------------------2994 if ($tbody.next('tfoot').length > 0) {2995 $(Names.ctmDelTfoot.addHash()).removeClass(Names.disabled);2996 $(Names.ctmAddTfoot.addHash()).addClass(Names.disabled);2997 } else {2998 $(Names.ctmAddTfoot.addHash()).removeClass(Names.disabled);2999 $(Names.ctmDelTfoot.addHash()).addClass(Names.disabled);3000 }30013002 /* ここまで各メニューの表示・非表示 ---------------------------------------- */30033004 // コンテキストメニューを表示3005 $(Names.ctm.addHash()).fadeIn('fast');3006 var pageY = e.pageY - $(window).scrollTop();3007 var pageX = e.pageX - $(window).scrollLeft();3008 // パディング、ボーダーを含めた高さを取得3009 var ulBottom = $(Names.ctm.addHash()).find('ul').outerHeight();3010 // パディング、ボーダーを含めた幅を取得3011 var ulLeft = $(Names.ctm.addHash()).find('ul').outerWidth();3012 // 画面から高さがはみ出る場合は位置を調整3013 if ($(window).height() < pageY + ulBottom) {3014 pageY -= ulBottom;3015 }3016 // 画面から幅がはみ出る場合は位置を調整3017 if ($(window).width() < pageX + ulLeft) {3018 pageX -= ulLeft;3019 }3020 $(Names.ctm.addHash()).children('ul')3021 .css({3022 top: pageY,3023 left: pageX3024 });3025 },3026 // コンテキストメニューの非表示3027 hide: function(elm) {3028 $(elm).fadeOut('fast', function () {3029 $($(Names.ctm.addHash()).data(Names.dataTargetElm))3030 .find(Names.ctmHover.addDot())3031 .removeClass(Names.ctmHover)3032 .addClass(Names.hover);3033 });3034 }3035 };30363037 // 「カテゴリの編集」モーダル用3038 var ModalCate = {3039 // カテゴリ行のテンプレート3040 row: '<tr>' +3041 ' <td class="' + Names.mdlCateSort + '">⇕</td>' +3042 ' <td><input type="text" class="' + Names.mdlCateName + '"></td>' +3043 ' <td><input type="text" class="' + Names.mdlCateId + '"></td>' +3044 ' <td><input type="text" class="' + Names.mdlCateClass + '"></td>' +3045 ' <td>' +3046 ' <select class="' + Names.mdlCateEnable + '">' +3047 ' <option value="0">-</option>' +3048 ' <option value="1">削除</option>' +3049 ' </select>' +3050 ' </td>' +3051 '</tr>',3052 // 表に追加するときのテンプレート3053 sectionTmp: '<div class="tn-section" id="">' +3054 ' <h3>総合</h3>' +3055 ' <div class="' + Names.tblWrap + '">' +3056 ' <table>' +3057 ' <thead>' +3058 ' </thead>' +3059 ' <tbody>' +3060 ' </tbody>' +3061 ' </table>' +3062 ' </div>' +3063 '</div>',3064 // モーダルの表示3065 show: function(table) {3066 // 一旦行の全削除3067 $(Names.mdlCateTable.addHash()).empty();3068 $(Names.cntBody.addDot()).first().find(Names.section.addDot()).each(function() {3069 ModalCate.addRow(3070 $(this).children('h3').text(),3071 $(this).attr('id'),3072 $(this).attr('class')3073 );3074 });3075 },3076 // カテゴリの「表示・削除」の値が変わった時の処理3077 changeCateEnable: function(elm) {3078 // カテゴリを削除するかどうかの値を確認してクラスを設定する3079 if ($(elm).children('option:selected').first().val() === '0') {3080 $(elm).removeClass(Names.mdlCateDel);3081 } else {3082 $(elm).addClass(Names.mdlCateDel);3083 }3084 },3085 // 行の追加処理3086 addRow: function(cateName, cateId, cateClass) {3087 // カテゴリ一覧のテーブルを選択3088 var $cateTable = $(Names.mdlCateTable.addHash());3089 // 追加する行のテンプレートをjQueryオブジェクトとして取得3090 var $row = $(ModalCate.row);3091 // 行のinput要素に値を設定3092 $row.find(Names.mdlCateName.addDot()).first().val(cateName || '');3093 $row.find(Names.mdlCateId.addDot()).first().val(cateId ? cateId.split('-')[1] : '')3094 .attr(Names.mdlCateNowId, cateId || '');3095 // sectionタグの代わりに付けているtn-sectionを削除3096 cateClass = cateClass || '';3097 cateClass = cateClass.replace(Names.section, '').trim();3098 $row.find(Names.mdlCateClass.addDot()).first().val(cateClass || '');3099 // 新規行の時は必須エラーを付与3100 if (!cateName) {3101 $row.find(Names.mdlCateName.addDot())3102 .addClass(Names.mdlCateErrInput)3103 .after($('<div></div>')3104 .text('※必須項目です')3105 .addClass(Names.mdlCateErrPnl));3106 }3107 if (!cateId) {3108 $row.find(Names.mdlCateId.addDot())3109 .addClass(Names.mdlCateErrInput)3110 .after($('<div></div>')3111 .text('※必須項目です')3112 .addClass(Names.mdlCateErrPnl));3113 }3114 // テーブルの最後に追加3115 $cateTable.append($row);3116 // 追加した行の名前にフォーカスを移動3117 $cateTable.find(Names.mdlCateName.addDot()).last().focus();3118 },3119 // 名前の確認3120 validateName: function(elm) {3121 // 空文字の確認3122 if (ModalCate.validateEmpty(elm)) {3123 return;3124 }3125 // 重複チェック3126 ModalCate.validateOverlap(Names.mdlCateName);3127 },3128 // idの確認3129 validateId: function(elm) {3130 // 空文字の確認3131 if (ModalCate.validateEmpty(elm)) {3132 return;3133 }3134 // 入力文字種のチェック3135 if ($(elm).val().match(/[^a-zA-Z0-9_-]+/)) {3136 $(elm).addClass(Names.mdlCateErrInput)3137 .after($('<div></div>')3138 .text('※使用できる文字は英数字とハイフン、アンダースコアのみです')3139 .addClass(Names.mdlCateErrPnl));3140 return;3141 } else if ($(elm).val().match(/^[0-9_-]+/)) {3142 $(elm).addClass(Names.mdlCateErrInput)3143 .after($('<div></div>')3144 .text('※数字・記号から始まるものは設定できません')3145 .addClass(Names.mdlCateErrPnl));3146 } else {3147 $(elm).removeClass(Names.mdlCateErrInput)3148 .next(Names.mdlCateErrPnl.addDot()).remove();3149 }3150 // 重複チェック3151 ModalCate.validateOverlap(Names.mdlCateId);3152 },3153 // idの確認3154 validateClass: function(elm) {3155 $(elm).removeClass(Names.mdlCateErrInput)3156 .parents('td').first().find(Names.mdlCateErrPnl.addDot()).remove();3157 if ($(elm).val().match(/^[0-9_-]+/)) {3158 $(elm).addClass(Names.mdlCateErrInput)3159 .after($('<div></div>')3160 .text('※数字・記号から始まるものは設定できません')3161 .addClass(Names.mdlCateErrPnl));3162 }3163 },3164 // 空白かどうかの確認3165 validateEmpty: function(elm) {3166 $(elm).removeClass(Names.mdlCateErrInput)3167 .parents('td').first().find(Names.mdlCateErrPnl.addDot()).remove();3168 if ($(elm).val()) {3169 return false;3170 } else {3171 $(elm).addClass(Names.mdlCateErrInput)3172 .after($('<div></div>')3173 .text('※必須項目です')3174 .addClass(Names.mdlCateErrPnl));3175 return true;3176 }3177 },3178 // 重複チェック3179 validateOverlap: function(col) {3180 var vals = [];3181 var overlaps = [];3182 var i, len;3183 // 重複エラーを一旦初期化3184 $(Names.mdlCateTable.addHash()).find(col.addDot()).each(function() {3185 $(this).removeClass(Names.mdlCateErrOverlap);3186 $(this).parents('td').first().find(Names.mdlCateErrOverlap.addDot()).remove();3187 if ($(this).parents('td').first().find(Names.mdlCateErrInput.addDot()).length === 0) {3188 $(this).removeClass(Names.mdlCateErrInput);3189 }3190 });31913192 // 列の値を配列に保存3193 $(Names.mdlCateTable.addHash()).find(col.addDot()).each(function() {3194 if ($.inArray($(this).val(), vals) === -1) {3195 vals.push($(this).val());3196 } else {3197 if ($.inArray($(this).val(), overlaps) === -1 && $(this).val() !== '') {3198 overlaps.push($(this).val());3199 }3200 }3201 });3202 for (i = 0, len = overlaps.length; i < len; i++) {3203 $(Names.mdlCateTable.addHash()).find(col.addDot()).each(function() {3204 if ($(this).val() === overlaps[i]) {3205 $(this).addClass(Names.mdlCateErrInput)3206 .addClass(Names.mdlCateErrOverlap)3207 .after(3208 $('<div></div>').text('※値が重複しています')3209 .addClass(Names.mdlCateErrPnl)3210 .addClass(Names.mdlCateErrOverlap)3211 );3212 }3213 });3214 }3215 },3216 // ページ内リンクの作成3217 createUl: function(pageName) {3218 var $ul = $('<ul></ul>').attr('id', 'inpage-links');3219 $(Names.cntBody.addDot()).first().find(Names.section.addDot()).each(function() {3220 var href = $(this).attr('id');3221 $ul.append(3222 $('<li></li>').append(3223 $('<a></a>').attr('href', href)3224 .text($(this).children('h3').text())3225 )3226 );3227 });3228 return $ul;3229 },3230 // カテゴリの表への反映3231 reflect: function() {3232 // エラーの存在する場合は何もしない3233 if ($(Names.mdlCateTable.addHash()).find(Names.mdlCateErrInput.addDot()).length > 0) {3234 alert('エラーを修正してください');3235 return false;3236 }3237 var hasDel = false;3238 var delElm = $(Names.mdlCateTable.addHash()).find('option:selected').each(function() {3239 if ($(this).attr('value') === '1') {3240 hasDel = true;3241 return true;3242 }3243 });32443245 if (hasDel) {3246 if (!confirm("削除項目があります。\n更新してもよろしいですか?")) {3247 return false;3248 }3249 }32503251 // ページ内リンク3252 var $ul = $('<ul></ul>').attr('id', 'inpage-links');32533254 // パネルの入れ替え3255 var newArr = [];3256 $(Names.mdlCateTable.addHash()).children('tr').each(function() {3257 if ($(this).find(Names.mdlCateEnable.addDot()).first().val() === '1') {3258 return true;3259 }3260 var nowval = $(this).find(Names.mdlCateId.addDot()).first().attr(Names.mdlCateNowId);3261 var $obj;3262 if (nowval) {3263 $obj = $(nowval.addHash()).clone();3264 } else {3265 $obj = $(ModalCate.sectionTmp);3266 $obj.find('thead').first().append($(DataTable.tHeadRowTmp));3267 $obj.find('tbody').first().append(DataTable.createNewRow());3268 }3269 var id = Names.mdlCateIdPre + $(this).find(Names.mdlCateId.addDot()).first().val();3270 var name = $(this).find(Names.mdlCateName.addDot()).first().val();3271 $obj.attr(Names.mdlCateNowId, Names.mdlCateIdPre + $(this).find(Names.mdlCateId.addDot()).first().val())3272 .attr('id', id)3273 // addClassにしないのは現在のものとの置き換えを目的としている為3274 .attr('class', $(this).find(Names.mdlCateClass.addDot()).first().val())3275 .addClass(Names.section)3276 .children('h3').text(name);3277 newArr.push($obj);32783279 $ul.append(3280 $('<li></li>').append(3281 $('<a></a>').attr('href', '#' + id)3282 .text(name)3283 )3284 );3285 });32863287 // 一旦データを空にする3288 $(Names.cntBodyDataWrap.addHash()).empty();3289 // ナビゲーションの挿入3290 $(Names.cntBodyDataWrap.addHash()).first().append($ul);3291 // 新規に挿入3292 $.each(newArr, function(i, val) {3293 $(Names.cntBodyDataWrap.addHash()).append(val);3294 });3295 // 編集フラグをセット3296 isEdit = true;3297 // テーブル選択の有効化3298 DataTable.addSelectEvent();3299 // コンテンツボックスのドラッグアンドドロップ有効化3300 Cells.addSortableCol();3301 $(Names.mdlCate.addHash()).modal('hide');3302 }3303 };33043305 // 「問合せ一覧」モーダル用3306 var ModalMenu = {3307 // 表示処理3308 show: function() {3309 // モーダル表示時に選択したリストのクリア、ボタンの無効化を行う3310 ModalMenu.removeSelect();3311 $(Names.mdlMenuBtnShow.addHash()).addClass(Names.disabled);3312 },3313 // リストを選択した時の処理3314 liSelect: function(elm) {3315 // リストをクリックした際に選択クラスの付与とボタンの有効化を行う3316 ModalMenu.removeSelect();3317 $(elm).addClass(Names.selected);3318 $(Names.mdlMenuBtnShow.addHash()).removeClass(Names.disabled);3319 },3320 // 選択されているリストのクリア3321 removeSelect: function() {3322 // 選択されているリストをクリアする3323 $(Names.mdlMenu.addHash()).find('li').removeClass(Names.selected);3324 },3325 // 選択されているページの取得3326 getPage: function(elm) {3327 var $modalMenu = $(Names.mdlMenu.addHash());3328 if (isEdit) {3329 if (!confirm("現在表示中のページは編集されているようです。\n編集を保存せずにページを取得しますか?")) {3330 $modalMenu.modal('hide');3331 return;3332 }3333 }3334 // 選択されているリストのページを取得して表示する3335 // var $menuSelect = $modalMenu.find('li' + Names.selected.addDot()).first();3336 var $menuSelect = $(elm);3337 var url = 'html/get/' + $menuSelect.attr(Names.dataMenuName);3338 $modalMenu.modal('hide');3339 Ajaxs.get(url);3340 }3341 };334233433344 // 本番用のJSと合わせること!3345 // BoxNamesオブジェクトも忘れずに!3346 var phoneOther = {3347 // ○○○○年○○月○○日[から・まで]を表示するようのテンプレート3348 tmp: '<div class="until-phone">' +3349 ' <span class="' + BoxNames.phoneOtherDateClass + '"></span>' +3350 ' <span>:</span>' +3351 ' <span class="' + BoxNames.phoneOtherNumberClass + '"></span>' +3352 '</div>',3353 set: function() {3354 // 更新システム用3355 // $(EditNames.panel.addHash() + '-preview').find('['+ BoxNames.phoneOtherDate +']')3356 //3357 // 本番用3358 // $('['+ BoxNames.phoneOtherDate +']')3359 $(EditNames.panel.addHash() + '-preview').find('['+ BoxNames.phoneOtherDate +']').each(function() {3360 var date = $(this).attr(BoxNames.phoneOtherDate) || '1900-01-01';3361 var phoneState = $(this).attr(BoxNames.phoneOtherState);3362 var stateStr = phoneState === '1' ? 'から' : 'まで';3363 var otherNum = $(this).attr(BoxNames.phoneOtherNumber);3364 var defaultNum = $(this).attr(BoxNames.phoneDefaultNumber);3365 var $boxPhoneNum = $(this).find(BoxNames.phoneNumber.addDot()).first();3366 $boxPhoneNum.empty();3367 $boxPhoneNum.append($('<em></em>').text(defaultNum));33683369 if (phoneOther.validDate(date) && otherNum) {3370 var checkDate = new Date(date);3371 var today = new Date();33723373 if (phoneState === '1') {3374 if (today >= checkDate) {3375 $boxPhoneNum.empty();3376 $boxPhoneNum.append($('<em></em>').text(otherNum));3377 } else {3378 phoneOther.setAfter(this, otherNum, stateStr, checkDate);3379 }3380 } else if (phoneState === '2') {3381 if (today <= checkDate) {3382 phoneOther.setAfter(this, otherNum, stateStr, checkDate);3383 }3384 }3385 }3386 });3387 },3388 setAfter: function(elm, phoneNumber, stateStr, checkDate) {3389 var $div = $(phoneOther.tmp);3390 var viewDate = checkDate.getFullYear() + '年' +3391 (checkDate.getMonth() + 1) + '月' +3392 checkDate.getDate() + '日' +3393 stateStr;3394 $div.find(BoxNames.phoneOtherDateClass.addDot()).first().text(viewDate);3395 $div.find(BoxNames.phoneOtherNumberClass.addDot()).first().text(phoneNumber);3396 $(elm).append($div);3397 },3398 validDate: function(date) {3399 var dateArr = date.split('-');3400 var y = parseInt(dateArr[0], 10) || 0;3401 var m = parseInt(dateArr[1], 10) || 0;3402 var d = parseInt(dateArr[2], 10) || 0;3403 var dt = new Date(y, m - 1, d);3404 return (dt.getFullYear() === y, dt.getMonth() === m, dt.getDate() === d);3405 }3406 };34073408 // 初期化の実行3409 Init(); ...

Full Screen

Full Screen

jquery.popSelect.js

Source:jquery.popSelect.js Github

copy

Full Screen

...87 var elemPos = this.getPosition(this.$elem);88 this.elemPos = elemPos;89 // Also Add the required css Properties90 this.$elem91 .parent(addDot(classNames.selectWrapper))92 .css({width: this.settings.width || elemPos.width, height: elemPos.height});93 // Append the popover to $elem94 var popUpCode = this.generatePopover(this.$options);95 $this.log(logs.popoverGenerated, popUpCode);96 this.$elem.after(popUpCode);97 // Assign the $popover to the new $elem98 this.$popover = this.$elem.next(addDot(classNames.popoverSelect));99 this.$popover.css({top: 0, left: 0});100 // Append Tagging System to it101 this.$elem.after(createTaggingStr(this.settings.placeholderText, this.$options));102 // Get the Tag Wrapper for later use103 this.$tagWrapper = this.$elem.next(addDot(classNames.tagWrapper));104 this.baseHeight = this.$tagWrapper.height();105 // Get the input106 this.$inputTagField = this.$tagWrapper.find(addDot(classNames.selectTextarea));107 // Hide the popover when blurring the inputTagField108 this.$inputTagField.on(constants.blur, function() {109 $this.$popover.hide();110 });111 // Get the tags in the wrapper112 this.$tags = this.$tagWrapper.find(addDot(classNames.selectTags));113 // Show Popover on click of tags114 this.$tags115 .on(constants.click, this.initializePopover.bind(this));116 // Also Attach to placeHolder Text117 this.$tags.next(addDot(classNames.placeholderText))118 .on(constants.click, this.initializePopover.bind(this));119 // Attach Event Listener to ul list120 this.$tags.on(constants.click, addDot(classNames.popoverClose), function() {121 $this.inputToPopover($(this));122 });123 // Attach List Event Handlers to Li124 this.$popover.find(addDot(classNames.selectList)).on(constants.mousedown, function(e) {125 e.preventDefault();126 }).on(constants.click, constants.li, function() {127 $this.popoverToInput($(this));128 });129 // Finally Hide the Element130 this.$elem.hide();131 // Required for placeholdertext and pre-selected values132 this.checkNumberOfTags();133 // If pre-selected are higher than normal134 this.changeSize();135 // Trigger init event136 this.$elem.trigger('popselect:init');137 if (this.settings.autofocus) {138 this.initializePopover();139 }140 },141 inputToPopover: function($elem) {142 var $li = $elem.parent();143 this.log(logs.closeClicked, $li);144 var val = $li.attr(constants.attrVal);145 var text = $li.attr(constants.attrText);146 // Remove them from input and add it to popover147 this.appendToPopup(val, text);148 $li.remove();149 // Standard Reset Calls150 this.setPlaceholder();151 this.focus();152 // Whether to increase/decrease width153 this.changeSize();154 // Whether to enable / disable popover and Placeholder Text155 this.checkNumberOfTags();156 // Trigger remove event, passing value and text of removed tag157 this.$elem.trigger('popselect:remove', [val, text]);158 },159 enablePopover: function() {160 this.$popover.find(addDot(classNames.selectList) + ' li')161 .removeClass(classNames.popoverDisabled);162 },163 disablePopover: function() {164 this.$popover.find(addDot(classNames.selectList) + ' li')165 .addClass(classNames.popoverDisabled);166 },167 checkNumberOfTags: function() {168 var currentNo = this.$tags.find(addDot(classNames.tag)).length;169 if (currentNo === 0) {170 this.enablePlaceHolderText();171 } else {172 this.disablePlaceHolderText();173 }174 if (this.settings.maxAllowed !== 0) {175 if (this.settings.maxAllowed > currentNo) {176 this.enablePopover();177 } else {178 this.disablePopover();179 }180 }181 this.syncWithSelect();182 },183 popoverToInput: function($elem) {184 var val = $elem.attr(constants.attrVal);185 var text = $elem.text();186 var li = createTagStr(val, text);187 // Remove them from popover and it to input188 this.$tags.append(li);189 $elem.remove();190 // Standard Reset Calls191 this.setPlaceholder();192 this.focus();193 this.popoverShow();194 this.changePosition();195 // Whether to increase/decrease width196 this.changeSize();197 // Enable / Disable Popover198 this.checkNumberOfTags();199 // Trigger add event, passing value and text of added tag200 this.$elem.trigger('popselect:add', [val, text]);201 },202 popoverShow: function() {203 // Change Position as well show popover204 if (this.$popover.find(addDot(classNames.selectList) + ' li').length) {205 this.$popover.show();206 } else {207 this.$popover.hide();208 }209 },210 initializePopover: function() {211 this.popoverShow();212 this.changePosition();213 this.setPlaceholder();214 this.focus();215 },216 enablePlaceHolderText: function() {217 this.$tags.next(addDot(classNames.placeholderText)).show();218 },219 disablePlaceHolderText: function() {220 this.$tags.next(addDot(classNames.placeholderText)).hide();221 },222 focus: function() {223 var $this = this;224 this.$tags.find(addDot(classNames.placeholderInput)).focus();225 this.$tags.find(addDot(classNames.placeholderInput)).on(constants.blur, function() {226 $this.$popover.hide();227 });228 },229 setPlaceholder: function() {230 if (this.$tags.children(addDot(classNames.placeholder)).length) {231 this.$tags.children(addDot(classNames.placeholder)).remove();232 }233 this.$tags.append(createPlaceholderInput());234 this.disableInput();235 },236 disableInput: function() {237 var $this = this;238 this.$tags.find(addDot(classNames.placeholderInput)).keyup(function(e) {239 // Empty the input always240 $(this).val('');241 // For delete key, backspace and Ctrl + x Key242 if (e.which === 8 || e.which === 46 || e.ctrlKey && e.which === 88) {243 $this.removeLastElem();244 }245 });246 },247 changeSize: function() {248 if (this.settings.autoIncrease) {249 var tagWidth = 0;250 var textWidth = this.settings.width || this.elemPos.width;251 this.$tags.find(addDot(classNames.tag)).each(function(i, elem) {252 tagWidth += $(elem).outerWidth() + 20;253 });254 var mHeight = Math.floor(tagWidth / textWidth);255 this.$tags.height((mHeight + 1) * this.baseHeight);256 }257 },258 removeLastElem: function() {259 // Delete the last selected li if present260 var tags = this.$tags.find(addDot(classNames.tag));261 if (tags.length) {262 var $li = $(tags[tags.length - 1]);263 var val = $li.attr(constants.attrVal);264 var text = $li.attr(constants.attrText);265 // Remove them from input and add it to popover266 this.appendToPopup(val, text);267 $li.remove();268 // Standard Reset Calls269 this.changePosition();270 this.setPlaceholder();271 this.focus();272 // Whether to increase/decrease width273 this.changeSize();274 // Enable / Disable Popover275 this.checkNumberOfTags();276 } else {277 this.log(logs.noElem);278 }279 },280 setTitle: function(title) {281 if (this.settings.showTitle) {282 this.$popover.find(addDot(classNames.selectTitle)).text(title);283 }284 },285 getPosition: function($element) {286 $element = $element || this.$element;287 var el = $element[0];288 var isBody = el.tagName === constants.body;289 var elRect = el.getBoundingClientRect();290 if (elRect.width == null) {291 var w = elRect.right - elRect.left;292 var h = elRect.bottom - elRect.top;293 elRect = $.extend({}, elRect, {width: w, height: h});294 }295 var elOffset = isBody ? {top: 0, left: 0} : $element.offset();296 /* jshint ignore:start */297 var scroll = {scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }298 /* jshint ignore:end */299 var outerDims = isBody ? {width: $(window).width(), height: $(window).height()} : null;300 return $.extend({}, elRect, scroll, outerDims, elOffset);301 },302 syncWithSelect: function() {303 var arrValues = this.$tags.find(addDot(classNames.tag)).map(function(i, elem) {304 return $(elem).attr('data-value');305 }).toArray();306 this.$elem.children(constants.option).each(function(i, option) {307 if (arrValues.indexOf($(option).val()) < 0) {308 $(option).removeAttr('selected');309 } else {310 $(option).attr('selected', 'selected');311 }312 });313 },314 appendToPopup: function(val, text) {315 var li = createLiTag(val, text);316 this.$popover.find(addDot(classNames.selectList)).append(li);317 },318 generatePopover: function(options) {319 var list = '';320 for (var i = 0; i < options.length; i++) {321 if (!options[i].selected) {322 list += createLiTag(options[i].val, options[i].text);323 }324 }325 var popoverStr = createPopoverStr(list, this.settings);326 return popoverStr;327 },328 changePosition: function() {329 // It first needs to be placed330 var popPos = this.getPosition(this.$popover);331 var tagPos = this.getPosition(this.$tagWrapper);332 var leftOffset = ((this.settings.width || this.elemPos.width) / 2) - (popPos.width / 2);333 var topOffset;334 if (this.settings.position === 'top') {335 topOffset = -(popPos.height);336 } else {337 topOffset = tagPos.height;338 }339 this.log('popPos.width', popPos.width);340 this.log(logs.posChanged, topOffset, leftOffset);341 this.$popover.css({top: topOffset, left: leftOffset});342 },343 log: function() {344 if (this.settings.debug) {345 console.log.apply(console, arguments);346 }347 }348 });349 /**350 * A quick helper function for creating templates351 * @param {string} s Template String352 * @param {object} d Values to replace for353 * @return {string} Populated template string354 */355 function template(s, d) {356 for (var p in d) {357 s = s.replace(new RegExp('{' + p + '}', 'g'), d[p]);358 }359 return s;360 }361 /**362 * Just adds a dot for easy class selection363 * @param {string} str DOM className364 * @return {string} jQuery selector365 */366 function addDot(str) {367 return '.' + str;368 }369 function createEmptyDiv(x) {370 if (x) {371 return '<div class="{' + x + '}"></div>';372 } else {373 return '<div class="{wrapper}"></div>';374 }375 }376 function createTagsLi(options) {377 var str = '';378 for (var i = 0; i < options.length; i++) {379 if (options[i].selected) {380 str += createTagStr(options[i].val, options[i].text);381 }382 }383 return str;384 }385 function createTaggingStr(text, options) {386 return template('<div class="{tagWrapper}">' +387 '<textarea class="{selectTextarea}"></textarea>' +388 '<ul class="{selectTags}">' +389 '{tags}' +390 '</ul>' +391 '<div class="{placeholderText}">' +392 '{text}' +393 '</div>' +394 '</div>', {395 tags: createTagsLi(options),396 text: text,397 placeholderText: classNames.placeholderText,398 tagWrapper: classNames.tagWrapper,399 selectTextarea: classNames.selectTextarea,400 selectTags: classNames.selectTags401 });402 }403 function createTagStr(val, text) {404 return template('<li class="{tag}" data-value="{val}" data-text="{text}">' +405 '<span class="{popoverClose}">&times;</span>{text}' +406 '</li>', {407 text: text,408 val: val,409 tag: classNames.tag,410 popoverClose: classNames.popoverClose411 });412 }413 function createLiTag(val, text) {414 return template('<li data-value="{val}" data-text="{text}">{text}</li>', {415 val: val,416 text: text417 });418 }419 function createPlaceholderInput() {420 return template('<li class="{placeholder}">' +421 '<div>' +422 '<input type="text" readonly="true">' +423 '</div>' +424 '</li>', {425 placeholder: classNames.placeholder426 });427 }428 function createPopoverStr(list, settings) {429 return template('<div class="{popoverSelect} {top}">' +430 (settings.showTitle ? '<h3 class="{selectTitle}">{title}</h3>' : '') +431 '<div class="{popoverBody}">' +432 '<ul class="{selectList}">' +433 '{list}' +434 '</ul>' +435 '</div>' +436 '<div class="{arrow}"></div>' +437 '</div>', {438 title: settings.title,439 list: list,440 arrow: classNames.arrow,441 popoverSelect: classNames.popoverSelect,442 popoverBody: classNames.popoverBody,443 selectList: classNames.selectList,444 top: settings.position,445 selectTitle: classNames.selectTitle446 });447 }448 // A really lightweight plugin wrapper around the constructor,449 // preventing against multiple instantiations450 $.fn.popSelect = function(options) {451 if (typeof(options) === 'string') {452 if (options === 'value') {453 return this.next(addDot(classNames.tagWrapper))454 .find(addDot(classNames.tag)).map(function(i, $elem) {455 return $($elem).attr(constants.attrVal);456 });457 } else {458 console.warn(logs.unSupported);459 }460 } else {461 return this.each(function() {462 if (!$.data(this, 'plugin_' + pluginName)) {463 $.data(this, 'plugin_' + pluginName, new Plugin(this, options));464 }465 });466 }467 };468})(jQuery, window, document);

Full Screen

Full Screen

selectarea.js

Source:selectarea.js Github

copy

Full Screen

...12 url: API + "0",13 method: "GET"14 }).then(function(e) {15 var t = e.data.result[0];16 return selectArea.addDot(e.data.result), a.setData({17 proviceData: e.data.result,18 "selectedProvince.index": 0,19 "selectedProvince.code": t.code,20 "selectedProvince.fullName": t.fullName21 }), (0, _util.Promise)(wx.request, {22 url: API + t.code,23 method: "GET"24 });25 }).then(function(e) {26 var t = e.data.result[0];27 return selectArea.addDot(e.data.result), a.setData({28 cityData: e.data.result,29 "selectedCity.index": 0,30 "selectedCity.code": t.code,31 "selectedCity.fullName": t.fullName32 }), (0, _util.Promise)(wx.request, {33 url: API + t.code,34 method: "GET"35 });36 }).then(function(e) {37 var t = e.data.result[0];38 selectArea.addDot(e.data.result), a.setData({39 districtData: e.data.result,40 "selectedDistrict.index": 0,41 "selectedDistrict.code": t.code,42 "selectedDistrict.fullName": t.fullName43 });44 }).catch(function(e) {45 console.log(e);46 });47 },48 tapProvince: function(t, a) {49 var l = t.currentTarget.dataset;50 (0, _util.Promise)(wx.request, {51 url: API + l.code,52 method: "GET"53 }).then(function(e) {54 return selectArea.addDot(e.data.result), a.setData({55 cityData: e.data.result,56 "selectedProvince.code": l.code,57 "selectedProvince.fullName": l.fullName,58 "selectedCity.code": e.data.result[0].code,59 "selectedCity.fullName": e.data.result[0].fullName60 }), (0, _util.Promise)(wx.request, {61 url: API + e.data.result[0].code,62 method: "GET"63 });64 }).then(function(e) {65 selectArea.addDot(e.data.result), a.setData({66 districtData: e.data.result,67 "selectedProvince.index": t.currentTarget.dataset.index,68 "selectedCity.index": 0,69 "selectedDistrict.index": 0,70 "selectedDistrict.code": e.data.result[0].code,71 "selectedDistrict.fullName": e.data.result[0].fullName72 });73 }).catch(function(e) {74 console.log(e);75 });76 },77 tapCity: function(t, a) {78 var l = t.currentTarget.dataset;79 (0, _util.Promise)(wx.request, {80 url: API + l.code,81 method: "GET"82 }).then(function(e) {83 selectArea.addDot(e.data.result), a.setData({84 districtData: e.data.result,85 "selectedCity.index": t.currentTarget.dataset.index,86 "selectedCity.code": l.code,87 "selectedCity.fullName": l.fullName,88 "selectedDistrict.index": 0,89 "selectedDistrict.code": e.data.result[0].code,90 "selectedDistrict.fullName": e.data.result[0].fullName91 });92 }).catch(function(e) {93 console.log(e);94 });95 },96 tapDistrict: function(e, t) {97 var a = e.currentTarget.dataset;...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.addDot()2cy.removeDot()3cy.addDot()4cy.removeDot()5Cypress.Commands.add('addDot', () => {6 cy.get('input').type('{.}')7})8Cypress.Commands.add('removeDot', () => {9 cy.get('input').type('{backspace}')10})11Cypress.Commands.add('addDot', () => {12 cy.get('input').type('{.}')13})14Cypress.Commands.add('removeDot', () => {15 cy.get('input').type('{backspace}')16})17declare namespace Cypress {18 interface Chainable {19 * @example cy.addDot()20 addDot(): Chainable<Element>21 * @example cy.removeDot()22 removeDot(): Chainable<Element>23 }24}25declare namespace Cypress {26 interface Chainable {27 * @example cy.addDot()28 addDot(): Chainable<Element>29 * @example cy.removeDot()30 removeDot(): Chainable<Element>31 }32}33declare namespace Cypress {34 interface Chainable {35 * @example cy.addDot()36 addDot(): Chainable<Element>37 * @example cy.removeDot()38 removeDot(): Chainable<Element>39 }40}41declare namespace Cypress {42 interface Chainable {43 * @example cy.addDot()44 addDot(): Chainable<Element>45 * @example cy.removeDot()46 removeDot(): Chainable<Element>47 }48}49declare namespace Cypress {

Full Screen

Using AI Code Generation

copy

Full Screen

1addDot(10, 10);2Cypress.Commands.add('addDot', (x, y) => {3 cy.get('canvas')4 .click(x, y)5 .trigger('mousemove', { x, y })6 .trigger('mousedown', { button: 0 })7 .trigger('mouseup', { force: true });8});

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.addDot(1, 2);2Cypress.Commands.add('addDot', (a, b) => {3 return a + b;4});5Cypress.Commands.add('addDot', (a, b) => {6 return a + b;7});

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.get('.some-selector').addDot();2Cypress.Commands.add('addDot', { prevSubject: 'element' }, $el => {3 $el.val($el.val() + '.');4});5Cypress.Commands.add('addDot', { prevSubject: 'optional' }, $el => {6 $el.val($el.val() + '.');7});8cy.addDot('.some-selector');9I am trying to use the cy.server() and cy.route() commands to mock some api calls. I have a test that is working but I want to add a second test that will use the same mock. For some reason, the second test is not using the mock. Here is the code:10describe('My First Test', function() {11 it('Does not do much!', function() {12 cy.server();13 cy.route({14 });15 cy.get('div').contains('Contact1');16 });17 it('Does not do much!', function() {18 cy.get('div').contains('Contact1');19 });20});21I am trying to use the cy.server() and cy.route() commands to mock some api calls. I have a test that is working but I want to add a second test that will use the same mock. For some reason, the second test is not using the mock. Here is the code:

Full Screen

Using AI Code Generation

copy

Full Screen

1Cypress.addDot = function (x, y) {2 cy.get('svg').click(x, y)3}4describe('Cypress.addDot', () => {5 it('adds a dot', () => {6 Cypress.addDot(100, 200)7 cy.addDot(200, 100)8 })9})10Cypress.addDot = function (x, y) {11 cy.get('svg').click(x, y)12}13cy.addDot = function (x, y) {14 Cypress.addDot(x, y)15}16Cypress.addDot = function (x, y) {17 cy.get('svg').click(x, y)18}19Cypress.Commands.add('addDot', (x, y) => {20 cy.get('svg').click(x, y)21})22cy.addDot(100, 200)23Cypress.Commands.add('addDot', (x, y) => {24 cy.get('svg').click(x, y)25})26cy.addDot(100, 200)27Cypress.Commands.add('addDot', (x, y) => {28 cy.get('svg').click(x, y)29})30cy.addDot(100, 200)31Cypress.Commands.add('addDot', (x, y) => {32 cy.get('svg').click(x, y)33})34cy.addDot(100, 200)35Cypress.Commands.add('addDot', (x, y) => {36 cy.get('svg').click(x, y)37})38cy.addDot(100, 200)39Cypress.Commands.add('addDot', (x, y) => {40 cy.get('svg').click(x, y)41})42cy.addDot(100,

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.get('input').type('text').addDot()2cy.get('input').type('text').addDot()3Cypress.Commands.add('addDot', () => {4 cy.get('input').type('.')5})6Cypress.Commands.add('addDot', () => {7 cy.get('input').type('.')8})9cy.get('input').type('text').addDot()10cy.get('input').type('text').addDot()11Cypress.Commands.add('addDot', () => {12 cy.get('input').type('.')13})14Cypress.Commands.add('addDot', () => {15 cy.get('input').type('.')16})17cy.get('input').type('text').addDot()18cy.get('input').type('text').addDot()19Cypress.Commands.add('addDot', () => {20 cy.get('input').type('.')21})22Cypress.Commands.add('addDot', () => {23 cy.get('input').type('.')24})25cy.get('input').type('text').addDot()26cy.get('input').type('text').addDot()27Cypress.Commands.add('addDot', () => {28 cy.get('input').type('.')29})30Cypress.Commands.add('addDot', () => {31 cy.get('input').type('.')32})33cy.get('input').type('text').addDot()34cy.get('input').type('text').addDot()35Cypress.Commands.add('addDot', () => {36 cy.get('input').type('.')37})38Cypress.Commands.add('addDot', () => {39 cy.get('input').type('.')40})

Full Screen

Using AI Code Generation

copy

Full Screen

1Cypress.Commands.add('addDot', { prevSubject: 'optional' }, (subject, position) => {2 if (subject) {3 cy.wrap(subject).type('{shift}.')4 } else {5 if (position === 'after') {6 cy.get('body').type('{end}{shift}.')7 } else if (position === 'before') {8 cy.get('body').type('{shift}.')9 } else {10 cy.get('body').type('{shift}.')11 }12 }13})14describe('Add dot', () => {15 it('Add dot in the middle of the text', () => {16 cy.get('h1').click()17 cy.get('h1').addDot()18 cy.get('h1').should('have.text', 'Welcome to Cypress.io..')19 })20 it('Add dot after the text', () => {21 cy.get('h1').click()22 cy.get('h1').addDot('after')23 cy.get('h1').should('have.text', 'Welcome to Cypress.io.')24 })25 it('Add dot before the text', () => {26 cy.get('h1').click()27 cy.get('h1').addDot('before')28 cy.get('h1').should('have.text', '.Welcome to Cypress.io')29 })30})31Cypress.Commands.add('addDot', { prevSubject: 'optional' }, (subject, position) => {32 if (subject) {33 cy.wrap(subject).type('{shift}.')34 } else {35 if (position === 'after') {36 cy.get('body').type('{end}{shift}.')37 } else if (position === 'before') {38 cy.get('body').type('{shift}.')39 } else {40 cy.get('body').type('{shift}.')41 }42 }43})

Full Screen

Using AI Code Generation

copy

Full Screen

1cy.get('.selector').addDot({text: 'Hello World'});2cy.get('.selector').addDot({text: 'Hello World'});3cy.get('.selector').then(($el) => {4 cy.wrap($el).addDot({text: 'Hello World'});5});6Cypress.Commands.add('addDot', { prevSubject: 'element' }, (subject, options) => {7 const { text } = options;8 return cy.wrap(subject).invoke('text', `${text}...`);9});10cy.get('.selector').addDot({text: '

Full Screen

Cypress Tutorial

Cypress is a renowned Javascript-based open-source, easy-to-use end-to-end testing framework primarily used for testing web applications. Cypress is a relatively new player in the automation testing space and has been gaining much traction lately, as evidenced by the number of Forks (2.7K) and Stars (42.1K) for the project. LambdaTest’s Cypress Tutorial covers step-by-step guides that will help you learn from the basics till you run automation tests on LambdaTest.

Chapters:

  1. What is Cypress? -
  2. Why Cypress? - Learn why Cypress might be a good choice for testing your web applications.
  3. Features of Cypress Testing - Learn about features that make Cypress a powerful and flexible tool for testing web applications.
  4. Cypress Drawbacks - Although Cypress has many strengths, it has a few limitations that you should be aware of.
  5. Cypress Architecture - Learn more about Cypress architecture and how it is designed to be run directly in the browser, i.e., it does not have any additional servers.
  6. Browsers Supported by Cypress - Cypress is built on top of the Electron browser, supporting all modern web browsers. Learn browsers that support Cypress.
  7. Selenium vs Cypress: A Detailed Comparison - Compare and explore some key differences in terms of their design and features.
  8. Cypress Learning: Best Practices - Take a deep dive into some of the best practices you should use to avoid anti-patterns in your automation tests.
  9. How To Run Cypress Tests on LambdaTest? - Set up a LambdaTest account, and now you are all set to learn how to run Cypress tests.

Certification

You can elevate your expertise with end-to-end testing using the Cypress automation framework and stay one step ahead in your career by earning a Cypress certification. Check out our Cypress 101 Certification.

YouTube

Watch this 3 hours of complete tutorial to learn the basics of Cypress and various Cypress commands with the Cypress testing at LambdaTest.

Run Cypress automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful