NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name ArcSoft Project Management // @version 18 // @author maxint <NOT_SPAM_lnychina@gmail.com> // @namespace http://maxint.github.io // @description An enhancement for Arcsoft project management system in http://doc-server // @include http://doc-server/* // @include https://doc-server/* // @include http://hz-delivery/ImageTECH/* // @updateURL https://raw.githubusercontent.com/maxint/userjs/master/docserver/doc-server-project-ms.user.js // @downloadURL https://raw.githubusercontent.com/maxint/userjs/master/docserver/doc-server-project-ms.user.js // @grant none // @Note // v18 // - Remove "Small Delivery" button. // // v17 // - Add "Delvery" and "Small Delivery" buttons to project table. // // v16 // - Add delivery package selection in "Delivery"" page. // // v15 // - Fix bug of un-selected project id. // - Confirm project id input by space. // // v14 // - Save project data individually in "Release" page and new data copies from old one when first time access. // // v13 // - Do not "Invert Rows" by default. // - Confirm project id's by period when input. // // v12 // - Add "Show Release To" button to show names of "release to" projects. // // v11 // - Disable the target onchange event and select the last target by default // in http://doc-server/HRInfo/TrainingSpace/FeedbackEdit.asp. // // v10 // - Fix bug of loading failed in 360 browser. // // v9 // - Lazy load jQuery UI when really needed. // - Fix bug: unable to delete ID. // // v8 // - Add "Version Format" setting dialog. // // v7 // - Fix bug of using "for in" loop for Array. // - Filter empty package path. // // v6 // - Fix bug of Object.keys() in Chrome. // // v5 // - Fix bug of no response in Firefox. // - Sort project Ids. // // v4 // - Fix bug of wrong id in Chrome. // // v3 // - Update id checkboxes w.r.t. keyboard input. // - Sort project id rows w.r.t. checked statuses. // - Add input project id automatically. // // v2 // - Fix bug of pause when multiple delivery packages. // - Add checkboxes to project id table. // // v1 // - Add support for delivery multiple packages to multiple projects at one time. // // v0.0.9 // - Add https support. // - Add "Release" column to "/index2014/Engineering/index.asp" page. // // v0.0.8 // - Add partial auto fill support for "Edit" window. // - Add message alert when flushing project IDs. // - Fix bug of "Invert Rows" caused by web page update. // // v0.0.7 // - Update @updateURL and @downloadURL. // - Add support for "Edit" in "Add Release Page". // // v0.0.6 // - Fix bug of date format. // // v0.0.5 // - Login page: login when press <Enter> in password input. // // v0.0.4 // - Add management of "Related Projects". // // v0.0.3 // - Add "Invert Rows" button to "Release List" page. // // v0.0.2 // - Auto save data in "Add Rlease" form. // // v0.0.1 // - 首页 | “项目” 导航到 “项目跟踪” // - “项目跟踪”页面添加 "Release" // - "Add Release Package" 窗口: // * 自动填写日期 // * 根据Release Package填写Version // * 自动查询Related Project名称 // // ==/UserScript== // a function that loads jQuery and calls a callback function when jQuery has finished loading ; (function (callback, safe) { "use strict"; var callback2 = function (jQuery_old, jQuery) { //Firefox supports console.log('[I] Using jquery ' + jQuery().jquery); console.log('[I] Runing custom script'); callback(jQuery_old, jQuery, typeof(unsafeWindow) === "undefined" ? window : unsafeWindow); }; if (typeof(jQuery) === "undefined" || jQuery.jquery !== '2.1.1') { var script = document.createElement("script"); script.type = "text/javascript"; script.src = "//apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"; if (safe) { var cb = document.createElement("script"); cb.type = "text/javascript"; cb.textContent = "var jq = jQuery.noConflict();(" + callback.toString() + ")($, jq, window);"; script.addEventListener('load', function() { document.head.appendChild(cb); }); } else { script.addEventListener('load', function () { var jq = jQuery.noConflict(); callback2($, jq); }); } document.head.appendChild(script); } else { setTimeout(function () { callback2(jQuery, jQuery); }, 30); } })(function (jq, $, window) { "use strict"; // helper functions // local storage var IStorage = function (prefix) { var db = window.localStorage; var pref = prefix + '.'; var addpref = function (key) { return pref + key; }; var nameRegExp = new RegExp('^' + prefix + '\\.' + '(.+)$'); this.prefix = prefix; this.get = function (key, def) { var val = db.getItem(addpref(key)); if (val !== null) { return val; } else { return def || null; } }; this.set = function (key, val) { db.setItem(addpref(key), val); }; this.remove = function (key) { db.removeItem(addpref(key)); }; this.clear = function () { var names = this.getNames(); console.log('[W] Remove all objects in "' + this.prefix + '" storage: ' + names); for (var i = 0; i < names.length; ++i) { this.remove(names[i]); } }; this.flush = function () { db.clear(); }; this.getObject = function (key, def) { var val = this.get(key); return val ? JSON.parse(val) : (def || null); }; this.setObject = function (key, val) { this.set(key, JSON.stringify(val)); }; this.getNames = function () { var names = []; var n = db.length; //console.log(nameRegExp); for (var i = 0; i < n; ++i) { var m = nameRegExp.exec(db.key(i)); if (m === null || m.length === 1) { //console.log(' ~ ' + db.key(i) + '|'); continue; } names.push(m[1]); } return names; }; this.copyFrom = function (istore) { var names = this.getNames(); console.log('[I] Object names in "' + this.prefix + '" storage: ' + names); if (names.length > 0) return; names = istore.getNames(); console.log('[W] Copy data from "' + istore.prefix + '" storage: ' + names); for (var i=0; i < names.length; ++i) { var n = names[i]; var v = istore.get(n); console.log('[W] - ' + n + ': ' + v); this.set(n, v); } return true; }; }; // assert function function assert(condition, message) { if (!condition) { throw message || "Assertion failed"; } } // replace main menu [Project] function redirectToProjectListPage(obj) { obj.prop('href', '/projectManage/ProjectList.asp'); } redirectToProjectListPage($('li#mainMenuItem_150000 a')); // add "Release" column in second row of table function addReleaseToTable(table) { var trs = table.find('tbody tr'); trs.first().find('th:nth-child(2)').after('<th>Operations</th>'); trs.nextAll().each(function () { let id = $(this).find('td:first a:first').text(); let rlsUrl = 'http://doc-server/projectManage/ProjectOther/ReleaseList.asp?proj_id=' + id; let dlrUrl = 'http://doc-server/projectManage/ProjectDelivery/delivery_phase_plan.asp?keyid=0&status=20&projid=' + id; let link = '<a title="Release" href="' + rlsUrl + '">R</a>'; link += ' / <a title="Delivery" href="' + dlrUrl + '">D</a>'; $(this).find('td:nth-child(2)').after('<td>' + link + '</td>'); }); } // fill input values function fillValues(key_id_pairs, istore) { for (var key in key_id_pairs) { if (key_id_pairs.hasOwnProperty(key)) { var elem = key_id_pairs[key]; if (!elem.val()) elem.val(istore.get(key, '')); } } } // save input values function storeValues(key_id_pairs, istore) { for (var key in key_id_pairs) { if (key_id_pairs.hasOwnProperty(key)) { istore.set(key, key_id_pairs[key].val()); } } } // check id function checkID(id) { return /^\d{4,5}$/.test(id); } // query id function queryID(id, callback) { var url = '../ProjectDelivery/delivery_releated_project_list.asp'; $.get(url, {projid: id}, function (data, status) { var name = $(data).find('td:nth-child(2)').text(); if (status == 'success' && name !== "" && callback) { var proj_status = $(data).find('td:nth-child(3)').text(); callback(id, name, proj_status); } else { callback(id); } }); } // get parameter by name from URL function getParameterByName(url, name, def) { name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); let regex = new RegExp("[\\?&]" + name + "=([^&#]*)"); let results = regex.exec(url); return results === null ? def : decodeURIComponent(results[1].replace(/\+/g, " ")); } // float contact window function createFloatContactWindow() { console.log('[I] Create float contact window'); let floatDiv = $('<div id="floatContactDiv"><div>author: maxint</div><div>skype: <a href="skype:maxint_5?add">maxint_5</a></div></div>').css({ "position": 'absolute', "background": "white", "margin": "50px 20px", "padding": "10px", }); $('body').append(floatDiv); $(window).scroll(function () { let pos = $(document).scrollTop() + "px"; $('#floatContactDiv').animate({top: pos}, {duration: 1000, queue: false}); }); } /////////////////////////////////////////////////////////////////////////// // page routines if (window.location.hostname == 'hz-delivery') { console.log('[I] Open hz-delivery page'); let is_reformat = getParameterByName(window.location.search, 'reformat'); if (is_reformat == null) return; let pre_object = $('body > pre'); let html = pre_object.html(); let lines = html.split('<br>'); let item_pattern = /(\d{4})\/(\d{1,2})\/(\d{1,2})\s+(\d{1,2}):(\d{1,2})\s+(\d+)\s+<a href="([^"]+)">([^<]+)/; let items = []; for (let i = 0; i < lines.length; ++i) { let line = lines[i].trim(); if (line.length == 0) { continue; } let m = item_pattern.exec(line); //console.log(line); if (m !== null && /\.(zip|ZIP)$/.test(m[8])) { // only add ZIP files items.push({ date: new Date(m[1], m[2], m[3], m[4], m[5]), size: parseInt(m[6]), name: m[8], url: m[7], }); } } // sort by date in descending order items.sort(function(lhs, rhs) { return lhs.date < rhs.date; }); let max_count = Math.min(items.length, getParameterByName(window.location.search, 'max_count', 8)); let new_html = '<form>'; for (let i = 0; i < max_count; ++i) { let item = items[i]; new_html += '<input type="radio" name="package" id="' + item.name + '">' + item.name + '<br>'; } new_html += '</form>'; $('hr').remove(); $('h1').remove(); pre_object.html(new_html); $(':radio:first').prop('checked', true); $(':radio').click(function() { //console.log(this); //console.log(window.parent); window.parent.postMessage(this.id, '*'); }); window.addEventListener("message", function(e) { console.log(e); }, false); return; } // operate w.r.t. sub path var subpath = window.location.pathname; if (subpath == '/login.asp') { $('input#password').keyup(function (e) { if (e.which == 13) { $('input[value="Login"]').click(); } }); } else if (subpath == '/index2014/index.asp') { console.log('[I] Open new home page'); redirectToProjectListPage($('div#headerTopDiv div a:nth-child(2)')); } else if (subpath == '/projectManage/ProjectList.asp') { console.log('[I] Open ProjectList page'); addReleaseToTable($('table.ListTable')); } else if (subpath == '/index2014/Engineering/index.asp') { console.log('[I] Open Engineering page'); addReleaseToTable($('#workspace table:first')); } else if (subpath == '/projectManage/ProjectDelivery/delivery_plan.asp') { var d = new Date(); $('input#DeliverDate').val(d.getFullYear() + '-' + (d.getMonth()+1) + '-' + d.getDate()); } else if (subpath == '/projectManage/ProjectDelivery/delivery_codingreport.asp' || subpath == '/projectManage/ProjectDelivery/delivery_codingreport_update.asp') { console.log('[I] Open delivery page'); var id = $('#projectid').val(); var istore = new IStorage('project#' + id); var key_id_pairs = { 'svn_path': $('input#SourceCodePath'), 'last_tag': $('input#SOSLabel'), 'hzpm_notes': $('textarea#hzpm_notes'), }; fillValues(key_id_pairs, istore); $(window).unload(function () { console.log('[I] Window unload'); storeValues(key_id_pairs, istore); }); // replace delivery URL let delivery_href_a = $('#act_hzdelivery + a'); let delivery_url = delivery_href_a.attr('href'); let delivery_new_url = 'http:' + delivery_url.replace(/\\/g, '/'); delivery_href_a.attr('href', delivery_new_url); delivery_new_url = delivery_new_url + '?reformat=1'; let delivery_frame = $('<iframe id="delivery_page" src="' + delivery_new_url + '"></iframe>').css({ 'width': '100%', 'height': '100%', 'border': '0' }); $('#table4').append(delivery_frame); window.addEventListener("message", function(e) { //console.log(e); if (e.origin === 'http://hz-delivery') { $('input#file_name').val(e.data); } }, false); setTimeout(function() { delivery_frame[0].contentWindow.postMessage('message from doc-server', '*'); }, 1000); } else if (subpath == '/projectManage/ProjectOther/ReleaseList.asp') { console.log('[I] Open ReleaseList page'); //createFloatContactWindow(); if (window.location.protocol == 'https:') { console.log('[W] Redirecting to http ...'); window.location.replace(window.location.href.replace('https://', 'http://')); return; } // invert table row $('<input type="button" value="Invert Rows"/>').insertBefore($("input[type='button']")).click(function () { $('table.ListTable tbody').each(function (index, elem) { var arr = $.makeArray($("tr", this).detach()); var th = arr.shift(); arr.reverse(); arr.unshift(th); $(this).append(arr); }); }); // show release to $('<input type="button" value="Show Release To"/>').insertBefore($("input[type='button']").first()).click(function (){ this.disabled = true; $('table.ListTable tbody tr.status_1 td:nth-child(4)').each(function (index, elem) { var a = elem.getElementsByTagName('a')[0]; var id = a.innerHTML; queryID(id, function (id, name, proj_status) { a.innerHTML = name + ' (' + id + ')'; }); }); }); } else if (subpath == '/projectManage/ProjectOther/addRelease.asp') { var proj_id = /\?proj_id=(\d{4,5})/.exec(window.location.href)[1]; console.log('[I] Open addRelease page with project id: ' + proj_id); var istore = new IStorage('addRelease#' + proj_id); // copy old data //console.log(window.localStorage);istore.clear(); istore.copyFrom(new IStorage('addRelease')); // related project IDs var IDManager = function (db) { var storeid = 'IDs'; var idb = db; var cb = function () {}; this.data = {}; this.load = function () { this.data = idb.getObject(storeid, {}); cb(this.data); return this; }; this.save = function () { idb.setObject(storeid, this.data); return this; }; this.contains = function (id) { return id in this.data; }; this.add = function (id, name) { assert(checkID(id)); if (!this.contains(id)) { this.data[id] = {name: name}; cb(this.data); } return this; }; this.set = function (id, name) { if (this.contains(id)) { this.data[id] = {name: name}; } return this; }; this.remove = function (id) { if (this.contains(id)) { delete this.data[id]; cb(this.data); } return this; }; this.clear = function (id) { if (this.data) { this.data = {}; cb(this.data); } return this; }; this.change = function (callback) { var oldcb = cb; cb = function (data) { oldcb(data); callback(data); }; return this; }; this.check = function (id, callback) { if (checkID(id)) { queryID(id, callback); } else { callback(); } return this; }; }; var idmgr = new IDManager(istore); if (window.location.search.indexOf('IdentityID=') == -1) { // date var d = new Date(); $('input#txtDate').val(d.getFullYear() + '/' + (d.getMonth()+1) + '/' + d.getDate()); // create packages textarea var packagesTextArea = $('<textarea id="txtDeliveryPackages"></textarea>').css({ 'width': '100%', 'height': '80px', }); $('input#txtDeliveryPackage').hide().siblings('input').hide().last().after(packagesTextArea); packagesTextArea.next().each(function () { $(this).html('请输入递交包文件名,支持多个文件一起提交,每行一个文件名。'); }); // fill previous data var key_id_pairs = { 'version': $("input[name='txtVersion']"), 'releasepath': $('input#txtReleasePath'), 'package': $('input#txtDeliveryPackage'), 'packages': $('textarea#txtDeliveryPackages'), 'relatedProjectID': $("input[name='txtReleaseReleatedProject']"), 'note': $('textarea#txtNotes'), }; fillValues(key_id_pairs, istore); // save result before close window $(window).unload(function () { console.log('[I] Window closing'); storeValues(key_id_pairs, istore); idmgr.save(); }); // submit $('#btnSubmit').removeAttr('onclick').click(function () { // check form console.log('[I] Checking form ...'); if (!(function () { if ($("#txtReleaseType").val() == "1") { //先进行校验是否填写了相关项目,如果填写了,同时校验规则 是否正确. var selected = $("#txtReleaseReleatedProject").val(); if (selected === "") { alert("项目号格式不能为空"); $("#txtReleaseReleatedProject").focus(); return false; } else { /* 检验是否符合输入规则.*/ if (!selected.split(',').every(checkID)) { $("#txtReleaseReleatedProject").focus(); alert("项目号格式不对"); return false; } return true; } } })()) return; var pkgs = packagesTextArea.val().split('\n').map(function (s) { return s.trim(); }).filter(function (s) { return s !== ''; }); for (var i = 0; i < pkgs.length; ++i) { var pkg = pkgs[i]; $('input#txtReleasePath,input#txtDeliveryPackage').val(pkg); if (!jq('#form1').valid()) { alert('提交包列表格式不对'); return; } } // disable the form to avoid user interaction when subcomt $(this).prop('disabled', true); // submit for (var i = 0; i < pkgs.length; ++i) { var pkg = pkgs[i]; console.log('[I] Submitting "' + pkg + '" ...'); $('input#txtReleasePath,input#txtDeliveryPackage').val(pkg); var qstr = jq('#form1').formSerialize(); $.post('/projectManage/Ajax/AjaxSubmitProjectRelease.asp', qstr, function (data) { if (data != "success") alert(data); }); } alert("提交成功"); parent.document.location.reload(); }); } // update version var default_version_fmt = '${major}.${minor}.${platform}.${build}'; var pkgInputs = $('#txtDeliveryPackage,#txtDeliveryPackages').change(function () { var val = this.value; var vers = /(\d+)\.(\d+)\.(\d+)\.(\d+)/g.exec(val); if (vers === null) { vers = /(\d+)\.(\d+)\.(\d+)/g.exec(val); if (vers) vers.splice(3, '0'); } if (vers) { var vstr = istore.get('version.format', default_version_fmt) || ''; vstr = vstr.replace('${major}', vers[1]); vstr = vstr.replace('${minor}', vers[2]); vstr = vstr.replace('${platform}', vers[3]); vstr = vstr.replace('${build}', vers[4]); console.log('[I] Current version format: ' + vstr); $("input[name='txtVersion']").val(vstr); } }).css({ 'width': '100%', }).change(); $('<input type="button" value="Version Format"/>').appendTo($("input[name='txtVersion']").parent()).click(function () { if ($('#version-format-dialog').length === 0) { var fmt = istore.get('version.format', default_version_fmt); $('<div id="version-format-dialog" title="设置版本格式">' + ' <p class="validateTips">可用的变量:${major}, ${minor}, ${platform}, ${build}</p>' + ' <form>' + ' <fieldset>' + ' <label for="name">格式</label>' + ' <input type="text" name="format" id="format" class="text ui-widget-content ui-corner-all">' + ' </fieldset>' + ' </form>' + '</div>').appendTo(document.body).find('input#format').css({ 'width': '300', }).val(fmt); } var showDialog = function() { $('#version-format-dialog').dialog({ autoOpen: true, width: 400, modal: true, buttons: { '默认': function() { format.value = default_version_fmt; istore.set('version.format', default_version_fmt); }, '确定': function() { if (format.value != fmt) { console.log('[I] Set version format to: ' + format.value); istore.set('version.format', format.value); pkgInputs.change(); } $(this).dialog('close'); }, '关闭': function() { $(this).dialog('close'); } } }); }; if ($.ui) { showDialog(); } else { $("head").append('<link rel="stylesheet" href="//apps.bdimg.com/libs/jqueryui/1.10.4/css/jquery-ui.min.css">'); $.getScript("//apps.bdimg.com/libs/jqueryui/1.10.4/jquery-ui.min.js", showDialog); } }); // release package $('input#txtReleasePath').css({ 'width': '100%', }); // related project table $(function () { var table = $('<table>' + '<thead><tr style="width:10px">' + '<td><input id="selectAllIDs" type="checkbox"></td><td style="width:40px">ID</td><td>Name</td><td style="width:60px">Operation</td>' + '</tr></thead>' + '<tbody></tbody>' + '<tfoot>' + '<tr><td/>' + '<td><input id="inputID" type="text" maxlength="4" size="4"/></td>' + '<td id="inputIDtxt" class="projIdName">Clicking "Add" to add item</td>' + '<td><input id="addID" type="button" value="Add" disabled="true"/></td></tr>' + '<tr><td/><td/><td>Clear all saved project IDs</td>' + '<td><input id="flushIDs" type="button" value="Flush"/></td></tr>' + '</tfoot>' + '</table>').css({ width: '100%' }); $('input#btnCheckReleatedProject').after('<div class="info">多个项目号以逗号分隔,当手动输入时以空格或句号结尾。</div>').next().next().after(table); // update check states of check boxes var updateCheckBoxes = function() { var checked = table.find('tbody input:checked').length; var total = table.find('tbody input:checkbox').length; table.find('input#selectAllIDs').each(function () { this.indeterminate = checked != total && checked !== 0; if (!this.indeterminate) this.checked = checked == total && total !== 0; }); }; var selectRelatedProjects = function(s) { var selected = s.trim().split(','); var obj = $("input[name='txtReleaseReleatedProject']"); if (s.length === 0 || selected.every(checkID)) { console.log('[I] Selected project IDs: ' + selected); $(':checkbox', table).prop('checked', false); for (var i=0; i < selected.length; ++i) { var id = selected[i]; if (!idmgr.contains(id)) { idmgr.check(id, function (id, name) { if (name) { idmgr.add(id, name); } }); } $('#proj_' + id + ' :checkbox', table).prop('checked', true); } // move checked IDs to the front if (selected.length !== 0) $('tbody input:checked', table).parent().parent().detach().prependTo($('tbody', table)); updateCheckBoxes(); obj.css({ 'background-color': 'transparent' }); } else { obj.css({ 'background-color': "#FAA" }); } }; // detete id input box var projectIdInput = $("input[name='txtReleaseReleatedProject']").keyup(function () { var s = this.value.replace(/^\s+/, ''); // left trim if (s.length > 0) { var ch = s[s.length-1]; if (ch !== '.' && ch !== ' ') return; s = s.substr(0, s.length-1); this.value = s; } selectRelatedProjects(s); }); idmgr.change(function (data) { table.find('tbody').each(function () { $(this).empty(); // insert items var keys = Object.keys(data); keys.sort(); for (var i in keys) { var id = keys[i]; if (checkID(id)) { var val = data[id]; $('<tr id=proj_' + id + '>' + '<td><input type="checkbox"></td>' + '<td>' + id + '</td>' + '<td class="projIdName">' + val.name + '</td>' + '<td><input id="delID" type="button" value="Del"/></td></tr>').appendTo($(this)); } } selectRelatedProjects(projectIdInput.val()); }); }).load(); table.find('tbody').delegate('input#delID', 'click', function () { var id = $(this).parent().prev().prev().text(); console.log('[I] Delete project ID: ' + id); // remove id from selected input var selected = projectIdInput.val().trim().split(',').remove(id); projectIdInput.val(selected.join(',')); idmgr.remove(id); }); table.delegate(':checkbox', 'click', function() { var ids = []; table.find('tbody input:checked').parent().next().each(function() { ids.push($(this).text()); }); projectIdInput.val(ids.join(',')); updateCheckBoxes(); }).delegate('td.projIdName', 'click', function () { if ($(this).find('input').length) return; var oldval = $(this).text(); $(this).addClass('cellEditing'); $(this).empty(); var input = $('<input type="text"/>').val(oldval); input.appendTo($(this)).focus().keypress(function (e) { if (e.which == 13) { // enter var id = $(this).parent().prev().text(); var newval = $(this).val(); $(this).parent().text(newval); idmgr.set(id, newval); } }).blur(function () { $(this).parent().text(oldval); }).css({ width: '100%', }); }).find('input#selectAllIDs').click(function () { table.find(':checkbox').prop('checked', this.checked); }); table.find('tfoot').delegate('input#inputID', 'keyup', function (e) { var addButton = $('input#addID', table); if (e.which == 13 && !addButton.prop('disabled')) { addButton.click(); return; } idmgr.check(this.value, function (name) { table.find('td#inputIDtxt').html(name || '<font color="#FF0000">[Invalid project id]</font>'); addButton.prop('disabled', name === undefined); }); }).delegate('input#addID', 'click', function () { var id = table.find('input#inputID').val(); var name = table.find('td#inputIDtxt').text(); console.log('[I] Add project: ' + id +', ' + name); idmgr.add(id, name); }).delegate('input#flushIDs', 'click', function () { if (confirm('Delete all project IDs?')) { idmgr.clear(); } }); }); // notes $('textarea#txtNotes').css({ width: '100%', height: '80px', }); } else if (subpath == '/HRInfo/TrainingSpace/FeedbackEdit.asp') { // save all form data $('form select#Target').removeAttr('onchange').find('option:last').attr('selected', 'selected'); console.log('[I] Select the last option and remove onchange event of forms'); } }, true); // vim: ts=4 sts=4 sw=4 et