<:ifMessage:><div id="message"><:message:></div><:or:><:eif:>
<:include admin/product_menu.tmpl:>
-<:if Dboptions:>
+<:.define dboption_move:>
+<:# parameters: loop -:>
+<:.set baseurl = "/cgi-bin/admin/add.pl?id=" _ article.id _ "&option_id=" _ loop.current.id _ "&_csrfp=" _ request.get_csrf_token("admin_move_option") _ "&_t=" _ cgi.param("_t") _ "&" :>
+<:.set upurl = loop.is_first ? "" : baseurl _ "a_option_moveup=1" :>
+<:.set downurl = loop.is_last ? "" : baseurl _ "a_option_movedown=1" :>
+<span id="prodoptmove<:= loop.current.id :>"><:.call "make_arrows", down_url: downurl, up_url: upurl :></span>
+<:.end define :>
+
+<:.define dboptionvalue_move:>
+<:# parameters: loop -:>
+<:.set baseurl = "/cgi-bin/admin/add.pl?id=" _ article.id _ "&value_id=" _ loop.current.id _ "&_csrfp=" _ request.get_csrf_token("admin_move_option_value") _ "&_t=" _ cgi.param("_t") _ "&" :>
+<:.set upurl = loop.is_first ? "" : baseurl _ "a_option_value_moveup=1" :>
+<:.set downurl = loop.is_last ? "" : baseurl _ "a_option_value_movedown=1" :>
+<span id="prodoptvaluemove<:= loop.current.id :>"><:.call "make_arrows", down_url: downurl, up_url: upurl :></span>
+<:.end define :>
+
+<:.set dboptions = [ product.db_options ] :>
+<:.if dboptions.size:>
<h2>Product options</h2>
-<:if UserCan bse_edit_prodopt_move:article:>
+<:.if request.user_can("bse_edit_prodopt_move", article) :>
<div id="prodoptmenu">All options:
-<a id="sortoptions" href="<:script:>?a_option_reorder=1&_t=prodopts&id=<:article id:>&_csrfp=<:csrfp admin_move_option:>&option_ids=<:arithmetic join ",", map $_->{id}, sort { lc $a->{name} cmp lc $b->{name} } BSE::TB::Products->getByPkey([article id])->db_options:>">Sort</a>
-<a id="reverseoptions" href="<:script:>?a_option_reorder=1&_t=prodopts&id=<:article id:>&_csrfp=<:csrfp admin_move_option:>&option_ids=<:arithmetic join ",", map $_->{id}, reverse BSE::TB::Products->getByPkey([article id])->db_options:>">Reverse</a>
+<a id="sortoptions" href="<:script:>?a_option_reorder=1&_t=prodopts&id=<:= article.id:>&_csrfp=<:csrfp admin_move_option:>&option_ids=<:= dboptions.sort(@{a,b: a.lc cmp b.lc }).map(@{o: o.id }).join(",") :>">Sort</a>
+<a id="reverseoptions" href="<:script:>?a_option_reorder=1&_t=prodopts&id=<:article id:>&_csrfp=<:csrfp admin_move_option:>&option_ids=<:= dboptions.reverse.map(@{o: o.id}).join(","):>">Reverse</a>
<img src="/images/admin/busy.gif" id="busy_img" style="visibility: hidden" alt="busy" />
</div>
-<:or UserCan:><:eif UserCan:>
-<div id="productoptions" <:ifUserCan bse_edit_prodopt_move:>class="moveable"<:or:><:eif:>>
-<:iterator begin dboptions:>
-<div id="prodopt<:dboption id:>" class="prodopt">
-<div id="prodoptmenu<:dboption id:>" class="prodoptmenu">Option:<span id="prodoptname<:dboption id:>"><:dboption name:></span>
+<:.end if :>
+<div id="productoptions" <:.if request.user_can("bse_edit_prodopt_move", article):>class="moveable"<:.end if:>>
+<:.for dboption in dboptions :>
+<:.set dboloop = loop :>
+<div id="prodopt<:= dboption.id:>" class="prodopt">
+<div id="prodoptmenu<:= dboption.id:>" class="prodoptmenu">Option:<span id="prodoptname<:= dboption.id:>"><:= dboption.name:></span>
<div class="prodoptmenuoptions">
-<:if UserCan bse_edit_prodopt_edit:article :>
-<a id="editoption<:dboption id:>" href="<:script:>?id=<:article id:>&a_edit_option=1&option_id=<:dboption id:>">Edit</a>
-<a href="<:script:>?id=<:article id:>&a_delconf_option=1&option_id=<:dboption id:>">Delete</a>
-<a id="sortvals<:dboption id:>" href="<:script:>?id=<:article id:>&a_option_value_reorder=1&option_id=<:dboption id:>&_csrfp=<:csrfp admin_move_option_value:>&_t=prodopts&value_ids=<:arithmetic join ',', map $_->{id}, sort { lc $a->{value} cmp lc $b->{value} } BSE::TB::ProductOptions->getByPkey([dboption id])->values:>">Sort</a>
-<a id="reversevals<:dboption id:>" href="<:script:>?id=<:article id:>&a_option_value_reorder=1&option_id=<:dboption id:>&_csrfp=<:csrfp admin_move_option_value:>&_t=prodopts&value_ids=<:arithmetic join ',', map $_->{id}, reverse BSE::TB::ProductOptions->getByPkey([dboption id])->values:>">Reverse</a>
-<:or UserCan:><:eif UserCan:>
-<:ifUserCan bse_edit_prodopt_move:article:><:dboption_move:><:or:><:eif:>
+<:.if request.user_can("bse_edit_prodopt_edit", "article") :>
+<a id="editoption<:= dboption.id:>" href="<:script:>?id=<:= article.id:>&a_edit_option=1&option_id=<:= dboption.id:>">Edit</a>
+<a href="<:script:>?id=<:= article.id:>&a_delconf_option=1&option_id=<:= dboption.id:>">Delete</a>
+<a id="sortvals<:= dboption.id:>" href="<:script:>?id=<:article id:>&a_option_value_reorder=1&option_id=<:= dboption.id:>&_csrfp=<:csrfp admin_move_option_value:>&_t=prodopts&value_ids=<:= dboptions.sort(@{a,b: a.lc cmp b.lc }).map(@{o: o.id }).join(",") :>">Sort</a>
+<a id="reversevals<:= dboption.id:>" href="<:script:>?id=<:= article.id:>&a_option_value_reorder=1&option_id=<:= dboption.id:>&_csrfp=<:csrfp admin_move_option_value:>&_t=prodopts&value_ids=<:= dboptions.reverse.map(@{o: o.id}).join(",") :>">Reverse</a>
+<:.end if :>
+<:.if request.user_can("bse_edit_prodopt_move", article) :><:.call "dboption_move", loop: dboloop:><:.end if:>
</div>
</div>
-<div id="vallist<:dboption id:>" class="prodoptvalues">
-<:iterator begin dboptionvalues:>
-<div id="valentry<:dboptionvalue id:>" class="valueentry<:ifMatch [dboptionvalue_index] "[13579]$":> odd<:or:><:eif:>"><span id="prodoptvalue<:dboptionvalue id:>"><:dboptionvalue value:></span>
-<:ifEq [dboptionvalue id] [dboption default_value]:>(default)<:or:><:eif:>
-<:if UserCan bse_edit_prodopt_edit:article:>
+<div id="vallist<:= dboption.id:>" class="prodoptvalues">
+<:.for dboptionvalue in [ dboption.values ] :>
+<:.set dbovloop = loop :>
+<div id="valentry<:= dboptionvalue.id:>" class="valueentry<:= dbovloop.index mod 2 == 1 ? " odd" : "":>"><span id="prodoptvalue<:= dboptionvalue.id:>"><:= dboptionvalue.value:></span>
+<:.if dboptionvalue.id == dboption.default_value:>(default)<:.end if:>
+<:.if request.user_can("bse_edit_prodopt_edit", article):>
<div class="valueentrymenu">
-<a href="<:script:>?id=<:product id:>&value_id=<:dboptionvalue id:>&a_edit_option_value=1">Edit</a>
-<a href="<:script:>?id=<:product id:>&value_id=<:dboptionvalue id:>&a_confdel_option_value=1">Delete</a>
-<:dboptionvalue_move:>
+<a href="<:script:>?id=<:= product.id:>&value_id=<:= dboptionvalue.id:>&a_edit_option_value=1">Edit</a>
+<a href="<:script:>?id=<:= product.id:>&value_id=<:= dboptionvalue.id:>&a_confdel_option_value=1">Delete</a>
+<:.call "dboptionvalue_move", loop:dbovloop:>
</div>
-<:or UserCan:><:eif UserCan:>
+<:.end if :>
</div>
-<:iterator end dboptionvalues:>
+<:.end for :>
</div>
-<:if UserCan bse_edit_prodopt_edit:article:>
+<:.if request.user_can("bse_edit_prodopt_edit", article) :>
<div class="addvalueform">
-<form action="<:script:>" method="post" id="valform<:dboption id:>" class="addvalue"><input type="hidden" name="id" value="<:article id:>" /><input type="hidden" name="option_id" value="<:dboption id:>" /><input type="hidden" name="_t" value="prodopts" /><:csrfp admin_add_option_value hidden:><input type="text" name="value" class="add_field" /><input type="submit" name="a_add_option_value" value="Add Value" class="add_submit" /></form>
+<form action="<:script:>" method="post" id="valform<:= dboption.id:>" class="addvalue"><input type="hidden" name="id" value="<:= article.id:>" /><input type="hidden" name="option_id" value="<:= dboption.id:>" /><input type="hidden" name="_t" value="prodopts" /><:csrfp admin_add_option_value hidden:><input type="text" name="value" class="add_field" /><input type="submit" name="a_add_option_value" value="Add Value" class="add_submit" /></form>
</div>
-<:or UserCan:><:eif UserCan:>
+<:.end if :>
</div>
-<:iterator end dboptions:>
+<:.end for :>
</div>
-<:or Dboptions:><:eif Dboptions:>
-<:if UserCan bse_edit_prodopt_add:article:>
+<:.end if:>
+<:.if request.user_can("bse_edit_prodopt_add", article) :>
<div id="addoptionform" class="prodopt">
<form action="<:script:>" method="post">
<:csrfp admin_add_option hidden:>
<input type="hidden" name="_t" value="prodopts" />
-<input type="hidden" name="id" value="<:article id:>" />
-<div class="prodoptmenu">Option: <input type="text" name="name" value="<:old name:>" maxlength="255" class="editor_field" title="Enter the name of your new option here" /><:error_img name:><input type="submit" name="a_add_option" value="Add New Option" class="editor_ok_button" /></div>
+<input type="hidden" name="id" value="<:= article.id:>" />
+<div class="prodoptmenu">Option: <input type="text" name="name" value="<:= cgi.param("name") :>" maxlength="255" class="editor_field" title="Enter the name of your new option here" /><:.call "error_img", field: "name":><input type="submit" name="a_add_option" value="Add New Option" class="editor_ok_button" /></div>
<div class="prodoptvalues">
-<div class="valueentry"><input type="text" name="value1" value="<:old value1:>" maxlength="255" class="editor_field" title="Enter some values here" /><:error_img value1:></div>
-<div class="valueentry odd"><input type="text" name="value2" value="<:old value2:>" maxlength="255" class="editor_field" /><:error_img value2:></div>
-<div class="valueentry"><input type="text" name="value3" value="<:old value3:>" maxlength="255" class="editor_field" /><:error_img value3:></div>
-<div class="valueentry odd"><input type="text" name="value4" value="<:old value4:>" maxlength="255" class="editor_field" /><:error_img value4:></div>
-<div class="valueentry"><input type="text" name="value5" value="<:old value5:>" maxlength="255" class="editor_field" /><:error_img value5:></div>
+<div class="valueentry"><input type="text" name="value1" value="<:= cgi.param("value1") :>" maxlength="255" class="editor_field" title="Enter some values here" /><:.call "error_img", field: "value1":></div>
+<div class="valueentry odd"><input type="text" name="value2" value="<:= cgi.param("value2") :>" maxlength="255" class="editor_field" /><:.call "error_img", field: "value2":></div>
+<div class="valueentry"><input type="text" name="value3" value="<:= cgi.param("value3") :>" maxlength="255" class="editor_field" /><:.call "error_img", field: "value3" :></div>
+<div class="valueentry odd"><input type="text" name="value4" value="<:= cgi.param("value4") :>" maxlength="255" class="editor_field" /><:.call "error_img", field: "value4":></div>
+<div class="valueentry"><input type="text" name="value5" value="<:= cgi.param("value5") :>" maxlength="255" class="editor_field" /><:.call "error_img", field: "value5":></div>
</div>
</form>
</div>
<div id="addoptionbutton" style="display: none">
<a href="#" onclick="javascript: document.getElementById('addoptionform').style.display='block'; return false;">Add an option</a>
</div>
-<:or UserCan:><:eif UserCan:>
+<:.end if :>
<script type="text/javascript">
-var prodopts = <:dboptionsjson:>;
+var prodopts = <:= bse.json(dboptions.map(@{o: o.data_only })) |raw:>;
var reorder_values_csrf = '<:csrfp admin_move_option_value:>';
var reorder_options_csrf = '<:csrfp admin_move_option:>';
var edit_option_csrf = '<:csrfp admin_save_option:>';
var edit_value_csrf = '<:csrfp admin_save_option_value:>';
-var article_id = "<:article id:>";
+var article_id = "<:= article.id:>";
var edit_script = "<:script:>";
-var user_can_edit_option = <:ifUserCan bse_edit_prodopt_edit:>1<:or:>0<:eif:>;
-var user_can_delete_option = <:ifUserCan bse_edit_prodopt_delete:>1<:or:>0<:eif:>;
-var user_can_move_option = <:ifUserCan bse_edit_prodopt_move:>1<:or:>0<:eif:>;
+var user_can_edit_option = <:= request.user_can("bse_edit_prodopt_edit", article) ? "true" : "false":>;
+var user_can_delete_option = <:= request.user_can("bse_edit_prodopt_delete", article) ? "true" : "false" :>;
+var user_can_move_option = <:= request.user_can("bse_edit_prodopt_move", article) ? "true" : "false" :>;
-var show_add_form = <:ifCgi a_add_option:>true<:or:>false<:eif:>;
+var show_add_form = <:= cgi.param("a_add_option") ? "true" : "false" :>;
</script>