var syncer = function () { //TODO: some of the public 'that' functions are actually private, no 'that' needed var that = this; var controllers = new Array(); var mediaTime; //set defaults that setters can overwrite var interval = 1000; var syncMediaImpl; var recurse = true; var maxRecurse = 0; var recurseCount = -1; that.stopRecurse = function (){ recurse = false; } that.setMaxRecurse = function (madMax){ maxRecurse = madMax; } that.main = function (){ runSync(); recurseCount++; if ( recurse && (recurseCount <= maxRecurse) || (maxRecurse < 0)){ setTimeout(that.main, interval) } } runSync = function (){ mediaTime = syncMediaImpl.getTimeCode(); runControllers(); } setNewTime = function (newTime){ syncMediaImpl.setTimeCode(newTime); mediaTime = syncMediaImpl.getTimeCode(); } that.setInterval = function (new_interval){ interval = new_interval; } that.getInterval = function (){ return interval; } that.setSyncMediaImpl = function(mediaAccessObject){ syncMediaImpl = mediaAccessObject; } that.addController = function (controller){ //TODO check for duplicates controllers.push(controller); return controllers.length; } that.insertController = function (controller, index){ controllers.splice(index, 0, controller); } that.removeController = function (index){ //TODO to keep sparseness in check if(length > ARBITRARY_NUMBER)rewrite array controllers.splice(index, 1); } that.getControllers = function (){ return controllers; } runControllers = function (){ //http://stackoverflow.com/questions/500504/javascript-for-in-with-arrays //for..in isn't guaranteed to preserve element ordering for(i=0;i