diff options
33 files changed, 1786 insertions, 4 deletions
diff --git a/expo/admin.py b/expo/admin.py index 9f804c2..247b4b1 100644 --- a/expo/admin.py +++ b/expo/admin.py @@ -101,22 +101,22 @@ def export_as_json(modeladmin, request, queryset): serializers.serialize("json", queryset, stream=response)
return response
-admin.site.add_action(export_as_json)
def export_as_xml(modeladmin, request, queryset):
response = HttpResponse(mimetype="text/xml")
response['Content-Disposition'] = 'attachment; filename=troggle_output.xml'
return response
-admin.site.add_action(export_as_xml)
-
def export_as_python(modeladmin, request, queryset):
response = HttpResponse(mimetype="text/python")
response['Content-Disposition'] = 'attachment; filename=troggle_output.py'
serializers.serialize("json", queryset, stream=response)
return response
-admin.site.add_action(export_as_python)
+#These require django newer than 1.0 (SVN version) so we'll have to wait.
+#admin.site.add_action(export_as_xml)
+#admin.site.add_action(export_as_json)
+#admin.site.add_action(export_as_python)
try:
mptt.register(Subcave, order_insertion_by=['name'])
diff --git a/media/feincms/css/jquery.alerts.css b/media/feincms/css/jquery.alerts.css new file mode 100644 index 0000000..0b5e1e8 --- /dev/null +++ b/media/feincms/css/jquery.alerts.css @@ -0,0 +1,54 @@ +#popup_container {
+ font-family: Arial, sans-serif;
+ font-size: 12px;
+ min-width: 300px; /* Dialog will be no smaller than this */
+ max-width: 600px; /* Dialog will wrap after this width */
+ background: #FFF;
+ border: solid 1px #666;
+ color: #000;
+}
+
+#popup_title {
+ font-size: 14px;
+ font-weight: bold;
+ text-align: center;
+ line-height: 1.75em;
+ color: #666;
+ background: #eee url(images/title.gif) top repeat-x;
+ border: solid 1px #FFF;
+ border-bottom: solid 1px #666;
+ cursor: default;
+ padding: 0em;
+ margin: 0em;
+}
+
+#popup_content {
+ background: 16px 16px no-repeat url(../img/info.gif);
+ padding: 1em 1.75em;
+ margin: 0em;
+}
+
+#popup_content.alert {
+ background-image: url(../img/info.gif);
+}
+
+#popup_content.confirm {
+ background-image: url(../img/important.gif);
+}
+
+#popup_content.prompt {
+ background-image: url(../img/help.gif);
+}
+
+#popup_message {
+ padding-left: 48px;
+}
+
+#popup_panel {
+ text-align: center;
+ margin: 1em 0em 0em 1em;
+}
+
+#popup_prompt {
+ margin: .5em 0em;
+}
\ No newline at end of file diff --git a/media/feincms/css/jquery.treeTable.css b/media/feincms/css/jquery.treeTable.css new file mode 100644 index 0000000..5305653 --- /dev/null +++ b/media/feincms/css/jquery.treeTable.css @@ -0,0 +1,47 @@ +/* jQuery TreeTable Core 2.0 stylesheet + * + * This file contains styles that are used to display the tree table. Each tree + * table is assigned the +treeTable+ class. + * ========================================================================= */ + +/* jquery.treeTable.collapsible + * ------------------------------------------------------------------------- */ +.treeTable tr td .expander { + background-position: left center; + background-repeat: no-repeat; + cursor: pointer; + padding: 0; + zoom: 1; /* IE7 Hack */ +} + +.treeTable tr.collapsed td .expander { + background-image: url(../img/toggle-expand-dark.png); +} + +.treeTable tr.expanded td .expander { + background-image: url(../img/toggle-collapse-dark.png); +} + +/* jquery.treeTable.sortable + * ------------------------------------------------------------------------- */ +.treeTable tr.selected, .treeTable tr.accept { + /*background-color: #7799ff; + color: #fff;*/ +} + +.treeTable tr.append { + border-bottom: 2px solid #7799ff; +} + +.treeTable tr.collapsed.selected td .expander, .treeTable tr.collapsed.accept td .expander { + /*background-image: url(../img/toggle-expand-light.png);*/ +} + +.treeTable tr.expanded.selected td .expander, .treeTable tr.expanded.accept td .expander { + /*background-image: url(../img/toggle-collapse-light.png);*/ +} + +.treeTable .ui-draggable-dragging { + color: #000; + z-index: 1; +}
\ No newline at end of file diff --git a/media/feincms/css/layout.css b/media/feincms/css/layout.css new file mode 100644 index 0000000..d7be020 --- /dev/null +++ b/media/feincms/css/layout.css @@ -0,0 +1,242 @@ + +#overview { + background-color:none; + padding:5px 0px 0px 5px; + margin:10px 0px 0px 10px; +} + +#content { + background-color:#fff; + margin-bottom:0px; + width:745px; +} + +.navi_tab { + float:left; + padding: 3px 10px 3px 10px; + cursor:pointer; + border: 1px solid #aaa; + border-bottom:none; + min-width:100px; +} +.tab_active { + height:16px; + font-weight: bold; + background-image:url('../img/default-bg.gif'); + color: white; +} +.tab_inactive { + margin-top:4px; + height:12px; + font-weight: normal; + background-image:none; + color: black; +} +#main_wrapper {margin-left:15px;} +#main { + clear:both; + padding: 10px 10px 10px 10px; + border: 1px solid #aaa; +} +.panel { + display:none; + position:relative; + padding-bottom:50px; +} + + +lab { font-weight: bold; margin-right:5px;} +span { margin-right: 5px;} + +.order-machine { + margin-bottom:10px; +} + +.order-item { + margin: 5px 15px 10px 5px; + background: #eee; + position:relative; + width:700px; + min-height:24px; + border: 1px solid #678; +} +.order-item span { + font-weight:bold; + margin-left:5px; +} +.order-item .handle { + float: left; + margin-top:2px; + cursor: move; +} +.item-content { + padding: 0px 10px 0px 15px; + margin-right:5px; + clear:both; + margin-left:10px; +} +.item-header { + padding: 3px 10px 3px 15px; + margin-left:10px; + margin-top:1px; +} +.item-header span { + margin-right:10px; + float:left; + font-weight: strong; +} +.item-delete { + cursor:pointer; + float:right; + margin:3px 0px 0px 5px; +} +.active-item { + border: 1px solid #00a; + background-color:#def; +} +.button { + margin:5px; padding:5px; + font-weight: bold; + background-image:url('../img/nav-bg.gif'); + cursor:pointer; + border: 1px solid #678; + width:30px; +} +th { vertical-align: middle; } + +#test-log { padding: 5px; border: 1px solid #ccc; } + +#overview span { margin-right:15px; margin-left:5px;} + +.richtextcontent {display:none;} + +textarea { + width: 100%; + margin-top:5px; + margin-bottom:5px; +} + +.item-minimize { + width: 15px; + height:15px; + float: left; + cursor: pointer; + margin-left:-17px; +} + +.item-minimize-disabled { + width: 15px; + height:15px; + float: left; + margin-left:-17px; +} + +.machine-control { + height:50px; + padding: 5px 0px 5px 0px; + border: 1px solid #678; + background-color:#ddd; + width:728px; + position:absolute; + left:-11px; + bottom:-21px; +} + +.control-unit { + float:left; + padding-left:15px; + padding-right:10px; + border-right: 1px solid #678; +} + +.control-unit span { + font-weight:bold; + margin-left:5px; +} + +hr { + color: #f00; + background-color: #bbb; + height: 1px; + margin-top: 5px; + margin-bottom: 5px; +} + +.empty-machine-msg { + margin:10px 0px 5px 300px; + font-style: italic; + font-size:14px; + color:#999; +} + +td span select { + width:600px; +} + +.popup_bg { + width:100%; height:100%; + background-color:white; + opacity: 0.5; + filter:alpha(opacity=50); + position:absolute; + top:0px; left:0px; +} + +#sitetree { + margin-left: 20px; + margin-top: 20px; + padding: 0px; +} + +.title-col { + position:relative; + z-index:2; + background-color:none; +} +td div.wrap { + border: 0px solid #000; + margin: -5px; + padding: 4px; + position:relative; +} + +.insert-as-child { + position:absolute; + bottom:-3px; + left: 15px; + height:15px; + width:100%; + border: 0px solid #0f0; +} +.insert-as-sibling { + position:absolute; + top:0px; + left: 15px; + height:10px; + width:100%; + border: 0px solid #f00; +} + +.nohover { + background-color: #eef; +} + +.flash { + background-color: #afa; +} + +.hover-as-child { + background-color:#cdf; +} + +.hover-as-sibling { + border: 1px solid #aee; +} + +.move-node { + cursor: move; + margin-left:5px; +} +.del-page { + cursor: pointer; +} diff --git a/media/feincms/helper.js b/media/feincms/helper.js new file mode 100644 index 0000000..58ca3eb --- /dev/null +++ b/media/feincms/helper.js @@ -0,0 +1,88 @@ +function region_append(region, obj, modname) { + var wrp = []; + wrp.push('<div class="order-item"><div class="item-header">'); + if (obj.children(":visible").length > 0) + wrp.push('<div class="item-minimize"><img src="'+IMG_ARROW_DOWN_PATH+'" /></div>'); + else + wrp.push('<div class="item-minimize-disabled"><img src="'+IMG_CIRCLE_PATH+'" /></div>'); + wrp.push('<span>' + modname + '</span><img class="handle" src='+IMG_MOVE_PATH+' />'); + wrp.push('<img class="item-delete" src="'+IMG_DELETELINK_PATH+'" />'); + wrp.push('</div><div class="item-content"></div></div>'); + + $("#"+REGIONS[region]+"_body").children(".order-machine").append(wrp.join("")) + .children(".order-item:last").children(".item-content").append(obj); +} + +function create_new_from_form(form, modvar, last_id) { + var new_form = form.html().replace( + new RegExp(modvar+'-'+last_id, 'g'), + modvar+'-'+(last_id+1)); + new_form = '<div id="'+modvar+'_set_item_'+(last_id+1)+'">'+new_form+'</div>'; + $("#"+modvar+"_set").append(new_form); +} + +function get_item_field_value(item,field) { + // item: DOM object created by 'region_append' function + // field: "order-field" | "delete-field" | "region-field" + if (field=="delete-field") + return item.find("."+field).attr("checked"); + else + return item.find("."+field).val(); +} + +function set_item_field_value(item,field, value) { + // item: DOM object created by 'region_append' function + // field: "order-field" | "delete-field" | "region-field" + if (field=="delete-field") + item.find("."+field).attr("checked",value); + else if (field=="region-choice-field") { + var old_region_id = REGION_MAP.indexOf(item.find("."+field).val()); + item.find("."+field).val(REGION_MAP[value]); + + old_region_item = $("#"+REGIONS[old_region_id]+"_body"); + old_region_item.children(".empty-machine-msg").hide(); + if (old_region_item.children(".order-machine").children().length == 0) + old_region_item.children(".empty-machine-msg").show(); + + new_region_item = $("#"+REGIONS[value]+"_body"); + new_region_item.children(".empty-machine-msg").hide(); + } + else + item.find("."+field).val(value); +} + +function move_item (region_id, item) { + poorify_rich(item); + $("#"+REGIONS[region_id]+"_body").children(".order-machine").append(item); + set_item_field_value(item, "region-choice-field", region_id); + richify_poor(item); +} + +function poorify_rich(item){ + item.children(".item-content").hide(); + if (item.find("div[id^=richtext]").length > 0) { + var editor_id = item.find(".mceEditor").prev().attr("id"); + tinyMCE.execCommand('mceRemoveControl',false,editor_id); + } +} +function richify_poor(item){ + item.children(".item-content").show(); + if (item.find("div[id^=richtext]").length > 0) { + var editor_id = item.find('textarea[name*=richtext]:visible').attr("id"); + tinyMCE.execCommand('mceAddControl',false,editor_id); + } +} + +function zucht_und_ordnung(move_item) { + for (var i=0; i<REGIONS.length;i++) { + var container = $("#"+REGIONS[i]+"_body .order-machine"); + for (var j=0; j<container.children().length; j++) { + if (move_item) + container.find(".order-field[value="+j+"]").parents(".order-item").appendTo(container); + else + set_item_field_value(container.find(".order-item:eq("+j+")"),"order-field",j); + } + } +} + + diff --git a/media/feincms/img/arrow_down.gif b/media/feincms/img/arrow_down.gif Binary files differnew file mode 100644 index 0000000..64b5403 --- /dev/null +++ b/media/feincms/img/arrow_down.gif diff --git a/media/feincms/img/arrow_right.gif b/media/feincms/img/arrow_right.gif Binary files differnew file mode 100644 index 0000000..244e5c3 --- /dev/null +++ b/media/feincms/img/arrow_right.gif diff --git a/media/feincms/img/circle.gif b/media/feincms/img/circle.gif Binary files differnew file mode 100644 index 0000000..fa75af5 --- /dev/null +++ b/media/feincms/img/circle.gif diff --git a/media/feincms/img/cut.png b/media/feincms/img/cut.png Binary files differnew file mode 100644 index 0000000..f215d6f --- /dev/null +++ b/media/feincms/img/cut.png diff --git a/media/feincms/img/default-bg.gif b/media/feincms/img/default-bg.gif Binary files differnew file mode 100644 index 0000000..003aeca --- /dev/null +++ b/media/feincms/img/default-bg.gif diff --git a/media/feincms/img/door.png b/media/feincms/img/door.png Binary files differnew file mode 100644 index 0000000..369fc46 --- /dev/null +++ b/media/feincms/img/door.png diff --git a/media/feincms/img/help.gif b/media/feincms/img/help.gif Binary files differnew file mode 100644 index 0000000..3b51425 --- /dev/null +++ b/media/feincms/img/help.gif diff --git a/media/feincms/img/icon_deletelink.gif b/media/feincms/img/icon_deletelink.gif Binary files differnew file mode 100644 index 0000000..72523e3 --- /dev/null +++ b/media/feincms/img/icon_deletelink.gif diff --git a/media/feincms/img/icon_move.gif b/media/feincms/img/icon_move.gif Binary files differnew file mode 100644 index 0000000..004bb7c --- /dev/null +++ b/media/feincms/img/icon_move.gif diff --git a/media/feincms/img/important.gif b/media/feincms/img/important.gif Binary files differnew file mode 100644 index 0000000..41d4943 --- /dev/null +++ b/media/feincms/img/important.gif diff --git a/media/feincms/img/info.gif b/media/feincms/img/info.gif Binary files differnew file mode 100644 index 0000000..c81828d --- /dev/null +++ b/media/feincms/img/info.gif diff --git a/media/feincms/img/nav-bg.gif b/media/feincms/img/nav-bg.gif Binary files differnew file mode 100644 index 0000000..f8402b8 --- /dev/null +++ b/media/feincms/img/nav-bg.gif diff --git a/media/feincms/img/page_white_copy.png b/media/feincms/img/page_white_copy.png Binary files differnew file mode 100644 index 0000000..a9f31a2 --- /dev/null +++ b/media/feincms/img/page_white_copy.png diff --git a/media/feincms/img/page_white_delete.png b/media/feincms/img/page_white_delete.png Binary files differnew file mode 100644 index 0000000..af1ecaf --- /dev/null +++ b/media/feincms/img/page_white_delete.png diff --git a/media/feincms/img/page_white_edit.png b/media/feincms/img/page_white_edit.png Binary files differnew file mode 100644 index 0000000..b93e776 --- /dev/null +++ b/media/feincms/img/page_white_edit.png diff --git a/media/feincms/img/page_white_paste.png b/media/feincms/img/page_white_paste.png Binary files differnew file mode 100644 index 0000000..5b2cbb3 --- /dev/null +++ b/media/feincms/img/page_white_paste.png diff --git a/media/feincms/img/title.gif b/media/feincms/img/title.gif Binary files differnew file mode 100644 index 0000000..f92b596 --- /dev/null +++ b/media/feincms/img/title.gif diff --git a/media/feincms/img/toggle-collapse-dark.png b/media/feincms/img/toggle-collapse-dark.png Binary files differnew file mode 100644 index 0000000..76577a5 --- /dev/null +++ b/media/feincms/img/toggle-collapse-dark.png diff --git a/media/feincms/img/toggle-collapse-light.png b/media/feincms/img/toggle-collapse-light.png Binary files differnew file mode 100644 index 0000000..ed1612f --- /dev/null +++ b/media/feincms/img/toggle-collapse-light.png diff --git a/media/feincms/img/toggle-expand-dark.png b/media/feincms/img/toggle-expand-dark.png Binary files differnew file mode 100644 index 0000000..cfb42a4 --- /dev/null +++ b/media/feincms/img/toggle-expand-dark.png diff --git a/media/feincms/img/toggle-expand-light.png b/media/feincms/img/toggle-expand-light.png Binary files differnew file mode 100644 index 0000000..27b5234 --- /dev/null +++ b/media/feincms/img/toggle-expand-light.png diff --git a/media/feincms/jquery.alerts.css b/media/feincms/jquery.alerts.css new file mode 100644 index 0000000..6c9532c --- /dev/null +++ b/media/feincms/jquery.alerts.css @@ -0,0 +1,54 @@ +#popup_container {
+ font-family: Arial, sans-serif;
+ font-size: 12px;
+ min-width: 300px; /* Dialog will be no smaller than this */
+ max-width: 600px; /* Dialog will wrap after this width */
+ background: #FFF;
+ border: solid 1px #666;
+ color: #000;
+}
+
+#popup_title {
+ font-size: 14px;
+ font-weight: bold;
+ text-align: center;
+ line-height: 1.75em;
+ color: #666;
+ background: #eee url(img/title.gif) top repeat-x;
+ border: solid 1px #FFF;
+ border-bottom: solid 1px #666;
+ cursor: default;
+ padding: 0em;
+ margin: 0em;
+}
+
+#popup_content {
+ background: 16px 16px no-repeat url(img/info.gif);
+ padding: 1em 1.75em;
+ margin: 0em;
+}
+
+#popup_content.alert {
+ background-image: url(img/info.gif);
+}
+
+#popup_content.confirm {
+ background-image: url(img/important.gif);
+}
+
+#popup_content.prompt {
+ background-image: url(img/help.gif);
+}
+
+#popup_message {
+ padding-left: 48px;
+}
+
+#popup_panel {
+ text-align: center;
+ margin: 1em 0em 0em 1em;
+}
+
+#popup_prompt {
+ margin: .5em 0em;
+}
\ No newline at end of file diff --git a/media/feincms/jquery.alerts.js b/media/feincms/jquery.alerts.js new file mode 100644 index 0000000..0fdee7a --- /dev/null +++ b/media/feincms/jquery.alerts.js @@ -0,0 +1,235 @@ +// jQuery Alert Dialogs Plugin
+//
+// Version 1.0
+//
+// Cory S.N. LaViska
+// A Beautiful Site (http://abeautifulsite.net/)
+// 29 December 2008
+//
+// Visit http://abeautifulsite.net/notebook/87 for more information
+//
+// Usage:
+// jAlert( message, [title, callback] )
+// jConfirm( message, [title, callback] )
+// jPrompt( message, [value, title, callback] )
+//
+// History:
+//
+// 1.00 - Released (29 December 2008)
+//
+// License:
+//
+// This plugin is licensed under the GNU General Public License: http://www.gnu.org/licenses/gpl.html
+//
+(function($) {
+
+ $.alerts = {
+
+ // These properties can be read/written by accessing $.alerts.propertyName from your scripts at any time
+
+ verticalOffset: -75, // vertical offset of the dialog from center screen, in pixels
+ horizontalOffset: 0, // horizontal offset of the dialog from center screen, in pixels/
+ repositionOnResize: true, // re-centers the dialog on window resize
+ overlayOpacity: .01, // transparency level of overlay
+ overlayColor: '#FFF', // base color of overlay
+ draggable: true, // make the dialogs draggable (requires UI Draggables plugin)
+ okButton: ' OK ', // text for the OK button
+ cancelButton: ' Cancel ', // text for the Cancel button
+ dialogClass: null, // if specified, this class will be applied to all dialogs
+
+ // Public methods
+
+ alert: function(message, title, callback) {
+ if( title == null ) title = 'Alert';
+ $.alerts._show(title, message, null, 'alert', function(result) {
+ if( callback ) callback(result);
+ });
+ },
+
+ confirm: function(message, title, callback) {
+ if( title == null ) title = 'Confirm';
+ $.alerts._show(title, message, null, 'confirm', function(result) {
+ if( callback ) callback(result);
+ });
+ },
+
+ prompt: function(message, value, title, callback) {
+ if( title == null ) title = 'Prompt';
+ $.alerts._show(title, message, value, 'prompt', function(result) {
+ if( callback ) callback(result);
+ });
+ },
+
+ // Private methods
+
+ _show: function(title, msg, value, type, callback) {
+
+ $.alerts._hide();
+ $.alerts._overlay('show');
+
+ $("BODY").append(
+ '<div id="popup_container">' +
+ '<h1 id="popup_title"></h1>' +
+ '<div id="popup_content">' +
+ '<div id="popup_message"></div>' +
+ '</div>' +
+ '</div>');
+
+ if( $.alerts.dialogClass ) $("#popup_container").addClass($.alerts.dialogClass);
+
+ // IE6 Fix
+ var pos = ($.browser.msie && parseInt($.browser.version) <= 6 ) ? 'absolute' : 'fixed';
+
+ $("#popup_container").css({
+ position: pos,
+ zIndex: 99999,
+ padding: 0,
+ margin: 0
+ });
+
+ $("#popup_title").text(title);
+ $("#popup_content").addClass(type);
+ $("#popup_message").text(msg);
+ $("#popup_message").html( $("#popup_message").text().replace(/\n/g, '<br />') );
+
+ $("#popup_container").css({
+ minWidth: $("#popup_container").outerWidth(),
+ maxWidth: $("#popup_container").outerWidth()
+ });
+
+ $.alerts._reposition();
+ $.alerts._maintainPosition(true);
+
+ switch( type ) {
+ case 'alert':
+ $("#popup_message").after('<div id="popup_panel"><input type="button" value="' + $.alerts.okButton + '" id="popup_ok" /></div>');
+ $("#popup_ok").click( function() {
+ $.alerts._hide();
+ callback(true);
+ });
+ $("#popup_ok").focus().keypress( function(e) {
+ if( e.keyCode == 13 || e.keyCode == 27 ) $("#popup_ok").trigger('click');
+ });
+ break;
+ case 'confirm':
+ $("#popup_message").after('<div id="popup_panel"><input type="button" value="' + $.alerts.okButton + '" id="popup_ok" /> <input type="button" value="' + $.alerts.cancelButton + '" id="popup_cancel" /></div>');
+ $("#popup_ok").click( function() {
+ $.alerts._hide();
+ if( callback ) callback(true);
+ });
+ $("#popup_cancel").click( function() {
+ $.alerts._hide();
+ if( callback ) callback(false);
+ });
+ $("#popup_ok").focus();
+ $("#popup_ok, #popup_cancel").keypress( function(e) {
+ if( e.keyCode == 13 ) $("#popup_ok").trigger('click');
+ if( e.keyCode == 27 ) $("#popup_cancel").trigger('click');
+ });
+ break;
+ case 'prompt':
+ $("#popup_message").append('<br /><input type="text" size="30" id="popup_prompt" />').after('<div id="popup_panel"><input type="button" value="' + $.alerts.okButton + '" id="popup_ok" /> <input type="button" value="' + $.alerts.cancelButton + '" id="popup_cancel" /></div>');
+ $("#popup_prompt").width( $("#popup_message").width() );
+ $("#popup_ok").click( function() {
+ var val = $("#popup_prompt").val();
+ $.alerts._hide();
+ if( callback ) callback( val );
+ });
+ $("#popup_cancel").click( function() {
+ $.alerts._hide();
+ if( callback ) callback( null );
+ });
+ $("#popup_prompt, #popup_ok, #popup_cancel").keypress( function(e) {
+ if( e.keyCode == 13 ) $("#popup_ok").trigger('click');
+ if( e.keyCode == 27 ) $("#popup_cancel").trigger('click');
+ });
+ if( value ) $("#popup_prompt").val(value);
+ $("#popup_prompt").focus().select();
+ break;
+ }
+
+ // Make draggable
+ if( $.alerts.draggable ) {
+ try {
+ $("#popup_container").draggable({ handle: $("#popup_title") });
+ $("#popup_title").css({ cursor: 'move' });
+ } catch(e) { /* requires jQuery UI draggables */ }
+ }
+ },
+
+ _hide: function() {
+ $("#popup_container").remove();
+ $.alerts._overlay('hide');
+ $.alerts._maintainPosition(false);
+ },
+
+ _overlay: function(status) {
+ switch( status ) {
+ case 'show':
+ $.alerts._overlay('hide');
+ $("BODY").append('<div id="popup_overlay"></div>');
+ $("#popup_overlay").css({
+ position: 'absolute',
+ zIndex: 99998,
+ top: '0px',
+ left: '0px',
+ width: '100%',
+ height: $(document).height(),
+ background: $.alerts.overlayColor,
+ opacity: $.alerts.overlayOpacity,
+ display: 'none'
+ });
+ break;
+ case 'hide':
+ $("#popup_overlay").remove();
+ break;
+ }
+ },
+
+ _reposition: function() {
+ var top = (($(window).height() / 2) - ($("#popup_container").outerHeight() / 2)) + $.alerts.verticalOffset;
+ var left = (($(window).width() / 2) - ($("#popup_container").outerWidth() / 2)) + $.alerts.horizontalOffset;
+ if( top < 0 ) top = 0;
+ if( left < 0 ) left = 0;
+
+ // IE6 fix
+ if( $.browser.msie && parseInt($.browser.version) <= 6 ) top = top + $(window).scrollTop();
+
+ $("#popup_container").css({
+ top: top + 'px',
+ left: left + 'px'
+ });
+ $("#popup_overlay").height( $(document).height() );
+ },
+
+ _maintainPosition: function(status) {
+ if( $.alerts.repositionOnResize ) {
+ switch(status) {
+ case true:
+ $(window).bind('resize', function() {
+ $.alerts._reposition();
+ });
+ break;
+ case false:
+ $(window).unbind('resize');
+ break;
+ }
+ }
+ }
+
+ }
+
+ // Shortuct functions
+ jAlert = function(message, title, callback) {
+ $.alerts.alert(message, title, callback);
+ }
+
+ jConfirm = function(message, title, callback) {
+ $.alerts.confirm(message, title, callback);
+ };
+
+ jPrompt = function(message, value, title, callback) {
+ $.alerts.prompt(message, value, title, callback);
+ };
+
+})(jQuery);
\ No newline at end of file diff --git a/media/feincms/jquery.json-1.3.js b/media/feincms/jquery.json-1.3.js new file mode 100644 index 0000000..225ca82 --- /dev/null +++ b/media/feincms/jquery.json-1.3.js @@ -0,0 +1,156 @@ +/* + * jQuery JSON Plugin + * version: 1.0 (2008-04-17) + * + * This document is licensed as free software under the terms of the + * MIT License: http://www.opensource.org/licenses/mit-license.php + * + * Brantley Harris technically wrote this plugin, but it is based somewhat + * on the JSON.org website's http://www.json.org/json2.js, which proclaims: + * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that + * I uphold. I really just cleaned it up. + * + * It is also based heavily on MochiKit's serializeJSON, which is + * copywrited 2005 by Bob Ippolito. + */ + +(function($) { + function toIntegersAtLease(n) + // Format integers to have at least two digits. + { + return n < 10 ? '0' + n : n; + } + + Date.prototype.toJSON = function(date) + // Yes, it polutes the Date namespace, but we'll allow it here, as + // it's damned usefull. + { + return this.getUTCFullYear() + '-' + + toIntegersAtLease(this.getUTCMonth()) + '-' + + toIntegersAtLease(this.getUTCDate()); + }; + + var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g; + var meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }; + + $.quoteString = function(string) + // Places quotes around a string, inteligently. + // If the string contains no control characters, no quote characters, and no + // backslash characters, then we can safely slap some quotes around it. + // Otherwise we must also replace the offending characters with safe escape + // sequences. + { + if (escapeable.test(string)) + { + return '"' + string.replace(escapeable, function (a) + { + var c = meta[a]; + if (typeof c === 'string') { + return c; + } + c = a.charCodeAt(); + return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); + }) + '"'; + } + return '"' + string + '"'; + }; + + $.toJSON = function(o, compact) + { + var type = typeof(o); + + if (type == "undefined") + return "undefined"; + else if (type == "number" || type == "boolean") + return o + ""; + else if (o === null) + return "null"; + + // Is it a string? + if (type == "string") + { + return $.quoteString(o); + } + + // Does it have a .toJSON function? + if (type == "object" && typeof o.toJSON == "function") + return o.toJSON(compact); + + // Is it an array? + if (type != "function" && typeof(o.length) == "number") + { + var ret = []; + for (var i = 0; i < o.length; i++) { + ret.push( $.toJSON(o[i], compact) ); + } + if (compact) + return "[" + ret.join(",") + "]"; + else + return "[" + ret.join(", ") + "]"; + } + + // If it's a function, we have to warn somebody! + if (type == "function") { + throw new TypeError("Unable to convert object of type 'function' to json."); + } + + // It's probably an object, then. + var ret = []; + for (var k in o) { + var name; + type = typeof(k); + + if (type == "number") + name = '"' + k + '"'; + else if (type == "string") + name = $.quoteString(k); + else + continue; //skip non-string or number keys + + var val = $.toJSON(o[k], compact); + if (typeof(val) != "string") { + // skip non-serializable values + continue; + } + + if (compact) + ret.push(name + ":" + val); + else + ret.push(name + ": " + val); + } + return "{" + ret.join(", ") + "}"; + }; + + $.compactJSON = function(o) + { + return $.toJSON(o, true); + }; + + $.evalJSON = function(src) + // Evals JSON that we know to be safe. + { + return eval("(" + src + ")"); + }; + + $.secureEvalJSON = function(src) + // Evals JSON in a way that is *more* secure. + { + var filtered = src; + filtered = filtered.replace(/\\["\\\/bfnrtu]/g, '@'); + filtered = filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); + filtered = filtered.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); + + if (/^[\],:{}\s]*$/.test(filtered)) + return eval("(" + src + ")"); + else + throw new SyntaxError("Error parsing JSON, source is not valid."); + }; +})(jQuery); diff --git a/media/feincms/jquery.livequery.js b/media/feincms/jquery.livequery.js new file mode 100644 index 0000000..dde8ad8 --- /dev/null +++ b/media/feincms/jquery.livequery.js @@ -0,0 +1,250 @@ +/*! Copyright (c) 2008 Brandon Aaron (http://brandonaaron.net) + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * Version: 1.0.3 + * Requires jQuery 1.1.3+ + * Docs: http://docs.jquery.com/Plugins/livequery + */ + +(function($) { + +$.extend($.fn, { + livequery: function(type, fn, fn2) { + var self = this, q; + + // Handle different call patterns + if ($.isFunction(type)) + fn2 = fn, fn = type, type = undefined; + + // See if Live Query already exists + $.each( $.livequery.queries, function(i, query) { + if ( self.selector == query.selector && self.context == query.context && + type == query.type && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid) ) + // Found the query, exit the each loop + return (q = query) && false; + }); + + // Create new Live Query if it wasn't found + q = q || new $.livequery(this.selector, this.context, type, fn, fn2); + + // Make sure it is running + q.stopped = false; + + // Run it immediately for the first time + q.run(); + + // Contnue the chain + return this; + }, + + expire: function(type, fn, fn2) { + var self = this; + + // Handle different call patterns + if ($.isFunction(type)) + fn2 = fn, fn = type, type = undefined; + + // Find the Live Query based on arguments and stop it + $.each( $.livequery.queries, function(i, query) { + if ( self.selector == query.selector && self.context == query.context && + (!type || type == query.type) && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid) && !this.stopped ) + $.livequery.stop(query.id); + }); + + // Continue the chain + return this; + } +}); + +$.livequery = function(selector, context, type, fn, fn2) { + this.selector = selector; + this.context = context || document; + this.type = type; + this.fn = fn; + this.fn2 = fn2; + this.elements = []; + this.stopped = false; + + // The id is the index of the Live Query in $.livequery.queries + this.id = $.livequery.queries.push(this)-1; + + // Mark the functions for matching later on + fn.$lqguid = fn.$lqguid || $.livequery.guid++; + if (fn2) fn2.$lqguid = fn2.$lqguid || $.livequery.guid++; + + // Return the Live Query + return this; +}; + +$.livequery.prototype = { + stop: function() { + var query = this; + + if ( this.type ) + // Unbind all bound events + this.elements.unbind(this.type, this.fn); + else if (this.fn2) + // Call the second function for all matched elements + this.elements.each(function(i, el) { + query.fn2.apply(el); + }); + + // Clear out matched elements + this.elements = []; + + // Stop the Live Query from running until restarted + this.stopped = true; + }, + + run: function() { + // Short-circuit if stopped + if ( this.stopped ) return; + var query = this; + + var oEls = this.elements, + els = $(this.selector, this.context), + nEls = els.not(oEls); + + // Set elements to the latest set of matched elements + this.elements = els; + + if (this.type) { + // Bind events to newly matched elements + nEls.bind(this.type, this.fn); + + // Unbind events to elements no longer matched + if (oEls.length > 0) + $.each(oEls, function(i, el) { + if ( $.inArray(el, els) < 0 ) + $.event.remove(el, query.type, query.fn); + }); + } + else { + // Call the first function for newly matched elements + nEls.each(function() { + query.fn.apply(this); + }); + + // Call the second function for elements no longer matched + if ( this.fn2 && oEls.length > 0 ) + $.each(oEls, function(i, el) { + if ( $.inArray(el, els) < 0 ) + query.fn2.apply(el); + }); + } + } +}; + +$.extend($.livequery, { + guid: 0, + queries: [], + queue: [], + running: false, + timeout: null, + + checkQueue: function() { + if ( $.livequery.running && $.livequery.queue.length ) { + var length = $.livequery.queue.length; + // Run each Live Query currently in the queue + while ( length-- ) + $.livequery.queries[ $.livequery.queue.shift() ].run(); + } + }, + + pause: function() { + // Don't run anymore Live Queries until restarted + $.livequery.running = false; + }, + + play: function() { + // Restart Live Queries + $.livequery.running = true; + // Request a run of the Live Queries + $.livequery.run(); + }, + + registerPlugin: function() { + $.each( arguments, function(i,n) { + // Short-circuit if the method doesn't exist + if (!$.fn[n]) return; + + // Save a reference to the original method + var old = $.fn[n]; + + // Create a new method + $.fn[n] = function() { + // Call the original method + var r = old.apply(this, arguments); + + // Request a run of the Live Queries + $.livequery.run(); + + // Return the original methods result + return r; + } + }); + }, + + run: function(id) { + if (id != undefined) { + // Put the particular Live Query in the queue if it doesn't already exist + if ( $.inArray(id, $.livequery.queue) < 0 ) + $.livequery.queue.push( id ); + } + else + // Put each Live Query in the queue if it doesn't already exist + $.each( $.livequery.queries, function(id) { + if ( $.inArray(id, $.livequery.queue) < 0 ) + $.livequery.queue.push( id ); + }); + + // Clear timeout if it already exists + if ($.livequery.timeout) clearTimeout($.livequery.timeout); + // Create a timeout to check the queue and actually run the Live Queries + $.livequery.timeout = setTimeout($.livequery.checkQueue, 20); + }, + + stop: function(id) { + if (id != undefined) + // Stop are particular Live Query + $.livequery.queries[ id ].stop(); + else + // Stop all Live Queries + $.each( $.livequery.queries, function(id) { + $.livequery.queries[ id ].stop(); + }); + } +}); + +// Register core DOM manipulation methods +$.livequery.registerPlugin('append', 'prepend', 'after', 'before', 'wrap', 'attr', 'removeAttr', 'addClass', 'removeClass', 'toggleClass', 'empty', 'remove'); + +// Run Live Queries when the Document is ready +$(function() { $.livequery.play(); }); + + +// Save a reference to the original init method +var init = $.prototype.init; + +// Create a new init method that exposes two new properties: selector and context +$.prototype.init = function(a,c) { + // Call the original init and save the result + var r = init.apply(this, arguments); + + // Copy over properties if they exist already + if (a && a.selector) + r.context = a.context, r.selector = a.selector; + + // Set properties + if ( typeof a == 'string' ) + r.context = c || document, r.selector = a; + + // Return the result + return r; +}; + +// Give the init function the jQuery prototype for later instantiation (needed after Rev 4091) +$.prototype.init.prototype = $.prototype; + +})(jQuery);
\ No newline at end of file diff --git a/media/feincms/jquery.treeTable.js b/media/feincms/jquery.treeTable.js new file mode 100644 index 0000000..83d0fb0 --- /dev/null +++ b/media/feincms/jquery.treeTable.js @@ -0,0 +1,383 @@ +/* jQuery treeTable Plugin 2.2 - http://ludo.cubicphuse.nl/jquery-plugins/treeTable/ */ +(function($) { + // Helps to make options available to all functions + // TODO: This gives problems when there are both expandable and non-expandable + // trees on a page. The options shouldn't be global to all these instances! + var options; + + $.fn.treeTable = function(opts) { + options = $.extend({}, $.fn.treeTable.defaults, opts); + + return this.each(function() { + $(this).addClass("treeTable").find("tbody tr").each(function() { + // Initialize root nodes only whenever possible + if(!options.expandable || $(this)[0].className.search("child-of-") == -1) { + initialize($(this)); + } + }); + }); + }; + + $.fn.treeTable.defaults = { + childPrefix: "child-of-", + expandable: true, + indent: 19, + initialState: "collapsed", + treeColumn: 0 + }; + + // Recursively hide all node's children in a tree + $.fn.collapse = function() { + $(this).addClass("collapsed"); + + childrenOf($(this)).each(function() { + initialize($(this)); + + if(!$(this).hasClass("collapsed")) { + $(this).collapse(); + } + + $(this).hide(); + }); + + return this; + }; + + // Recursively show all node's children in a tree + $.fn.expand = function() { + $(this).removeClass("collapsed").addClass("expanded"); + + childrenOf($(this)).each(function() { + initialize($(this)); + + if($(this).is(".expanded.parent")) { + $(this).expand(); + } + + $(this).show(); + }); + + return this; + }; + + // Add an entire branch to +destination+ + $.fn.appendBranchTo = function(destination) { + var node = $(this); + var parent = parentOf(node); + + var ancestorNames = $.map(ancestorsOf(destination), function(a) { return a.id; }); + + // Conditions: + // 1: +node+ should not be inserted in a location in a branch if this would + // result in +node+ being an ancestor of itself. + // 2: +node+ should not have a parent OR the destination should not be the + // same as +node+'s current parent (this last condition prevents +node+ + // from being moved to the same location where it already is). + // 3: +node+ should not be inserted as a child of +node+ itself. + if($.inArray(node[0].id, ancestorNames) == -1 && (!parent || (destination.attr("id") != parent[0].id)) && destination.attr("id") != node[0].id) { + indent(node, ancestorsOf(node).length * options.indent * -1); // Remove indentation + + if(parent) { node.removeClass(options.childPrefix + parent[0].id); } + + var dest_id = $(destination).attr("id"); + while ($(".child-of-"+dest_id).length > 0) { + var move_to = $(".child-of-"+dest_id+":last"); + dest_id = move_to.attr("id"); + } + + node.addClass(options.childPrefix + destination.attr("id")); + if (move_to) + moveChild(node, move_to); // Recursively move nodes to new location + else + moveChild(node, destination); + indent(node, ancestorsOf(node).length * options.indent); + } + + return this; + }; + + $.fn.insertBranchBefore = function(destination) { + var node = $(this); + var parent = parentOf_jQuery(node); + var dest_parent = parentOf_jQuery(destination); + + if ($(this).attr("id")==destination.attr("id")) + return false; + + var ancestorNames = $.map(ancestorsOf_jQuery(destination), function(a) { return a.id; }); + + indent(node, ancestorsOf_jQuery(node).length * options.indent * -1); // Remove indentation + + if(parent) { node.removeClass(options.childPrefix + parent[0].id); } + + if (dest_parent) + node.addClass(options.childPrefix + dest_parent.attr("id")); + + moveBefore(node, destination); // Recursively move nodes to new location + indent(node, (ancestorsOf_jQuery(node).length * options.indent)); + + return this; + }; + + // Add reverse() function from JS Arrays + $.fn.reverse = function() { + return this.pushStack(this.get().reverse(), arguments); + }; + + // Toggle an entire branch + $.fn.toggleBranch = function() { + if($(this).hasClass("collapsed")) { + $(this).expand(); + } else { + $(this).removeClass("expanded").collapse(); + } + + return this; + }; + + // === Private functions + + function ancestorsOf(node) { + var ancestors = []; + while(node = parentOf(node)) { + ancestors[ancestors.length] = node[0]; + } + return ancestors; + }; + + function childrenOf(node) { + return $("table.treeTable tbody tr." + options.childPrefix + node[0].id); + }; + + function indent(node, value) { + var cell = $(node.children("td")[options.treeColumn]); + var padding = parseInt(cell.css("padding-left"), 10) + value; + + cell.css("padding-left", + padding + "px"); + + childrenOf(node).each(function() { + indent($(this), value); + }); + }; + + function initialize(node) { + if(!node.hasClass("initialized")) { + node.addClass("initialized"); + + var childNodes = childrenOf(node); + + if(!node.hasClass("parent") && childNodes.length > 0) { + node.addClass("parent"); + } + + if(node.hasClass("parent")) { + var cell = $(node.children("td")[options.treeColumn]); + var padding = parseInt(cell.css("padding-left"), 10) + options.indent; + + childNodes.each(function() { + $($(this).children("td")[options.treeColumn]).css("padding-left", padding + "px"); + }); + + if(options.expandable) { + cell.children(":first").children("span").prepend('<span style="margin-left: -' + (options.indent-15) + 'px; padding-left: ' + (options.indent-5) + 'px;" class="expander"></span>'); + //$(cell[0].firstChild).click(function() { node.toggleBranch(); }); + + // Check for a class set explicitly by the user, otherwise set the default class + if(!(node.hasClass("expanded") || node.hasClass("collapsed"))) { + node.addClass(options.initialState); + } + + if(node.hasClass("collapsed")) { + node.collapse(); + } else if (node.hasClass("expanded")) { + node.expand(); + } + } + } else { + var cell = $(node.children("td")[options.treeColumn]); + cell.children(":first").children("span").prepend('<span style="margin-left: -' + (options.indent-15) + 'px; padding-left: ' + (options.indent-5) + 'px;"></span>'); + } + node.children(":first").addClass("padded"); + } + }; + + function move(node, destination) { + node.insertAfter(destination); + childrenOf(node).reverse().each(function() { move($(this), node[0]); }); + }; + + function moveChild(node, destination) { + node.insertAfter(destination) + childrenOf(node).reverse().each(function() { move($(this), node[0]); }); + + }; + + function moveBefore(node, destination) { + node.insertBefore(destination) + childrenOf(node).reverse().each(function() { move($(this), node[0]); }); + }; + + function parentOf(node) { + + var classNames = node[0].className.split(' '); + + for(key in classNames) { + if(classNames[key].match("child-of-")) { + return $("#" + classNames[key].substring(9)); + } + } + }; +})(jQuery); + +// public functions +function handle_drop_event(source, dest, method){ + var ancestorNames = $.map(ancestorsOf_jQuery(dest), function(a) { return a.attr("id"); }); + if (method=="child") + dest.find(".wrap").removeClass("hover-as-child").addClass("nohover"); + else // method == "sibling" + dest.find("div:first").remove(); + // do not drop on itself or its own children, if method == "child" + if ( (method == "sibling") || (source.attr("id") != dest.attr("id") && $.inArray(source.attr("id"), ancestorNames) == -1) ) { + var source_child_of = null; + if (source.attr("class").match(/child-of-node-(\d+)/)) + source_child_of = source.attr("class").match(/child-of-node-(\d+)/)[0]; + var dest_child_of = "child-of-" + dest.attr("id"); + if (source_child_of && $("."+source_child_of).length - 1 == 0) { + var parent_id = "#" + source_child_of.substring(9); + $(parent_id).removeClass("parent"); + if ($(parent_id).hasClass("expanded")) + $(parent_id).removeClass("expanded").addClass("collapsed"); + $(parent_id+" .title-col span").removeClass("expander"); + } + if (method=="child") { + if ($("."+dest_child_of).length == 0) { + var parent_id = "#" + dest_child_of.substring(9); + $(parent_id).addClass("parent").find(".title-col span").addClass("expander"); + } + if (!dest.hasClass("expanded")) + dest.expand(); + // *** INSERT *** + source.appendBranchTo(dest); + } else // method == "sibling" + source.insertBranchBefore(dest); + } + source.find(".wrap").switchClass("nohover","flash",0).switchClass("flash","nohover",500); +} + +function handle_page_delete(node) { + var page_id = node.attr("class").match(/page-id-(\d+)/)[1]; + var parent_id = null; + if (node.attr("class").match(/child-of-node-(\d+)/)) + parent_id = node.attr("class").match(/child-of-node-(\d+)/)[1]; + var popup_bg = '<div class="popup_bg"></div>'; + $("body").append(popup_bg); + if (node.hasClass("parent")){ + jAlert('Cannot delete item, because it is parent of at least one other item.', + 'Cannot delete item', function(){ + $(".popup_bg").remove(); + }); + } else { + jConfirm('Really delete item?', 'Confirm to delete item', function(r) { + if (r==true) { + $.post('.', {'__cmd': 'delete_item', 'item_id': page_id}, function(data){ + if (data == "OK") { + if (parent_id && $(".child-of-node-"+parent_id).length == 1) { + $("#node-"+parent_id).removeClass("parent") + .removeClass("expanded").addClass("collapsed") + .find(".expander").removeClass("expander"); + } + node.remove(); + $("body").append(popup_bg); + jAlert('Item deleted successfully.', + 'Item deleted', function(){ + $(".popup_bg").remove(); + }); + } + }); + } + $(".popup_bg").remove(); + }); + } +} + +function parentOf_jQuery(node) { + if (node.attr("class").match(/child-of-node-(\d+)/)) { + var parent_id = node.attr("class").match(/child-of-node-(\d+)/)[1]; + return $("#node-"+parent_id); + } + return null; +}; + +function ancestorsOf_jQuery(node) { + var ancestors = []; + while(node = parentOf_jQuery(node)) { + ancestors[ancestors.length] = node; + } + return ancestors; +}; + +function save_page_tree() { + var send_tree = new Array(); + + // prepare tree + var i = 0; + var ancestor_tree_ids = []; + var ancestor_indeces = []; + var tree_id = 0; + $("#sitetree tbody tr").each(function(){ + var tobj = new Array(); + // 0 = tree_id, 1 = parent_id, 2 = left, 3 = right, 4 = level, 5 = page_id + var classNames = $(this).attr("class").split(' '); + var is_child = false; var is_parent = false; + var parent_id = ""; + tobj[1] = null; + // gather information + for (key in classNames) { + if(classNames[key].match("page-id-")) + tobj[5] = parseInt(classNames[key].substring(8)); + if(classNames[key].match("parent")) + is_parent = true; + if(classNames[key].match("child-of-")) { + is_child = true; + var node_parent_id = classNames[key].substring(9); + var parent_id = parseInt($("#"+node_parent_id).attr("class").match(/page-id-(\d+)/)[1]) + tobj[1] = parent_id; + } + } + // save info + var inArray = ancestor_tree_ids.indexOf(parent_id); + while ( ( is_child && inArray < ancestor_tree_ids.length - 1 && inArray >= 0) || ( !is_child && ancestor_tree_ids.length > 0 ) ) { + send_tree[ancestor_indeces.pop()][3] = i++; + ancestor_tree_ids.pop(); + } + if (!is_child) { + tree_id++; + i = 0; + } + tobj[0] = tree_id; + tobj[4] = ancestor_tree_ids.length; + tobj[2] = i++; + if (is_parent) { + ancestor_tree_ids.push(tobj[5]); + ancestor_indeces.push(send_tree.length); + } else { + tobj[3] = i++; + } + send_tree.push(tobj); + }); + while (ancestor_tree_ids.length>0) { + send_tree[ancestor_indeces.pop()][3] = i++; + ancestor_tree_ids.pop(); + } + + // send tree to url + $.post('.', {'__cmd': 'save_tree', 'tree': $.toJSON(send_tree)}, function(data){ + if (data == "OK") { + var popup_bg = '<div class="popup_bg"></div>'; + $("body").append(popup_bg); + jAlert("Tree saved successfully.", "Tree saved", function(){ + $(".popup_bg").remove(); + }); + } + }); +} diff --git a/media/feincms/layout.css b/media/feincms/layout.css new file mode 100644 index 0000000..23c2ccd --- /dev/null +++ b/media/feincms/layout.css @@ -0,0 +1,183 @@ + +#overview { + background-color:none; + padding:5px 0px 0px 5px; + margin:10px 0px 0px 10px; +} + +#content-main { + background-color:#fff; + margin-bottom:0px; + width:730px; +} + +.navi_tab { + float:left; + padding: 3px 10px 3px 10px; + cursor:pointer; + border: 1px solid #aaa; + border-bottom:none; + min-width:100px; +} +.tab_active { + height:16px; + font-weight: bold; + background-image:url('img/default-bg.gif'); + color: white; +} +.tab_inactive { + margin-top:4px; + height:12px; + font-weight: normal; + background-image:none; + color: black; +} +#main { + clear:both; + padding: 10px 10px 10px 10px; + border: 1px solid #aaa; +} +.panel { + display:none; + position:relative; + padding-bottom:70px; +} + + +span { margin-right: 5px;} + +.order-machine { + margin-bottom:10px; +} + +.order-item { + margin: 5px 15px 10px 5px; + background: #eee; + position:relative; + width:700px; + min-height:24px; + border: 1px solid #678; +} +.order-item span { + font-weight:bold; + margin-left:5px; +} +.order-item .handle { + float: left; + cursor: move; + background-color: #456; + height:100%; + border: 0px solid #456; + width:5px; + position:absolute; +} +.item-content { + padding: 0px 10px 10px 15px; + margin-right:5px; + clear:both; + margin-left:10px; +} +.item-header { + padding: 3px 10px 3px 15px; + margin-left:10px; + margin-top:1px; +} +.item-header span { + margin-right:10px; + float:left; + font-weight: strong; +} +.item-delete { + cursor:pointer; + float:right; + margin:3px 0px 0px 5px; +} +.active-item { + border: 1px solid #00a; + background-color:#def; +} +.button { + margin:5px; padding:5px; + font-weight: bold; + background-image:url('img/nav-bg.gif'); + cursor:pointer; + border: 1px solid #678; + width:30px; +} + +#test-log { padding: 5px; border: 1px solid #ccc; } + +#overview span { margin-right:15px; margin-left:5px;} + +.richtextcontent {display:none;} + +textarea { + width: 100%; + height: 80px; +} + +.item-minimize { + width: 15px; + height:15px; + float: left; + cursor: pointer; + margin-left:-17px; +} + +.item-minimize-disabled { + width: 15px; + height:15px; + float: left; + margin-left:-17px; +} + +.machine-control { + height:50px; + padding: 5px 0px 5px 0px; + border: 1px solid #678; + background-color:#ddd; + width:700px; + position:absolute; + left:5px; + bottom:5px; +} + +.control-unit { + float:left; + padding-left:15px; + padding-right:10px; + border-right: 1px solid #678; +} + +.control-unit span { + font-weight:bold; + margin-left:5px; +} + +hr { + color: #f00; + background-color: #bbb; + height: 1px; + margin-top: 5px; + margin-bottom: 5px; +} + +.empty-machine-msg { + margin:10px 0px 5px 300px; + font-style: italic; + font-size:14px; + color:#999; +} + +td span select { + width:600px; +} + +.popup_bg { + width:100%; height:100%; + background-color:white; + opacity: 0.5; + filter:alpha(opacity=50); + position:absolute; + top:0px; left:0px; +} diff --git a/media/feincms/listener.js b/media/feincms/listener.js new file mode 100644 index 0000000..2b6a5c6 --- /dev/null +++ b/media/feincms/listener.js @@ -0,0 +1,90 @@ +$(document).ready(function(){ + $(".navi_tab").livequery('click',function(){ + $(".navi_tab").removeClass("tab_active").addClass("tab_inactive"); + $(this).removeClass("tab_inactive").addClass("tab_active"); + $("#main > div:visible").hide(); + + var tab_str = $(this).attr("id").substr(0,$(this).attr("id").length-4); + $('#'+tab_str+'_body').show(); + ACTIVE_REGION = REGIONS.indexOf(tab_str); + + if (tab_str == "settings") + $(".machine-control").hide(); + else + $(".machine-control").show(); + + window.location.hash = '#'+tab_str; + }); + + $(".order-machine-add-button").livequery('click', function(){ + var modvar = $(this).prev().val(); + var modname = $(this).prev().children("option:selected").html(); + var total_forms = $('#id_'+modvar+'-TOTAL_FORMS'); + var last_id = parseInt(total_forms.val()) - 1; + var form = $("#"+modvar+"_set_item_"+last_id); + + total_forms.val(last_id+2); + create_new_from_form(form, modvar, last_id); + region_append(ACTIVE_REGION, form, modname, modvar); + set_item_field_value(form,"region-choice-field", ACTIVE_REGION); + + init_pagecontent(); + }); + + $(".order-machine-move-button").livequery('click', function(){ + var moveTo = $(this).prev().val(); + move_item(REGIONS.indexOf(moveTo),$(".active-item")); + }); + + $(".item-delete").livequery('click',function(){ + popup_bg = '<div class="popup_bg"></div>'; + $("body").append(popup_bg); + var item = $(this).parents(".order-item"); + jConfirm('Really delete item?', 'Confirm to delete item', function(r) { + if (r==true) { + set_item_field_value(item,"delete-field","checked"); + item.fadeOut(200); + } + $(".popup_bg").remove(); + }); + }); + + $(".cancel").livequery('click',function(){ + popup_bg = '<div class="popup_bg"></div>'; + $("body").append(popup_bg); + jConfirm('Really change template? <br/>All content will be moved to main region.', + 'Change template', function(r) { + if (r==true) { + var items = $(".panel").children(".order-machine").children(); + move_item(0, items); + $(".submit_form").click(); + } else { + $(".popup_bg").remove(); + } + }); + }); + + $(".item-minimize").livequery('click',function(){ + var item = $(this).parent().next(); + if (item.is(":visible")) { + $(this).html('<img src="'+IMG_ARROW_RIGHT_PATH+'" />'); + item.slideUp(200); + } else { + $(this).html('<img src="'+IMG_ARROW_DOWN_PATH+'" />'); + item.slideDown(200); + } + }); + + $(".order-item").livequery('click',function(){ + $(".order-item").removeClass("active-item"); + $(this).addClass("active-item"); + }); + + $(".submit_form").livequery('click',function(){ + zucht_und_ordnung(false); + var form = $(this).parents('form'); + form.attr('action', form.attr('action')+window.location.hash); + return true; + }); + +}); |