/********************************************************************* autolock.js Ticket locking utility...loaded only when ticket locking is enabled!! Mainly useful for renewing locks based on form activity since we do initial lock onview at PHP end. It is work in process...feedback is welcomed! Peter Rotich Copyright (c) 2006-2010 osTicket http://www.osticket.com Released under the GNU General Public License WITHOUT ANY WARRANTY. See LICENSE.TXT for details. vim: expandtab sw=4 ts=4 sts=4: $Id: $ **********************************************************************/ var autoLock = { addEvent: function(elm, evType, fn, useCapture) { if(elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true; }else if(elm.attachEvent) { return elm.attachEvent('on' + evType, fn); }else{ elm['on' + evType] = fn; } }, removeEvent: function(elm, evType, fn, useCapture) { if(elm.removeEventListener) { elm.removeEventListener(evType, fn, useCapture); return true; }else if(elm.detachEvent) { return elm.detachEvent('on' + evType, fn); }else { elm['on' + evType] = null; } }, //Incoming event... handleEvent: function(e) { if(!autoLock.lockId) { var now = new Date().getTime(); //Retry every 5 seconds?? if(autoLock.retry && (!autoLock.lastattemptTime || (now-autoLock.lastattemptTime)>5000)) { autoLock.acquireLock(e,autoLock.warn); autoLock.lastattemptTime=new Date().getTime(); } }else{ autoLock.renewLock(e); } if(!autoLock.lasteventTime) //I hate nav away warnings..but autoLock.addEvent(window,'beforeunload',autoLock.discardWarning,true); autoLock.lasteventTime=new Date().getTime(); }, //Watch activity on individual form. watchForm: function(fObj,fn) { if(!fObj || !fObj.length) return; //Watch onSubmit event on the form. autoLock.addEvent(fObj,'submit',autoLock.onSubmit,true); //Watch activity on text + textareas + select fields. for (var i=0; i=(autoLock.renewFreq*1000)){ Http.get({ url: "ajax.php?api=tickets&f=renewLock&id="+autoLock.lockId+'&tid='+autoLock.tid, callback: autoLock.setLock },['renew',autoLock.warn]); } }, releaseLock: function(e) { if(!autoLock.tid) { return false; } Http.get({ url: "ajax.php?api=tickets&f=releaseLock&id="+autoLock.lockId+'&tid='+autoLock.tid, callback: function (resp){ alert(resp);} }); }, setLock: function(reply,action,warn) { var warn = warn || false; if(reply.status == Http.Status.OK && reply.responseText) { var lock = eval('('+reply.responseText+')'); if(lock.id) { autoLock.renewFreq=lock.time?(lock.time/2):30; autoLock.lastcheckTime=new Date().getTime(); } autoLock.lockId=lock.id; //overwrite the lockid. switch(action){ case 'renew': if(!lock.id && lock.retry) { autoLock.lockAttempts=1; //reset retries. autoLock.acquireLock(e,false); //We lost the lock?? ..try to re acquire now. } break; case 'acquire': if(!lock.id) { autoLock.lockAttempts++; if(warn && (!lock.retry || autoLock.lockAttempts>=autoLock.maxattempts)) { autoLock.retry=false; alert('Unable to lock the ticket. Someone else could be working on the same ticket.'); } } break; } } }, discardWarning: function(e) { e.returnValue="Any changes or info you've entered will be discarded!"; }, //TODO: Monitor events and elapsed time and warn user when the lock is about to expire. monitorEvents: function() { // warn user when lock is about to expire??; //autoLock.resetTimer(); }, clearTimer: function() { clearTimeout(autoLock.timerId); }, resetTimer: function() { clearTimeout(autoLock.timerId); autoLock.timerId=setTimeout(function () { autoLock.monitorEvents() },30000); } } //Register ticket locking init on load! autoLock.addEvent(window, 'load', autoLock.Init, false);