2 * Magic3管理機能用JavaScriptライブラリ
\r
6 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
\r
8 * @package Magic3 Framework
\r
9 * @author 平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
\r
10 * @copyright Copyright 2006-2013 Magic3 Project.
\r
11 * @license http://www.gnu.org/copyleft/gpl.html GPL License
\r
12 * @version SVN: $Id: m3admin_widget1.5.3.js 5718 2013-02-21 01:09:52Z fishbone $
\r
13 * @link http://www.magic3.org
\r
17 var m3InsertIndex = -1;
\r
20 var m3UpdateByConfig = function(serial){
\r
21 var widgets = $('.m3_widget_sortable');
\r
22 for (var i = 0; i < widgets.length; i++){
\r
23 var widget = $(widgets[i]);
\r
24 var attrs = m3_splitAttr(widget.attr('m3'));
\r
26 if (attrs['serial'] == serial){
\r
27 m3TaskWidget('get', widget);
\r
32 window.m3.m3UpdateByConfig = m3UpdateByConfig;
\r
34 var widgetClose = function(){
\r
35 var widget = $(this).parents('.m3_widget_sortable');
\r
36 widget.fadeOut('slow', function(){
\r
37 m3TaskWidget('delete', $(this));
\r
41 var m3TaskWidget = function(task, obj, widgetType, index, pos){
\r
42 var parent = obj.parents('.m3_widgetpos_box');
\r
43 var attrs = m3_splitAttr(obj.attr('m3'));
\r
44 var pattrs = m3_splitAttr(parent.attr('m3'));
\r
48 var insertIndex = -1;
\r
50 var children = parent.children('.m3_widget_sortable');
\r
51 for (var i = 0; i < children.length; i++){
\r
52 var child = $(children[i]);
\r
53 var wattr = m3_splitAttr(child.attr('m3'));
\r
55 if (task == 'move'){
\r
56 if (wattr['serial'] == attrs['serial']){
\r
58 if (!pos) widgets += wattr['serial'] + ',';
\r
60 widgets += wattr['serial'] + ',';
\r
63 if (wattr['serial']) widgets += wattr['serial'] + ',';
\r
66 widgets = widgets.substr(0, widgets.length -1);
\r
70 for (var i = 0; i < M3_POSITIONS.length; i++){
\r
71 var posObj = $(M3_POSITIONS[i]);
\r
72 var battrs = m3_splitAttr(posObj.attr('m3'));
\r
73 if (task == 'move'){
\r
74 if (battrs['pos'] == pattrs['pos'] || battrs['pos'] == pos) updatepos += posObj.attr('id') + ',';
\r
76 if (battrs['pos'] == pattrs['pos']) updatepos += posObj.attr('id') + ',';
\r
79 updatepos = updatepos.substr(0, updatepos.length -1);
\r
83 param = '&task=wget' + '&serial=' + attrs['serial'] + '&shared=' + attrs['shared'] +
\r
84 '&pos=' + pattrs['pos'] + '&widgets=' + widgets + '&updatepos=' + updatepos + '&rev=' + M3_REVISION;
\r
85 } else if (task == 'toggle'){
\r
86 param = '&task=wtoggle' + '&serial=' + attrs['serial'] + '&shared=' + attrs['shared'] +
\r
87 '&pos=' + pattrs['pos'] + '&widgets=' + widgets + '&updatepos=' + updatepos + '&rev=' + M3_REVISION;
\r
88 } else if (task == 'delete'){
\r
89 param = '&task=wdelete' + '&serial=' + attrs['serial'] + '&shared=' + attrs['shared'] +
\r
90 '&pos=' + pattrs['pos'] + '&widgets=' + widgets + '&updatepos=' + updatepos + '&rev=' + M3_REVISION;
\r
91 } else if (task == 'add'){
\r
92 var idHead = 'm3widgettype_';
\r
93 var widgetId = widgetType.substr(idHead.length);
\r
94 param = '&task=wadd' + '&widget=' + widgetId + '&index=' + index +
\r
95 '&pos=' + pattrs['pos'] + '&widgets=' + widgets + '&updatepos=' + updatepos + '&rev=' + M3_REVISION;
\r
96 } else if (task == 'move'){
\r
97 var position = pattrs['pos'];
\r
98 if (pos) position += ',' + pos;
\r
99 param = '&task=wmove' + '&serial=' + attrs['serial'] + '&index=' + insertIndex +
\r
100 '&pos=' + position + '&widgets=' + widgets + '&updatepos=' + updatepos + '&rev=' + M3_REVISION;
\r
103 $.ajax({ url: createUrl() + param,
\r
105 success: function(data, textStatus){
\r
106 var children = jQuery(data).children('.m3_widgetpos_box');
\r
107 for (var i = 0; i < children.length; i++){
\r
108 var child = $(children[i]);
\r
111 var attrs = m3_splitAttr(child.attr('m3'));
\r
112 M3_REVISION = attrs['rev'];
\r
114 $('#' + child.attr('id')).replaceWith(child);
\r
119 if (window.parent.m3UpdateByChildWindow) window.parent.m3UpdateByChildWindow();
\r
121 error: function(request, textStatus, errorThrown){
\r
122 $("#m3_message").html('<font color="red">通信エラー</font>');
\r
126 var setupSortable = function(){
\r
127 var els = M3_POSITIONS;
\r
128 var $els = $(els.toString());
\r
129 var urlParams = m3_getUrlParam(document.URL);
\r
130 var page = urlParams['_page'];
\r
131 var sub = urlParams['_sub'];
\r
134 $('dt.m3_widget_with_check_box', $els).append('<span class="options"><a class="m3_widget_close">close</a></span>');
\r
135 $('a.m3_widget_close').bind('click', widgetClose);
\r
137 //$els.sortable('destroy'); // 一旦削除
\r
142 /* cursorAt: { top: 0, left: 0 }, // selection bug? */
\r
146 placeholder: 'm3_spacer',
\r
148 start: function(e,ui) {
\r
149 ui.helper.css("width", ui.item.width());
\r
151 $('#m3_widgetlist_inner').data('scroll', $('#m3_widgetlist_inner').scrollTop());
\r
152 $('#m3_widget_window').hide(1000);
\r
154 stop: function(e,ui) {
\r
155 $('#m3_widget_window').show(500, function(){
\r
156 $('#m3_widgetlist_inner').scrollTop($('#m3_widgetlist_inner').data('scroll'));
\r
159 // change: changeSortable,
\r
160 update: updateSortable
\r
164 $('.m3_widget_sortable').contextMenu('m3_widgetmenu', {
\r
166 // border : "2px solid green",
\r
167 backgroundColor: '#FFFFFF',
\r
170 font: '12px/1.5 Arial, sans-serif'
\r
176 'm3_wconfig': function(t){
\r
177 var attrs = m3_splitAttr($('#' + t.id).attr('m3'));
\r
178 if (attrs['useconfig'] == '0'){
\r
179 alert("このウィジェットには設定画面がありません");
\r
182 m3ShowConfigWindow(attrs['widgetid'], attrs['configid'], attrs['serial']);
\r
184 'm3_wadjust': function(t){
\r
185 var attrs = m3_splitAttr($('#' + t.id).attr('m3'));
\r
186 m3ShowAdjustWindow(attrs['configid'], attrs['serial'], page, sub);
\r
188 'm3_wshared': function(t){
\r
189 m3TaskWidget('toggle', $('#' + t.id));
\r
191 'm3_wdelete': function(t){
\r
192 var widget = $('#' + t.id);
\r
193 widget.fadeOut('slow', function(){
\r
194 m3TaskWidget('delete', $(this));
\r
199 onContextMenu: function(e) {
\r
200 var attrs = m3_splitAttr($(e.target).parents('dl').attr('m3'));
\r
201 if (attrs['shared'] == '0'){ // 共通ウィジェットでない
\r
202 $('#m3_wshared span').text('ページ共通属性を設定');
\r
204 $('#m3_wshared span').text('ページ共通属性を解除');
\r
208 onShowMenu: function(e, menu) {
\r
210 var attrs = m3_splitAttr($(e.target).parents('dl').attr('m3'));
\r
211 if (attrs['useconfig'] == '0'){
\r
212 $('#m3_wconfig', menu).remove();
\r
219 /* var changeSortable = function(e, ui){
\r
221 var w = ui.item.width();
\r
222 ui.placeholder.width(w);
\r
223 ui.helper.css("width", w);
\r
227 var updateSortable = function(e, ui){
\r
228 var obj = $('#' + ui.item[0].id);
\r
229 var recvPosObj = obj.parents('.m3_widgetpos_box'); // 移動先ポジション
\r
231 if (recvPosObj.attr('id') == $(this).attr('id')){
\r
233 var senderObj = $('#' + ui.sender[0].id);
\r
234 var attrs = m3_splitAttr(senderObj.attr('m3'));
\r
235 pos = attrs['pos'];
\r
237 m3TaskWidget('move', obj, '', -1, pos);
\r
241 /* var dragChange = function(e, ui){
\r
243 var w = ui.item.width();
\r
244 ui.placeholder.width(w);
\r
245 ui.helper.css("width",ui.item.children().width());
\r
247 $('dl.m3_widget_sortable').css("margin-top", '100px');
\r
249 var updateWidgetList = function(){
\r
250 $('dl.m3_widgetlist_item').draggable({
\r
253 /* cursorAt: { top: 0, left: 0 }, // selection bug? */
\r
256 drag: function(e, ui){
\r
257 var objects = $('.m3_widgetpos_box');
\r
258 if (objects.length > 0){
\r
259 for (var i = 0; i < objects.length; i++){
\r
260 var widget = $(objects[i]);
\r
261 if (mouseInDrag(widget, e)) return;
\r
265 start: function(e, ui){
\r
266 $('#m3_widgetlist_inner').data('scroll', $('#m3_widgetlist_inner').scrollTop());
\r
267 $('#m3_widget_window').hide(1000);
\r
269 stop: function(e, ui){
\r
270 //m3TaskWidget('add', $('.m3_spacer'), e.target.id, m3InsertIndex);// NG in IE
\r
271 m3TaskWidget('add', $('.m3_spacer'), this.id, m3InsertIndex);
\r
272 //$('.m3_spacer').remove();
\r
274 $('#m3_widget_window').show(500, function(){
\r
275 $('#m3_widgetlist_inner').scrollTop($('#m3_widgetlist_inner').data('scroll'));
\r
280 // ウィジェットリストからのドラッグ処理
\r
281 var mouseInDrag = function(obj, e){
\r
282 var width = obj.width();
\r
283 var height = obj.height();
\r
284 var left = obj.offset().left;
\r
285 var top = obj.offset().top;
\r
287 if (left <= e.pageX && e.pageX <= left + width &&
\r
288 top <= e.pageY && e.pageY <= top + height){
\r
291 var children = obj.children('.m3_widget_sortable');
\r
293 for (var i = 0; i < children.length; i++){
\r
294 var child = $(children[i]);
\r
295 if (child.hasClass('m3_spacer')){
\r
301 var insertPos = -1;
\r
304 for (i = 0; i < children.length; i++){
\r
305 var child = $(children[i]);
\r
306 var childLeft = child.offset().left;
\r
307 var childTop = child.offset().top;
\r
308 var childWidth = child.width();
\r
309 var childHeight = child.height();
\r
312 if (spacePos != -1){
\r
313 if (i == spacePos - 1){
\r
315 } else if (i == spacePos + 1){
\r
317 } else if (i == spacePos){
\r
318 if (childLeft <= e.pageX && e.pageX <= childLeft + childWidth &&
\r
319 childTop <= e.pageY && e.pageY <= childTop + childHeight){
\r
324 if (e.pageY < child.offset().top + childHeight / 2 + play){
\r
328 var spacing = true;
\r
329 if (spacePos == -1){
\r
332 if (insertPos < spacePos){
\r
335 if (insertPos == spacePos || insertPos == spacePos +1){
\r
343 $('.m3_spacer').remove();
\r
345 children = obj.children('.m3_widget_sortable');
\r
347 var spacerHtml = '<div class="m3_spacer"></div>';
\r
348 if (insertPos < children.length){
\r
349 $(children[insertPos]).before(spacerHtml);
\r
351 obj.append(spacerHtml);
\r
353 m3InsertIndex = insertPos;
\r
360 var createUrl = function(){
\r
362 var urlParams = m3_getUrlParam(document.URL);
\r
363 var page = urlParams['_page'];
\r
364 var sub = urlParams['_sub'];
\r
365 url = M3_DEFAULT_ADMIN_URL + '?cmd=getwidgetinfo' + '&_page=' + page + '&_sub=' + sub;
\r
368 $(document).ready(function(){
\r
369 var widgetWindow = '<div id="m3_widget_window">';
\r
370 widgetWindow += '<table border="1px" width="250" bgcolor="#424242" cellspacing="0">';
\r
371 widgetWindow += '<tr>';
\r
372 widgetWindow += '<td width="100%">';
\r
373 widgetWindow += '<table border="0" width="100%" cellspacing="0" cellpadding="0">';
\r
374 widgetWindow += '<tr>';
\r
375 widgetWindow += '<td width="100%">';
\r
376 widgetWindow += '<font color="#FFFFFF">ウィジェット</font>';
\r
377 widgetWindow += '</td>';
\r
378 widgetWindow += '</tr>';
\r
379 widgetWindow += '<tr>';
\r
380 widgetWindow += '<td width="100%" bgcolor="#FFFFFF" style="padding:4px">';
\r
381 widgetWindow += '<div id="m3_widget_window_inner">';
\r
382 widgetWindow += '<div id="m3_message"></div>';
\r
383 widgetWindow += '<div id="m3_widgetlist" class="m3_widget_tab">';
\r
384 //widgetWindow += '<h2>ウィジェット</h2>';
\r
385 widgetWindow += '<div id="m3_widgetlist_inner" class="m3_widgetlist_box">';
\r
386 widgetWindow += '</div>'; // widgetlist_box end
\r
387 widgetWindow += '</div>'; // widgetlist end
\r
388 widgetWindow += '</div>'; // m3_widget_window_inner end
\r
389 widgetWindow += '</td>';
\r
390 widgetWindow += '</tr>';
\r
391 widgetWindow += '</table>';
\r
392 widgetWindow += '</td>';
\r
393 widgetWindow += '</tr>';
\r
394 widgetWindow += '</table>';
\r
395 widgetWindow += '</div>';
\r
397 widgetWindow += '<div class="m3_contextmenu" id="m3_widgetmenu" style="visibility:hidden;">';
\r
398 widgetWindow += '<ul>';
\r
399 widgetWindow += '<li id="m3_wadjust"><img src="' + M3_ROOT_URL + '/images/system/adjust_widget.png" /> <span>タイトル・位置調整</span></li>';
\r
400 widgetWindow += '<li id="m3_wconfig"><img src="' + M3_ROOT_URL + '/images/system/config.png" /> <span>ウィジェットの設定</span></li>';
\r
401 widgetWindow += '<li id="m3_wshared"><img src="' + M3_ROOT_URL + '/images/system/shared.png" /> <span>ページ共通属性</span></li>';
\r
402 widgetWindow += '<li id="m3_wdelete"><img src="' + M3_ROOT_URL + '/images/system/delete.png" /> <span>このウィジェットを削除</span></li>';
\r
403 widgetWindow += '</ul>';
\r
404 widgetWindow += '</div>';
\r
405 $("body").append(widgetWindow);
\r
407 $('#m3_widget_window').draggable({
\r
409 cancel: '#m3_widget_window_inner'
\r
414 $.ajax({ url: createUrl() + '&task=list',
\r
416 success: function(data, textStatus){
\r
417 $("#m3_widgetlist_inner").html(data);
\r
418 updateWidgetList();
\r
420 error: function(request, textStatus, errorThrown){
\r
421 $("#m3_message").html('<font color="red">通信エラー</font>');
\r
424 $('div.m3_widgetpos_box').droppable({
\r
425 accept: 'dl.m3_widgetlist_item',
\r
426 out: function(e, ui){
\r
427 $('.m3_spacer').remove();
\r
431 // テキスト選択停止(Safari,Chromeのウィジェットドラッグ中のテキスト選択の問題を回避)
\r
432 document.onselectstart = function(){ return false; }
\r