/**
 * Smarty {ddrerank} function plugin
 *
 * Type:     function<br>
 * Name:     ddrerank<br>
 * Purpose:  display item re-ranking popup
 *
 * @param         $params
 * @param \Smarty $smarty
 * @return bool
 */
function smarty_function_ddrerank($params, &$smarty)
{
    global $db;
    $loc = $smarty->getTemplateVars('__loc');
    $badvals = array("[", "]", ",", " ", "'", "\"", "&", "#", "%", "@", "!", "\$", "(", ")", "{", "}");
    $uniqueid = str_replace($badvals, "", $loc->src) . $params['id'];
    $controller = !empty($params['controller']) ? $params['controller'] : $loc->mod;
    if ($params['sql']) {
        $sql = explode("LIMIT", $params['sql']);
        $params['items'] = $db->selectObjectsBySQL($sql[0]);
    } else {
        if ($params['items'][0]->id) {
            $model = empty($params['model']) ? $params['items'][0]->classname : $params['model'];
            $only = !empty($params['only']) ? ' AND ' . $params['only'] : '';
            $obj = new $model();
            $params['items'] = $obj->find('all', "location_data='" . serialize($loc) . "'" . $only, "rank");
        } else {
            $params['items'] = array();
        }
    }
    if (count($params['items']) >= 2) {
        expCSS::pushToHead(array("corecss" => "rerank,panel"));
        $sortfield = empty($params['sortfield']) ? 'title' : $params['sortfield'];
        //what was this even for?
        // attempt to translate the label
        if (!empty($params['label'])) {
            $params['label'] = gt($params['label']);
        }
        echo '<a id="rerank' . $uniqueid . '" class="reranklink" href="#">' . gt("Order") . ' ' . $params['label'] . '</a>';
        $html = '
        <div id="panel' . $uniqueid . '" class="exp-skin-panel exp-skin-rerank hide">
            <div class="yui3-widget-hd">Order ' . $params['label'] . '</div>
            <div class="yui3-widget-bd">
            <form method="post" action="' . URL_FULL . '">
            <input type="hidden" name="model" value="' . $model . '" />
            <input type="hidden" name="controller" value="' . $controller . '" />
            <input type="hidden" name="lastpage" value="' . curPageURL() . '" />
            <input type="hidden" name="src" value="' . $loc->src . '" />';
        if (!empty($params['items'])) {
            // we may need to pass through an ID for some reason, like a category ID for products
            $html .= $params['id'] ? '<input type="hidden" name="id" value="' . $params['id'] . '" />' : '';
            $html .= '<input type="hidden" name="action" value="manage_ranks" />
                <ul id="listToOrder' . $uniqueid . '" style="' . (count($params['items'] < 12) ? "" : "height:350px") . ';overflow-y:auto;">
                ';
            $odd = "even";
            foreach ($params['items'] as $item) {
                $html .= '
                    <li class="' . $odd . '">
                    <input type="hidden" name="rerank[]" value="' . $item->id . '" />
                    <div class="fpdrag"></div>';
                //Do we include the picture? It depends on if there is one set.
                $html .= $item->expFile[0]->id && $item->expFile[0]->is_image ? '<img class="filepic" src="' . URL_FULL . 'thumb.php?id=' . $item->expFile[0]->id . '&w=16&h=16&zc=1">' : '';
                $html .= '<span class="label">' . (!empty($item->{$sortfield}) ? substr($item->{$sortfield}, 0, 40) : gt('Untitled')) . '</span>
                    </li>';
                $odd = $odd == "even" ? "odd" : "even";
            }
            $html .= '</ul>
                    <div class="yui3-widget-ft">
                    <button type="submit" class="awesome small ' . BTN_COLOR . '">' . gt('Save') . '</button>
                    </div>
                    </form>
                    </div>
                </div>
                ';
        } else {
            $html .= '<strong>' . gt('Nothing to re-rank') . '</strong>
            
                    </div>
                </div>
                ';
        }
        echo $html;
        $script = "\n        YUI(EXPONENT.YUI3_CONFIG).use('node','dd','dd-plugin','panel', function(Y) {\n            var panel = new Y.Panel({\n                srcNode:'#panel" . $uniqueid . "',\n                width        : 500,\n                visible      : false,\n                zIndex       : 50,\n                centered     : false,\n                render       : 'body',\n                // plugins      : [Y.Plugin.Drag]\n            }).plug(Y.Plugin.Drag);\n            \n            panel.dd.addHandle('.yui3-widget-hd');\n            \n            var panelContainer = Y.one('#panel" . $uniqueid . "').get('parentNode');\n            panelContainer.addClass('exp-panel-container');\n            Y.one('#panel" . $uniqueid . "').removeClass('hide');\n                        \n            Y.one('#rerank" . $uniqueid . "').on('click',function(e){\n                e.halt();\n                panel.show();\n                panel.set('centered',true);\n            });\n\n            //Static Vars\n            var goingUp = false, lastY = 0;\n\n            // the list\n            var ul = '#listToOrder" . $uniqueid . "';\n\n            //Get the list of li's in the lists and make them draggable\n            var lis = Y.Node.all('#listToOrder" . $uniqueid . " li');\n//            lis.each(function(v, k) {\n                // var dragItem = new Y.DD.Drag({\n                //     node: v,\n                //     target: {\n                //         padding: '0 0 0 0'\n                //     }\n                // }).plug(Y.Plugin.DDProxy, {\n                //     moveOnEnd: false\n                // }).plug(Y.Plugin.DDConstrained, {\n                //     constrain2node: ul,\n                //     stickY:true\n                // }).plug(Y.Plugin.DDNodeScroll, {\n                //     node: ul\n                // }).addHandle('.fpdrag');\n\n                var dragItems = new Y.DD.Delegate({\n                    container: ul,\n                    nodes: 'li',\n                    target: {\n                        padding: '0 0 0 0'\n                    }\n                })\n                \n                dragItems.dd.plug(Y.Plugin.DDConstrained, {\n                    constrain2node: ul,\n                    stickY:true\n                }).plug(Y.Plugin.DDProxy, {\n                    moveOnEnd: false\n                }).plug(Y.Plugin.DDConstrained, {\n                    constrain2node: ul,\n                    stickY:true\n                }).plug(Y.Plugin.DDNodeScroll, {\n                    node: ul\n                }).addHandle('.fpdrag');\n\n                dragItems.on('drop:over', function(e) {\n                    //Get a reference to out drag and drop nodes\n                    var drag = e.drag.get('node'),\n                        drop = e.drop.get('node');\n\n                    //Are we dropping on a li node?\n                    if (drop.get('tagName').toLowerCase() === 'li') {\n                        //Are we not going up?\n                        if (!goingUp) {\n                            drop = drop.get('nextSibling');\n                        }\n                        //Add the node to this list\n                        e.drop.get('node').get('parentNode').insertBefore(drag, drop);\n                        //Resize this nodes shim, so we can drop on it later.\n                        e.drop.sizeShim();\n                    }\n                });\n                //Listen for all drag:drag events\n                dragItems.on('drag:drag', function(e) {\n                    //Get the last y point\n                    var y = e.target.lastXY[1];\n                    //is it greater than the lastY var?\n                    if (y < lastY) {\n                        //We are going up\n                        goingUp = true;\n                    } else {\n                        //We are going down..\n                        goingUp = false;\n                    }\n                    //Cache for next check\n                    lastY = y;\n                    Y.DD.DDM.syncActiveShims(true);\n                });\n                //Listen for all drag:start events\n                dragItems.on('drag:start', function(e) {\n                    //Get our drag object\n                    var drag = e.target;\n                    //Set some styles here\n                    drag.get('node').setStyle('opacity', '.25');\n                    drag.get('dragNode').addClass('rerank-proxy').set('innerHTML', drag.get('node').get('innerHTML'));\n                    drag.get('dragNode').setStyles({\n                        opacity: '.5'\n                        // borderColor: drag.get('node').getStyle('borderColor'),\n                        // backgroundColor: drag.get('node').getStyle('backgroundColor')\n                    });\n                });\n                //Listen for a drag:end events\n                dragItems.on('drag:end', function(e) {\n                    var drag = e.target;\n                    //Put out styles back\n                    drag.get('node').setStyles({\n                        visibility: '',\n                        opacity: '1'\n                    });\n                });\n                //Listen for all drag:drophit events\n                dragItems.on('drag:drophit', function(e) {\n                    var drop = e.drop.get('node'),\n                        drag = e.drag.get('node');\n\n                    //if we are not on an li, we must have been dropped on a ul\n                    if (drop.get('tagName').toLowerCase() !== 'li') {\n                        if (!drop.contains(drag)) {\n                            drop.appendChild(drag);\n                        }\n                    }\n                });\n//            });\n\n            //Create simple targets for the 2 lists..\n            var tar = new Y.DD.Drop({\n                node: ul\n            });        \n        });\n        \n        ";
        if (!expTheme::inPreview()) {
            expJavascript::pushToFoot(array("unique" => $uniqueid, "yui3mods" => 1, "content" => $script));
        }
    }
}