+#!/bin/zsh
+bdir="bookmarks/${REMOTE_USER}"
+icodir=icodir
+alias wget="/usr/bin/wget -T 5 -t 1 -q -U ''"
+
+if [ -n "${CONTENT_LENGTH}" -a "${CONTENT_LENGTH}" -gt 0 ]; then
+ (head -c "${CONTENT_LENGTH}" | sed 's:&:\n:g'; echo) >$bdir/$(date +%s)
+fi
+
+moveName="$(echo -en "$(sed -rn '/mn=.+&mc=.+/{s:(^|.+&)mn=(.+)(&.+|$):\2:;s:\+: :g;s:%:\\x:g;p}' <<<"$QUERY_STRING")")"
+moveCont="$(echo -en "$(sed -rn '/mn=.+&mc=.+/{s:(^|.+&)mc=(.+)(&.+|$):\2:;s:\+: :g;s:%:\\x:g;p}' <<<"$QUERY_STRING")")"
+[ -n "$moveName" -a -n "$moveCont" ] && move=true || move=false
+
+[ -d "$bdir" ] || mkdir -p "$bdir"
+names=$(sed -rn 's:^name=(.*)$:\1:pg' $bdir/$(ls $bdir |tail -n1))
+hidecmd=$(for each in $(echo $names); do echo "try{hide('e_$each');}catch(e){};"; done)
+showcmd=$(for each in $(echo $names); do echo "try{show('d_$each');}catch(e){};"; done)
+
+delFolder=false
+delBookmark=false
+
+echo "
+<form action='index.cgi' method='post' accept-charset='utf-8'>
+ <div style='display:none;'>
+ qs $QUERY_STRING
+ mn $moveName
+ mc $moveCont
+"
+
+cat $bdir/$(ls $bdir |tail -n1) |while read line; do
+ case "$line" in
+ deleteFolder=*) delFolder=true
+ ;;
+ deleteBookmark=*) delBookmark=true
+ ;;
+ folder=*) echo '<!-- FOLDER -->'
+ fId=$(sed 's:^folder=::' <<<"$line")
+ [ -z "$fId" ] && fId='###'
+ fName="$(echo -ne "$(sed 's:+: :g;s:%:\\x:g' <<<"$fId")")"
+ $delFolder || echo "
+ <input type='hidden' name='title' value='New Bookmark'>
+ <input type='submit' name='content' value='New Bookmark'>
+ </div><div class='folder'>
+ <div class='fName' id='fName_$fId'>
+ <a href='#' onclick='javascript:hide(\"fName_$fId\");show(\"efName_$fId\")'>→</a>$fName
+ </div><div class='efName' id='efName_$fId'>
+ <a href='#' onclick='javascript:hide(\"efName_$fId\");show(\"fName_$fId\")'>←</a>
+ <input type='submit' value='Rename'><input type='submit' name='deleteFolder' value='Remove'>
+ <input type='text' name='folder' value='$fName'>
+ </div>
+ "
+ delFolder=false
+ $move && echo "
+ <div class='moveButton'>
+ <input type='hidden' name='title' value='$moveName'>
+ <button type='submit' name='content' value='$moveCont'>Move Here</button>
+ </div>
+ "
+ ;;
+ title=*)
+ bmId=$(sed 's:^title=::' <<<"$line")
+ [ -z "$bmId" ] && bmId='###'
+ bmName="$(echo -ne "$(sed 's:+: :g;s:%:\\x:g' <<<"$bmId")")"
+ ;;
+ content=*)
+ bmLink="$(echo -ne "$(sed 's:^content=::;s:+: :g;s:%:\\x:g' <<<"$line")")"
+ bmBase="$(sed -r 's:^(https?\://[^/]+)/?.*$:\1:' <<<"$bmLink")"
+ bmFav="$(sed -r 's:^(https?\://[^/]+)/?.*$:\1/favicon.ico:' <<<"$bmLink")"
+ bmFavFile="$icodir/$(sed -r 's:^https?\://([^/]+)/?.*$:\1.ico:' <<<"$bmLink")"
+ [ -f "$bmFavFile" ] || (wget -O - "$bmLink" |head -c 4096 |\
+ sed -rn "/<link.*rel=[\"'](shortcut )?icon[\"'].*>/Is:^.*<link.*href=[\"']([^\"']*)[\"'].*$:\1:ip" |\
+ read p && [ -n "$p" ] && (wget -O "$bmFavFile" "$p" || wget -O "$bmFavFile" "$bmBase/$p") ||\
+ wget -O "$bmFavFile" "$bmFav"
+ ) &
+ [ "$bmName" = "$moveName" -a "$bmLink" = "$moveCont" ] && delBookmark=true
+ $delBookmark || echo "
+ <div class='bmDisplay' id='d_$bmId'>
+ <a class='edButton' href='#' onclick='javascript:${hidecmd}${showcmd}show(\"e_$bmId\");hide(\"d_$bmId\");'>→</a>
+ <img width=16 height=16 src='$bmFavFile'>
+ <a href='$bmLink'>$bmName</a>
+ </div><div class='bmEdit' id='e_$bmId'>
+ <a class='edButton' href='#' onclick='javascript:show(\"d_$bmId\");hide(\"e_$bmId\");'>←</a>
+ <input type='submit' value='Update'><input type='submit' name='deleteBookmark' value='Remove'><br>
+ <a href='?mn=$bmName&mc=$bmLink'>Move Bookmark</a><br>
+ Name: <input type='text' name='title' value='$bmName'><br>
+ Link: <input type='text' name='content' value='$bmLink'>
+ </div>
+ "
+ $delBookmark || ($move && echo "
+ <div class='moveButton'>
+ <input type='hidden' name='title' value='$moveName'>
+ <button type='submit' name='content' value='$moveCont'>Move Here</button>
+ </div>
+ ")
+ delBookmark=false
+ ;;
+ *) echo "<!-- $line -->"
+ ;;
+ esac
+done
+
+echo "
+ <input type='hidden' name='title' value='New Bookmark'>
+ <input type='submit' name='content' value='New Bookmark'>
+ </div>
+ <input type='submit' value='Submit Changes'>
+ <input type='submit' name='folder' value='New Folder'>
+</form>
+"