From 3784eb97209c00da703036031fa5127197ccef38 Mon Sep 17 00:00:00 2001 From: substantialnoninfringinguser Date: Fri, 22 May 2009 02:54:09 +0100 Subject: [PATCH] [svn] - Remove feature (admin JSON / XML downloads) which won't work until we have django 1.1 installed (works on my SVN version, but not on seagrass debian package version). - Copy feincms media to project so that we don't have to serve it separately. Also useful because we may want to customize it. --- expo/admin.py | 8 +- media/feincms/css/jquery.alerts.css | 54 +++ media/feincms/css/jquery.treeTable.css | 47 +++ media/feincms/css/layout.css | 242 +++++++++++++ media/feincms/helper.js | 88 +++++ media/feincms/img/arrow_down.gif | Bin 0 -> 224 bytes media/feincms/img/arrow_right.gif | Bin 0 -> 222 bytes media/feincms/img/circle.gif | Bin 0 -> 198 bytes media/feincms/img/cut.png | Bin 0 -> 648 bytes media/feincms/img/default-bg.gif | Bin 0 -> 844 bytes media/feincms/img/door.png | Bin 0 -> 412 bytes media/feincms/img/help.gif | Bin 0 -> 1582 bytes media/feincms/img/icon_deletelink.gif | Bin 0 -> 181 bytes media/feincms/img/icon_move.gif | Bin 0 -> 185 bytes media/feincms/img/important.gif | Bin 0 -> 1492 bytes media/feincms/img/info.gif | Bin 0 -> 1487 bytes media/feincms/img/nav-bg.gif | Bin 0 -> 273 bytes media/feincms/img/page_white_copy.png | Bin 0 -> 309 bytes media/feincms/img/page_white_delete.png | Bin 0 -> 536 bytes media/feincms/img/page_white_edit.png | Bin 0 -> 618 bytes media/feincms/img/page_white_paste.png | Bin 0 -> 620 bytes media/feincms/img/title.gif | Bin 0 -> 317 bytes media/feincms/img/toggle-collapse-dark.png | Bin 0 -> 2886 bytes media/feincms/img/toggle-collapse-light.png | Bin 0 -> 2864 bytes media/feincms/img/toggle-expand-dark.png | Bin 0 -> 2894 bytes media/feincms/img/toggle-expand-light.png | Bin 0 -> 2863 bytes media/feincms/jquery.alerts.css | 54 +++ media/feincms/jquery.alerts.js | 235 ++++++++++++ media/feincms/jquery.json-1.3.js | 156 ++++++++ media/feincms/jquery.livequery.js | 250 +++++++++++++ media/feincms/jquery.treeTable.js | 383 ++++++++++++++++++++ media/feincms/layout.css | 183 ++++++++++ media/feincms/listener.js | 90 +++++ 33 files changed, 1786 insertions(+), 4 deletions(-) create mode 100644 media/feincms/css/jquery.alerts.css create mode 100644 media/feincms/css/jquery.treeTable.css create mode 100644 media/feincms/css/layout.css create mode 100644 media/feincms/helper.js create mode 100644 media/feincms/img/arrow_down.gif create mode 100644 media/feincms/img/arrow_right.gif create mode 100644 media/feincms/img/circle.gif create mode 100644 media/feincms/img/cut.png create mode 100644 media/feincms/img/default-bg.gif create mode 100644 media/feincms/img/door.png create mode 100644 media/feincms/img/help.gif create mode 100644 media/feincms/img/icon_deletelink.gif create mode 100644 media/feincms/img/icon_move.gif create mode 100644 media/feincms/img/important.gif create mode 100644 media/feincms/img/info.gif create mode 100644 media/feincms/img/nav-bg.gif create mode 100644 media/feincms/img/page_white_copy.png create mode 100644 media/feincms/img/page_white_delete.png create mode 100644 media/feincms/img/page_white_edit.png create mode 100644 media/feincms/img/page_white_paste.png create mode 100644 media/feincms/img/title.gif create mode 100644 media/feincms/img/toggle-collapse-dark.png create mode 100644 media/feincms/img/toggle-collapse-light.png create mode 100644 media/feincms/img/toggle-expand-dark.png create mode 100644 media/feincms/img/toggle-expand-light.png create mode 100644 media/feincms/jquery.alerts.css create mode 100644 media/feincms/jquery.alerts.js create mode 100644 media/feincms/jquery.json-1.3.js create mode 100644 media/feincms/jquery.livequery.js create mode 100644 media/feincms/jquery.treeTable.js create mode 100644 media/feincms/layout.css create mode 100644 media/feincms/listener.js diff --git a/expo/admin.py b/expo/admin.py index 9f804c2a3..247b4b14b 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 000000000..0b5e1e815 --- /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 000000000..530565392 --- /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 000000000..d7be020e0 --- /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 000000000..58ca3ebb8 --- /dev/null +++ b/media/feincms/helper.js @@ -0,0 +1,88 @@ +function region_append(region, obj, modname) { + var wrp = []; + wrp.push('
'); + if (obj.children(":visible").length > 0) + wrp.push('
'); + else + wrp.push('
'); + wrp.push('' + modname + ''); + wrp.push(''); + wrp.push('
'); + + $("#"+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 = '
'+new_form+'
'; + $("#"+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; iWgn z=v87$KiRTG&ES}e~VR*_055oP(xoWZd)TJT|%Wy?Wgn z=v;-0ZV%M^QZnbsGibcva1oud z#o<`y)#f>-&mZ?YuYCSHREBN(+K43#YD!6k&6Ofkf_<796uz2?A6sBOB|?m8lc#9F N;yY`1Xs|F?0{{-%N}>P& literal 0 HcmV?d00001 diff --git a/media/feincms/img/circle.gif b/media/feincms/img/circle.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa75af5100c57da2217745ecde8d70bd2cbdd255 GIT binary patch literal 198 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 literal 0 HcmV?d00001 diff --git a/media/feincms/img/icon_deletelink.gif b/media/feincms/img/icon_deletelink.gif new file mode 100644 index 0000000000000000000000000000000000000000..72523e3a3ba1446c8f768c157cea642119a02741 GIT binary patch literal 181 zcmZ?wbhEHbc&kkH2hg{xUB9fxq8%JG(R5 zT3?Eao`!{eDJnj1U~tLY{9|s;X>G0VWo1vp!yowhEs~V{|NlP&4xspxg^__loIwX9 z53-Yi)#yQKgxah|7So2 zia%Kx85pD(bU?x&I~iEb7N~U{$(Y1hyvU6Kb8z+epk9;rNu literal 0 HcmV?d00001 diff --git a/media/feincms/img/important.gif b/media/feincms/img/important.gif new file mode 100644 index 0000000000000000000000000000000000000000..41d49438fd08230095c699b2d6f80593f3aa8667 GIT binary patch literal 1492 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 literal 0 HcmV?d00001 diff --git a/media/feincms/img/nav-bg.gif b/media/feincms/img/nav-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8402b809dc1efec80db6e466d789f88429a79a8 GIT binary patch literal 273 zcmZ?wbhEHb6l9QRIKsg2{rmT~Z{I$D{`}ReSAYNh{q^hDhYue(@t*9{u_A=gpfpKY#xG_U+rVXV3oq`}hC||i=Q&8(m$()z5YF*CjUEw001<4;4tjrTwH+&%FA_x~E6rskH`CdQ7= zuI>)uzWxal`(>Zw+Pr1!Chi?O LckSMx$Y2cs9wnNk literal 0 HcmV?d00001 diff --git a/media/feincms/img/page_white_copy.png b/media/feincms/img/page_white_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f31a278e17993d8d4e13beac2f9d5f7b42d08f GIT binary patch literal 309 zcmV-50m}Y~P)(?iiXTHIMmcoLoO94I8;j@ zv^2DJ5#orqydFJX|Gm$_Bi_vyew+j6{r}$Qc@D1%fQqeAhJj)1!z4pP83k2MV2~s! zSt^w(<#HLFVBg_#xz1W8ioi(WY&Hu~6zil?DI^jJgu`K35(hkP)H%@Imesbg#5!Ps_$Ni*SiR8&sKb9?M`0-mH)gtg&YgRX#*TXz@Z+| z;|2H@xzE0TfuORhuO2k6#K8#sW^J`mQ0+E@$K`QkFV+DTlI$w{GJ;zid{*v9xeIe_ z$|Bp`@iKkgoFK3{4Z)#DWKV~W4K@5WZN+Ql_7%YxNqSx7%cWud&cX>)_PvD*UzxZg a%Kia9Rjz_59@~-t0000$>5Y&axjp2O=VLu>*f>1L;s0)kkvKC!*u?s6CVL=HJ6oP~pNfZc; zsKr=bq;7MITw8NXw{SZm%59TId2x_9BQ zV86`NuvGI!>o^V!Na!=$7GJE{Cq`b+XwknM{UcGHFTTfmuS+ zm-zYC!P3+zmY;SG$?!fYkOih`QYaLxyF}A86h$GGN}kFj)_o*0e zjPMP%zTG7FYMAfO2Nn1D`D0Cj?Wl>5q%@CE10nX)KxpNmwk+!IWkzywiYD( zqUXiYYIq3qcRyMGJ;IY`(Gz~E$J$zu2+R{)xGlE*88b3WK6V*J>}2iPY1HH|tER0W z_+^^FdppY?o)Gt5M2`%xwRDH@R3G}^i1l4|6uchm0X0f!@&YdVLB5K&dd7Rv{)DXX zt^&vP;}kqj3f>94j+4xd93>s|Q!Ezi>?r8(Il$P}PFxSqu{d*!Y%*#cX(R0f|Juz# z3o0_xI14Al->1uky@W-rCI_%l&>4A_ab^avY?n0hpS-#mn_4{O$e%cm-@NH=3`90Wq+3`~HKArSdfX`&Z12 z(CY$VW-MNtXX4xy%yUeE?}*~0-|iByA@ZrwXgph4S*bhcc5{HB!DFVm_v}P*g7+Q~K}7K0lcp(^N@X>U zV`{ZpeIf${R6Hgg4FL^`X$Eu75k(PE6ycl$AW0Ic)#@rR7Z(7;V?i-dR1K935Jgcx zPfkwK>2wGokf!Nih^ARp6-6arYFG#(9Ta!x93nFEjoA==z(g?#sDg?Owk?Mg7K+>l zWYsf(<`#+$h9Sp6gFOg_dd+80SkUpk&xM7h0`Sov9W73spU;GP073|VfZ&Gd$J$*0<~TV5aPS|qWH57|VJz+d0000aX1K}04b%WX}Ye94MPwF)JDW42FALk8HT|avmJZ1Lc3i`yOJcip7+J`vMh_D zG|8yn^VidsEfmtRdOgm? IU-!VyACo}9@&Et; literal 0 HcmV?d00001 diff --git a/media/feincms/img/toggle-collapse-dark.png b/media/feincms/img/toggle-collapse-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..76577a57a23105b4c821b851902cda145e348d9c GIT binary patch literal 2886 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 N002ovPDHLkV1hxePYD13 literal 0 HcmV?d00001 diff --git a/media/feincms/jquery.alerts.css b/media/feincms/jquery.alerts.css new file mode 100644 index 000000000..6c9532cdc --- /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 000000000..0fdee7a11 --- /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( + ''); + + 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, '
') ); + + $("#popup_container").css({ + minWidth: $("#popup_container").outerWidth(), + maxWidth: $("#popup_container").outerWidth() + }); + + $.alerts._reposition(); + $.alerts._maintainPosition(true); + + switch( type ) { + case 'alert': + $("#popup_message").after(''); + $("#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(''); + $("#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('
').after(''); + $("#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(''); + $("#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 000000000..225ca82a1 --- /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 000000000..dde8ad8e3 --- /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 000000000..83d0fb0fe --- /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(''); + //$(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(''); + } + 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 = ''; + $("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 = ''; + $("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 000000000..23c2ccdc8 --- /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 000000000..2b6a5c60e --- /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 = ''; + $("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 = ''; + $("body").append(popup_bg); + jConfirm('Really change template?
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(''); + item.slideUp(200); + } else { + $(this).html(''); + 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; + }); + +});