/** * 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)); } } }