Helpdesk Ammcentr enhancements

Miglioramenti ad OTRS

目前為 2017-03-21 提交的版本,檢視 最新版本

// ==UserScript==
// @name        Helpdesk Ammcentr enhancements
// @namespace   camelsoft
// @description Miglioramenti ad OTRS
// @include     https://helpdesk.ammcentr.unipd.it/otrs/index.pl*
// @icon        https://github.com/acavalin/otrs_enhancements/raw/master/xm_icon.png
// @version     1.4.0
// @grant       none
// ==/UserScript==

// NB: queste due direttive non servono perche' OTRS ha gia' jQuery e sembra funzionare senza problemi
// require     http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js
//jQuery.noConflict();

(function ($) { $(function () {
// -----------------------------------------------------------------------------
var cur_user = $('#UserInfo a:first').text().trim(); // displayed name

var icons = {
  idra:      "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAKKGlDQ1BpY2MAAHjanZZ3VFTXFofPvXd6oc0wdBh6720Akd4EpEgXhWFmgKEMMMzQxIaICkYUFWk2JCpgwGgoEiuiWAgICtgDEgSUGIwiKipvRtaKrry89/Ly++Pcb+2z977n7L3vWhcAkrcfl5cGSwGQyhPwg71c6RGRUXRsL4ABHmCAOQBMVma6/wrPECCSj4cbPVPkBL4IAuDNkHgF4LaxdyCdDv4/SbPS+QJRmkARW7I5mSwRF4o4JVuQLrbPiJgalyxmGCVmvuiAIpYXc8IiG332WWRnMbNTeWwRi8+czk5li7lLxFuzhBwRI34iLsricrJFfEfEWinCVK6I34pjUznMTABQJLFdwGElithMxCR+SLCbiJcAgCMlfMVxX7GAkyMQX8otLT2Xz01IFND1WPp0czs7Bt2bk53CEQiMA5msZCafTXdLS01n8nIBWLzzZ8mIa0sXFdnG3M7GxtjCxPyrQv3Xzb8pcW8X6VXQ555BtJ4vtr/yS6sFgDErqs3OL7a4SgDaNgMgf/+LTesQAJKivrX2fXUfmnheEgWCdHtT0+zsbBMuh2UiLugf+p8Of0Nfvc9EnO6P8tDdOfFMYYqALq4bKy0lTcinZ6YzWRy68Z+H+B8H/vU5jII58Rw+hyeKCBNNGZeXIGo3j80VcNN4dC7vPzXxH4b9SYtzLRKl7hOgxpgAqT4qQH7tASgKESDRB8Rd/6NvfvgwECh6hqtNLM79Z0H/nhUuFS+Z3ITPcW7BIXSWkJ+1uCf+LAEaEIAkoAIFoAo0gR4wBhbAFjgAZ+ABloEAEAIiwWrAAokgFfBBNsgHG0ERKAE7wV5QBQ6COlAPmsAp0AbOgkvgKrgJboFB8ACMgHHwHMyAN2AegiAsRIYokAKkBmlDhpAFxICWQh6QHxQMRUKxUALEg4RQPrQJKoHKoCroMFQPfQ+dgS5B16F+6B40Ck1Bv0PvYQQmwVRYBdaBTWEG7AL7wiHwKjgBzoDz4EJ4B1wB18In4Fb4EnwTHoRH4OfwLAIQIkJD1BFjhIG4IQFIFBKP8JF1SDFSjtQiTUgH0o3cRkaQaeQdCoOioOgoY5QDyhsVimKhMlDrUNtRVajjqFZUF+o2ahQ1g/qEJqOV0YZoe7QPOgKdgM5GF6HL0UfRLegr6EH0OPoNBoOhYXQxthhvTCQmCbMGsx2zH9OMuYjpx4xhZrFYrALWEOuIDcAysQJsEbYSewJ7ATuAHce+xRFxajgLnCcuCsfDFeDKcQ2487gB3ARuHi+F18bb4wPwbHwuvhRfh+/A9+HH8fMEaYIuwZEQQkgibCRUEJoIVwgPCa+IRKIG0Y4YROQSNxAriCeJ14ijxHckGZIByY0UTRKSdpCOkS6S7pFekclkHbIzOYosIO8g15Mvkx+T30pQJEwkfCTYEuslqiVaJQYkXkjiJbUlXSRXS+ZJlkueluyTnJbCS+lIuUkxpdZJVUudkRqWmpWmSJtLB0inSm+XbpC+Lj0pg5XRkfGQYcsUyhyRuSwzRkEomhQ3CouyiVJHuUIZp2KoulQfahK1hPodtZc6IysjayUbJpsjWy17TnaEhtB0aD60FFop7RRtiPZeTkXORY4jt02uSW5Abk5eSd5ZniNfLN8sPyj/XoGu4KGQrLBLoU3hkSJK0UAxSDFb8YDiFcVpJaqSgxJLqVjplNJ9ZVjZQDlYeY3yEeUe5VkVVRUvlXSVSpXLKtOqNFVn1STVParnVafUKGpL1bhqe9QuqD2jy9Jd6Cn0CnoXfUZdWd1bXah+WL1XfV5DVyNUo0CjWeORJkGToRmvuUezU3NGS03LXytfq1HrvjZem6GdqL1Pu1t7TkdXJ1xni06bzqSuvK6Pbp5uo+5DPbKek16GXq3eHX2MPkM/WX+//i0D2MDaINGg2qDPEDa0MeQa7jfsN0Ib2RnxjGqNho1Jxi7GWcaNxqMmNBM/kwKTNpMXplqmUaa7TLtNP5lZm6WY1Zk9MJcxX2ZeYN5h/ruFgQXLotrijiXZ0tNyvWW75UsrQyuO1QGru9YUa3/rLdad1h9tbG34Nk02U7ZatrG2NbbDDCojkLGdcc0Obedqt97urN07ext7gf0p+98cjB2SHRocJpfoLuEsqVsy5qjhyHQ87DiylL40dumhpSNO6k5Mp1qnJ86azmzno84TLvouSS4nXF64mrnyXVtc59zs3da6XXRH3L3ci917PWQ8Qj2qPB57angmeDZ6znhZe63xuuiN9vb13uU97KPiw/Kp95lZZrts7bIuX5LvCt8q3yd+Bn58vw5/2H+Z/27/h8u1l/OWtwWAAJ+A3QGPAnUDMwJ/DMIEBQZVBz0NNg/OD+5eQVkRs6JhxZsQ15DSkAeheqHC0M4wybDosPqwuXD38LLwkQjTiLURNyMVI7mR7VHYqLCoo1GzKz1W7l05Hm0dXRQ9tEp3Vc6q66sVV6esPhcjGcOMOR2Ljg2PbYj9wAxg1jJn43ziauJmWG6sfaznbGf2HvYUx5FTxpmId4wvi59McEzYnTCV6JRYnjjNdeNWcV8meScdTJpLDkg+lryQEp7SnIpLjU09w5PhJfO60lTTctL60w3Ti9JHMuwz9mbM8H35RzOhzFWZ7QKq6GeqR6gn3CwczVqaVZ31Njss+3SOdA4vpyfXIHdb7kSeZ963a1BrWGs689XzN+aPrnVZe3gdtC5uXed6zfWF68c3eG04vpGwMXnjTwVmBWUFrzeFb+ooVCncUDi22WtzY5FEEb9oeIvDloNbUVu5W3u3WW6r3PapmF18o8SspLzkw3bW9hvfmH9T8c3CjvgdvaU2pQd2Ynbydg7tctp1vEy6LK9sbLf/7tY99D3Fe17vjdl7vdyq/OA+wj7hvpEKv4r2Sq3KnZUfqhKrBqtdq5trlGu21cztZ+8fOOB8oOmgysGSg+8PcQ/dPex1uLVWp7b8COZI1pGndWF13d8yvq0/qni05OjHY7xjI8eDj3fV29bXNyg3lDbCjcLGqRPRJ2595/5de5Nx0+FmWnPJSXBSePLZ97HfD53yPdV5mnG66QftH2paKC3FrVBrbutMW2LbSHtke/+ZZWc6Oxw6Wn40+fHYWfWz1edkz5WeJ5wvPL9wIe/C7MX0i9OXEi6NdcZ0PrgccflOV1BX7xXfK9euel693O3SfeGa47Wz1+2vn7nBuNF20+Zma491T8tP1j+19Nr0tvbZ9rXfsrvV0b+k//yA08Cl2+63r97xuXNzcPlg/1Do0N3h6OGRu+y7k/dS7r28n3V//sGGh+iHxY+kHpU/Vn5c+7P+z80jNiPnRt1He56sePJgjDX2/JfMXz6MFz4lPy2fUJuon7SYPDvlOXXr2cpn48/Tn89PF/0q/WvNC70XP/zm/FvPTMTM+Ev+y4Xft79SeHXstdXrztnA2cdvUt/MzxW/VXh7/B3jXff78PcT89kfsB8qPup/7Pjk++nhQurCwr8AA5jz/NxUoywAAALfUExURYYAAOjExAAAAIEbG24JCTYAABgAAAUAABUCAp8eHgAGBmMDAz0BAcRRUVUAAJ4CAnc9Lzs/PO1vb+dgYOpZWfpcXOlRUeJiYtdBQbc9PZtQUP1YWNshIY4JCfdnZ9I5ObQgIOkbG/AaGrwlJeZHR+UuLtweHsQhIeYGBuQQEKchIWgfH+0yMoIICJM4OOMaGuoSEukeHrEEBNkFBZcBAZwAAN8CAsQLC1AHB+ENDZULC68qKo8PD+sJCbwCArgJCcIQEOQbG9UCApMBAc0ODrQDAyoAAMMPD48ODqo0NMgvL+wLC9cICNggINcGBuUEBJsGBts2NpgGBggAAHcfH7M2NqsVFagMDOICArUAAIcTE9sICMISErUYGFMAAAAAALI5OcsVFX0BAashIdIFBbEJCb8sLNQFBcgAAKABAVYBAQQBAQACAqsDA3gBAVAICKgCAsoDA8kFBZ0LC4UwMLY8PLwtLZEYGGYDAzgBAQAAAJkFBbkFBbgGBrsNDbMICJMFBSUAAMZZWbkYGI0AAD4BAfj4y/v7yeHiwLvevsdtaagUE5gAAIwHBkIBAXx8Z39yYXNvYHJdUX9PRWk1K1EYEnVHPXI9MoccFmdANTgcFWZmWF1NRGNVS3ohHWgLCVBLP21tXG5jWEcnIFhOQ18wKGcQD25NRFNIO1daSXN3bIJYUW9aUjsWEl4AAHlOR2xbU3ZjXGNkWnFvZ00mImZMSWdgWWBRR2VoX4CBY36BeV09OGtkXmFlWod7cmtjXUIqJWNWUUc6NllQS0xAOlxSTTg4MykoI15jXXd7bnN3bFRXSnJ4cHBza2xwZ0pNRRoSDlZXTx0ZFTQzLVpdUlxeVRYXEwAAAFNWTmBjWPcBAeIAAOQAANoAANgAAMsAAMYAAL4AALwAALoAALgHB7IAALAAAK4AAKwAAKoAAKgAAKgAAKIIBqQNC6IIB54BAJsAAJwDA3A9NI8AAI4tJgRvfxAAAADadFJOUwAAAAAAAAAAAAAAAAAAAAAAAAUrPRwJAxkgCFiqF0nBzMuiTna6cKP2sTsFwbNo6eHp4OCCfvLYNeentMfx79rL2dc0g+w3p8muyvfz4/3/pJHbIkq65tD+8bP47u+QBzXduIr+7tH+/++bGQR9rDO1///wtJBXDhpEAzPi/fv4kQoV0e5DBwIKD1vy//1phFqewu7qhtb+//1lurnl+uzFdMPcvv7y+vxptMnxl6/R1e/K3v3u/PuyDrvY5FtW3/H74Pb9/f303019T5OsoWlYmp2GoKGFa4NoLEvCeQAAAAlwSFlzAAAOwwAADsMBx2+oZAAAARtJREFUGNMBEAHv/gASExQVFhcYGRobHB0AAQICAB4fICEiIyQlJicoKSorAwIALC0uL9owMTIzNDU2NzgEAgA5Ojs8PT4/QEFCQ0RFRgUCAEdISUpLTE1OT9tQUVJTBgIAVFVWV1jcWVpb3VxdXl8HAgBgYWJjZN5lZmdoaWprCAICAGxtbm9w33Fy4HN0dXZ3CQoAC3h5ent84eLjfX7kf4CBDAACAgINgoPl5ufo6errhIUOAIaHiImKi4zs7e7v8PGNjg8Aj5CRkpOUlZbyl5jz9JmaEACbnJ2en6ChoqOkpaanqKkRAKqrrK2ur7CxsrO0tba3uLkAuru8vb6/wMHCw8TFxsfIyQDKy8zNzs/Q0dLT1NXW19jZ8mB02eGhMe0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTEtMDQtMDNUMDE6MTI6MjkrMDI6MDDIqN5CAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDEwLTEyLTI5VDE1OjE2OjE2KzAxOjAwSMbr/gAAAABJRU5ErkJggg==",
  coda:      "R0lGODlhEAAQAMQfAOvGUf7ztuvPMf/78/fkl/Pbg+u8Rvjqteu2Pf3zxPz36Pz0z+vTmPzurPvuw/npofbjquvNefHVduuyN+uuMu3Oafbgjfnqvf/3zv/3xevPi+vRjP/20/bmsP///////yH5BAEAAB8ALAAAAAAQABAAAAV24CeOZGmepqeqqOgxjBZFa+19r4ftWQUAgqDgltthMshMIJAZ4jYDHsBARSAmFOJvq+g6HIdEFgcYmBWNxoNAsDjGHgBnmV5bCoUDHLBIq9sFEhIdcAYJdYASFRUQhQkLCwkOFwcdEBAXhVabE52ecDahKy0oIQA7",
  Indietro:  "R0lGODlhEAAQAMQfACROFdzy00yoLbDhnUSVKFe+OV3CPMXpuLPioitfGordWnfRTXTLXLzmqX3UUYTaVjyDJGTEQaPdjI/gXXDLSc7sw2rKRdjwz9PuyVG6NTRzH4zUc9/z2H3OZf///////yH5BAEAAB8ALAAAAAAQABAAAAWH4CeOXumNKOkJLFGm4ipwXHARbrrSzaQMmArkFJtVJj7Fw4E4aIg75MSzXFCcp1WgoVCUHFbLppEoES6Ph8kUMZDNGIdjXTIUEGUPpCKxlixtBQwIAFkQBxaAHgZ2GYRQGgcSbXYFGRsDhSQaDQ0dGRkMA5lEJAkJCAijAJowJaysLzAqsighADs=",
  Rilascia:  "R0lGODlhEAAQALMPAEWi6azap1WzS9LusYrSbApexXLHV+z41vH559Ltw8ns+pe75hBs0iCZEP///////yH5BAEAAA8ALAAAAAAQABAAAARl8MlJq30uuztzawyTXc53IIjCNBtVIscxAMAysC6DDIMAEIZbC8NQJAYEmgAYwBEVgADtZxA0W47iYgoQeK+SUgI4DTUCok5j7GUUCou0OtADwePD8CcQWMTlFR4hInkWGoUciREAOw==",
  Gestisci:  "R0lGODlhEAAQAMQfAOvx9pjL/HWVsbfb/eTs9abS+0lVa1ZtjZG3z7+beLvU4cbg9Im77PHl2tfn8PD2+/v7+1JgeavO4UNLXODo7ykxQz5FVarQ8sOUaENxm36s1bF2RYlhMunXxv///////yH5BAEAAB8ALAAAAAAQABAAAAWfoCeO5PidniOtEoJoQix4qOQQQA4QPMEcNI8EsOAYOYvB4MH4iRQPTmJD5SgfWKBHIaV6rdfIk7PpmDsbcOEh9iw2DY5ZvhkU1gbRAtNImP0YdwUEeSkAGGcdgYIEEyIOGRcYkxgaGQUBARSOHpEXFxqhoRmZFBYikZGhFxmWmQCnWwAPOz0UtwAKFSICB74REQYGExMWFhViECXLIxAhADs=",
  Storico:   "R0lGODlhEAAQALMPAOz2/6mjhdrMrMe6kkE4H7OfY7iofJR7PnBgN9Dq/tLT1Ojaw3h/hf7+/v///////yH5BAEAAA8ALAAAAAAQABAAAAR88MnpqpuYusNPzVLDLeTCNZm4CEM7CMKBSts6OEhltDl9sBaHorHzPGo3i4IQIBYIlcMi2VgyEgDDs4KYIhqNAAFA1kJxC0ODDGAgEonC9ogQGNiJa2DQoxcGAXBwAQIFfQ8NCH8BjFqGMxOJBHJyCF8gRw4Em2eYGh8ZEQA7",
  PDF:       "R0lGODlhEAAQAMQfAOmNjMfHx9UqJ3Fvb9hoZqmpqbe3t96pqPn4+IeHh9ra2qRSUOXl5dtFQ9i2turq6uDg4NTT0+7u7uzMy/DX15OTk9/Ew99+fa89PN+Yl/Hp6eLi4vPz8/v7+////////yH5BAEAAB8ALAAAAAAQABAAAAWgoCeO5PidHhOtQWC8ReyhEdLdOB5Usxd1HARnSOy0eD4gkUO5UHAJUaAjqVYBl8zjgYh6pg/J9mFpZBiMrsjQGaMZDQsEovYYEI/3hiEQWBQcA2scaBtzBxkZcRoDCB4FhBuGEBcOCg19GBePHJJzCgQEDQQZBxgAjwiTChcNlSuBIhVpHBMNDRRiDxwKgo8JFQkCGAsJA8fHXiQAuCUjIQA7",
  Priorit:   "R0lGODlhEAAQAMQfAK41AGI6Ff+pJ9BPAP/x2v/DZf+eDv+kHP/qxv+5Sv+vNf+ZBP/Oe/+hFv+cCv2nNd55BP/UjP/ThVQzGIFUAP+fEv+qOP+tQP+yO/++Vv/15P/cobF2RVk2Gf///////yH5BAEAAB8ALAAAAAAQABAAAAVx4CeOZCl6aKqqp8QUWaIIh9Hd3sloBIEgEYkEwunkPp4CgXZoGBwLYuDoSSAOzcpzQeFMT5hNdsv1UgWRhpbcNZ4ODAN5UZ5QK4WLxfLoPwIcdicQEAOGAwCJHYFUKyqLgiYkHpBHkieLbpeYOJsnLCEAOw==",
  Collega:   "R0lGODlhEAAQANUkAHBwcMXFxaioqJqamtHR0XNzc6SkpJeXl6CgoNXV1ZiYmHd3d8fHx6Kioo2NjZubm6GhoX9/f4qKipSUlKenp5CQkJOTk6Ojo3t7e6WlpZ2dnX19fZ+fn4SEhHJycn5+foWFhZ6entra2v///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACQALAAAAAAQABAAAAZmQJJwSCwaj0jSaMlMjgSUjAGCGB2fI1GCwAg8rEKmYGRAcAYKRWDCHIXe78vyAH8vRXg8SBjJ45cggYEDSwUAh4dtDSMHFRIdHxgBC01hGllbXR5gRSMWDiAbCwWcRm1LSamqq6pBADs=",
  Operatore: "R0lGODlhEAAQAMQfAFWApnCexR4xU1SApaJ3SlB5oSg9ZrOVcy1HcURok/Lo3iM2XO/i1lJ8o2eVu011ncmbdSc8Zc6lg4212DZTgC5Hcmh3f8OUaDhWg7F2RYlhMunXxqrQ8n6s1f///////yH5BAEAAB8ALAAAAAAQABAAAAVz4CeOXumNKOpprHampAZltAt/q0Tvdrpmm+Am01MRGJpgkvBSXRSHYPTSJFkuws0FU8UBOJiLeAtuer6dDmaN6Uw4iNeZk653HIFORD7gFOhpARwGHQJ8foAdgoSGJA1/HJGRC40qHg8JGBQVe10kJiUpIQA7",
  Nota:      "R0lGODlhEAAQAMQAAJvN/MXi/naZtl13lavU+6TR+7TZ/Pz9/r7e/VpwiUhacfL1+cjk/rHX/GF8m4Gnwrrc/cDf/Za805/E2Lfa/OLq9K/Q4ubv96jL3Yyyy7DS42eHp1Nle+zx9////////yH5BAEAAB8ALAAAAAAQABAAAAV+4CeOZEl6aKqWnoVNUvY8grB5Y6t6x3JVlQHOo/EwjoFAJIJAVBYO1MTISDIhFERjIfRIDkklAmtoELiox2KJoJQJhEKhkkAJOmOKOV4AACocdh1kZnJ+f4EfHncdjY0ABY2JIh4ODgMJCRySCjgnO5uTJiccoqM5pqeUnh8hADs=",
  Chiudi:    "R0lGODlhEAAQAMQfAOt0dP94eOFjY/a0tP/JyfFfX/yVlf6mppNtbf5qanknJ9dVVeZqat5eXpiMjGo4OIUvL3pGRthWVuhvb1kaGv39/f1lZdg7O/7Y2F8/P+13d4tcXNRTU2dCQv///////yH5BAEAAB8ALAAAAAAQABAAAAV/4Cd+Xml6Y0pGTosgEap6G0YQh6FDskhjGg0AMJkwAjxfBygkGhmCAAXl6QyGnuLFI4g+qNbixLMNdBNfkpXBLncbial6AC17Gvg4eND1BPB3cHJVBguGhwsSHHo+GRqKHJGRCQo9JI4WBZoFFpUVMw8QCqMQU58qJCclqKytIQA7"
};

// localStorage shortcuts
Storage.prototype.rm = function(k) { this.removeItem(k); };
Storage.prototype.get = function(k, default_value) {
  var v = JSON.parse(this.getItem(k) || 'null');
  return (typeof v !== 'undefined' && v != null) ? v : default_value;
};// Storage.prototype.get -----------------------------------------------------
Storage.prototype.set = function(k, v) {
  try {
    return (typeof v !== 'undefined' && v != null) ?
      this.setItem(k, JSON.stringify(v)) :
      this.rm(k);
  } catch (e) {
    console.log('ERROR: key not saved');
    return null;
  }//try-catch
};// Storage.prototype.set -----------------------------------------------------
var $ls = localStorage; // abbrevia localStorage

function extend_uris () {
  $('a[title]:contains([..])').each(function () {
    $(this).text( $(this).attr('href') );
  });
}//extend_uris

// sort select options by text => http://stackoverflow.com/a/278509
function sortSelect (selElem) {
  var tmpAry = new Array(), i = 0;
  
  for (i=0; i < selElem.options.length; i++) {
    tmpAry[i] = new Array();
    tmpAry[i][0] = selElem.options[i].text;
    tmpAry[i][1] = selElem.options[i].value;
  }
  
  tmpAry.sort();
  
  while (selElem.options.length > 0)
    selElem.options[0] = null;
  
  for (i=0; i < tmpAry.length; i++)
    selElem.options[i] = ( new Option(tmpAry[i][0], tmpAry[i][1]) );
}//sortSelect

// piccole migliorie per guadagnare spazio
$('#Header').css('height', '1rem');
$('#Navigation').css('top','2px');
$('#Logo').hide();

// riquadro credits + links
var links_hp     = '<a href="https://cava.link/" target="_blank">Cava.link</a>',
    links_script = '<a href="https://github.com/acavalin/otrs_enhancements" target="_blank">OTRS script</a>',
    links_css    = 'position: absolute; top: 0.5rem; left: 43%; padding: 0.3rem 0.6rem; z-index: 65000;'+
      'background: linear-gradient(to bottom, rgb(249, 249, 249) 0%, rgb(241, 241, 241) 100%);'+
      'border-radius: 0.5rem; border: 1px outset red;';
$('<div style="'+links_css+'">'+links_script+' by '+links_hp+'</div>').appendTo('body');

// --- ticket overview ---------------------------------------------------------
if ($('.OverviewBox h1:contains(Lista Ticket: Le mie Code)').length > 0 ||
    $('.OverviewBox h1:contains(Visualizzazione Stato: Ticket)').length > 0) {
  //            1         2     3       4      5           6      7         8         9     10
  // COLONNE: [x], Priorita, Star, Ticket, Tempo, Da/Oggetto, Stato, Gestione, Operatore, Coda
  
  // evidenzia righe mie
  $('#OverviewBody tr[id^=TicketID] td:nth-child(9) div:contains('+cur_user+')').
  parent().parent().
  addClass('miei').
  find('td').css('background-color', '#ddd'); // pale gray
  
  // evidenzia righe non mie
  $('#OverviewBody tr[id^=TicketID]:not(.di_altri) td:nth-child(9) div').not(
    ':contains(Admin OTRS),'+
    ':contains('+cur_user+')'
  ).parent().parent().
  addClass('assegnati').
  find('td').css('background-color', '#FCE3FF'); // violetta
  
  // sposta righe mie in alto
  $('#OverviewBody tr.miei').prependTo( $('#OverviewBody tbody') );
  // sposta righe non mie in basso
  $('#OverviewBody tr.assegnati').appendTo( $('#OverviewBody tbody') );

  // metti bordo sui blocchi di righe
  $('#OverviewBody tr.miei:last       td').css('border-bottom', '1px solid black');
  $('#OverviewBody tr.assegnati:first td').css('border-top'   , '1px solid black');
 
  // evidenzia utente e titolo
  $('#OverviewBody tr[id^=TicketID] td:nth-child(6)').each(function () {
    $(this).find('div:first').
      css('font-weight', 'bold').css('float', 'left').css('white-space', 'nowrap').
      css('padding-right', '0.5em');
    var t = $(this).find('div:last').css('white-space', 'wrap').css('display', 'inherit');
    t.text( t.attr('title') );
  });
  // unica linea per utente e titolo + stessa larghezza per l'utente
  var utenti   = $('#OverviewBody tr[id^=TicketID] td:nth-child(6) div:nth-child(1)'),
      utenti_w = utenti.map(function () { return $(this).outerWidth() }),
      utente_w = Math.max.apply(null, utenti_w);
  utenti.width(utente_w);
  
  // mostra solo nome finale della coda
  $('#OverviewBody tr[id^=TicketID] td:nth-child(10)').each(function () {
    var div  = $(this).find('div:first'),
        coda = div.attr('title').trim().replace(/.*::(.+)/,'$1');
    $('<span style="font-size: smaller"></span>').text(coda).appendTo( div.empty() );
  });

  // abbrevia "preso in gestione"
  $('#OverviewBody tr[id^=TicketID] td:nth-child(8)').each(function () {
    var div  = $(this).find('div:first');
    div.text( div.text().trim().replace(/preso /, '') );
  });

  // abbrevia "chiuso con successo"
  $('#OverviewBody tr[id^=TicketID] td:nth-child(7)').each(function () {
    var div  = $(this).find('div:first');
    div.text( div.text().trim().replace(/ con successo/, '') );
  });

  //// nascondi ultima colonna
  //$('#OverviewBody thead th.Last').hide();
  //$('#OverviewBody tr[id^=TicketID] td.Last').hide();
  
  // imposta larghezza minima per le celle mono-info
  $('#OverviewBody tr[id^=TicketID] td:nth-child(-n+5)').css('white-space','nowrap').attr('width', '1%'); // prime 5 colonne
  $('#OverviewBody tr[id^=TicketID] td:nth-child(n+7) ').css('white-space','nowrap').attr('width', '1%'); // dalla 7^ colonna
  // accorcia alcune scritte
  $('#OverviewBody thead tr th.Age   a:last').text('Tempo');     // tempo trascorso
  $('#OverviewBody thead tr th.State a:last').text('St.');       // stato
  $('#OverviewBody thead tr th.Lock  a:last').text('Gestione');  // gestione
  // dai un titolo alla priorita'
  $('#OverviewBody thead tr th:eq(1) a').text('Pr.');
  //rendi leggibile il campo Tempo trascorso
  $('#OverviewBody tr[id^=TicketID] td:nth-child(5)').
    css('font-family', 'monospace').css('font-size', 'small').css('text-align', 'right').
    each(function () {
      var t = $(this).text().trim().
        replace(/ ([dhm])/g, '$1').
        replace(/ ([0-9]{1}[hm])/g, ' 0$1').
        replace(/h /, '.').
        replace(/m/, "'");
      $(this).text(t);
    });
  // eguaglia larghezza TD e TH
  $('#OverviewBody tr[id^=TicketID]:first td').each(function (i) {
    $('#OverviewBody thead tr:first th:eq('+i+')').width( $(this).outerWidth() );
  });
  
  // evidenzia area Ticket# per middle-clic
  $('#OverviewBody tr[id^=TicketID] td:nth-child(4)').css('background-color', 'orange');
  
  // avvisa se ci son tickets
  //if ($('#OverviewBody tr[id^=TicketID]').length > 0)
  //  alert('HD: ' + num_tickets + ' tickets nuovi! :O');
  window.document.title = 'T: ' +
    $('#OverviewBody tr[id^=TicketID].miei').length + '|' +
    $('#OverviewBody tr[id^=TicketID]:not(.assegnati):not(.miei)').length + '/' +
    $('#OverviewBody tr[id^=TicketID]').length;
}//if


// --- visualizzazione ticket --------------------------------------------------
if ($('#ArticleTableBody').length > 0) {
  function underscorize (str) {
    return str.trim().replace(/[^A-Z ]/ig, '').replace(/\s/g, '_');
  }//camelize
  
  function icon_tag (icon_key) {
    return '<img src="data:image/x-icon;base64,'+icons[icon_key]+'">';
  }//icon_tag
  
  // inserisci filtro per area
  var sel_area = $('<select id="sel_area"><option value="-">- Area -</option></select>').insertBefore('#DestQueueID');
  // inserisci filtro per servizio
  var sel_serv = $('<select id="sel_serv"><option value="-">- Serv -</option></select>').insertBefore('#DestQueueID').hide();
  
  $('#sel_area, #sel_serv').css('width', '5rem'); // ridimensiona filtri
  $('#DestQueueID'        ).css('width', '6rem'); // ridimensiona combo spostamento
  
  var aree = [], servizi = {};
  
  // combo spostamento: imposta classi area/servizio ad ogni option
  var cur_opt = $('#DestQueueID option:eq(1)'), cur_area = '', cur_serv = '';
  while (cur_opt.length > 0) {
    if ( cur_opt.is('[disabled][value=-]') ) {
      if ( cur_opt.text().match(/^[^\s]/) ) {             // area
        aree.push( cur_opt.text() );
        cur_area = underscorize(cur_opt.text());
        cur_opt.addClass('area area_'+cur_area);
      } else if ( cur_opt.text().match(/^\s{2}[^\s]/) ) { // servizio
        servizi[cur_area] = servizi[cur_area] || [];
        servizi[cur_area].push( cur_opt.text() );
        cur_serv = underscorize(cur_opt.text());
        cur_opt.addClass('serv area_'+cur_area+' serv_'+cur_serv);
      } else                                              // coda corrente
        ;
    } else
      cur_opt.addClass('coda area_'+cur_area+' serv_'+cur_serv);
    
    cur_opt = cur_opt.next();
  }//while
  
  // popola filtro dell'area coi valori ordinati
  $.each(
    aree.sort(function (a,b) { return a.replace(/AREA\s+/,'') > b.replace(/AREA\s+/,'') ? 1 : -1; }),
    function () {
      var i = this.toString();
      $('<option></option>').
        html(i.replace('AREA','').trim()).
        val(underscorize(i)).
        appendTo(sel_area);
    }
  );
  
  // filtra code per area
  sel_area.change(function () {
    var area = $(this).val(),
        opts = $('#DestQueueID option').hide();
    
    $('#DestQueueID').get(0).selectedIndex = 0; //opts.first().prop('selected', true);
    
    if (area == '-') {
      opts.show();
      sel_serv.hide();
    } else {
      sel_serv.show().find('option:gt(0)').remove(); // svuota filtro del servizio per il successivo popolamento
      sel_serv.get(0).selectedIndex = 0;
      
      // popola filtro del servizio coi valori ordinati
      $.each(
        servizi[area].sort(function (a,b) { return a.replace(/SERVIZIO\s+/,'') > b.replace(/SERVIZIO\s+/,'') ? 1 : -1; }),
        function () {
          var i = this.toString();
          $('<option></option>').
            html(i.replace('SERVIZIO','').trim()).
            val(underscorize(i)).
            appendTo(sel_serv);
        }
      );
      
      opts.filter('.area_'+area).show();
    }//if-else
  });
  
  // filtra code per servizio
  sel_serv.change(function () {
    var area = sel_area.val(),
        serv = $(this).val(),
        opts = $('#DestQueueID option').hide();
    
    $('#DestQueueID').get(0).selectedIndex = 0; //opts.first().prop('selected', true);
    
    if (serv == '-')
      opts.filter('.area_'+area).show();
    else
      opts.filter('.serv_'+serv).show();
  });
  
  // togli margine superiore per:
  $('.MainBox:first').css('margin-top', '-0.9rem'); // contenitore principale
  $('#ArticleTree'  ).css('margin-top',  '0.2rem'); // contenitore dei post
  
  // piccole migliorie per guadagnare spazio col titolo
  var headline      = $('div.Headline').hide(),
      title_row     = $('div.ControlRow:first'),
      ticket_status = headline.find('div.Flag').css('display', 'inline-block').css('float', 'left'),
      ticket_descr  = headline.find('h1').hide().text().trim().replace('—','&middot;').
        replace(/Ticket\#([0-9]+)/,'Ticket <span style="font-size: larger;">$1</span>'),
      tempo_descr   = title_row.find('.AdditionalInformation').hide().text().trim().
        replace('Tempo trascorso','Tempo').replace(/ +[^ ] Data di Creazione:/, ' dal');
  title_row.
    css('min-height', 'unset').
    find('h2').hide().
    after(ticket_status).
    after('<b>'+ticket_descr+'</b>').
    after('<i style="float: right">'+tempo_descr+'</span>');
  
  // gestione toggle righe di sistema
  function toggle_sys_rows () {
    $('#ArticleTableBody tbody tr[class*="system-email-"]').
      toggle( !$ls.get('prefs.hide_sys_rows', true) );
  }//toggle_sys_rows
  
  toggle_sys_rows(); // toggle alla prima visualizzazione
  
  // toggle su onclick del pulsantino che aggiorna le preferenze
  var sys_rows_class = $ls.get('prefs.hide_sys_rows', true) ? ' Active' : '';
  $('<a href="#" title="Mostra righe di sistema" class="OneArticle'+sys_rows_class+'"><i style="font-size: small">Sys</i><span>Mostra righe di sistema</span></a>').
    prependTo('.TicketList .ControlRow .ArticleView.Icons').
    click(function () {
      var hide_rows = $ls.set('prefs.hide_sys_rows', !$ls.get('prefs.hide_sys_rows', true));
      $(this).toggleClass('Active', hide_rows);
      toggle_sys_rows();
    });
  
  // ridimensiona lo scroller in modo da mostrare tutte le righe
  var rows = $('#ArticleTableBody tbody tr:visible');
  $('#ArticleTableBody div.Scroller').
    css('min-height', '3.5rem').
    height(
      parseInt($('#ArticleTableBody thead tr:visible:first').height()) +
      rows.length * parseInt(rows.filter(':first').height()) +
      3
    );
  
  // evidenzia link allegati
  $('a.Attachment').parent().
    css('border', '1px dotted red').
    css('background-color', 'orange');

  //$('#ArticleTableBody tbody tr').live('click', function () {
  //  setTimeout(extend_uris, 1000);
  //  setTimeout(extend_uris, 2000);
  //  setTimeout(extend_uris, 3000);
  //});
  setInterval(extend_uris, 1000);

  // visualizza l'ultimo messaggio
  rows.filter(':last').click();
  
  // scambia nome-cognome nella colonna "DA"
  $('#ArticleTableBody tbody tr:visible td.From').each(function () {
    $(this).text(
      $(this).text().trim().replace(/^(\w+)\s([\w\s]+)$/,"$2 $1")
    );
  });
  
  // rendi visibile il telefono
  $('p:contains(049827)').each(function () {
    var tel = $(this).text().trim().replace(/049827(.+)/, '049.827.<b style="font-size: large">$1</b>');
    $(this).html(tel);
  });
  
  // rendi visibile il telefono esterno (medicina)
  $('p:contains(049821)').each(function () {
    var tel = $(this).text().trim().replace(/049821(.+)/, '049.<b style="font-size: large">821</b>&minus;<b style="font-size: large">$1</b>');
    $(this).html(tel);
  });
  
  // rimuovi intestazioni delle widgets sulla destra
  $('div.SidebarColumn div.WidgetSimple').
    css('margin-bottom', '0').
    find('div.Header').hide();
  
  // evidenzia stato ticket
  var p_stato = $('fieldset label:contains(Stato:)').next();
  p_stato.html( '<b>'+p_stato.text().trim()+'</b>' );
  // nascondi codice cliente = email cliente (gia' presente in basso)
  $('fieldset label:contains(Codice cliente:)').hide().next().hide().next().hide();
  // evidenzia operatore
  var p_op = $('fieldset label:contains(Operatore:)').next();
  p_op.html( '<b>'+p_op.text().trim()+'</b>' );
  // rendi leggibile la coda
  var p_coda = $('fieldset label:contains(Coda:)').next(),
      //coda = p_coda.text().trim().replace(/::/g,'<hr style="border-top: 1px solid black">');
      coda = p_coda.text().trim().replace(/.*::/,'');
  p_coda.html('<div style="font-size: smaller">'+coda+'</div>' );
  // evidenzia email
  var p_email = $('fieldset label:contains(Email:)').next(),
      mail    = p_email.attr('title').trim(),
      ticket_num = $('h1:contains(Ticket#)').text().trim().replace(/^([^ ]+).+/,'$1');
  p_email.html('<a href="mailto:'+mail+'?Subject='+ticket_num+'">'+mail+'</a>' );
  if (p_coda.is('[title^=AREA DIDATTICA E SERVIZI AGLI STUDENTI]')) { // add link IDRA personale
    p_email.
      append('<br>').
      append('<a href="https://programmazione.didattica.unipd.it/persone?search='+mail+'" target="_blank"></a>').
      find('a:last').append('(vedi in '+icon_tag('idra')+')');
  }
  // merge nome e cognome
  var p_cogn = $('fieldset label:contains(Cognome:)').next();
  p_cogn.hide().prev().hide().prev().hide().prev().append( p_cogn.text().trim() );
  // rendi leggibile la sede
  var p_sede = $('fieldset label:contains(Commento:)').next();
  p_sede.text( p_sede.attr('title').trim().replace(/DIPARTIMENTO (DI|DEI)/,'DIP.') );
  
  // nascondi nome utente che e' uguale alla mail
  $('fieldset label:contains(Nome utente:)').next().andSelf().hide();
  
  // compatta fieldset info sulla destra
  $('div.Content fieldset.TableLike').css('margin-bottom', '0');
  // metti in riga i link dei tickets aperti dall'utente
  $('div.Content ul.ItemRow').css('margin-left', '0').find('li').css('display', 'inline-block');
  
  // migliora elenco collegamenti
  $('ul.Tablelike.SpacingTopSmall').each(function () {
    var ul    = $(this).css('margin-left', '0'),
        title = ul.prev().hide().text().trim();
    ul.find('li.Header').text(title);
    ul.find('li:not(.Header)').css('display', 'inline-block');
  });
  
  // aggiungi icone ai link delle azioni
  $.each(icons, function (label, data) {
    var link = $('.ActionRow ul.Actions a:contains('+label+')');
    switch (label) {
      case 'Nota':   link.text('Nota'); break;
      case 'Chiudi': link.text('Chiudi/Stato'); break;
    }//switch
    link.append(icon_tag(label));
  });
  $('#DestQueueID').after(icon_tag('coda'));
  $('.ActionRow ul.Actions').
    find('li').css('margin-right', '-1px').
    find('a').css('border', '2px outset #555').css('border-radius', '0.3rem');
  $('#DestQueueID').parents('form:first').
    css('border', '2px outset #555').css('border-radius', '0.3rem').css('padding', '0.13rem').
    find('select').css('margin', 'auto');
  $('.ActionRow img').css('vertical-align', 'text-bottom').css('margin-left', '0.2rem');
  
  // mostra storico sopra alle righe delle note
  var storico = $('<fieldset style="height: 40px; font-size: smaller; padding: 0 2px 6px 2px; border: 1px solid black; overflow-x: hidden; overflow-y: scroll;"><legend style="margin: 0 2em; padding: 0 0.5em">Storico del ticket</legend></fieldset>').
    insertBefore('#ArticleTableBody');
  $.get(
    $('a:contains(Storico)').attr('href'),
    function (resp) {
      $('#ArticleTableBody').css('border', '1px solid green');
      $(resp).find('table.DataTable:first').appendTo(storico);
      storico.find('tr').hide();
      var storico_height = storico.find('tr td:first-child').
        filter(':contains(Move), :contains(OwnerUpdate)').
        parent().show().
        length * 20;
      storico.height(storico_height > 100 ? 100 : storico_height);
      // indica se la richiesta proviene da un TEAM
      var team_row = storico.find('table tbody tr:first td[title*="TEAM"]');
      if (team_row.length != 0) {
        var team = team_row.attr('title').replace(/.+(TEAM[^;)]+).+/, '$1');
        $('<span style="background-color: red; margin-left: 1rem;">Creato in: '+team+'</span>').prependTo('.TicketList .ControlRow');
      }
    },//success
    'html'
  );
}//if


// --- cambio proprietario -----------------------------------------------------
var sel_owner = $('#NewOwnerID');
if (sel_owner.length > 0) {
  //// nascondi nomi non usati
  //sel_owner.find('option').not(
  //  ':contains([email protected]),'+
  //  ':contains([email protected])'
  //).hide()
  
  // swap nome e cognome
  sel_owner.find('option').each(function () {
    var o = $(this);
    o.text(
      o.text().trim().
        replace(/^([^ ]+) (.+)/, '$2 $1').
        replace(/\b\w/g, function(l){ return l.toUpperCase() }) // capitalize => http://stackoverflow.com/a/38530325
    );
  });
  
  // resort options
  sortSelect( sel_owner.get(0) );
  
  // imposta oggetto predefinito
  $('#NewOwnerID, #OldOwnerID').change(function () {
    $('#Subject').val(
      'per ' + $(this).find('option:selected').text().replace(/^(.: )*.+ (\w+) .+/, '$2')
    );
  
    return false;
  });
  
  // seleziona proprietario precedente
  $(':radio[value="Old"]').attr('checked', true);
  $('#OldOwnerID').change();
  
  // testo predefinito
  $('#RichText').
    val('fatto').
    bind('focus', function () { $(this).select(); }); // seleziona tutto onfocus
}//if

// -----------------------------------------------------------------------------
});})(jQuery);