/* OxJS 0.1.3905 (c) 2023 0x2620, dual-licensed GPL/MIT, see https://oxjs.org for details */'use strict';Ox.AnnotationFolder=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({clickLink:null,collapsed:false,editable:false,highlight:'',highlightAnnotations:'none',id:'','in':0,item:'',items:[],keyboard:'',languages:'all',out:0,position:0,range:'all',selected:'',separator:';',showInfo:false,showWidget:false,sort:'position',translate:false,title:'',type:'text',users:'all',widgetSize:256,width:0}).options(options||{}).update(function(key,value){if(key=='highlight'){self.$annotations.options({highlight:value});} if(key=='highlightAnnotations'){self.$annotations.options({highlightGroup:value});updateAnnotations();} if(['in','out'].indexOf(key)>-1&&self.editing){var item=Ox.getObjectById(self.options.items,self.options.selected);if(item){item[key]=value;item.duration=self.options.out-self.options['in'];} self.points=getPoints();} if(key=='in'){self.options.range=='selection'&&updateAnnotations();}else if(key=='out'){self.options.range=='selection'&&updateAnnotations();}else if(key=='position'){if(self.options.range=='position'){crossesPoint()&&updateAnnotations();self.position=self.options.position;}}else if(key=='collapsed'){self.options.collapsed=!self.options.collapsed;self.$panel.options({collapsed:!self.options.collapsed});self.options.type=='event'&&self.$calendar.resizeCalendar() self.options.type=='map'&&self.$map.resizeMap()}else if(key=='languages'){updateAnnotations();}else if(key=='range'){updateAnnotations();self.$annotations.options({placeholder:getPlaceholder()});}else if(key=='selected'){if(value===''){self.editing=false;} if(value&&self.options.collapsed){self.$panel.options({animate:false});self.$panel.options({collapsed:false});self.$panel.options({animate:true});} self.$annotations.options({selected:value});}else if(key=='sort'){self.sort=getSort();self.$annotations.options({sort:self.sort});showWarnings();}else if(key=='users'){updateAnnotations();}else if(key=='width'){if(self.widget){self.$outer.options({width:self.options.width});self.$inner.options({width:self.options.width});self.$widget.options({width:self.options.width});} self.$annotations.options({width:self.options.type=='text'?self.options.width+8:self.options.width});}});if(self.options.selected){self.options.collapsed=false;} self.annotations=getAnnotations();self.points=getPoints();self.position=self.options.position;self.sort=getSort();self.widget=self.options.type=='event'?'Calendar':self.options.type=='place'?'Map':'';self.$addButton=Ox.Button({id:'add',style:'symbol',title:'add',tooltip:Ox._('Add {0}',[self.options.item]) +(self.options.keyboard?' ['+self.options.keyboard+']':''),type:'image'}).bindEvent({click:function(){that.triggerEvent('add',{value:''});}});self.$infoButton=Ox.Button({style:'symbol',title:'info',type:'image'}).bindEvent({click:function(){that.triggerEvent('info');}});self.$panel=Ox.CollapsePanel({collapsed:self.options.collapsed,extras:[self.options.editable?self.$addButton:self.$infoButton],size:16,title:self.options.title}).addClass('OxAnnotationFolder').bindEvent({toggle:toggleLayer});that.setElement(self.$panel);that.$content=self.$panel.$content;if(self.widget){self.widgetSize=self.options.showWidget*self.options.widgetSize;self.$outer=Ox.Element().css({display:'table-cell',width:self.options.width+'px'}).appendTo(that.$content);self.$inner=Ox.Element().css({height:self.widgetSize+'px',overflow:'hidden'}).appendTo(self.$outer);if(options.type=='event'){self.$widget=self.$calendar=Ox.Calendar({events:getEvents(),height:self.widgetSize,showZoombar:true,width:self.options.width,zoomOnlyWhenFocused:true}).css({width:self.options.width+'px',height:self.widgetSize+'px'}).bindEvent({select:function(data){if(!data.id&&self.options.selected&&isDefined(Ox.getObjectById(self.options.items,self.options.selected))){self.$annotations.options({selected:''});}else if(data.annotationIds&&data.annotationIds.indexOf(self.options.selected)==-1){self.$annotations.options({selected:data.annotationIds[0]});}}}).appendTo(self.$inner);}else{self.$widget=self.$map=Ox.Map({places:getPlaces(),showTypes:true,zoombar:true,zoomOnlyWhenFocused:true}).css({width:self.options.width+'px',height:self.widgetSize+'px'}).bindEvent({select:function(data){if((!data||!data.id)&&self.options.selected&&isDefined(Ox.getObjectById(self.options.items,self.options.selected))){self.$annotations.options({selected:''});}else if(data&&data.annotationIds&&data.annotationIds.indexOf(self.options.selected)==-1){self.$annotations.options({selected:data.annotationIds[0]});}}}).appendTo(self.$inner);} self.$resizebar=Ox.Element({tooltip:Ox._('Drag to resize or click to toggle map')}).addClass('OxResizebar OxHorizontal').css({position:'absolute',top:self.widgetSize+'px',cursor:'ns-resize'}).append($('
').addClass('OxSpace')).append($('
').addClass('OxLine')).append($('
').addClass('OxSpace')).bindEvent({anyclick:toggleWidget,dragstart:dragstart,drag:drag,dragend:dragend}).appendTo(self.$outer);} self.$annotations=Ox.ArrayEditable(Ox.extend({clickLink:self.options.clickLink,editable:self.options.editable,getSortValue:self.options.type=='text'?function(value){return Ox.stripTags(value);}:null,globalAttributes:['data','lang'],highlight:self.options.translate?Ox._(self.options.highlight):self.options.highlight,highlightGroup:self.options.highlightAnnotations,placeholder:Ox._('Loading...'),separator:self.options.separator,sort:self.sort,submitOnBlur:false,tooltipText:self.options.showInfo?function(item){return Ox.encodeHTMLEntities(item.user)+', ' +Ox.formatDate(item.modified.slice(0,10),'%B %e, %Y');}:'',width:self.options.width,maxHeight:self.options.type=='text'?Infinity:void 0,type:self.options.type=='text'?'textarea':'input'},self.options.autocomplete?{autocomplete:function(value,callback){self.options.autocomplete(self.options.id,value,callback);},autocompleteReplace:self.options.type=='entity',autocompleteSelect:true,autocompleteSelectHighlight:true,autocompleteSelectMaxWidth:256,autocompleteSelectOffset:{left:0,top:0},autocompleteSelectUpdate:true,format:self.options.translate?function(value){return Ox._(value);}:null,unformat:function(value){return Ox.decodeHTMLEntities(Ox.stripTags(value));}}:{})).bindEvent({add:function(data){if(self.editing){} that.triggerEvent('add',{value:data.value||''});},blur:function(data){if(data&&data.id&&data.id[0]=='_'){changeAnnotation(data);that.triggerEvent('blur');}else{that.triggerEvent('blur');}},change:changeAnnotation,'delete':removeAnnotation,edit:function(){self.editing=true;that.triggerEvent('edit');},insert:function(data){that.triggerEvent('insert',data);},open:function(){that.triggerEvent('open');},select:selectAnnotation,selectnext:function(){that.triggerEvent('selectnext');},selectprevious:function(){that.triggerEvent('selectprevious');},selectnone:function(){that.triggerEvent('selectnone');},submit:submitAnnotation}).appendTo(['event','place'].indexOf(self.options.type)>-1?self.$outer:that.$content);['0','1','2','3','4','5','6','7','8','9','b','backslash','closebracket','comma','dot','equal','e','f','g','h','i','minus','n','o','openbracket','p','shift_0','shift_equal','shift_g','shift_i','shift_minus','shift_o','slash','space','control_c','control_v',].forEach(function(key){key='key.'+key;self.$annotations.bindEvent(key,function(){that.triggerEvent(key);});});self.loaded=false;setTimeout(function(){self.$annotations.options({items:self.annotations,placeholder:getPlaceholder(),selected:self.options.selected});self.loaded=true;if(self.options.selected){if(self.options.collapsed){self.$panel.options({collapsed:false});} selectAnnotation({id:self.options.selected});};});['0','1','2','3','4','5','6','7','8','9','b','backslash','closebracket','comma','dot','equal','f','g','h','i','minus','n','o','openbracket','p','shift_0','shift_equal','shift_g','shift_i','shift_minus','shift_o','slash','space','control_c','control_v',].forEach(function(key){key='key_'+key;self.$annotations.bindEvent(key,function(){that.triggerEvent(key);});});showWarnings();function changeAnnotation(data){var item=Ox.getObjectById(self.options.items,data.id);if(item.value!=data.value){item.value=data.value;that.triggerEvent('change',item);}} function crossesPoint(){var positions=Ox.sort([self.position,self.options.position]);return self.points.some(function(point){return point>=positions[0]&&point<=positions[1];});} function dragstart(){if(self.options.showWidget){Ox.$body.addClass('OxDragging');self.drag={startSize:self.options.widgetSize};}} function drag(e){if(self.options.showWidget){self.options.widgetSize=Ox.limit(self.drag.startSize+e.clientDY,128,384);if(self.options.widgetSize>=248&&self.options.widgetSize<=264){self.options.widgetSize=256;} self.$resizebar.css({top:self.options.widgetSize+'px'});self.$inner.css({height:self.options.widgetSize+'px'});self.$widget.options({height:self.options.widgetSize});}} function dragend(e){if(self.options.showWidget){Ox.$body.removeClass('OxDragging');self.options.type=='event'?self.$calendar.resizeCalendar():self.$map.resizeMap();that.triggerEvent('resizewidget',{size:self.options.widgetSize});}} function getAnnotations(){var annotations=Ox.filter(self.options.items,function(item){return self.editing&&item.id==self.options.selected||((self.options.range=='all'||(self.options.range=='selection'&&item['in']<=self.options.out&&item.out>=self.options['in'])||(self.options.range=='position'&&item['in']<=self.options.position&&item.out>=self.options.position))&&(self.options.languages=='all'||self.options.languages.some(function(language){return item.languages&&item.languages.indexOf(language)>-1;}))&&(self.options.users=='all'||self.options.users.indexOf(item.user)>-1));}).map(function(item){return Ox.extend(item,{group:self.options.highlightAnnotations=='none'?'':self.options.highlightAnnotations=='value'?item.value:item['in']+'-'+item.out});});return annotations;} function getEvents(){var events=[];self.annotations.filter(function(item){return isDefined(item);}).forEach(function(item){var index=Ox.getIndexById(events,item.event.id);if(index==-1){events.push(Ox.extend({annotationIds:[item.id]},item.event))}else{events[index].annotationIds.push(item.id);}});return events;} function getPlaceholder(){return'No '+self.options.title.toLowerCase()+(self.options.range=='position'?' at current position':self.options.range=='selection'?' in current selection':'');} function getPlaces(){var places=[];self.annotations.filter(function(item){return isDefined(item);}).forEach(function(item){var index=Ox.getIndexById(places,item.place.id);if(index==-1){places.push(Ox.extend({annotationIds:[item.id]},item.place));}else{places[index].annotationIds.push(item.id);}});return places;} function getPoints(){return Ox.unique(Ox.flatten(self.options.items.map(function(item){return[item['in'],item.out];})));} function getSort(){return({duration:['-duration','+in',self.options.type=='text'?'+created':'+value'],position:['+in','+duration',self.options.type=='text'?'+created':'+value'],text:['+value','+in','+duration'],created:['+created','+in','+duration','+value']})[self.options.sort];} function isDefined(item){return!!item[self.options.type]&&!!item[self.options.type].type;} function removeAnnotation(data){var item;self.editing=false;if(self.widget){item=Ox.getObjectById(self.options.items,data.id);if(isDefined(item)){if(self.options.type=='event'){self.$calendar.options({selected:''}).options({events:getEvents()});}else{self.$map.options({selected:''}).options({places:getPlaces()});}}} showWarnings();that.triggerEvent('remove',{id:data.id});} function selectAnnotation(data){if(self.loaded){var item=Ox.getObjectById(self.options.items,data.id);self.options.selected=item?data.id:'';if(self.widget){if(self.options.type=='event'){self.$calendar.options({selected:item&&isDefined(item)?item.event.id:''}).panToEvent();}else{self.$map.options({selected:item&&isDefined(item)?item.place.id:''}).panToPlace();}} that.triggerEvent('select',Ox.extend(data,item?{'in':item['in'],out:item.out,layer:self.options.id}:{}));}} function showWarnings(){if(self.widget&&self.options.items.length){self.$annotations.find('.OxEditableElement').each(function(){var $element=$(this);if($element.data('id')&&!isDefined(Ox.getObjectById(self.options.items,$element.data('id')))){$element.addClass('OxWarning');}else{$element.removeClass('OxWarning');}});}} function submitAnnotation(data){var item=Ox.getObjectById(self.options.items,data.id);if(item){item.value=data.value;self.editing=false;self.options.sort=='text'&&self.$annotations.reloadItems();that.triggerEvent('submit',item);}} function toggleLayer(){self.options.collapsed=!self.options.collapsed;if(!self.options.collapsed&&self.options.type=='place'&&self.options.showWidget){self.$map.resizeMap();} if(self.options.collapsed){self.editing&&that.blurItem();self.$annotations.loseFocus();} that.triggerEvent('togglelayer',{collapsed:self.options.collapsed});} function toggleWidget(){self.options.showWidget=!self.options.showWidget;self.widgetSize=self.options.showWidget*self.options.widgetSize;self.$resizebar.animate({top:self.widgetSize+'px'},250);self.$inner.animate({height:self.widgetSize+'px'},250);self.$widget.animate({height:self.widgetSize+'px'},250,function(){self.$widget.options({height:self.widgetSize});});that.triggerEvent('togglewidget',{collapsed:!self.options.showWidget});} function updateAnnotations(){self.annotations=getAnnotations();self.$annotations.options({highlightGroup:self.options.highlightAnnotations!='none'});self.$annotations.options({items:self.annotations});self.$annotations.updateItemGroup();showWarnings();if(self.widget){self.options.type=='event'?self.$calendar.options({events:getEvents()}):self.$map.options({places:getPlaces()});}} that.addItem=function(item){var pos=0;self.options.items.splice(pos,0,item);self.$panel.options({collapsed:false});self.$annotations.addItem(pos,Ox.extend(item,{group:item['in']+'-'+item.out})).options({selected:item.id}).editItem();showWarnings();self.points=getPoints();return that;};that.blurItem=function(){self.editing=false;self.$annotations.blurItem();return that;};that.editItem=function(){self.editing=true;self.$panel.options({collapsed:false});self.$annotations.editItem();return that;};that.gainFocus=function(){self.$annotations.gainFocus();return that;};that.getCurrentAnnotations=function(){return getAnnotations();};that.removeItem=function(){self.$annotations.removeItem();};that.selectItem=function(position){if(self.annotations.length){that.options({selected:self.annotations[position==0?0:self.annotations.length-1].id});self.$annotations.gainFocus();}else{that.triggerEvent(position==0?'selectnext':'selectprevious');}};that.updateItem=function(id,data){Ox.Log('AF','updateItem',id,data) var item=Ox.getObjectById(self.options.items,id);Ox.forEach(data,function(value,key){item[key]=value;});item.group=self.options.highlightAnnotations=='none'?'':self.options.highlightAnnotations=='value'?item.value:item['in']+'-'+item.out;self.$annotations.updateItemGroup();if(id!=item.id){self.$annotations.find('.OxEditableElement').each(function(){var $element=$(this);if($element.data('id')==id){$element.data({id:item.id});}});self.options.selected=item.id;} if(self.options.type=='entity'){if(data.value){self.$annotations.updateItem(data.value);}else{that.removeItem();}} if(self.$widget){if(isDefined(item)){self.$widget.options(self.options.type=='event'?{events:getEvents()}:{places:getPlaces()}).options({selected:item[self.options.type].id});self.$widget[self.options.type=='event'?'panToEvent':'panToPlace']();}else{self.$widget.options({selected:''}).options(self.options.type=='event'?{events:getEvents()}:{places:getPlaces()});}} if(!self.editing&&id!=item.id){self.$annotations.options({selected:self.options.selected});} showWarnings();return that;};return that;};'use strict';Ox.AnnotationPanel=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({calendarSize:256,clickLink:null,editable:false,enableExport:false,enableImport:false,highlight:'',highlightAnnotations:'none',highlightLayer:'*',itemName:{singular:'video',plural:'videos'},layers:[],mapSize:256,range:'all',selected:'',separator:';',showCalendar:false,showFind:false,showLayers:{},showMap:false,showUsers:false,sort:'position',width:256}).options(options||{}).update(function(key,value){if(key=='highlight'||key=='highlightLayer'){self.$folder.forEach(function($folder){$folder.options({highlight:getHighlight($folder.options('id'))});});}else if(key=='highlightAnnotations'){self.$folder.forEach(function($folder){$folder.options({highlightAnnotations:self.options.highlightAnnotations});});}else if(['in','out','position'].indexOf(key)>-1){self.$folder.forEach(function($folder){$folder.options(key,value);});}else if(key=='layers'){renderFolders();}else if(key=='selected'){self.options.editable&&updateEditMenu();if(value){var folder=getFolder(value) folder&&folder.options({selected:value});}else{self.$folder.forEach(function($folder){$folder.options({selected:''});});}}else if(key=='showLayers'){self.options.layers.forEach(function(layer,index){self.$folder[index].options({collapsed:!self.options.showLayers[layer.id]});});}else if(key=='width'){self.$folder.forEach(function($folder){$folder.options({width:self.options.width-Ox.UI.SCROLLBAR_SIZE});});}}).addClass('OxAnnotationPanel');self.editing=false;self.languages=getLanguages();self.enabledLanguages=self.languages.map(function(language){return language.code;});if(self.options.showUsers){self.users=getUsers();self.enabledUsers=self.users;}else{self.enabledUsers='all';} self.$menubar=Ox.Bar({size:16}).addClass('OxVideoPlayer').bindEvent({doubleclick:function(e){if($(e.target).is('.OxBar')){self.$folders.animate({scrollTop:0},250);}}});self.$folders=Ox.Element().css({overflowY:'scroll'});self.$folder=[];renderFolders();renderOptionsMenu();self.options.editable&&renderEditMenu();that.setElement(self.$panel=Ox.SplitPanel({elements:[{element:self.$menubar,size:16},{element:self.$folders}],orientation:'vertical'}));function getAnnotation(annotationId){var found=false,annotation;Ox.forEach(self.options.layers,function(layer,i){Ox.forEach(layer.items,function(item){if(item.id==annotationId){annotation=item;found=true;return false;}});if(found){return false;}});return annotation;} function getFolder(annotationId){var found=false,folder;Ox.forEach(self.options.layers,function(layer,i){Ox.forEach(layer.items,function(item){if(item.id==annotationId){folder=self.$folder[i];found=true;return false;}});if(found){return false;}});return folder;} function getHighlight(layer){return Ox.contains(['*',layer],self.options.highlightLayer)?self.options.highlight:'';} function getLanguages(){return Ox.sortBy(Ox.map(Ox.unique(Ox.flatten(self.options.layers.map(function(layer){return layer.items.map(function(item){return item.languages;});}))),function(language){return{code:language,name:Ox.getLanguageNameByCode(language)};}),'name');} function getUsers(){return Ox.sort(Ox.unique(Ox.flatten(self.options.layers.map(function(layer){return layer.items.map(function(item){return item.user;});}))));} function insert(data){var id=data.id;Ox.InsertHTMLDialog(Ox.extend({callback:function(data){Ox.$elements[id].value(data.value).focusInput(data.position).triggerEvent('change',data.value);}},data)).open();} function renderEditMenu(){var annotation,annotationTitle,folder,hasManualCalendarOrMap,isDefined,isEditable,isEntity,isEvent,isEventOrPlace,isPlace,isString,key,manageTitle,type,value;if(self.options.selected){annotation=getAnnotation(self.options.selected);folder=getFolder(self.options.selected);if(annotation&&folder){key=folder.options('id');type=folder.options('type');value=annotation.entity?annotation.entity.name:annotation.value;isEditable=annotation.editable;isEntity=!!annotation.entity;isEvent=type=='event';isPlace=type=='place';isEventOrPlace=isEvent||isPlace;isString=type!='text';isDefined=isEventOrPlace&&!!annotation[type]&&!!annotation[type].type;annotationTitle=folder.options('item')+': "'+Ox.stripTags(value)+'"';}} hasManualCalendarOrMap=self.options.layers.some(function(layer){return layer.type=='event'||layer.type=='place';});manageTitle=Ox._((isDefined?'Edit':'Define')+' ' +(isPlace?'Place':isEvent?'Event':'Place or Event')+'...');self.$editMenuButton&&self.$editMenuButton.remove();self.$editMenuButton=Ox.MenuButton({items:[].concat(self.options.layers.map(function(layer,i){return{id:'add'+layer.id,disabled:!layer.editable,title:Ox._('Add {0}',[layer.item]),keyboard:i<9?i+1+'':null}}),[{},{id:'deselect',title:Ox._('Deselect Annotation'),disabled:!self.options.selected||self.editing,keyboard:'escape'},{id:'edit',title:Ox._('Edit Annotation'),disabled:!self.options.selected||!isEditable||self.editing,keyboard:'return'},{id:'delete',title:Ox._('Delete Annotation'),disabled:!self.options.selected||!isEditable,keyboard:'delete'},{},{id:'insert',title:Ox._('Insert...'),disabled:isString||!self.editing,keyboard:'control i'},{id:'undo',title:Ox._('Undo Changes'),disabled:!self.editing,keyboard:'escape'},{id:'save',title:Ox._('Save Changes'),disabled:!self.editing,keyboard:isString?'return':'shift return'},],hasManualCalendarOrMap?[{},{id:'manage',title:manageTitle,disabled:!self.options.selected||!isEventOrPlace},]:[],isString?[{},{id:'annotation',title:annotationTitle,disabled:true}].concat(isEntity?[{id:'showentityinfo',title:Ox._('Show Entity Info'),keyboard:'e'}]:[],[{id:'findannotations',title:Ox._('Find in All {0}',[Ox.toTitleCase(self.options.itemName.plural)])},{id:'find',title:Ox._('Find in This {0}',[Ox.toTitleCase(self.options.itemName.singular)])}]):[],[{},{id:'import',title:Ox._('Import Annotations...'),disabled:!self.options.enableImport},{id:'export',title:Ox._('Export Annotations...'),disabled:!self.options.enableExport},]),maxWidth:256,style:'square',title:'edit',tooltip:Ox._('Editing Options'),type:'image'}).css({float:'right'}).bindEvent({click:function(data){if(Ox.startsWith(data.id,'add')){that.triggerEvent('add',{layer:data.id.slice(3),value:''});}else if(data.id=='delete'){getFolder(self.options.selected).removeItem();}else if(data.id=='deselect'){getFolder(self.options.selected).options({selected:''});}else if(data.id=='edit'){getFolder(self.options.selected).editItem();}else if(data.id=='export'){that.triggerEvent('exportannotations');}else if(data.id=='find'){that.triggerEvent('find',{value:value});}else if(data.id=='findannotations'){that.triggerEvent('findannotations',{key:key,value:value});}else if(data.id=='import'){that.triggerEvent('importannotations');}else if(data.id=='insert'){var id=$('.OxEditableElement div.OxInput').data('oxid'),element=$('.OxEditableElement textarea.OxInput')[0];insert({end:element.selectionEnd,id:id,selection:element.value.slice(element.selectionStart,element.selectionEnd),start:element.selectionStart,value:element.value});}else if(data.id=='manage'){that.triggerEvent('define',{id:getAnnotation(self.options.selected)[type].id,type:type});}else if(data.id=='save'){}else if(data.id=='showentityinfo'){that.triggerEvent('showentityinfo',annotation.entity);}else if(data.id=='undo'){}},hide:function(){var folder=self.options.selected?getFolder(self.options.selected):null;folder?folder.gainFocus():that.triggerEvent('focus');}}).appendTo(self.$menubar);} function renderFolder(layer){var index=Ox.getIndexById(self.options.layers,layer.id),item=Ox.getObjectById(layer.items,self.options.selected),selected=item?item.id:'';self.$folder[index]=Ox.AnnotationFolder(Ox.extend({clickLink:self.options.clickLink,collapsed:!self.options.showLayers[layer.id],editable:self.options.editable,highlight:getHighlight(layer.id),highlightAnnotations:self.options.highlightAnnotations,id:layer.id,'in':self.options['in'],keyboard:index<9?index+1+'':'',out:self.options.out,position:self.options.position,range:self.options.range,selected:selected,separator:self.options.separator,sort:self.options.sort,width:self.options.width-Ox.UI.SCROLLBAR_SIZE},layer,layer.type=='event'?{showWidget:self.options.showCalendar,widgetSize:self.options.calendarSize}:layer.type=='place'?{showWidget:self.options.showMap,widgetSize:self.options.mapSize}:{})).bindEvent({add:function(data){that.triggerEvent('add',Ox.extend({layer:layer.id},data));},blur:function(){that.triggerEvent('blur');},change:function(data){that.triggerEvent('change',Ox.extend({layer:layer.id},data));},edit:function(){self.editing=true;renderEditMenu();that.triggerEvent('edit');},info:function(data){that.triggerEvent('info',{layer:layer.id});},insert:insert,key_e:function(data){var entity=getAnnotation(self.options.selected).entity;entity&&that.triggerEvent('showentityinfo',entity);},open:function(){that.triggerEvent('open');},remove:function(data){that.triggerEvent('remove',Ox.extend({layer:layer.id},data));},resizewidget:function(data){that.triggerEvent('resize'+(layer.type=='event'?'calendar':'map'),data);},select:function(data){selectAnnotation(data,index);},selectnext:function(){selectNext(layer.id,1);},selectprevious:function(){selectNext(layer.id,-1);},selectnone:selectNone,submit:function(data){that.triggerEvent('submit',Ox.extend({layer:layer.id},data));},togglelayer:function(data){self.options.showLayers[layer.id]=!data.collapsed;that.triggerEvent('togglelayer',Ox.extend({layer:layer.id},data));},togglewidget:function(data){that.triggerEvent('toggle'+(layer.type=='event'?'calendar':'map'),data);}}).appendTo(self.$folders);['0','1','2','3','4','5','6','7','8','9','b','backslash','closebracket','comma','dot','equal','f','g','h','i','minus','n','o','openbracket','p','shift_0','shift_equal','shift_g','shift_i','shift_minus','shift_o','slash','space','control_c','control_v',].forEach(function(key){key='key.'+key;self.$folder[index].bindEvent(key,function(){that.triggerEvent(key);});});} function renderFolders(){self.$folders.empty();self.options.layers.forEach(function(layer,index){renderFolder(layer);});} function renderOptionsMenu(){self.$optionsMenuButton&&self.$optionsMenuButton.remove();self.$optionsMenuButton=Ox.MenuButton({items:[].concat([{id:'showannotations',title:Ox._('Show Annotations'),disabled:true},{group:'range',min:1,max:1,items:[{id:'all',title:Ox._('All'),checked:self.options.range=='all'},{id:'selection',title:Ox._('In Current Selection'),checked:self.options.range=='selection'},{id:'position',title:Ox._('At Current Position'),checked:self.options.range=='position'}]},{},{id:'sortannotations',title:Ox._('Sort Annotations'),disabled:true},{group:'sort',min:1,max:1,items:[{id:'position',title:Ox._('By Position'),checked:self.options.sort=='position'},{id:'duration',title:Ox._('By Duration'),checked:self.options.sort=='duration'},{id:'text',title:Ox._('By Text'),checked:self.options.sort=='text'},{id:'created',title:Ox._('By Creation Time'),checked:self.options.sort=='created'}]}],self.options.showFind?[{},{id:'results',title:Ox._('Find Annotations'),disabled:true},{group:'results',max:1,items:[{id:'result_*',title:Ox._('All'),checked:self.options.highlightLayer=='*'}].concat(self.options.layers.map(function(result){return{id:'result_'+result.id,title:result.title,checked:result.id==self.options.highlightLayer};}))}]:[],self.options.editable?[{},{id:'highlightannotations',title:Ox._('Highlight Annotations'),disabled:true},{group:'highlight',max:1,items:[{id:'none',title:Ox._('None'),checked:self.options.highlightAnnotations=='none'},{id:'value',title:Ox._('Same Value'),checked:self.options.highlightAnnotations=='value'},{id:'selection',title:Ox._('Same Selection'),checked:self.options.highlightAnnotations=='selection'}]}]:[],self.languages.length>1?[{},{id:'languages',title:Ox._('Show Languages'),disabled:true},{group:'languages',min:1,max:-1,items:self.languages.map(function(language){return{id:language.code,title:Ox._(language.name),checked:Ox.contains(self.enabledLanguages,language.code)};})}]:[],self.options.showUsers&&self.users.length?[{},{id:'users',title:Ox._('Show Users'),disabled:true},{group:'users',min:0,max:-1,items:self.users.map(function(user){return{id:'user_'+user,title:Ox.encodeHTMLEntities(user),checked:self.enabledUsers=='all'||Ox.contains(self.enabledUsers,user)};})}]:[],self.options.showUsers&&self.users.length>1?[{},{id:'allusers',title:Ox._('Show All Users')},{id:'nousers',title:Ox._('Show No Users')}]:[]),style:'square',title:'set',tooltip:Ox._('Options'),type:'image'}).css({float:'left'}).bindEvent({change:function(data){var set={};if(data.id=='languages'){self.enabledLanguages=data.checked.map(function(checked){return checked.id;});self.$folder.forEach(function($folder){$folder.options({languages:self.enabledLanguages});});}else if(data.id=='users'){self.enabledUsers=data.checked.map(function(checked){return checked.id.slice(5);});self.$folder.forEach(function($folder){$folder.options({users:self.enabledUsers});});}else if(data.id=='results'){var layer=data.checked[0].id.split('_').pop() that.options({highlightLayer:layer});that.triggerEvent('highlightlayer',self.options.highlightLayer);}else if(data.id=='highlight'){var value=data.checked[0].id that.options({highlightAnnotations:value});that.triggerEvent('highlightannotations',self.options.highlightAnnotations);}else{self.options[data.id]=data.checked[0].id;set[data.id]=self.options[data.id];self.$folder.forEach(function($folder){$folder.options(set);});that.triggerEvent('annotations'+data.id,set);}},click:function(data){if(data.id=='allusers'){self.enabledUsers=Ox.clone(self.users);self.users.forEach(function(user){self.$optionsMenuButton.checkItem('user_'+user);});self.$folder.forEach(function($folder){$folder.options({users:self.enabledUsers});});}else if(data.id=='nousers'){self.enabledUsers=[];self.users.forEach(function(user){self.$optionsMenuButton.uncheckItem('user_'+user);});self.$folder.forEach(function($folder){$folder.options({users:self.enabledUsers});});}},hide:function(){var folder=self.options.selected?getFolder(self.options.selected):null;folder?folder.gainFocus():that.triggerEvent('focus');}}).appendTo(self.$menubar);} function scrollToSelected(type){var $item=that.find('.OxEditableElement.OxSelected'),itemHeight=$item.height()+(type=='text'?8:0),itemTop=($item.offset()||{}).top,itemBottom=itemTop+itemHeight,height=self.$folders.height(),scrollTop=self.$folders.scrollTop(),top=self.$folders.offset().top;if(itemToptop+height){if(itemTop').attr({src:Ox.UI.getImageURL('markerPosition')}).addClass('OxMarkerPosition').appendTo(that);setPositionMarker();if(self.options.showPointMarkers){self.$pointMarker={};['in','out'].forEach(function(point){var titlecase=Ox.toTitleCase(point);self.$pointMarker[point]=Ox.$('').addClass('OxMarkerPoint'+titlecase).attr({src:Ox.UI.getImageURL('marker'+titlecase)}).appendTo(that);setPointMarker(point);});} function addLine(i){self.$lines[i]=Ox.$('
').css({position:'absolute',left:self.margin/2+'px',top:i*(self.height+self.margin)+'px',width:self.options.width+'px',height:'24px',overflow:'hidden'}).appendTo(that);self.$images[i]=self.$image.clone().css({position:'absolute',marginLeft:-i*self.options.width+'px'}).appendTo(self.$lines[i]);self.$interfaces[i]=Ox.$('
').addClass('OxInterface OxTarget OxSpecialTarget').css({top:'2px',width:Math.round(self.options.duration)+'px',height:'20px',marginLeft:-i*self.options.width+'px'}).appendTo(self.$lines[i]);} function doubleclick(e){var position;if($(e.target).is('.OxInterface')){position=getPosition(e);if(self.options.state=='selected'&&position>=self.options['in']&&position<=self.options.out){that.triggerEvent('edit');}else if(self.options.state!='editing'){that.triggerEvent('select');}}} function getImage(){return Ox.SmallVideoTimelineImage({duration:self.options.duration,editing:self.options.editing,imageURL:self.options.getImageURL,'in':self.options['in'],mode:'editor',out:self.options.out,results:self.options.results,state:self.options.state,subtitles:Ox.clone(self.options.subtitles,true),type:self.options.type,width:Math.round(self.options.duration)}).bindEvent({loaded:updateTimelines});} function getLines(){return Math.ceil(self.options.duration/self.options.width);} function getPosition(e){return e.offsetX?e.offsetX:e.clientX-$(e.target).offset().left;} function getSubtitle(position){var subtitle='';Ox.forEach(self.options.subtitles,function(v){if(v['in']<=position&&v.out>position){subtitle=v;return false;}});return subtitle;} function getTooltip(e){} function mousedown(e){if($(e.target).is('.OxInterface')){self.options.position=getPosition(e);setPositionMarker();if(!self.triggered){that.triggerEvent('position',{position:self.options.position});self.triggered=true;setTimeout(function(){self.triggered=false;},250);}}} function mouseleave(){self.$tooltip.hide();} function mousemove(e){var position,subtitle;if($(e.target).is('.OxInterface')){position=getPosition(e);subtitle=getSubtitle(position);self.$tooltip.options({title:subtitle?''+Ox.highlight(subtitle.text,self.options.find,'OxHighlight',true).replace(/\n/g,' ')+'
' +Ox.formatDuration(subtitle['in'],3)+' - ' +Ox.formatDuration(subtitle['out'],3):Ox.formatDuration(position)}).show(e.clientX,e.clientY);}else{self.$tooltip.hide();}} function setCSS(){that.css({width:(self.options.width+self.margin)+'px',height:((self.height+self.margin)*self.lines)+4+'px'});} function setPoint(point){setPointMarker(point);self.$image.options(point,self.options[point]);updateTimelines();} function setPointMarker(point){var position=Math.round(self.options[point]);self.$pointMarker[point].css({left:(position%self.options.width)+'px',top:(Math.floor(position/self.options.width)*(self.height+self.margin)+15)+'px'});} function setPositionMarker(){var position=Math.round(self.options.position);self.$positionMarker.css({left:(position%self.options.width)-1+'px',top:(Math.floor(position/self.options.width)*(self.height+self.margin)+2)+'px'});} function setResults(){self.$image.options({results:self.options.results});updateTimelines();} function setState(){self.$image.options({state:self.options.state});updateTimelines();} function setSubtitles(){self.$image.options({subtitles:Ox.clone(self.options.subtitles,true)});updateTimelines();} function setType(){self.$image=getImage();self.$images.forEach(function($image,i){self.$images[i].replaceWith(self.$images[i]=self.$image.clone().css({position:'absolute',marginLeft:-i*self.options.width+'px'}));});} function setWidth(){self.lines=getLines();setCSS();Ox.loop(self.lines,function(i){if(self.$lines[i]){self.$lines[i].css({width:self.options.width+'px'});self.$images[i].css({marginLeft:(-i*self.options.width)+'px'});self.$interfaces[i].css({marginLeft:(-i*self.options.width)+'px'});}else{addLine(i);}});while(self.$lines.length>self.lines){self.$lines[self.$lines.length-1].remove();self.$lines.pop();self.$images.pop();} setPositionMarker();if(self.options.showPointMarkers){setPointMarker('in');setPointMarker('out');}} function updateTimelines(){self.$lines.forEach(function($line,i){$($line.children()[0]).replaceWith(self.$images[i]=self.$image.clone().css({position:'absolute',marginLeft:(-i*self.options.width)+'px'}));});} return that;};'use strict';Ox.ClipPanel=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({annotationsCalendarSize:256,annotationsMapSize:256,annotationsRange:'all',annotationsSort:'position',clipRatio:16/9,clips:[],clickLink:null,duration:0,editable:false,formatTitle:function(){return Ox.last(arguments);},getClipImageURL:null,'in':0,layers:[],out:0,position:0,selected:[],sort:[],sortOptions:[],showAnnotationsCalendar:false,showAnnotationsMap:false,showLayers:{},showUsers:false,view:'list',width:0}).options(options||{}).update({clips:function(){var action=self.options.clips.length&&self.options.view!='annotations'?'enableItem':'disableItem';self.$list.options({items:Ox.clone(self.options.clips),sort:getListSort(),sortable:isSortable()});self.$menu[action]('selectclip');self.$menu[action]('splitclip');updateStatus();},duration:updateStatus,height:function(){self.$list.size();},position:function(){if(self.options.view=='annotations'){self.$list.options({position:self.options.position});}},selected:selectClips,showLayers:function(){if(self.options.view=='annotations'){self.$list.options({showLayers:Ox.clone(self.options.showLayers)});}},sort:function(){updateSortElement();self.$list.options({sort:getListSort(),sortable:isSortable(),});},view:function(){updateView();self.$menu.checkItem(self.options.view);},width:function(){self.$list.options({width:self.options.width});}}).bindEvent({resize:function(data){self.$sortSelect.options({width:getSortSelectWidth(data.size)});self.$list.size();}});self.columns=[].concat([{align:'right',id:'index',format:function(value){return value+1;},operator:'+',title:Ox._('Index'),visible:false,width:60},{format:function(value,data){return data.annotation?data.annotation:data.item;},id:'id',operator:'+',sort:function(value,data){return data.sort;},title:Ox._('ID'),unique:true,width:60},{addable:false,id:'item',operator:'+',sort:function(value,data){return data.sort;}},{format:self.options.formatTitle,id:'title',operator:'+',sort:function(value,data){return data.sort;},title:Ox._('Title'),visible:true,width:120},{align:'right',editable:isEditable,format:function(value,data){return(isEditable(data)?['','']:['','']).join(Ox.formatDuration(value,3));},id:'in',operator:'+',sort:function(value,data){return data.sort;},title:Ox._('In'),visible:true,width:90},{align:'right',editable:isEditable,format:function(value,data){return(isEditable(data)?['','']:['','']).join(Ox.formatDuration(value,3));},id:'out',title:Ox._('Out'),visible:true,width:90},{align:'right',editable:isEditable,format:function(value,data){return(isEditable(data)?['','']:['','']).join(Ox.formatDuration(value,3));},id:'duration',operator:'+',sort:function(value,data){return data.sort;},title:Ox._('Duration'),visible:true,width:90},],hasVolume()?[{align:'right',editable:self.options.editable,format:function(value,data){return Ox.formatNumber(value,2);},id:'volume',operator:'+',sort:function(value,data){return data.sort;},title:Ox._('Volume'),visible:false,width:45},]:[],[{addable:false,id:'sort',operator:'+',visible:false}]);self.$menubar=Ox.Bar({size:24}).bindEvent({doubleclick:function(e){if($(e.target).is('.OxBar')){(self.options.view=='list'?self.$list.$body:self.$list).animate({scrollTop:0},250);}}});self.$menu=Ox.MenuButton({items:[{group:'view',min:1,max:1,items:[{id:'list',title:Ox._('View Clips as List'),checked:self.options.view=='list'},{id:'grid',title:Ox._('View Clips as Grid'),checked:self.options.view=='grid'},{id:'annotations',title:Ox._('View Annotations'),checked:self.options.view=='annotations'},]},{},{id:'selectclip',title:'Select Clip at Current Position',keyboard:'\\',disabled:self.options.clips.length==0||self.options.view=='annotations'},{id:'splitclip',title:'Split Clip at Current Position',keyboard:'shift \\',disabled:self.options.clips.length==0||self.options.view=='annotations'},{},{id:'split',title:Ox._('Split Selected Clips at Cuts'),disabled:!self.options.editable||self.options.selected.length==0||self.options.view=='annotations'},{id:'join',title:Ox._('Join Selected Clips at Cuts'),disabled:!self.options.editable||self.options.selected.length<2||self.options.view=='annotations'},{id:'makeeditable',title:Ox._('Make Selected Clips Editable'),disabled:!self.options.editable||self.options.selected.length==0||self.options.view=='annotations'}],title:'set',tooltip:Ox._('Options'),type:'image'}).css({float:'left',margin:'4px 2px 4px 4px'}).bindEvent({change:function(data){if(data.id=='view'){self.options.view=data.checked[0].id;updateView();that.triggerEvent('view',{view:self.options.view});}},click:function(data){if(data.id=='selectclip'){that.selectClip();self.$list.gainFocus();}else if(data.id=='splitclip'){splitClip();}else if(data.id=='split'){splitClips();}else if(data.id=='join'){joinClips();}else if(data.id=='makeeditable'){makeClipsEditable();}}}).appendTo(self.$menubar),self.$sortSelect=Ox.Select({items:self.options.sortOptions,value:self.options.sort[0].key,width:getSortSelectWidth(self.options.width)}).bindEvent({change:function(data){self.options.sort=[{key:data.value,operator:Ox.getObjectById(self.options.sortOptions,data.value).operator}];updateSortElement();that.triggerEvent('sort',self.options.sort);self.$list.options({sortable:isSortable()});}});self.$orderButton=Ox.Button({overlap:'left',title:getButtonTitle(),tooltip:getButtonTooltip(),type:'image'}).bindEvent({click:function(){self.options.sort=[{key:self.options.sort[0].key,operator:self.options.sort[0].operator=='+'?'-':'+'}];updateSortElement();that.triggerEvent('sort',self.options.sort);}});self.$sortElement=Ox.FormElementGroup({elements:[self.$sortSelect,self.$orderButton],float:'right'}).css({float:'right',margin:'4px 4px 4px 2px'}).appendTo(self.$menubar);self.$list=getList();self.$statusbar=Ox.Bar({size:16});self.$status=Ox.Element().css({marginTop:'2px',fontSize:'9px',textAlign:'center',textOverflow:'ellipsis'}).appendTo(self.$statusbar);that.setElement(self.$panel=Ox.SplitPanel({elements:[{element:self.$menubar,size:24},{element:self.$list},{element:self.$statusbar,size:16}],orientation:'vertical'}));updateStatus();function editClip(data){var value=self.$list.value(data.id,data.key);if(data.value!=value&&!(data.value===''&&value===null)){self.$list.value(data.id,data.key,data.value||null);that.triggerEvent('edit',data);}} function getButtonTitle(){return self.options.sort[0].operator=='+'?'up':'down';} function getButtonTooltip(){return Ox._(self.options.sort[0].operator=='+'?'Ascending':'Descending');} function getEditable(ids){return ids.filter(function(id){return isEditable(Ox.getObjectById(self.options.clips,id));});} function getList(){var $list;if(self.options.view=='list'){$list=Ox.TableList({columns:self.columns,columnsMovable:true,columnsRemovable:true,columnsResizable:true,columnsVisible:true,items:Ox.clone(self.options.clips),keys:['director','year','annotation'],pageLength:1000,scrollbarVisible:true,selected:self.options.selected,sort:getListSort(),sortable:isSortable(),unique:'id'});}else if(self.options.view=='grid'){$list=Ox.IconList({draggable:true,fixedRatio:self.options.clipRatio,item:function(data,sort,size){size=size||128;var ratio=data.videoRatio,fixedRatio=self.options.clipRatio,width=ratio>fixedRatio?size:Math.round(size*ratio/fixedRatio),height=Math.round(width/ratio),info,title=self.options.formatTitle(data),url=self.options.getClipImageURL(data.id,width,height);if(['text','position','duration','random'].indexOf(sort[0].key)>-1){info=Ox.formatDuration(data['in'])+' - ' +Ox.formatDuration(data.out);}else{info=Ox.formatDuration(data['in'])+' - ' +Ox.formatDuration(data.out);} return{height:height,id:data.id,info:info,title:title,url:url,width:width};},items:self.options.clips,keys:['annotation','id','in','out'],orientation:'both',selected:self.options.selected,sort:getListSort(),unique:'id'});}else if(self.options.view=='annotations'){$list=Ox.AnnotationPanel({calendarSize:self.options.annotationsCalendarSize,clickLink:self.options.clickLink,editable:false,layers:self.options.layers,mapSize:self.options.annotationsMapSize,position:self.options.position,range:self.options.annotationsRange,showCalendar:self.options.showAnnotationsCalendar,showLayers:Ox.clone(self.options.showLayers),showMap:self.options.showAnnotationsMap,showUsers:self.options.showUsers,sort:self.options.annotationsSort,width:self.options.width}).bindEvent({select:function(data){that.triggerEvent('selectannotation',data);},open:function(data){}});$list.size=function(){$list.options({width:self.options.width});};return $list;} $list.bindEvent({copy:function(data){that.triggerEvent('copy',data);},copyadd:function(data){that.triggerEvent('copyadd',data);},cut:function(data){if(self.options.editable){that.triggerEvent('cut',data);self.options.selected=[];selectClips();that.triggerEvent('select',{ids:[]});}},cutadd:function(data){if(self.options.editable){that.triggerEvent('cutadd',data);self.options.selected=[];selectClips();that.triggerEvent('select',{ids:[]});}},'delete':function(data){self.options.editable&&that.triggerEvent('delete',data);},key_backslash:function(data){that.selectClip();self.$list.gainFocus();},key_shift_backslash:function(data){splitClip();},move:function(data){data.ids.forEach(function(id,index){self.$list.value(id,'index',index);});that.triggerEvent('move',data);},open:function(data){that.triggerEvent('open',data);},paste:function(){self.options.editable&&that.triggerEvent('paste');},select:function(data){self.options.selected=data.ids;selectClips();that.triggerEvent('select',data);},sort:function(data){if(data.key=='in'){data.key='position';} self.options.sort=[data];updateSortElement();self.$list.options({sortable:isSortable()});that.triggerEvent('sort',self.options.sort);},submit:function(data){var value=self.$list.value(data.id);if(data.key=='volume'){data.value=parseFloat(data.value);if(data.value>=1||Ox.isNaN(data.value)){data.value=1;}else if(data.value<0){data.value=0;} self.$list.value(data.id,data.key,data.value);that.triggerEvent('edit',data);}else{data.value=Ox.parseDuration(data.value);if((data.key=='in'&&data.valuevalue['in'])||(data.key=='duration'&&data.value>0)){self.$list.value(data.id,data.key,data.value);if(data.key=='in'){self.$list.value(data.id,'duration',value.out-data.value);}else if(data.key=='out'){self.$list.value(data.id,'duration',data.value-value['in']);}else if(data.key=='duration'){self.$list.value(data.id,'out',value['in']+data.value);} that.triggerEvent('edit',data);}else{self.$list.value(data.id,data.key,value[data.key]);}}}});return $list;} function getListSort(){var sort=[{key:'index',operator:'+'}];if(self.options.sort&&self.options.sort.length){sort[0].operator=self.options.sort[0].operator;sort[0].key=Ox.getObjectById(self.columns,self.options.sort[0].key)?self.options.sort[0].key:'sort';if(self.options.sort[0].key=='position'){sort[0].key='in';}} return sort;} function getSortSelectWidth(width){return Math.min(144,width-52+Ox.UI.SCROLLBAR_SIZE);} function isEditable(data){return self.options.editable&&!data.annotation;} function isSortable(){return self.options.editable&&self.options.sort&&self.options.sort.length&&self.options.sort[0].key=='index'&&self.options.sort[0].operator=='+';} function hasVolume(){return self.options.editable&&self.options.sort&&self.options.sort.length&&self.options.sort[0].key=='index'} function joinClips(){var clips=getEditable(self.options.selected).map(function(id){return Ox.clone(Ox.getObjectById(self.options.clips,id));}),ids=[],join=[],joined;do{joined=false;Ox.forEach(clips,function(outClip){var outPoint=outClip.item+'/'+outClip.out;Ox.forEach(clips,function(inClip,index){var inPoint=inClip.item+'/'+inClip['in'];if(inPoint==outPoint){ids=Ox.unique(ids.concat([outClip.id,inClip.id]));join=Ox.unique(join.concat([outClip.id]));outClip.out=inClip.out;if(Ox.contains(join,inClip.id)){join.splice(join.indexOf(inClip.id),1);} clips.splice(index,1);joined=true;return false;}});if(joined){return false;}});}while(joined);join=join.map(function(id){var clip=Ox.getObjectById(clips,id);return{'in':clip['in'],item:clip.item,out:clip.out};});if(ids.length){that.triggerEvent('join',{ids:ids,join:join});}} function makeClipsEditable(){if(!self.options.editable){return} var clips=self.options.clips.filter(function(clip){return Ox.contains(self.options.selected,clip.id)&&clip.annotation;});clips.forEach(function(clip){self.$list.value(clip.id,{annotation:''});that.triggerEvent('edit',{id:clip.id,key:'annotation',value:''});})} function selectClips(){if(self.options.editable){self.$menu[self.options.selected.length>0?'enableItem':'disableItem']('split');self.$menu[self.options.selected.length>1?'enableItem':'disableItem']('join');self.$menu[self.options.selected.length>0?'enableItem':'disableItem']('makeeditable');} self.$list.options({selected:self.options.selected});} function splitClip(){that.selectClip();var index;Ox.forEach(self.options.clips,function(clip,i){if(clip.position<=self.options.position){index=i}else{return false;}});var clip=self.options.clips[index];if(clip){var position=self.options.position-clip.position+clip['in'];if(position!=clip['in']&&position!=clip['out']){var ids=[clip.id];var split=[{'in':clip['in'],'out':position,'item':clip.item},{'in':position,'out':clip['out'],'item':clip.item}];that.triggerEvent('split',{ids:ids,split:split});}}} function splitClips(){var ids=getEditable(self.options.selected).filter(function(id){var clip=Ox.getObjectById(self.options.clips,id);return clip.cuts.length;}),split=Ox.flatten(ids.map(function(id){var clip=Ox.getObjectById(self.options.clips,id),cuts=[clip['in']].concat(clip.cuts).concat([clip.out]);return Ox.range(0,cuts.length-1).map(function(i){return{'in':cuts[i],item:clip.item,out:cuts[i+1]};});}));if(split.length>ids.length){that.triggerEvent('split',{ids:ids,split:split});}} function updateSortElement(){self.$sortSelect.options({value:self.options.sort[0].key,});self.$orderButton.options({title:getButtonTitle(),tooltip:getButtonTooltip(),});} function updateStatus(){self.$status.html(Ox.toTitleCase(Ox.formatCount(self.options.clips.length,'Clip')) +', '+Ox.formatDuration(self.options.duration,3));} function updateView(){var action=self.options.editable&&self.options.selected.length&&self.options.view!='annotations'?'enableItem':'disableItem';self.$menu[action]('split');self.$menu[self.options.editable&&self.options.selected.length>1&&self.options.view!='annotations'?'enableItem':'disableItem']('join');self.$menu[action]('makeeditable');self.$panel.replaceElement(1,self.$list=getList());} that.getPasteIndex=function(){return self.$list.getPasteIndex();};that.invertSelection=function(){self.$list.invertSelection();};that.selectAll=function(){self.$list.selectAll();};that.selectClip=function(){var index;Ox.forEach(self.options.clips,function(clip,i){Ox.print('CLIP',i,clip.position,clip.duration,self.options.position) if(clip.position<=self.options.position){index=i}else{return false;}});self.options.selected=[self.options.clips[index].id];selectClips();that.triggerEvent('select',{ids:self.options.selected});return that;};that.updateItem=function(id,data){self.options.clips[Ox.getIndexById(self.options.clips,id)]=data;self.$list.value(id,{duration:data.duration,'in':data['in'],out:data.out,sort:data.sort});return that;};return that;};'use strict';Ox.LargeVideoTimeline=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({chapters:[],cuts:[],disabled:false,duration:0,find:'',getImageURL:null,'in':0,matches:[],out:0,position:0,showInToOut:false,subtitles:[],type:'',width:0}).options(options||{}).update({find:setSubtitles,'in':function(){setPointMarker('in');},out:function(){setPointMarker('out');},position:setPosition,subtitles:setSubtitles,type:setType,width:setWidth}).addClass('OxLargeVideoTimeline OxMedia').on({mouseleave:mouseleave,mousemove:mousemove});if(!self.options.disabled){that.bindEvent({anyclick:click,dragstart:dragstart,drag:drag,dragend:dragend,touchstart:dragstart,touchmove:drag,touchend:dragend});} self.$cuts=[];self.$pointMarker={};self.$tiles={};self.$tooltip=Ox.Tooltip({animate:false});self.center=Math.floor(self.options.width/2);self.fps=25;self.height=64;self.isAsync=self.options.getImageURL.length==3;self.tileWidth=1500;self.tiles=self.options.duration*self.fps/self.tileWidth;self.$timeline=$('
').css({left:self.center+'px'}).appendTo(that);setTimeout(setSubtitles);if(self.options.showInToOut){if(self.options['in']){$('
').addClass('OxOverlay').css({left:0,width:self.options['in']*self.fps+'px',}).appendTo(self.$timeline);} if(self.options.out){$('
').addClass('OxOverlay').css({left:self.options.out*self.fps+'px',width:(self.options.duration-self.options.out)*self.fps+'px',}).appendTo(self.$timeline);}} setTimeout(function(){var $cut=$('').addClass('OxCut').attr({src:Ox.UI.getImageURL('markerCut')}),$chapter=$('').addClass('OxChapter').attr({src:Ox.UI.getImageURL('markerChapter')}),chapters=self.options.chapters.slice(1).map(function(chapter){return chapter.position;});Ox.unique(chapters.concat(self.options.cuts)).forEach(function(v,i){self.$cuts[i]=(Ox.contains(chapters,v)?$chapter:$cut).clone().css({left:(v*self.fps)+'px'}).appendTo(self.$timeline);});});self.$markerPosition=$('').addClass('OxMarkerPosition').attr({src:Ox.UI.getImageURL('markerPosition')}).appendTo(that);setMarker();['in','out'].forEach(function(point){var titlecase=Ox.toTitleCase(point);self.$pointMarker[point]=$('').addClass('OxMarkerPoint'+titlecase).attr({src:Ox.UI.getImageURL('marker'+titlecase)}).appendTo(self.$timeline);setPointMarker(point);});setWidth();setPosition();function click(data){self.options.position=Ox.round(Ox.limit(getPosition(data),0,self.options.duration),3);setPosition();that.triggerEvent('position',{position:self.options.position});} function dragstart(data){Ox.$body.addClass('OxDragging');self.drag={x:data.clientX};} function drag(data){self.options.position=Ox.round(Ox.limit(self.options.position+(self.drag.x-data.clientX)/self.fps,0,self.options.duration),3);self.drag.x=data.clientX;setPosition();that.triggerEvent('positioning',{position:self.options.position});} function dragend(){Ox.$body.removeClass('OxDragging');that.triggerEvent('position',{position:self.options.position});} function getImageURL(i,callback){if(!self.isAsync){callback(self.options.getImageURL(self.options.type,i));}else{self.options.getImageURL(self.options.type,i,callback);}} function getPosition(e){return self.options.position+(e.clientX-that.offset().left-self.center-1)/self.fps;} function mouseleave(e){self.clientX=0;self.clientY=0;self.$tooltip.hide();} function mousemove(e){self.clientX=e.clientX;self.clientY=e.clientY;updateTooltip();} function setMarker(){self.$markerPosition.css({left:self.center+'px'});} function setPointMarker(point){self.$pointMarker[point].css({left:(self.options[point]*self.fps)+'px'});} function setPosition(){self.tile=Math.floor(self.options.position*self.fps/self.tileWidth);self.$timeline.css({marginLeft:(-self.options.position*self.fps)+'px'});Ox.loop(Math.max(self.tile-1,0),Math.min(self.tile+2,self.tiles),function(i){if(!self.$tiles[i]){if(self.isAsync){self.$tiles[i]=true;} getImageURL(i,function(url){self.$tiles[i]=$('').attr({src:url}).css({left:(i*self.tileWidth)+'px'}).appendTo(self.$timeline);});}});if(self.clientX&&self.clientY){updateTooltip();}} function setSubtitles(){that.find('.OxSubtitle').remove();self.$subtitles=[];self.options.subtitles.forEach(function(subtitle,i){var found=self.options.find&&subtitle.text.toLowerCase().indexOf(self.options.find.toLowerCase())>-1;self.$subtitles[i]=$('
').addClass('OxSubtitle'+(found?' OxHighlight':'')).css({left:Math.round(subtitle['in']*self.fps)+'px',width:Math.round(((subtitle.out-subtitle['in'])*self.fps)-2)+'px'}).html(Ox.highlight(subtitle.text,self.options.find,'OxHighlight',true)).appendTo(self.$timeline);});} function setType(){Ox.forEach(self.$tiles,function($tile,i){getImageURL(i,function(url){$tile.attr({src:url});});});} function setWidth(){self.center=Math.floor(self.options.width/2);that.css({width:self.options.width+'px'});self.$timeline.css({left:self.center+'px'});setMarker();} function triggerPositionEvent(){that.triggerEvent('position',{position:self.options.position});} function updateTooltip(){var position=getPosition(self);if(position>=0&&position<=self.options.duration){self.$tooltip.options({title:Ox.formatDuration(position,3)}).show(self.clientX,self.clientY);}else{self.$tooltip.hide();}} return that;};'use strict';Ox.SmallVideoTimeline=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({_offset:0,disabled:false,duration:0,find:'',imageURL:'','in':0,invertHighlight:false,mode:'player',out:0,paused:false,results:[],showInToOut:false,showMilliseconds:0,state:'default',subtitles:[],width:256}).options(options||{}).update({duration:function(){self.$image.options({duration:self.options.duration});},imageURL:function(){self.$image.options({imageURL:self.options.imageURL});},'in':function(){self.$image.options({'in':self.options['in']});self.options.mode=='editor'&&setPointMarker('in');},out:function(){self.$image.options({out:self.options.out});self.options.mode=='editor'&&setPointMarker('out');},paused:function(){self.$positionMarker[self.options.paused?'addClass':'removeClass']('OxPaused');},position:function(){setPositionMarker();},results:function(){self.$image.options({results:self.options.results});},state:function(){self.$image.options({state:self.options.state});},subtitles:function(){self.$image.options({subtitles:self.options.subtitles});},width:function(){setWidth();}}).addClass('OxSmallVideoTimeline').css(Ox.extend({width:self.options.width+'px'},self.options.mode=='player'?{background:'rgb(0, 0, 0)',borderRadius:'8px'}:{}));self.height=self.options.mode=='player'?16:24;self.imageLeft=self.options.mode=='player'?8:4;self.imageWidth=self.options.width-(self.options.mode=='player'?16:8) self.imageHeight=self.options.mode=='player'?16:18;self.interfaceLeft=self.options.mode=='player'?0:4;self.interfaceTop=self.options.mode=='player'?0:2;self.interfaceWidth=self.options.mode=='player'?self.options.width:self.imageWidth;that.css({height:self.height+'px'});self.$image=getTimelineImage().appendTo(that);self.$interface=Ox.Element({tooltip:getTooltip}).addClass('OxInterface').css({left:self.interfaceLeft+'px',top:self.interfaceTop+'px',width:self.interfaceWidth+'px',height:'20px'}).bindEvent({drag:function(data){mousedown(data);},dragend:function(data){self.triggered=false;mousedown(data);},mousedown:mousedown,touchend:function(data){self.triggered=false;mousedown(data);},touchmove:mousedown,touchstart:mousedown}).appendTo(that);self.$interface.$tooltip.css({textAlign:'center'});if(self.options.mode=='player'){self.$positionMarker=$('
').addClass('OxMarkerPlay'+(self.options.paused?' OxPaused':'')).append($('
').append($('
'))).appendTo(that);}else{self.$positionMarker=$('').addClass('OxMarkerPosition').attr({src:Ox.UI.getImageURL('markerPosition')}).appendTo(that);} setPositionMarker();if(self.options.mode=='editor'){self.$pointMarker={};['in','out'].forEach(function(point){var titlecase=Ox.toTitleCase(point);self.$pointMarker[point]=$('').addClass('OxMarkerPoint'+titlecase).attr({src:Ox.UI.getImageURL('marker'+titlecase)}).appendTo(that);setPointMarker(point);});} function getLeft(){return(self.options.showInToOut?self.options.position-self.options['in']:self.options.position)*self.imageWidth/self.options.duration;} function getPosition(e){var position=((e.offsetX?e.offsetX:e.clientX-$(e.target).offset().left) -(self.options.mode=='player'?8:0))*self.options.duration/self.imageWidth;position=Ox.limit(position,0,self.options.duration);if(self.options.showInToOut){position+=self.options['in'];} return position;} function getSubtitle(position){var subtitle='';Ox.forEach(self.options.subtitles,function(v){if(v['in']<=position&&v.out>position){subtitle=v;return false;}});return subtitle;} function getTimelineImage(){return(self.options.imageURL?Ox.SmallVideoTimelineImage({duration:self.options.duration,imageURL:self.options.imageURL,'in':self.options['in'],invertHighlight:self.options.invertHighlight,mode:self.options.mode,out:self.options.out,results:self.options.results,showInToOut:self.options.showInToOut,subtitles:self.options.subtitles,state:self.options.state,type:self.options.type,width:self.imageWidth}):Ox.Element()).css({position:'absolute',left:self.imageLeft+'px',width:self.imageWidth+'px'});} function getTooltip(e){var position=getPosition(e),subtitle=getSubtitle(position);return subtitle?''+Ox.highlight(subtitle.text,self.options.find,'OxHighlight').replace(/\n/g,'
')+'

'+Ox.formatDuration(subtitle['in'],self.options.showMilliseconds)+' - '+Ox.formatDuration(subtitle['out'],self.options.showMilliseconds):Ox.formatDuration(position,self.options.showMilliseconds);} function mousedown(e){if(!self.options.disabled&&$(e.target).is('.OxInterface')){self.options.position=getPosition(e);setPositionMarker();if(!self.triggered){that.triggerEvent('position',{position:self.options.position});self.triggered=true;setTimeout(function(){self.triggered=false;},250);}}} function setPointMarker(point){self.$pointMarker[point].css({left:self.imageLeft+Math.round(getLeft())+'px'});} function setPositionMarker(){self.$positionMarker.css({left:self.interfaceLeft+Math.round(getLeft()) -(self.options.mode=='editor'?5:0) +self.options._offset+'px'});} function setWidth(){self.imageWidth=self.options.width-(self.options.mode=='player'?16:8);self.interfaceWidth=self.options.mode=='player'?self.options.width:self.imageWidth;that.css({width:self.options.width+'px'});self.$image.options({width:self.imageWidth}).css({width:self.imageWidth+'px'});self.$interface.css({width:self.interfaceWidth+'px'});setPositionMarker();if(self.options.mode=='editor'){setPointMarker('in');setPointMarker('out');}} return that;};'use strict';Ox.SmallVideoTimelineImage=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({duration:0,imageURL:'',invertHighlight:false,'in':0,mode:'player',out:0,results:[],showInToOut:false,state:'default',subtitles:[],type:'',width:256}).options(options||{}).update({imageURL:function(){self.$timeline.attr({src:self.options.imageURL});},'in':function(){self.$selection.attr({src:getImageURL('selection')});},out:function(){self.$selection.attr({src:getImageURL('selection')});},results:function(){self.$results.attr({src:getImageURL('results')});},selection:function(){self.$selection.attr({src:getImageURL('selection')});},subtitles:function(){self.$subtitles.attr({src:getImageURL('subtitles')});},state:function(){self.$selection.attr({src:getImageURL('selection')});},width:function(){var width=self.options.width;that.css({width:width+'px'});self.$results.attr({src:getImageURL('results')}).css({width:width+'px'});self.$selection.attr({src:getImageURL('selection')}).css({width:width+'px'});self.$subtitles.css({width:width+'px'});self.$timeline.css({width:width+'px'});}}).css({position:'absolute',width:self.options.width+'px'});if(self.options.showInToOut){self.pixelsPerSecond=(screen.width<1024?1024:screen.width)/self.options.duration;} self.images=Ox.isString(self.options.imageURL)?1:Math.ceil(self.options.duration/3600);self.imageWidth=Ox.isString(self.options.imageURL)?1920:self.options.showInToOut?(self.pixelsPerSecond<=1?Math.round(self.options.duration):Math.round(self.options.duration*25)):Math.round(self.options.duration);self.height=self.options.mode=='editor'?24:16;self.imageHeight=self.options.mode=='editor'?18:16;self.imageTop=self.options.mode=='editor'?3:0;self.timelineTop=self.options.mode=='editor'?4:0;self.themeData=Ox.Theme.getThemeData();that.css({height:self.height+'px'});if(Ox.isString(self.options.imageURL)){self.$timeline=$('').attr({src:self.options.imageURL}).css({position:'absolute',top:self.timelineTop+'px',width:self.options.width+'px',height:'16px'}).appendTo(that);}else if(self.options.showInToOut){self.$timeline=getClipTimeline().css({position:'absolute',top:self.timelineTop+'px',width:self.options.width+'px',height:'16px'}).appendTo(that);}else{Ox.loop(self.images,function(i){$('').attr({src:self.options.imageURL(self.options.type,i)}).css({position:'absolute',left:(i*3600)+'px',top:self.timelineTop+'px',width:(i==self.images-1?self.imageWidth%3600||3600:3600)+'px',height:'16px'}).appendTo(that);});} self.$subtitles=$('');self.$results=$('');self.$selection=$('');setTimeout(function(){self.$subtitles.attr({src:getImageURL('subtitles')}).css({position:'absolute',top:self.imageTop+'px',width:self.options.width+'px',height:self.imageHeight+'px'}).appendTo(that);self.$results.attr({src:getImageURL('results')}).css({position:'absolute',top:self.imageTop+'px',width:self.options.width+'px',height:self.imageHeight+'px'}).appendTo(that);self.$selection.attr({src:getImageURL('selection')}).css({position:'absolute',top:self.imageTop+'px',width:self.options.width+'px',height:self.imageHeight+'px'}).appendTo(that);that.triggerEvent('loaded');});function getClipTimeline(){var $canvas,context,image,firstTile,lastTile,tileHeight,tileOffset,tileWidth;if(self.pixelsPerSecond<=1){firstTile=Math.floor(self.options['in']/3600);lastTile=Math.floor(self.options.out/3600);tileHeight=16;tileOffset=-Math.round(self.options['in']%3600);tileWidth=3600;}else{firstTile=Math.floor(self.options['in']/60);lastTile=Math.floor(self.options.out/60);tileHeight=64;tileOffset=-Math.round(self.options['in']%60*25);tileWidth=1500;} $canvas=$('').attr({width:self.imageWidth,height:tileHeight});context=$canvas[0].getContext('2d');Ox.loop(firstTile,lastTile+1,function(tileIndex){var $image=$('').one({load:function(){context.drawImage($image[0],tileOffset+(tileIndex-firstTile)*tileWidth,0);}}).attr({src:self.options.imageURL(tileHeight,tileIndex)});});return $canvas;} function getImageURL(image,callback){var width=image=='results'||image=='selection'?self.options.width:self.imageWidth,height=self.imageHeight,canvas=$('').attr({width:width,height:height})[0],context=canvas.getContext('2d'),imageData=context.createImageData(width,height),data=imageData.data;if(image=='results'){var top=0,bottom=height;self.options.results.forEach(function(result){var left=Math.round(result['in']/self.options.duration*width),right=Math.round(result.out/self.options.duration*width)+1,rgb=self.themeData.videoTimelineResultGradient;Ox.loop(left,right,function(x){Ox.loop(top,bottom,function(y){var alpha=self.options.mode=='editor'&&(y==top||y==bottom-1)?255:128,color=rgb[[2,3,6].indexOf(x%4+y%4)>-1?0:1],index=x*4+y*4*width;data[index]=color[0];data[index+1]=color[1];data[index+2]=color[2];data[index+3]=alpha;});});});}else if(image=='selection'&&self.options.out>self.options['in']&&!self.options.showInToOut){var left=Math.round(self.options['in']/self.options.duration*width),right=Math.round(self.options.out/self.options.duration*width)+1,spans=self.options.invertHighlight?[{left:0,right:left},{left:right,right:width}]:[{left:left,right:right}],top=0,bottom=height,rgb=self.themeData[self.options.state=='editable'?'videoTimelineEditableGradient':self.options.state=='editing'?'videoTimelineEditingGradient':self.options.state=='selected'?'videoTimelineSelectedGradient':'videoTimelineDefaultGradient'];spans.forEach(function(span){Ox.loop(span.left,span.right,function(x){Ox.loop(top,bottom,function(y){var alpha=self.options.mode=='editor'&&(y==top||y==bottom-1)?255:128,color=rgb[[2,3,6].indexOf(x%4+y%4)>-1?0:1],index=x*4+y*4*width;data[index]=color[0];data[index+1]=color[1];data[index+2]=color[2];data[index+3]=alpha;});});});}else if(image=='subtitles'){var bottom=self.options.mode=='editor'?15:14,offset=self.options.showInToOut?(self.pixelsPerSecond<=1?-self.options['in']:-self.options['in']*25):0,subtitles=self.options.showInToOut?self.options.subtitles.filter(function(subtitle){return(subtitle['in']>=self.options['in']&&subtitle['in']<=self.options.out)||(subtitle.out>=self.options['in']&&subtitle.out<=self.options.out)||(subtitle['in']self.options.out)}):self.options.subtitles;subtitles.forEach(function(subtitle){var left=Math.round(subtitle['in']/self.options.duration*self.imageWidth)+offset,right=Math.round(subtitle.out/self.options.duration*self.imageWidth)+offset+1,top=bottom-subtitle.text.split('\n').length-2;Ox.loop(left,right,function(x){Ox.loop(top,bottom,function(y){var alpha=128,color=(y==top||y==bottom-1)?[0,0,0]:[255,255,255],index=x*4+y*4*width;data[index]=color[0];data[index+1]=color[1];data[index+2]=color[2];data[index+3]=alpha;});});});} context.putImageData(imageData,0,0);return canvas.toDataURL();} return that;};'use strict';Ox.VideoAnnotationPanel=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({annotationsCalendarSize:256,annotationsHighlight:'none',annotationsMapSize:256,annotationsRange:'all',annotationsSeparator:';',annotationsSize:256,annotationsSort:'position',annotationsTooltip:Ox._('annotations'),audioTrack:'',autocomplete:null,censored:[],censoredIcon:'',censoredTooltip:'',clickLink:null,cuts:[],duration:0,enableDownload:false,enableImport:false,enableExport:false,enableSetPosterFrame:false,enableSubtitles:false,find:'',findLayer:'*',fps:25,getFrameURL:null,getLargeTimelineURL:null,getSmallTimelineURL:null,'in':0,itemName:{singular:'video',plural:'videos'},height:0,layers:[],loop:false,muted:false,out:0,paused:true,playbackRate:1,position:0,posterFrame:0,resolution:0,selected:'',selectResult:false,showAnnotations:false,showAnnotationsCalendar:false,showAnnotationsMap:false,showLargeTimeline:true,showLayers:{},showUsers:false,subtitles:[],subtitlesDefaultTrack:'en',subtitlesLayer:null,subtitlesOffset:0,subtitlesTrack:'en',timeline:'',timelines:[],videoRatio:16/9,videoSize:'small',video:'',volume:1,width:0}).options(options||{}).update({enableSubtitles:function(){self.$player.forEach(function($player){$player.options('enableSubtitles',self.options.enableSubtitles);});},height:setSizes,'in':function(){setPoint('in',self.options['in']);},loop:function(){self.$video.options({loop:self.options.loop});},out:function(){setPoint('out',self.options.out);},paused:function(){self.$player[0].options({paused:self.options.paused});},playbackRate:function(){self.$player[0].options({playbackRate:self.options.playbackRate});},position:function(){setPosition(self.options.position);},selected:function(){selectAnnotation(self.options.selected?Ox.getObjectById(self.annotations,self.options.selected):{id:''});},showAnnotations:function(){self.$mainPanel.toggleElement(1);},showLayers:function(){self.$annotationPanel.options({showLayers:Ox.clone(self.options.showLayers)});},timeline:function(){self.$menuButton.checkItem('timelines_'+self.options.timeline);updateTimelines();},volume:function(){self.$player[0].options({volume:self.options.volume});},width:setSizes}).bindEvent({key_0:toggleMuted,key_alt_left:function(){},key_alt_right:function(){},key_alt_shift_left:function(){},key_alt_shift_right:function(){},key_b:function(){self.annotations.length&&selectAnnotation(getNextAnnotation('annotation',-1));},key_backslash:function(){self.annotations.length&&selectAnnotation();},key_closebracket:function(){self.annotations.length&&movePositionTo('annotation',1);},key_comma:function(){movePositionTo('cut',-1);},key_control_c:function(){that.triggerEvent('copy',[{annotation:self.options.selected,'in':self.options['in'],out:self.options.out}]);},key_control_shift_c:function(){that.triggerEvent('copyadd',[{annotation:self.options.selected,'in':self.options['in'],out:self.options.out}]);},key_delete:function(){self.$annotationPanel.removeItem(true);},key_dot:function(){movePositionTo('cut',1);},key_down:function(){movePositionBy(self.sizes.timeline[0].width);},key_enter:function(){if(self.editing){blurAnnotation();}else if(isEditable()){editAnnotation();}},key_equal:function(){self.$player[0].changeVolume(0.1);},key_escape:function(){if(self.editing){blurAnnotation();}else if(self.options.selected){selectAnnotation({id:''});}},key_f:function(){setTimeout(function(){self.$findInput.focusInput(true);});},key_g:function(){self.results.length&&selectAnnotation(getNextAnnotation('result',1));},key_h:showKeyboardShortcuts,key_i:function(){setPoint('in',self.options.position);},key_k:function togglePlaybackRate(){that.options({playbackRate:self.options.playbackRate==1?2:self.options.playbackRate==2?0.5:1});},key_l:toggleLoop,key_left:function(){movePositionBy(-1/self.options.fps);},key_minus:function(){self.$player[0].changeVolume(-0.1);},key_n:function(){self.annotations.length&&selectAnnotation(getNextAnnotation('annotation',1));},key_o:function(){setPoint('out',self.options.position);},key_openbracket:function(){self.annotations.length&&movePositionTo('annotation',-1);},key_p:playInToOut,key_right:function(){movePositionBy(1/self.options.fps);},key_shift_0:function(){movePositionBy(-self.options.position);},key_shift_down:function(){movePositionBy(self.options.duration);},key_shift_enter:function(){if(self.editing){blurAnnotation();}else if(isEditable()){editAnnotation();}},key_shift_equal:function(){self.options.videoSize=='small'&&toggleSize();},key_shift_g:function(){self.results.length&&selectAnnotation(getNextAnnotation('result',-1));},key_shift_i:function(){goToPoint('in');},key_shift_left:function(){movePositionBy(-1);},key_shift_minus:function(){self.options.videoSize=='large'&&toggleSize();},key_shift_o:function(){goToPoint('out');},key_shift_p:function(){setPosition(self.options.posterFrame);},key_shift_right:function(){movePositionBy(1);},key_shift_up:function(){movePositionBy(-self.options.position);},key_slash:selectCut,key_space:togglePaused,key_up:function(){movePositionBy(-self.sizes.timeline[0].width);}});self.options.subtitles=options.subtitles!==void 0?self.options.subtitles:parseSubtitles();self.subtitlesTracks=Ox.sort(Ox.unique(Ox.flatten(self.options.subtitles.map(function(subtitle){return subtitle.tracks;})))).map(function(track){return{id:track,title:Ox._(track),checked:self.options.enableSubtitles&&track==self.options.subtitlesTrack};}).concat([{id:'',title:Ox._('None'),checked:!self.options.enableSubtitles}]);if(Ox.isObject(self.options.video[0])){self.resolutions=Ox.sort(Ox.unique(self.options.video.map(function(video){return video.resolution;}))).map(function(resolution){return{id:resolution+'',title:resolution+'p',checked:self.options.resolution==resolution};});self.audioTracks=Ox.sort(Ox.unique(self.options.video.map(function(video){return video.track;}))).map(function(track){return{id:track,title:Ox._(track),checked:self.options.audioTrack==track};});} self.options.layers.forEach(function(layer,i){that.bindEvent('key_'+(i+1),function(){layer.editable?addAnnotation(layer.id):that.triggerEvent('info',{layer:layer.id});});});self.$player=[];self.$timeline=[];self.annotations=getAnnotations();self.controlsHeight=16;self.editing=false;self.margin=8;self.positions=getPositions();self.results=[];self.words=getWords();self.$editor=Ox.Element().addClass('OxVideoAnnotationPanel OxMedia').on({mousedown:function(e){var $target=$(e.target);if(!$target.is('.OxPosition')&&!$target.is('input')){that.gainFocus();} if($target.is('.OxKeyboardFocus')){return;} if(self.editing){self.focused=true;setTimeout(function(){that.gainFocus();self.focused=false;},25);}}});self.sizes=getSizes();['play','in','out'].forEach(function(type,i){self.$player[i]=Ox.VideoPlayer({censored:self.options.censored,censoredIcon:self.options.censoredIcon,censoredTooltip:self.options.censoredTooltip,controlsBottom:type=='play'?['play','playInToOut','volume','size','space','position']:['goto','set','space','position'],duration:self.options.duration,enableMouse:true,enablePosition:true,enableSubtitles:self.options.enableSubtitles,externalControls:true,find:getSubtitlesFind(),height:self.sizes.player[i].height,id:'player'+Ox.toTitleCase(type),'in':self.options['in'],loop:self.options.loop,muted:self.options.muted,out:self.options.out,paused:self.options.paused,playbackRate:self.options.playbackRate,position:type=='play'?self.options.position:self.options[type],posterFrame:self.options.posterFrame,resolution:self.options.resolution,showMarkers:true,showMilliseconds:3,sizeIsLarge:self.options.videoSize=='large',subtitles:Ox.clone(self.options.subtitles,true),subtitlesDefaultTrack:self.options.subtitlesDefaultTrack,subtitlesOffset:self.options.subtitlesOffset,subtitlesTrack:self.options.subtitlesTrack,type:type,video:type=='play'?self.options.video:self.options.getFrameURL,volume:self.options.volume,width:self.sizes.player[i].width}).css({left:self.sizes.player[i].left+'px',top:self.sizes.player[i].top+'px'}).bindEvent(Ox.extend({censored:function(){that.triggerEvent('censored');}},type=='play'?{loop:function(data){that.triggerEvent('loop',data);},muted:function(data){that.triggerEvent('muted',data);},paused:function(data){self.options.paused=data.paused;that.triggerEvent('paused',data);},playing:function(data){setPosition(data.position,true);},position:function(data){setPosition(data.position);},positioning:function(data){setPosition(data.position,false,true);},resolution:function(data){that.triggerEvent('resolution',data);},size:function(){toggleSize();},submit:function(){that.gainFocus();},subtitles:function(data){that.triggerEvent('subtitles',data);},volume:function(data){that.triggerEvent('volume',data);}}:{gotopoint:function(){goToPoint(type);},position:function(data){setPoint(type,data.position);},setpoint:function(){setPoint(type,self.options.position);}})).appendTo(self.$editor);});self.$timeline[0]=Ox.LargeVideoTimeline({cuts:self.options.cuts,duration:self.options.duration,find:getSubtitlesFind(),getImageURL:self.options.getLargeTimelineURL,id:'timelineLarge','in':self.options['in'],out:self.options.out,position:self.options.position,subtitles:getSubtitles(),type:self.options.timeline,width:self.sizes.timeline[0].width}).css({left:self.sizes.timeline[0].left+'px',top:self.sizes.timeline[0].top+'px'}).bindEvent({position:function(data){setPosition(data.position);},positioning:function(data){setPosition(data.position,false,true);}}).appendTo(self.$editor);self.$timeline[1]=Ox.BlockVideoTimeline({cuts:self.options.cuts,duration:self.options.duration,find:getSubtitlesFind(),getImageURL:self.options.getSmallTimelineURL,id:'timelineSmall','in':self.options['in'],out:self.options.out,position:self.options.position,results:find(self.options.find),showPointMarkers:true,state:self.options.selected?'selected':'default',subtitles:getSubtitles(),type:self.options.timeline,videoId:self.options.videoId,width:self.sizes.timeline[1].width}).css({left:self.sizes.timeline[1].left+'px',top:self.sizes.timeline[1].top+'px'}).bindEvent({edit:function(){if(isEditable()&&!self.editing){editAnnotation();}},position:function(data){setPosition(data.position);},select:function(){selectAnnotation(void 0,true);}}).appendTo(self.$editor);self.$menubar=Ox.Bar({size:16}).addClass('OxVideoPlayer').bindEvent({doubleclick:function(e){if($(e.target).is('.OxBar')){self.$editor.animate({scrollTop:0},250);}}});self.$keyboardShortcuts=$('
').css({margin:'16px'});[{key:Ox.SYMBOLS.space,action:Ox._('Play/Pause')},{key:'P',action:Ox._('Play In to Out')},{key:'K',action:Ox._('Toggle Playback Speed')},{key:'L',action:Ox._('Loop')},{key:'0',action:Ox._('Mute/Unmute')},{key:'-',action:Ox._('Turn Volume Down')},{key:'+',action:Ox._('Turn Volume Up')},{key:Ox.SYMBOLS.shift+'-',action:Ox._('Small Player')},{key:Ox.SYMBOLS.shift+'+',action:Ox._('Large Player')},{key:Ox.SYMBOLS.arrow_left,action:Ox._('Go One Frame Back')},{key:Ox.SYMBOLS.arrow_right,action:Ox._('Go One Frame Forward')},{key:Ox.SYMBOLS.shift+Ox.SYMBOLS.arrow_left,action:Ox._('Go One Second Back')},{key:Ox.SYMBOLS.shift+Ox.SYMBOLS.arrow_right,action:Ox._('Go One Second Forward')},{key:Ox.SYMBOLS.arrow_up,action:Ox._('Go One Line Up')},{key:Ox.SYMBOLS.arrow_down,action:Ox._('Go One Line Down')},{key:Ox.SYMBOLS.shift+Ox.SYMBOLS.arrow_up,action:Ox._('Go to First Frame')},{key:Ox.SYMBOLS.shift+Ox.SYMBOLS.arrow_down,action:Ox._('Go to Last Frame')},{key:'I',action:Ox._('Set In Point')},{key:'O',action:Ox._('Set Out Point')},{key:Ox.SYMBOLS.shift+'I',action:Ox._('Go to In Point')},{key:Ox.SYMBOLS.shift+'O',action:Ox._('Go to Out Point')},{key:'[',action:Ox._('Go to Previous Annotation')},{key:']',action:Ox._('Go to Next Annotation')},{key:'\\',action:Ox._('Select Current Annotation')},{key:'B',action:Ox._('Select Previous Annotation')},{key:'N',action:Ox._('Select Next Annotation')},{key:'<',action:Ox._('Go to Previous Cut')},{key:'>',action:Ox._('Go to Next Cut')},{key:'/',action:Ox._('Select Current Cut')},{key:'F',action:Ox._('Find')},{key:Ox.SYMBOLS.shift+'G',action:Ox._('Go to Previous Result')},{key:'G',action:Ox._('Go to Next Result')},{key:Ox.SYMBOLS['return'],action:Ox._('Edit/Submit')},{key:Ox.SYMBOLS.escape,action:Ox._('Cancel/Deselect')},{key:Ox.SYMBOLS.delete,action:Ox._('Delete')}].concat(Ox.filter(self.options.layers.slice(0,9).map(function(layer,i){return layer.editable?{key:i+1,action:Ox._('Add {0}',[layer.item])}:null;}))).forEach(function(shortcut){self.$keyboardShortcuts.append($('
').css({display:'table-row'}).append($('
').css({display:'table-cell',height:'16px',paddingRight:'16px',textAlign:'right'}).html(shortcut.key)).append($('
').css({display:'table-cell'}).html(shortcut.action)));});self.$menuButton=Ox.MenuButton({items:[].concat([{id:'size',title:Ox._('Large Player'),checked:self.options.videoSize=='large'},{id:'loop',title:Ox._('Loop'),checked:self.options.loop,keyboard:'l'},{},{id:'resolutions',title:Ox._('Resolution'),items:[{group:'resolution',min:1,max:1,items:self.resolutions}]}],self.audioTracks.length>1?[{id:'audioTracks',title:Ox._('Audio'),items:[{group:'audioTrack',min:1,max:1,items:self.audioTracks}]}]:[],self.options.subtitles.length?[{id:'subtitlesTracks',title:Ox._('Subtitles'),items:[{group:'subtitlesTrack',min:1,max:1,items:self.subtitlesTracks}]}]:[],[{id:'timelines',title:Ox._('Timeline'),items:[{group:'timeline',min:1,max:1,items:Ox.map(self.options.timelines,function(timeline){return Ox.extend({checked:timeline.id==self.options.timeline},timeline);})}]},{},{id:'gotoPosterFrame',title:Ox._('Go to Poster Frame'),keyboard:'shift p'},{id:'setPosterFrame',title:Ox._('Set Poster Frame'),disabled:!self.options.enableSetPosterFrame},{},{id:'downloadVideo',title:Ox._('Download Video...'),disabled:!self.options.enableDownload},{id:'downloadFrame',title:Ox._('Download Frame...'),disabled:!self.options.enableDownload},{id:'downloadSelection',title:Ox._('Download Selection...'),disabled:!self.options.enableDownload},{id:'embedSelection',title:Ox._('Embed Selection...')},{id:'linkToSelection',title:Ox._('Link to Selection...')},{},{id:'keyboard',title:Ox._('Keyboard Shortcuts...'),keyboard:'h'}]),style:'square',title:'set',tooltip:Ox._('Options'),type:'image'}).css({float:'left'}).bindEvent({click:function(data){var id=data.id;if(id=='gotoPosterFrame'){setPosition(self.options.posterFrame);}else if(id=='setPosterFrame'){self.options.posterFrame=self.options.position;self.$player.forEach(function($player){$player.options('posterFrame',self.options.posterFrame);});that.triggerEvent('posterframe',{position:self.options.posterFrame});}else if(id=='downloadVideo'){that.triggerEvent('downloadvideo');}else if(id=='downloadFrame'){that.triggerEvent('downloadframe',{'position':self.options.position});}else if(id=='downloadSelection'){that.triggerEvent('downloadselection',{'in':self.options['in'],out:self.options.out});}else if(id=='embedSelection'){that.triggerEvent('embedselection',{'in':self.options['in'],out:self.options.out});}else if(id=='linkToSelection'){that.triggerEvent('linktoselection',{'in':self.options['in'],out:self.options.out});}else if(id=='keyboard'){showKeyboardShortcuts();}},change:function(data){var enableSubtitles,id=data.id;if(id=='size'){toggleSize();}else if(id=='loop'){toggleLoop();}else if(id=='resolution'){self.options.resolution=parseInt(data.checked[0].id,10);self.$player[0].options({resolution:self.options.resolution});}else if(id=='audioTrack'){self.options.audioTrack=data.checked[0].id;self.$player[0].options({audioTrack:self.options.audioTrack});}else if(id=='subtitlesTrack'){enableSubtitles=!!data.checked[0].id;if(enableSubtitles!=self.options.enableSubtitles){that.triggerEvent('subtitles',{subtitles:enableSubtitles});} self.options.subtitlesTrack=data.checked[0].id;setSubtitlesTrack();}else if(id=='timeline'){self.options.timeline=data.checked[0].id;updateTimelines();that.triggerEvent('timeline',{timeline:self.options.timeline});}},hide:function(){that.gainFocus();}}).appendTo(self.$menubar);self.$clearButton=Ox.Button({disabled:self.options.find==='',style:'symbol',title:'close',tooltip:Ox._('Clear'),type:'image'}).css({float:'right'}).bindEvent({click:function(){self.$findInput.clearInput();submitFindInput('');}}).appendTo(self.$menubar);self.$findInput=Ox.Input({autocomplete:self.words.map(function(word){return word.value;}),autocompleteReplace:false,autocompleteSelect:true,autocompleteSelectHighlight:true,autocompleteSelectMax:10,autocompleteSelectSubmit:true,changeOnKeypress:true,placeholder:Ox._('Find...'),value:self.options.find,width:128}).css({float:'right',background:'transparent'}).bindEvent({change:function(data){submitFindInput(data.value,false);},submit:function(data){submitFindInput(data.value,true);}}).appendTo(self.$menubar);self.$nextButton=Ox.Button({disabled:true,style:'symbol',title:'arrowRight',tooltip:Ox._('Next Result'),type:'image'}).css({float:'right'}).bindEvent({click:function(){selectAnnotation(getNextAnnotation('result',1));}}).appendTo(self.$menubar);self.$previousButton=Ox.Button({disabled:true,style:'symbol',title:'arrowLeft',tooltip:Ox._('Previous Result'),type:'image'}).css({float:'right'}).bindEvent({click:function(){selectAnnotation(getNextAnnotation('result',-1));}}).appendTo(self.$menubar);self.$results=$('
').css({float:'right',width:'36px',padding:'2px 4px 0 0',fontSize:'9px',textAlign:'right',cursor:'default',opacity:0.25}).html('0').appendTo(self.$menubar.$element);self.$annotationPanel=Ox.AnnotationPanel({autocomplete:self.options.autocomplete,calendarSize:self.options.annotationsCalendarSize,clickLink:self.options.clickLink,editable:true,enableExport:self.options.enableExport,enableImport:self.options.enableImport,highlight:self.options.find,highlightAnnotations:self.options.annotationsHighlight,highlightLayer:self.options.findLayer,'in':self.options['in'],itemName:self.options.itemName,layers:self.options.layers,mapSize:self.options.annotationsMapSize,out:self.options.out,position:self.options.position,range:self.options.annotationsRange,selected:self.options.selected,separator:self.options.annotationsSeparator,showCalendar:self.options.showAnnotationsCalendar,showFind:true,showLayers:Ox.clone(self.options.showLayers),showMap:self.options.showAnnotationsMap,showUsers:self.options.showUsers,sort:self.options.annotationsSort,width:self.options.annotationsSize}).bindEvent({add:function(data){addAnnotation(data.layer);},annotationsrange:function(data){self.options.annotationsRange=data.range;that.triggerEvent('annotationsrange',data);},annotationssort:function(data){self.options.annotationsSort=data.sort;that.triggerEvent('annotationssort',data);},blur:function(data){if(!self.focused&&!$('.OxDialogLayer').length&&!$('.OxMenuLayer').length){blurAnnotation();}},change:function(data){if(data.layer==self.options.subtitlesLayer){updateSubtitles();} that.triggerEvent('editannotation',data);},define:function(data){that.triggerEvent('define',data);},edit:function(data){updateWords('remove');self.editing=true;setTimelineState();},exportannotations:function(){that.triggerEvent('exportannotations');},find:function(data){self.$findInput.options({value:data.value});submitFindInput(data.value,true);},findannotations:function(data){that.triggerEvent('findannotations',data);},focus:that.gainFocus,highlightannotations:function(data){self.options.annotationsHighlight=data;that.triggerEvent('annotationshighlight',data);},highlightlayer:function(data){self.options.findLayer=data;submitFindInput(self.$findInput.value(),false);that.triggerEvent('findlayer',data);},importannotations:function(){that.triggerEvent('importannotations');},info:function(data){that.triggerEvent('info',data);},open:function(){setPosition(self.options['in']);},remove:removeAnnotation,resize:resizeAnnotations,resizeend:resizeendAnnotations,resizecalendar:function(data){that.triggerEvent('resizecalendar',data);},resizemap:function(data){that.triggerEvent('resizemap',data);},select:function(data){selectAnnotation(data,!self.updating);},showentityinfo:function(data){that.triggerEvent('showentityinfo',data);},submit:submitAnnotation,toggle:toggleAnnotations,togglecalendar:function(data){self.options.showAnnotationsCalendar=!data.collapsed;that.triggerEvent('togglecalendar',data);},togglelayer:function(data){that.triggerEvent('togglelayer',{collapsed:data.collapsed,layer:data.layer});},togglemap:function(data){self.options.showAnnotationsMap=!data.collapsed;that.triggerEvent('togglemap',data);}});['0','1','2','3','4','5','6','7','8','9','b','backslash','closebracket','comma','dot','equal','f','g','h','i','minus','n','o','openbracket','p','shift_0','shift_equal','shift_g','shift_i','shift_minus','shift_o','slash','space','control_c','control_v',].forEach(function(key){key='key.'+key;self.$annotationPanel.bindEvent(key,function(){that.triggerEvent(key);});});that.setElement(self.$mainPanel=Ox.SplitPanel({elements:[{element:Ox.SplitPanel({elements:[{element:self.$menubar,size:16},{element:self.$editor}],orientation:'vertical'})},{collapsed:!self.options.showAnnotations,collapsible:true,element:self.$annotationPanel,resizable:true,resize:[192,256,320,384,448,512],size:self.options.annotationsSize,tooltip:self.options.annotationsTooltip}],orientation:'horizontal'}));self.options.find&&self.options.selectResult&&setTimeout(function(){submitFindInput(self.options.find,!self.options.selected);});function addAnnotation(layer){if(self.editing){self.editing=false;setTimelineState();self.$annotationPanel.blurItem();} that.triggerEvent('addannotation',{'in':self.options['in'],layer:layer,out:self.options.out,value:''});} function blurAnnotation(){updateWords('add');self.editing=false;setTimelineState();if(self.options.annotationsRange=='position'&&(self.options.positionself.options.out)){setPosition(self.options['in']);} setTimeout(self.$annotationPanel.blurItem);} function editAnnotation(){updateWords('remove');self.editing=true;setTimelineState();self.$annotationPanel.editItem();} function find(query){var results=[];if(query.length){query=query.toLowerCase();results=self.annotations.filter(function(annotation){return Ox.contains(['*',annotation.layer],self.options.findLayer)&&Ox.decodeHTMLEntities(Ox.stripTags(annotation.value.toLowerCase())).indexOf(query)>-1;});} return results;} function getAnnotation(){var annotations=self.annotations.filter(function(annotation){return annotation['in']<=self.options.position&&annotation.out>=self.options.position}).sort(function(a,b){var aValue=self.options.position-a['in'],bValue=self.options.position-b['in'],ret=0;if(aValuebValue){ret=1;}else if(a.durationb.duration){ret=1;}else if(a.valueb.value){ret=1;} return ret;});return annotations.length?annotations[0]:{id:''};} function getAnnotations(){return Ox.flatten(self.options.layers.map(function(layer){return layer.items.map(function(item){return Ox.extend({layer:layer.id},item)});})).sort(sortAnnotations);} function getAnnotationValue(annotationId){var found=false,value;Ox.forEach(self.options.layers,function(layer,i){Ox.forEach(layer.items,function(item){if(item.id==annotationId){value=item.value;found=true;return false;}});if(found){return false;}});return value;} function getNextAnnotation(type,direction){var annotation,annotations=type=='annotation'?self.annotations:self.results,index,position;if(self.options.selected){index=Ox.getIndexById(annotations,self.options.selected);if(index>-1&&self.options.position==annotations[index]['in']){annotation=annotations[Ox.mod(index+direction,annotations.length)];}} if(!annotation){position=getNextPosition(type,direction);annotations=annotations.filter(function(annotation){return annotation['in']==position;});annotation=annotations[direction==1?0:annotations.length-1];} return annotation;} function getNextPosition(type,direction){var positions;if(type=='annotation'){positions=self.positions;}else if(type=='cut'){positions=[0].concat(self.options.cuts,self.options.duration);}else if(type=='result'){positions=Ox.unique(self.results.map(function(result){return result['in'];}));} return Ox.nextValue(positions,self.options.position,direction);} function getPositions(){return Ox.unique(self.annotations.map(function(annotation){return annotation['in'];}));} function getSelectedLayer(){var selectedLayer;Ox.forEach(self.options.layers,function(layer){Ox.forEach(layer.items,function(item){if(item.id==self.options.selected){selectedLayer=layer.id;return false;}});if(selectedLayer){return false;}});return selectedLayer;} function getSizes(scrollbarIsVisible){var scrollbarWidth=Ox.UI.SCROLLBAR_SIZE,contentWidth=self.options.width -(self.options.showAnnotations*self.options.annotationsSize)-1 -(scrollbarIsVisible?scrollbarWidth:0),height,lines,size={player:[],timeline:[]},width,widths;function getHeight(){return size.player[0].height+self.controlsHeight +size.timeline[0].height+lines*16 +(lines+3)*self.margin;} if(self.options.videoSize=='small'){width=0;widths=Ox.splitInt(contentWidth-4*self.margin,3);[1,0,2].forEach(function(v,i){size.player[v]={left:(i+0.5)*self.margin+width,top:self.margin/2,width:widths[i],height:Math.round(widths[1]/self.options.videoRatio)};width+=widths[i];});}else{size.player[0]={left:self.margin/2,top:self.margin/2,width:Math.round((contentWidth-3*self.margin+(self.controlsHeight+self.margin)/2*self.options.videoRatio)*2/3)};size.player[0].height=Math.round(size.player[0].width/self.options.videoRatio);size.player[1]={left:size.player[0].left+size.player[0].width+self.margin,top:size.player[0].top,width:contentWidth-3*self.margin-size.player[0].width};size.player[1].height=Math.ceil(size.player[1].width/self.options.videoRatio);size.player[2]={left:size.player[1].left,top:size.player[0].top+size.player[1].height+self.controlsHeight+self.margin,width:size.player[1].width,height:size.player[0].height-size.player[1].height-self.controlsHeight-self.margin};} size.timeline[0]={left:self.margin/2,top:size.player[0].height+self.controlsHeight+1.5*self.margin,width:contentWidth-2*self.margin,height:64};size.timeline[1]={left:size.timeline[0].left,top:size.timeline[0].top+size.timeline[0].height+self.margin,width:size.timeline[0].width};lines=Math.ceil(self.options.duration/size.timeline[1].width);height=getHeight();self.$editor.css({overflowY:(scrollbarIsVisible&&height<=self.options.height-16)?'scroll':'auto'});return(!scrollbarIsVisible&&height>self.options.height-16)?getSizes(true):size;} function getSubtitles(){return self.options.enableSubtitles?self.options.subtitles.filter(function(v){return Ox.contains(v.tracks,self.options.subtitlesTrack);}):[];} function getSubtitlesFind(){return Ox.contains([self.options.subtitlesLayer,'*'],self.options.findLayer)?self.options.find:'';} function getWords(){var words=[];Ox.forEach(Ox.count(Ox.words(self.annotations.map(function(annotation){return Ox.decodeHTMLEntities(Ox.stripTags(annotation.value.toLowerCase()));}).join(' '))),function(count,value){words.push({count:count,value:value});}) return words.sort(function(a,b){return b.count-a.count;});} function goToPoint(point){setPosition(self.options[point]);} function isEditable(){var annotation=Ox.getObjectById(self.annotations,self.options.selected);return annotation&&annotation.editable;} function movePositionBy(sec){setPosition(Ox.limit(self.options.position+sec,0,self.options.duration));} function movePositionTo(type,direction){setPosition(getNextPosition(type,direction));} function parseSubtitles(){return self.options.subtitlesLayer?self.options.layers.filter(function(layer){return layer.id==self.options.subtitlesLayer;})[0].items.map(function(subtitle){return{id:subtitle.id,'in':subtitle['in'],out:subtitle.out,text:subtitle.value.replace(/\n/g,' ').replace(//g,'\n'),tracks:subtitle.languages||[self.options.subtitlesDefaultTrack]};}):[];} function playInToOut(){self.$player[0].playInToOut();} function removeAnnotation(data){var layer=Ox.getObjectById(self.options.layers,data.layer),index=Ox.getIndexById(layer.items,data.id);self.options.selected=data.id;updateWords('remove');self.options.selected='';layer.items.splice(index,1);self.annotations=getAnnotations();self.positions=getPositions();self.options.find&&submitFindInput(self.options.find);self.editing=false;if(data.layer==self.options.subtitlesLayer){updateSubtitles();} setTimelineState();self.$annotationPanel.removeItem();that.triggerEvent('removeannotation',data);} function resizeAnnotations(data){self.options.annotationsSize=data.size;setSizes();self.$annotationPanel.options({width:data.size});} function resizeendAnnotations(data){that.triggerEvent('annotationssize',{size:data.size});} function selectAnnotation(data,moveToPosition){if(Ox.isUndefined(data)){data=getAnnotation();}else if(!data.id&&Ox.$elements[that.oxid]){that.gainFocus();} if(data.id){var outOfRange=self.options.annotationsRange!='position'&&(self.options.positiondata.out) if(moveToPosition&&outOfRange){setPosition(data['in']);} if(!self.editing){setPoint('in',data['in'],true);setPoint('out',data.out,true);}} if(!self.editing){self.options.selected=data.id;self.$annotationPanel.options({selected:self.options.selected});setTimelineState();that.triggerEvent('select',{id:self.options.selected});}} function selectCut(){var points={'in':Ox.last(self.options.cuts),out:self.options.duration};Ox.forEach(self.options.cuts,function(cut,i){if(cut>self.options.position){points={'in':i==0?0:self.options.cuts[i-1],out:cut-1/self.options.fps};return false;}});setPoint('in',points['in']);setPoint('out',points.out);} function setPoint(point,position,keepSelected){self.options[point]=position;if(self.options.selected&&!self.editing&&!keepSelected){selectAnnotation({id:''});} self.$player.forEach(function($player){$player.options(point,self.options[point]);});self.$player[point=='in'?1:2].options({position:self.options[point]});self.$timeline.forEach(function($timeline){$timeline.options(point,self.options[point]);});if(self.options['in']>self.options.out){setPoint(point=='in'?'out':'in',position,keepSelected);}else{self.$annotationPanel.options({'in':self.options['in'],out:self.options.out});that.triggerEvent('points',{'in':self.options['in'],out:self.options.out,position:self.options.position});if(self.editing&&self.options.selected.length&&self.options.selected[0]!='_'){that.triggerEvent('editannotation',{id:self.options.selected,'in':self.options['in'],out:self.options.out,value:$('.OxEditableElement input:visible').val()});}}} function setPosition(position,playing,dragging){var minute=Math.floor(position/60),previousMinute=Math.floor(self.options.position/60);self.options.position=position;!playing&&self.$player[0].options({position:self.options.position});self.$timeline.forEach(function($timeline){$timeline.options({position:self.options.position});});self.$annotationPanel.options({position:self.options.position});if((!playing||minute!=previousMinute)&&!dragging){that.triggerEvent(playing?'playing':'position',{position:!playing?self.options.position:minute*60});}} function setSizes(){self.sizes=getSizes();self.$player.forEach(function($player,i){$player.options({height:self.sizes.player[i].height,width:self.sizes.player[i].width}).css({left:self.sizes.player[i].left+'px',top:self.sizes.player[i].top+'px'});});self.$timeline.forEach(function($timeline,i){$timeline.options({width:self.sizes.timeline[i].width}).css({left:self.sizes.timeline[i].left+'px',top:self.sizes.timeline[i].top+'px'});});} function setSubtitlesTrack(){var enableSubtitles=self.options.subtitlesTrack!='',subtitles,toggleSubtitles=enableSubtitles!=self.options.enableSubtitles;self.options.enableSubtitles=enableSubtitles;if(toggleSubtitles){self.$player.forEach(function($player){$player.options({enableSubtitles:self.options.enableSubtitles});});that.triggerEvent('subtitles',{subtitles:self.options.enableSubtitles});}else{self.$player.forEach(function($player){$player.options({subtitlesTrack:self.options.subtitlesTrack});});} self.$timeline.forEach(function($timeline){$timeline.options({subtitles:getSubtitles()});});} function showKeyboardShortcuts(){var dialog=Ox.Dialog({buttons:[Ox.Button({id:'close',title:Ox._('Close')}).bindEvent({click:function(){dialog.close();}})],content:self.$keyboardShortcuts,height:384,keys:{enter:'close',escape:'close'},title:Ox._('Keyboard Shortcuts'),width:256}).open();} function setTimelineState(){self.$timeline[1].options({state:self.editing?'editing':isEditable()?'editable':self.options.selected?'selected':'default'});} function sortAnnotations(a,b){var ret=0;if(a['in']b['in']){ret=1;}else if(a.outb.out){ret=1;}else if(a.valueb.value){ret=1;} return ret;} function submitAnnotation(data){self.annotations=getAnnotations();self.positions=getPositions();updateWords('add');self.options.find&&submitFindInput(self.options.find);self.editing=false;if(data.layer==self.options.subtitlesLayer){updateSubtitles();} setTimelineState();if(self.options.annotationsRange=='position'&&(self.options.positionself.options.out)){setPosition(self.options['in']);} data['in']=self.options['in'];data.out=self.options.out;that.triggerEvent('editannotation',data);} function submitFindInput(value,hasPressedEnter){self.options.find=value;self.results=find(self.options.find);self.$results.css({opacity:self.results.length?1:0.25}).html(self.results.length);self.$previousButton.options({disabled:!self.results.length});self.$nextButton.options({disabled:!self.results.length});self.$clearButton.options({disabled:!self.options.find});self.$player.forEach(function($player){$player.options({find:getSubtitlesFind()});});self.$timeline.forEach(function($timeline){$timeline.options({find:getSubtitlesFind()});});self.$timeline[1].options({results:self.results});if(hasPressedEnter){that.triggerEvent('find',{find:self.options.find});if(self.results.length){selectAnnotation(getNextAnnotation('result',1));that.gainFocus();}else{self.$findInput.focusInput(true);}} self.$annotationPanel.options({highlight:self.options.find,highlightLayer:self.options.findLayer,});} function toggleAnnotations(data){self.options.showAnnotations=!data.collapsed;setSizes();that.triggerEvent('toggleannotations',{showAnnotations:self.options.showAnnotations});} function toggleLoop(){self.options.loop=!self.options.loop;self.$menuButton[self.options.loop?'checkItem':'uncheckItem']('loop');self.$player[0].toggleLoop();} function toggleMuted(){self.$player[0].toggleMuted();} function togglePaused(){self.$player[0].togglePaused();self.$player[0].options('paused')&&that.triggerEvent('position',{position:self.$player[0].options('position')});} function toggleSize(){self.options.videoSize=self.options.videoSize=='small'?'large':'small';setSizes();self.$menuButton[self.options.videoSize=='small'?'uncheckItem':'checkItem']('size');self.$player[0].options({sizeIsLarge:self.options.videoSize=='large'});that.triggerEvent('togglesize',{size:self.options.videoSize});} function updateSubtitles(){self.options.subtitles=parseSubtitles();self.$player.forEach(function($player){$player.options({subtitles:Ox.clone(self.options.subtitles,true)});});if(self.options.enableSubtitles){self.$timeline.forEach(function($timeline){$timeline.options({subtitles:getSubtitles()});});}} function updateTimelines(){self.$timeline.forEach(function($timeline){$timeline.options({type:self.options.timeline});});} function updateWords(action){var words=[];Ox.forEach(Ox.count(Ox.words(getAnnotationValue(self.options.selected)||'')),function(count,value){words.push({count:count,value:value});});words.forEach(function(word){var index=Ox.indexOf(self.words,function(w){return w.value===word.value;});if(action=='add'){if(index==-1){self.words.push({count:1,value:word.value});}else{self.words[index].count++;}}else if(index>-1){if(self.words[index].count==1){self.words.splice(index,1);}else{self.words[index].count--;}}});self.words.sort(function(a,b){return b.count-a.count;});self.$findInput.options({autocomplete:self.words.map(function(word){return word.value;})});} that.addAnnotation=function(layer,annotation){self.$annotationPanel.addItem(layer,annotation);};that.getCurrentAnnotations=function(){return self.$annotationPanel.getCurrentAnnotations();};that.updateAnnotation=function(id,annotation){self.updating=true if(annotation.id){self.options.selected=annotation.id;} if(getSelectedLayer()==self.options.subtitlesLayer){updateSubtitles();} self.$annotationPanel.updateItem(id,annotation);if(id!=annotation.id){self.annotations=getAnnotations();setTimelineState();} self.updating=false};that.playInToOut=function(){self.$player[0].playInToOut();} return that;};'use strict';Ox.VideoEditPanel=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({annotationsCalendarSize:256,annotationsMapSize:256,annotationsRange:'all',annotationsSort:'position',clipRatio:16/9,clips:[],clipSize:256,clipTooltip:'clips',clipView:'list',clickLink:null,controlsTooltips:{},duration:0,editable:false,enableSubtitles:false,formatTitle:function(){return Ox.last(arguments);},fps:25,fullscreen:false,getClipImageURL:null,getLargeTimelineURL:null,height:0,'in':0,loop:false,layers:[],muted:false,out:0,paused:true,playbackRate:1,playInToOut:false,position:0,resolution:0,scaleToFill:false,selected:[],showAnnotationsCalendar:false,showAnnotationsMap:false,showClips:false,showLayers:{},showTimeline:false,showUsers:false,smallTimelineURL:'',sort:[],sortOptions:[],subtitles:[],subtitlesOffset:0,timeline:'',timelineTooltip:'timeline',type:'static',video:[],volume:1,width:0}).options(options||{}).update({clips:function(){self.$clipPanel.options({clips:Ox.clone(self.options.clips),sort:Ox.clone(self.options.sort)});},clipSize:function(){self.$mainPanel.resizeElement(1,self.options.clipSize);resizeClips({size:self.options.clipSize});},clipView:function(){self.$clipPanel.options({view:self.options.clipView});},duration:function(){self.$timeline&&self.$timeline.replaceWith(self.$timeline=getTimeline());},fullscreen:function(){self.$video.options({fullscreen:self.options.fullscreen});},height:function(){self.$video.options({height:getPlayerHeight()});self.$clipPanel.options({height:self.options.height});},'in':function(){setPoint('in',self.options['in']);},out:function(){setPoint('out',self.options.out);},paused:function(){self.$video.options({paused:self.options.paused});},playbackRate:function(){self.$video.options({playbackRate:self.options.playbackRate});},position:function(){self.$video.options({position:self.options.position});self.$timeline.options({position:self.options.position});self.$clipPanel.options({position:self.options.position});},selected:function(){self.$clipPanel.options({selected:self.options.selected});},showClips:function(){self.$mainPanel.toggleElement(1);},showLayers:function(){self.$clipPanel.options({showLayers:self.options.showLayers});},showTimeline:function(){self.$videoPanel.toggleElement(2);},smallTimelineURL:function(){self.$video.options({timeline:self.options.smallTimelineURL});},subtitles:function(){self.$video.options({subtitles:self.options.subtitles});self.$timeline.options({subtitles:self.options.enableSubtitles?self.options.subtitles:[]});},timeline:function(){self.$timeline.options({type:self.options.timeline});},video:function(){self.chapters=getChapters();self.cuts=getCuts();self.$video.options({chapters:self.chapters,video:self.options.video});self.$timeline.options({cuts:self.cuts});},volume:function(){self.$video.options({volume:self.options.volume});},width:function(){self.$video.options({width:getPlayerWidth()});self.$timeline.options({width:getTimelineWidth()});}}).bindEvent({key_0:toggleMuted,key_backslash:function(){if(self.options.view!='annotations'){self.$clipPanel.selectClip();}},key_closebracket:function(){movePositionTo('chapter',1);},key_comma:function(){movePositionTo('cut',-1);},key_control_c:function(){that.triggerEvent('copy',[{annotation:self.options.selected,'in':self.options['in'],out:self.options.out}]);},key_control_v:function(){that.triggerEvent('paste');},key_dot:function(){movePositionTo('cut',1);},key_equal:function(){self.$video.changeVolume(0.1);},key_i:function(){setPoint('in',self.options.position,true);},key_left:function(){movePositionBy(-0.04);},key_minus:function(){self.$video.changeVolume(-0.1);},key_o:function(){setPoint('out',self.options.position,true);},key_openbracket:function(){movePositionTo('chapter',-1);},key_right:function(){movePositionBy(0.04);},key_shift_i:function(){goToPoint('in');},key_shift_left:function(){movePositionBy(-1);},key_shift_o:function(){goToPoint('out');},key_slash:function(){},key_shift_right:function(){movePositionBy(1);},key_space:togglePaused});self.chapters=getChapters();self.cuts=getCuts();self.fullscreen=false;self.listSizes=[144+Ox.UI.SCROLLBAR_SIZE,280+Ox.UI.SCROLLBAR_SIZE,416+Ox.UI.SCROLLBAR_SIZE],self.$menubar=Ox.Bar({size:24});self.$player=Ox.Element().css({overflowX:'hidden'});self.$video=Ox.VideoPlayer({chapters:self.chapters,controlsBottom:['play','playInToOut','volume','scale','timeline','previous','next','loop','position','settings'],controlsTooltips:self.options.controlsTooltips,controlsTop:['fullscreen','chapterTitle','open'],cuts:self.cuts,enableKeyboard:true,enableMouse:true,enablePosition:true,enableSubtitles:self.options.enableSubtitles,enableTimeline:true,externalControls:true,height:getPlayerHeight(),'in':self.options['in'],loop:self.options.loop,muted:self.options.muted,out:self.options.out,playbackRate:self.options.playbackRate,paused:self.options.paused,position:self.options.position,resolution:self.options.resolution,scaleToFill:self.options.scaleToFill,showMilliseconds:3,subtitles:self.options.subtitles,subtitlesOffset:self.options.subtitlesOffset,timeline:self.options.smallTimelineURL,video:self.options.video,volume:self.options.volume,width:getPlayerWidth()}).bindEvent({durationchange:function(data){self.options.duration=data.duration;setPosition(self.$video.options('position'),true);self.$clipPanel.options({duration:self.options.duration});},fullscreen:function(data){self.options.fullscreen=data.fullscreen;},loop:function(data){that.triggerEvent('loop',data);},key_control_v:function(){that.triggerEvent('paste');},muted:function(data){that.triggerEvent('muted',data);},open:function(data){var clip=Ox.last(self.options.clips.filter(function(clip){return clip.position<=self.options.position;}));that.triggerEvent('openlink',{annotation:clip.annotation,'in':clip['in'],item:clip.item,out:clip.out,position:clip['in']+self.options.position-clip['position'],});},paused:function(data){self.options.paused=data.paused;that.triggerEvent('paused',data);},playing:function(data){setPosition(data.position,true);},position:function(data){setPosition(data.position);},positioning:function(data){setPosition(data.position,false,true);},resolution:function(data){that.triggerEvent('resolution',data);},scale:function(data){that.triggerEvent('scale',data);},subtitles:function(data){self.$timeline.options({subtitles:data.subtitles?self.options.subtitles:[]});that.triggerEvent('subtitles',data);},subtitlestrack:function(data){var enableSubtitles=!!data.track;if(enableSubtitles!=self.options.enableSubtitles){self.options.enableSubtitles=enableSubtitles;that.triggerEvent('subtitles',{subtitles:enableSubtitles});} self.$timeline.options({subtitles:enableSubtitles?self.options.subtitles:[]});},volume:function(data){that.triggerEvent('volume',data);}}).appendTo(self.$player);self.$controls=Ox.Element().addClass('OxMedia').bindEvent({toggle:toggleControls});self.$timeline=getTimeline().appendTo(self.$controls);self.$videoPanel=Ox.SplitPanel({elements:[{element:self.$menubar,size:24},{element:self.$player},{collapsed:!self.options.showTimeline,collapsible:true,element:self.$controls,size:80,tooltip:self.options.timelineTooltip}],orientation:'vertical'});self.$clipPanel=Ox.ClipPanel({annotationsCalendarSize:self.options.annotationsCalendarSize,annotationsMapSize:self.options.annotationsMapSize,annotationsRange:self.options.annotationsRange,annotationsSort:self.options.annotationsSort,clipRatio:self.options.clipRatio,clips:Ox.clone(self.options.clips),clickLink:self.options.clickLink,duration:self.options.duration,editable:self.options.editable,formatTitle:self.options.formatTitle,getClipImageURL:self.options.getClipImageURL,'in':self.options['in'],layers:Ox.clone(self.options.layers),out:self.options.out,position:self.options.position,selected:self.options.selected,showAnnotationsCalendar:self.options.showAnnotationsCalendar,showAnnotationsMap:self.options.showAnnotationsMap,showLayers:self.options.showLayers,showUsers:self.options.showUsers,sort:Ox.clone(self.options.sort),sortOptions:self.options.sortOptions,view:self.options.clipView,width:self.options.clipSize}).bindEvent({copy:function(data){that.triggerEvent('copy',data);},copyadd:function(data){that.triggerEvent('copyadd',data);},cut:function(data){that.triggerEvent('cut',data);},cutadd:function(data){that.triggerEvent('cutadd',data);},'delete':function(data){that.triggerEvent('delete',data);},edit:function(data){that.triggerEvent('edit',data);},join:function(data){that.triggerEvent('join',data);},move:function(data){that.triggerEvent('move',data);},open:function(data){setPosition(getClipById(data.ids[0])['position']);that.triggerEvent('open',data);},paste:function(){that.triggerEvent('paste');},resize:resizeClips,resizeend:resizeendClips,select:function(data){self.options.selected=data.ids;that.triggerEvent('select',data);},selectannotation:function(data){that.triggerEvent('selectannotation',data);},sort:function(data){self.options.sort=data;that.triggerEvent('sort',data);},split:function(data){that.triggerEvent('split',data);},toggle:toggleClips,view:function(data){that.triggerEvent('view',data);}});that.setElement(self.$mainPanel=Ox.SplitPanel({elements:[{element:self.$videoPanel},{collapsed:!self.options.showClips,collapsible:true,element:self.$clipPanel,resizable:true,resize:self.listSizes,size:self.options.clipSize,tooltip:self.options.clipTooltip}],orientation:'horizontal'}));function dragTimeline(data){self.options.position=data.position;self.$video.options({position:self.options.position});self.$clipPanel.options({position:self.options.position});} function dragendTimeline(data){dragTimeline(data);that.triggerEvent('position',{position:self.options.position});} function getChapters(){return self.options.clips.map(function(clip){return{position:clip.position,title:self.options.formatTitle(clip)};});} function getClipById(id){return Ox.getObjectById(self.options.clips,id);} function getClipsInSelection(){var clips=self.options.clips.filter(function(clip){var endPosition=clip.position+clip.duration;return(clip.position>=self.options['in']&&endPositionself.options['in'])||(clip.position=self.options.out)});return clips.map(function(clip,index){var dereference=false,endPosition=clip.position+clip.duration,inPoint=clip['in'],outPoint=clip.out;if(index==0&&clip.positionself.options.out){dereference=true;outPoint=Ox.round(clip.out+self.options.out-endPosition,3);} return clip.annotation&&!dereference?clip.annotation:clip.item+'/'+inPoint+'-'+outPoint;});} function getCuts(){var cuts=[];self.options.clips.forEach(function(clip,i){if(i>0){cuts.push(clip.position);} clip.cuts.forEach(function(cut){cuts.push(clip.position+cut-clip['in']);});});return cuts;} function getNextPosition(type,direction){var positions;if(type=='chapter'){positions=self.chapters.map(function(chapter){return chapter.position;});}else if(type=='cut'){positions=[0].concat(self.cuts,self.options.duration);} return Ox.nextValue(positions,self.options.position,direction);} function getPlayerHeight(){return self.options.height-24-32 -self.options.showTimeline*80-1;} function getPlayerWidth(){return self.options.width -(self.options.showClips&&!self.fullscreen)*self.options.clipSize-1;} function getTimeline(){return Ox.LargeVideoTimeline({chapters:self.chapters,cuts:self.cuts,duration:self.options.duration,getImageURL:self.options.getLargeTimelineURL,'in':self.options['in'],out:self.options.out,position:self.options.position,subtitles:self.options.enableSubtitles?self.options.subtitles:[],type:self.options.timeline,width:getTimelineWidth()}).css({left:'4px',top:'4px'}).bindEvent({key_left:function(){self.options.paused&&movePositionBy(-1/self.options.fps);},key_right:function(){self.options.paused&&movePositionBy(1/self.options.fps);},key_space:togglePaused,mousedown:that.gainFocus,position:dragendTimeline,positioning:dragTimeline,});} function getTimelineWidth(){return self.options.width -(self.options.showClips&&!self.fullscreen)*self.options.clipSize-16-1;} function goToPoint(point){setPosition(self.options[point]);} function movePositionBy(sec){setPosition(Ox.limit(self.options.position+sec,0,self.options.duration));} function movePositionTo(type,direction){setPosition(getNextPosition(type,direction));} function resizeClips(data){self.options.clipSize=data.size;self.$video.options({width:getPlayerWidth()});self.$timeline.options({width:getTimelineWidth()});self.$clipPanel.options({width:data.size});} function resizeendClips(data){that.triggerEvent('clipSize',data);} function setPoint(point,position,triggerEvent){self.options[point]=position;self.$video.options(point,position);self.$timeline.options(point,position);self.$clipPanel.options(point,position);if(self.options['in']>self.options.out){setPoint(point=='in'?'out':'in',position);} if(triggerEvent){that.triggerEvent('points',{'in':self.options['in'],out:self.options.out,position:self.options.position});}} function setPosition(position,playing,dragging){var minute=Math.floor(position/60),previousMinute=Math.floor(self.options.position/60);self.options.position=position;!playing&&self.$video.options({position:self.options.position});self.$timeline.options({position:self.options.position});self.$clipPanel.options({position:self.options.position});if((!playing||minute!=previousMinute)&&!dragging){that.triggerEvent('position',{position:!playing?self.options.position:minute*60});}} function toggleClips(data){self.options.showClips=!data.collapsed;self.$video.options({width:getPlayerWidth()});self.$timeline.options({width:getTimelineWidth()});that.triggerEvent('toggleclips',{showClips:self.options.showClips});} function toggleControls(data){self.options.showTimeline=!data.collapsed;self.$video.options({height:getPlayerHeight()});that.triggerEvent('toggletimeline',{showTimeline:self.options.showTimeline});} function toggleMuted(){self.$video.toggleMuted();} function togglePaused(){self.$video.togglePaused();self.$video.options('paused')&&that.triggerEvent('position',{position:self.$video.options('position')});} that.getPasteIndex=function(){return self.$clipPanel.getPasteIndex();};that.getSelectedClips=function(){return self.options.selected.length?self.options.selected.map(function(id){var clip=getClipById(id);return(clip.annotation||clip.item+'/'+clip['in']+'-'+clip.out)+'/'+id;}):getClipsInSelection();};that.invertSelection=function(){self.$clipPanel.invertSelection();};that.selectAll=function(){self.$clipPanel.selectAll();};that.updateClip=function(id,data){self.options.clips[Ox.getIndexById(self.options.clips,id)]=data;self.$clipPanel.updateItem(id,data);};return that;};'use strict';(function(){var queue=[],queueSize=100,restrictedElements=[],requiresUserGesture=mediaPlaybackRequiresUserGesture(),unblock=[];Ox.VideoElement=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({autoplay:false,loop:false,muted:false,playbackRate:1,items:[],volume:1}).options(options||{}).update({items:function(){self.loadedMetadata=false;loadItems(function(){self.loadedMetadata=true;var update=true;if(self.currentItem>=self.numberOfItems){self.currentItem=0;} if(!self.numberOfItems){self.video.src='';that.triggerEvent('durationchange',{duration:that.duration()});}else{if(self.currentItemId!=self.items[self.currentItem].id){self.items.some(function(item,i){if(item.id==self.currentItemId){self.currentItem=i;loadNextVideo();update=false;return true;}});if(update){self.currentItem=0;self.currentItemId=self.items[self.currentItem].id;}} if(!update){that.triggerEvent('seeked');that.triggerEvent('durationchange',{duration:that.duration()});}else{setCurrentVideo(function(){that.triggerEvent('seeked');that.triggerEvent('durationchange',{duration:that.duration()});});}}});},playbackRate:function(){self.video.playbackRate=self.options.playbackRate;}}).css({width:'100%',height:'100%'});Ox.Log('Video','VIDEO ELEMENT OPTIONS',self.options);self.currentItem=0;self.currentTime=0;self.currentVideo=0;self.items=[];self.loadedMetadata=false;self.paused=true;self.seeking=false;self.loading=true;self.buffering=true;self.$videos=[getVideo(),getVideo()];self.$video=self.$videos[self.currentVideo];self.video=self.$video[0];self.volume=self.options.volume;self.muted=self.options.muted;self.$brightness=$('
').css({width:'100%',height:'100%',background:'rgb(0, 0, 0)',opacity:0}).appendTo(that);self.timeupdate=setInterval(function(){if(!self.paused&&!self.loading&&self.loadedMetadata&&self.items[self.currentItem]&&self.items[self.currentItem].out&&self.video.currentTime>=self.items[self.currentItem].out){setCurrentItem(self.currentItem+1);}},30);if(restrictedElements.length>0){unblock.push(setSource);setTimeout(function(){that.triggerEvent('requiresusergesture');})}else{setSource();} function getCurrentTime(){var item=self.items[self.currentItem];return self.seeking||self.loading?self.currentTime:item?item.position+self.video.currentTime-item['in']:0;} function getset(key,value){var ret;if(Ox.isUndefined(value)){ret=self.video[key];}else{self.video[key]=value;ret=that;} return ret;} function getVideo(){return getVideoElement().css({position:'absolute'}).on({ended:function(){if(self.video==this){setCurrentItem(self.currentItem+1);}},loadedmetadata:function(){},progress:function(){var video=this,item=self.items[self.currentItem],nextItem=Ox.mod(self.currentItem+1,self.numberOfItems),next=self.items[nextItem],nextVideo=self.$videos[Ox.mod(self.currentVideo+1,self.$videos.length)][0];if(self.video==video&&(video.preload!='none'||self.buffering)){if(clipCached(video,item)){self.video.preload='none';self.buffering=false;if(nextVideo!=self.video){nextVideo.preload='auto';}}}else if(!self.buffering&&nextVideo==video&&video.preload!='none'){if(clipCached(video,next)){video.preload='none';}} function clipCached(video,item){var cached=false Ox.range(video.buffered.length).forEach(function(i){if(video.buffered.start(i)<=item['in']&&self.video.buffered.end(i)>=item.out){cached=true}});return cached}},seeking:function(){},stop:function(){if(self.video==this){self.video.pause();that.triggerEvent('ended');}}}).attr({preload:'auto'}).hide().appendTo(that);} function getVideoElement(){var video;if(requiresUserGesture){if(queue.length){video=queue.pop();}else{video=document.createElement('video');restrictedElements.push(video);}}else{video=document.createElement('video');} video.playsinline=true video.setAttribute('playsinline','playsinline') video.setAttribute('webkit-playsinline','webkit-playsinline') video.WebKitPlaysInline=true return $(video);};function getVolume(){var volume=1;if(self.items[self.currentItem]&&Ox.isNumber(self.items[self.currentItem].volume)){volume=self.items[self.currentItem].volume;} return self.volume*volume;} function isReady($video,callback){if($video[0].seeking&&!self.paused&&!self.seeking){that.triggerEvent('seeking');Ox.Log('Video','isReady','seeking');$video.one('seeked',function(event){Ox.Log('Video','isReady','seeked');that.triggerEvent('seeked');callback($video[0]);});}else if($video[0].readyState){callback($video[0]);}else{that.triggerEvent('seeking');$video.one('loadedmetadata',function(event){callback($video[0]);});$video.one('seeked',function(event){that.triggerEvent('seeked');});}} function loadItems(callback){var currentTime=0,items=self.options.items.map(function(item){return Ox.isObject(item)?Ox.clone(item,true):{src:item};});Ox.serialForEach(items,function(item){var callback=Ox.last(arguments);item['in']=item['in']||0;item.position=currentTime;if(item.out){item.duration=item.out-item['in'];} if(item.duration){if(!item.out){item.out=item.duration;} currentTime+=item.duration;item.id=getId(item);callback()}else{Ox.getVideoInfo(item.src,function(info){item.duration=info.duration;if(!item.out){item.out=item.duration;} currentTime+=item.duration;item.id=getId(item);callback();});}},function(){self.items=items;self.numberOfItems=self.items.length;callback&&callback();});function getId(item){return item.id||item.src+'/'+item['in']+'-'+item.out;}} function loadNextVideo(){if(self.numberOfItems<=1){return;} var item=self.items[self.currentItem],nextItem=Ox.mod(self.currentItem+1,self.numberOfItems),next=self.items[nextItem],$nextVideo=self.$videos[Ox.mod(self.currentVideo+1,self.$videos.length)],nextVideo=$nextVideo[0];$nextVideo.one('loadedmetadata',function(){if(self.video!=nextVideo){nextVideo.currentTime=next['in']||0;}});nextVideo.src=next.src;nextVideo.preload='auto';} function setCurrentItem(item){Ox.Log('Video','sCI',item,self.numberOfItems);var interval;if(item>=self.numberOfItems||item<0){if(self.options.loop){item=Ox.mod(item,self.numberOfItems);}else{self.seeking=false;self.ended=true;self.paused=true;self.video&&self.video.pause();that.triggerEvent('ended');return;}} self.video&&self.video.pause();self.currentItem=item;self.currentItemId=self.items[self.currentItem].id;setCurrentVideo(function(){if(!self.loadedMetadata){self.loadedMetadata=true;that.triggerEvent('loadedmetadata');} Ox.Log('Video','sCI','trigger itemchange',self.items[self.currentItem]['in'],self.video.currentTime,self.video.seeking);that.triggerEvent('sizechange');that.triggerEvent('itemchange',{item:self.currentItem});});} function setCurrentVideo(callback){var css={},muted=self.muted,item=self.items[self.currentItem],next;Ox.Log('Video','sCV',item);['left','top','width','height'].forEach(function(key){css[key]=self.$videos[self.currentVideo].css(key);});self.currentTime=item.position;self.loading=true;if(self.video){self.$videos[self.currentVideo].hide();self.video.pause();} self.currentVideo=Ox.mod(self.currentVideo+1,self.$videos.length);self.$video=self.$videos[self.currentVideo];self.video=self.$video[0];self.video.muted=true;if(self.$video.attr('src')!=item.src){self.loadedMetadata&&Ox.Log('Video','caching next item failed, reset src');self.video.src=item.src;} self.video.preload='auto';self.video.volume=getVolume();self.video.playbackRate=self.options.playbackRate;self.$video.css(css);self.buffering=true;Ox.Log('Video','sCV',self.video.src,item['in'],self.video.currentTime,self.video.seeking);isReady(self.$video,function(video){var in_=item['in']||0;function ready(){Ox.Log('Video','sCV','ready');self.seeking=false;self.loading=false;self.video.muted=muted;!self.paused&&self.video.play();self.$video.show();callback&&callback();loadNextVideo();} if(video.currentTime==in_){Ox.Log('Video','sCV','already at position');ready();}else{self.$video.one('seeked',function(){Ox.Log('Video','sCV','seeked callback');ready();});if(!self.seeking){Ox.Log('Video','sCV set in',video.src,in_,video.currentTime,video.seeking);self.seeking=true;video.currentTime=in_;if(self.paused){var promise=self.video.play();if(promise!==undefined){promise.then(function(){self.video.pause();self.video.muted=muted;}).catch(function(){self.video.pause();self.video.muted=muted;});}else{self.video.pause();self.video.muted=muted;}}}}});} function setCurrentItemTime(currentTime){Ox.Log('Video','sCIT',currentTime,self.video.currentTime,'delta',currentTime-self.video.currentTime);isReady(self.$video,function(video){if(self.video==video){if(self.video.seeking){self.$video.one('seeked',function(){that.triggerEvent('seeked');self.seeking=false;});}else if(self.seeking){that.triggerEvent('seeked');self.seeking=false;} video.currentTime=currentTime;}});} function setCurrentTime(time){Ox.Log('Video','sCT',time);var currentTime,currentItem;self.items.forEach(function(item,i){if(time>=item.position&&time',currentItem,currentTime);if(currentItem!=self.currentItem){setCurrentItem(currentItem);} self.seeking=true;self.currentTime=time;that.triggerEvent('seeking');setCurrentItemTime(currentTime);}else{self.currentTime=0;}} function setSource(){Ox.Log('Video','self.loadedMetadata',self.loadedMetadata);self.loadedMetadata=false;loadItems(function(){setCurrentItem(0);self.options.autoplay&&setTimeout(function(){that.play();});});} that.animate=function(){self.$video.animate.apply(self.$video,arguments);return that;};that.brightness=function(){var ret;if(arguments.length==0){ret=1-parseFloat(self.$brightness.css('opacity'));}else{self.$brightness.css({opacity:1-arguments[0]});ret=that;} return ret;};that.buffered=function(){return self.video.buffered;};that.currentTime=function(){var ret;if(arguments.length==0){ret=getCurrentTime();}else{self.ended=false;setCurrentTime(arguments[0]);ret=that;} return ret;};that.css=function(){self.$video.css.apply(self.$video,arguments);return that;};that.duration=function(){return self.items?Ox.sum(self.items.map(function(item){return item.duration;})):NaN;};that.muted=function(value){if(!Ox.isUndefined(value)){self.muted=value;} return getset('muted',value);};that.pause=function(){self.paused=true;self.video.pause();return that;};that.play=function(){if(self.ended){that.currentTime(0);} isReady(self.$video,function(video){self.ended=false;self.paused=false;self.seeking=false;video.play();});return that;};that.removeElement=function(){self.currentTime=getCurrentTime();self.loading=true;clearInterval(self.timeupdate);self.$videos.forEach(function($video){$video.attr({src:''});});return Ox.Element.prototype.removeElement.apply(that,arguments);};that.videoHeight=function(){return self.video.videoHeight;};that.videoWidth=function(){return self.video.videoWidth;};that.volume=function(value){if(Ox.isUndefined(value)){value=self.volume}else{self.volume=value;self.video.volume=getVolume();} return value;};return that;};function mediaPlaybackRequiresUserGesture(){var video=document.createElement('video');video.play();return video.paused;} function removeBehaviorsRestrictions(){if(restrictedElements.length>0){var rElements=restrictedElements;restrictedElements=[];rElements.forEach(function(video){video.load();});setTimeout(function(){var u=unblock;unblock=[];u.forEach(function(callback){callback();});},1000);} while(queue.length-1||self.options.controlsBottom.indexOf('volume')>-1;self.millisecondsPerFrame=1000/self.options.fps;self.secondsPerFrame=1/self.options.fps;self.barHeight=16;self.width=self.options.fullscreen?window.innerWidth:self.options.width;self.height=self.options.fullscreen?window.innerHeight:self.options.height;self.videoWidth=self.options.width;self.videoHeight=self.options.height;self.results=[];loadSubtitles();if(self.options.enableKeyboard){that.bindEvent({key_0:toggleMuted,key_1:toggleScale,key_down:function(){goToNext('chapter',1);},key_equal:function(){changeVolume(0.1);},key_escape:hideControlMenus,key_f:focusFind,key_g:function(){goToNext('result',1);},key_k:function togglePlaybackRate(){that.options({playbackRate:self.options.playbackRate==1?2:self.options.playbackRate==2?0.5:1});},key_l:toggleLoop,key_left:function(){setPosition(self.options.position-self.secondsPerFrame);that.triggerEvent('position',{position:self.options.position});},key_minus:function(){changeVolume(-0.1);},key_p:playInToOut,key_right:function(){setPosition(self.options.position+self.secondsPerFrame);that.triggerEvent('position',{position:self.options.position});},key_shift_f:function(){self.options.enableFullscreen&&toggleFullscreen();},key_shift_g:function(){goToNext('result',-1);},key_shift_left:function(){setPosition(self.options.position-1);that.triggerEvent('position',{position:self.options.position});},key_shift_right:function(){setPosition(self.options.position+1);that.triggerEvent('position',{position:self.options.position});},key_space:togglePaused,key_up:function(){goToNext('chapter',-1);}});if(self.options.focus=='mouseenter'){that.on({mouseenter:function(){if(!self.inputHasFocus){that.gainFocus();}},mouseleave:function(){that.loseFocus();}});}else{that.on({click:function(){if(!Ox.Focus.focusedElementIsInput()){that.gainFocus();}}});}} if((!self.options.externalControls&&(self.options.controlsTop.length||self.options.controlsBottom.length))){that.on({mouseenter:function(){showControls();self.mouseHasLeft=false;},mouseleave:function(){hideControls();self.mouseHasLeft=true;}});} self.$videoContainer=Ox.Element().addClass('OxVideoContainer').css({top:self.options.externalControls&&self.options.controlsTop.length?'16px':0}).appendTo(that) if(self.options.type=='play'){self.options.enableMouse&&self.$videoContainer.bindEvent({anyclick:function(e){var $target=$(e.target);if(!$target.is('.OxLogo')&&!$target.is('.OxCensoredIcon')){togglePaused();}},dragstart:dragstart,drag:drag,dragend:dragend});self.$video=Ox.VideoElement({items:self.video,loop:self.options.loop,muted:self.options.muted,playbackRate:self.options.playbackRate,volume:self.options.volume}).bindEvent(Ox.extend({durationchange:durationchange,ended:ended,itemchange:itemchange,loadedmetadata:loadedmetadata,requiresusergesture:requiresusergesture,seeked:seeked,seeking:seeking,sizechange:sizechange},self.options.progress?{progress:progress}:{})).appendTo(self.$videoContainer);self.$video.$element.css({position:'absolute'});self.$video.hide();}else{self.options.enableMouse&&self.$videoContainer.on({click:function(e){if(!$(e.target).is('.OxLogo')){goToPoint();}}});self.$video=$('
').appendTo(self.$videoContainer);self.$image=$('').attr({src:Ox.UI.PATH+'png/transparent.png'}).css({position:'absolute',width:'100%',height:'100%'}).appendTo(self.$video) self.$brightness=$('
').css({position:'absolute',width:'100%',height:'100%',background:'rgb(0, 0, 0)',opacity:1-self.options.brightness}).appendTo(self.$video);} if(self.options.poster){self.$poster=$('').addClass('OxPoster').attr({src:self.options.poster}).hide().one({load:function(){self.$poster.css(getVideoCSS(self.$poster[0].width,self.$poster[0].height)).show();self.posterIsVisible=true;}}).appendTo(self.$videoContainer);} if(self.options.logo){self.$logo=$('').addClass('OxLogo').attr({src:self.options.logo}).css({cursor:self.options.logoLink?'pointer':'default'}).appendTo(self.$videoContainer);if(self.options.logoTitle){self.$logoTooltip=Ox.Tooltip({title:self.options.logoTitle});}} self.$loadingIcon=Ox.LoadingIcon({video:true}).hide().appendTo(self.$videoContainer);if(!Ox.isEmpty(Ox.isObject(self.options.video[0])?getVideo():self.options.video)){showLoadingIcon();} if(self.options.showIcon||self.options.showIconOnLoad){self.$playIcon=$('').addClass('OxPlayIcon OxVideo').attr({src:Ox.UI.getImageURL('symbol'+(self.options.paused?'Play':'Pause'),'videoIcon')}).appendTo(self.$videoContainer);if(self.options.showIcon){self.$playIcon.addClass('OxInterface');} if(self.options.showIconOnLoad){self.iconIsVisible=true;}} if(self.options.censored.length){self.$copyrightIcon=Ox.Element({element:'',tooltip:self.options.censoredTooltip}).addClass('OxCensoredIcon OxVideo').attr({src:Ox.UI.getImageURL('symbol'+self.options.censoredIcon,'videoIcon')}).hide().bindEvent({singleclick:function(){that.triggerEvent('censored');}}).appendTo(self.$videoContainer);} if(self.options.showMarkers){self.$posterMarker={};['left','center','right'].forEach(function(position){var titleCase=Ox.toTitleCase(position);self.$posterMarker[position]=$('
').addClass('OxPosterMarker OxPosterMarker'+titleCase).appendTo(self.$videoContainer);});self.$pointMarker={};['in','out'].forEach(function(point){self.$pointMarker[point]={};['top','bottom'].forEach(function(edge){var titleCase=Ox.toTitleCase(point)+Ox.toTitleCase(edge);self.$pointMarker[point][edge]=$('').addClass('OxPointMarker OxPointMarker'+titleCase).attr({src:Ox.UI.getImageURL('marker'+titleCase)}).appendTo(self.$videoContainer);});});} if(self.options.subtitles.length||true){self.$subtitle=$('
').addClass('OxSubtitle').appendTo(self.$videoContainer);} ['top','bottom'].forEach(function(edge){var titleCase=Ox.toTitleCase(edge);if(self.options['controls'+titleCase].length){self['$controls'+titleCase]=Ox.Bar({size:self.barHeight}).addClass('OxControls'+(self.options.externalControls?'':' OxOnScreen')).css({opacity:self.options.externalControls?1:0}).css(edge,0).appendTo(that);self.options['controls'+titleCase].forEach(function(control){if(control=='chapterTitle'){self.$chapterTitle=$('
').addClass('OxTitle').html(getChapterTitle()).appendTo(self['$controls'+titleCase].$element);}else if(control=='close'){self.$closeButton=Ox.Button({style:'video',title:'close',tooltip:Ox._('Close'),type:'image'}).bindEvent({click:function(){that.triggerEvent('close');}}).appendTo(self['$controls'+titleCase]);}else if(control=='find'){self.$findButton=Ox.Button({style:'video',title:'find',tooltip:Ox._('Find'),type:'image'}).bindEvent({click:toggleFind}).appendTo(self['$controls'+titleCase]);}else if(control=='fullscreen'){self.$fullscreenButton=Ox.Button({style:'video',tooltip:[Ox._('Enter Fullscreen'),Ox._('Exit Fullscreen')],type:'image',value:self.options.fullscreen?'shrink':'grow',values:['grow','shrink']}).bindEvent({click:function(){toggleFullscreen('button');}}).appendTo(self['$controls'+titleCase]);}else if(control=='goto'){self.$setButton=Ox.Button({style:'video',title:'goTo'+Ox.toTitleCase(self.options.type),tooltip:Ox._('Go to '+Ox.toTitleCase(self.options.type) +' Point'),type:'image'}).bindEvent({click:goToPoint}).appendTo(self['$controls'+titleCase]);}else if(control=='loop'){self.$loopButton=Ox.Button({style:'video',tooltip:[Ox._('Don\'t Loop'),Ox._('Loop')],type:'image',value:self.options.loop?'RepeatAll':'RepeatNone',values:['RepeatAll','RepeatNone']}).bindEvent({click:function(){toggleLoop('button');}}).appendTo(self['$controls'+titleCase]);}else if(control=='mute'){self.$muteButton=Ox.Button({style:'video',tooltip:[Ox._('Mute'),Ox._('Unmute')],type:'image',value:self.options.muted?'unmute':'mute',values:['mute','unmute']}).bindEvent({click:function(){toggleMuted('button');}}).appendTo(self['$controls'+titleCase]);}else if(control=='next'){self.$nextChapterButton=Ox.Button({style:'video',title:'playNext',tooltip:Ox._('Next'),type:'image'}).bindEvent({click:function(){goToNext('chapter',1);}}).appendTo(self['$controls'+titleCase]);}else if(control=='open'){self.$openButton=Ox.Button({style:'video',title:'arrowRight',tooltip:self.options.controlsTooltips.open||'',type:'image'}).bindEvent({click:function(){that.triggerEvent('open');}}).appendTo(self['$controls'+titleCase]);}else if(control=='play'){self.$playButton=Ox.Button({style:'video',tooltip:[Ox._('Play'),Ox._('Pause')],type:'image',value:self.options.paused?'play':'pause',values:['play','pause']}).bindEvent({click:function(){togglePaused('button');}}).appendTo(self['$controls'+titleCase]);}else if(control=='playInToOut'){self.$playInToOutButton=Ox.Button({style:'video',title:'playInToOut',tooltip:Ox._('Play In to Out'),type:'image'}).bindEvent({click:playInToOut}).appendTo(self['$controls'+titleCase]);}else if(control=='position'){self.positionWidth=getPositionWidth();self.$position=Ox.Element({tooltip:Ox._(self.options.type=='play'?'Position':self.options.type=='in'?'In Point':'Out Point')}).addClass('OxPosition').css({width:self.positionWidth-4+'px'}).html(formatPosition()).on({click:function(){if(self.options.enablePosition){if(self.options.type=='play'){if(!self.options.paused){self.playOnSubmit=true;togglePaused();}else if(self.playOnLoad){self.playOnLoad=false;self.playOnSubmit=true;}} self.$position.hide();self.$positionInput.value(formatPosition()).show().focusInput(false);}}}).appendTo(self['$controls'+titleCase]);self.$positionInput=Ox.Input({value:formatPosition(),width:self.positionWidth}).addClass('OxPositionInput').bindEvent({focus:function(){self.inputHasFocus=true;},blur:function(){self.inputHasFocus=false;submitPositionInput();},submit:function(){self.inputHasFocus=false;submitPositionInput();}}).appendTo(self['$controls'+titleCase].$element);self.$positionInput.children('input').css({width:(self.positionWidth-6)+'px',fontSize:'9px'});}else if(control=='previous'){self.$previousChapterButton=Ox.Button({style:'video',title:'playPrevious',tooltip:Ox._('Previous'),type:'image'}).bindEvent({click:function(){goToNext('chapter',-1);}}).appendTo(self['$controls'+titleCase]);}else if(control=='scale'){self.$scaleButton=Ox.Button({style:'video',tooltip:[Ox._('Scale to Fill'),Ox._('Scale to Fit')],type:'image',value:self.options.scaleToFill?'fit':'fill',values:['fill','fit']}).bindEvent('change',function(){toggleScale('button');}).appendTo(self['$controls'+titleCase]);}else if(control=='set'){self.$setButton=Ox.Button({style:'video',title:'set'+Ox.toTitleCase(self.options.type),tooltip:Ox._('Set '+Ox.toTitleCase(self.options.type) +' Point'),type:'image'}).bindEvent({click:setPoint}).appendTo(self['$controls'+titleCase]);}else if(control=='settings'){self.$settingsButton=Ox.Button({style:'video',title:'set',tooltip:Ox._('Settings'),type:'image'}).bindEvent({click:function(){self.$settings.toggle();}}).appendTo(self['$controls'+titleCase]);self.$settings=renderSettings().appendTo(that);}else if(control=='size'){self.$sizeButton=Ox.Button({style:'video',tooltip:[Ox._('Larger'),Ox._('Smaller')],type:'image',value:self.options.sizeIsLarge?'shrink':'grow',values:['grow','shrink']}).bindEvent('change',toggleSize).appendTo(self['$controls'+titleCase]);}else if(control=='space'){self['$space'+titleCase]=$('
').html(' ').appendTo(self['$controls'+titleCase].$element);}else if(Ox.startsWith(control,'space')){$('
').css({width:parseInt(control.substr(5))+'px',height:'16px'}).appendTo(self['$controls'+titleCase].$element);}else if(control=='timeline'){if(self.options.duration){self.$timeline=getTimeline()}else{self.$timeline=Ox.Element().html(' ');} self.$timeline.appendTo(self['$controls'+titleCase]);}else if(control=='title'){self.$title=$('
').addClass('OxTitle').html(self.options.title).appendTo(self['$controls'+titleCase].$element);}else if(control=='volume'){self.$volumeButton=Ox.Button({style:'video',title:getVolumeImage(),tooltip:Ox._('Volume'),type:'image'}).bindEvent({click:toggleVolume}).appendTo(self['$controls'+titleCase]);}else if(control=='zapHome'){self.$zapHomeButton=Ox.Button({style:'video',title:'up',tooltip:Ox._('Home Channel'),type:'image'}).bindEvent({click:function(){that.triggerEvent('zap',{direction:0});}}).appendTo(self['$controls'+titleCase]);}else if(control=='zapNext'){self.$zapNextButton=Ox.Button({style:'video',title:'right',tooltip:Ox._('Next Channel'),type:'image'}).bindEvent({click:function(){that.triggerEvent('zap',{direction:1});}}).appendTo(self['$controls'+titleCase]);}else if(control=='zapPrevious'){self.$zapPreviousButton=Ox.Button({style:'video',title:'left',tooltip:Ox._('Previous Channel'),type:'image'}).bindEvent({click:function(){that.triggerEvent('zap',{direction:-1});}}).appendTo(self['$controls'+titleCase]);}});}});if(self.options.enableFind){self.$find=$('
').addClass('OxControls OxFind').css({top:self.options.controlsTop.length?'16px':0}).appendTo(that);self.$results=Ox.Element({tooltip:Ox._('Results')}).addClass('OxResults').html('0').appendTo(self.$find);self.$previousResultButton=Ox.Button({disabled:true,style:'symbol',title:'arrowLeft',tooltip:Ox._('Previous'),type:'image'}).bindEvent({click:function(){goToNext('result',-1);}}).appendTo(self.$find);self.$nextResultButton=Ox.Button({disabled:true,style:'symbol',title:'arrowRight',tooltip:Ox._('Next'),type:'image'}).bindEvent({click:function(){goToNext('result',1);}}).appendTo(self.$find);self.$findInput=Ox.Input({changeOnKeypress:true,value:self.options.find}).bindEvent({blur:function(){self.inputHasFocus=false;},focus:function(){self.inputHasFocus=true;},change:function(data){submitFindInput(data.value,false);},submit:function(data){self.inputHasFocus=false;submitFindInput(data.value,true);}}).appendTo(self.$find);self.$clearButton=Ox.Button({disabled:!self.options.find,style:'symbol',title:'delete',tooltip:Ox._('Clear'),type:'image'}).bindEvent({click:function(){self.options.find='';self.results=[];self.$results.html('0');self.$findInput.clearInput();self.subtitle&&setSubtitleText();self.$timeline&&self.$timeline.options({find:self.options.find,results:self.results});}}).appendTo(self.$find);self.$hideFindButton=Ox.Button({style:'symbol',title:'close',tooltip:Ox._('Hide'),type:'image'}).bindEvent({click:toggleFind}).appendTo(self.$find);} if(self.hasVolumeControl){self.$volume=$('
').addClass('OxControls OxVolume').css({bottom:self.options.controlsBottom.length?'16px':0}).appendTo(that);self.$hideVolumeButton=Ox.Button({style:'symbol',title:'close',tooltip:Ox._('Hide'),type:'image'}).bindEvent({click:toggleVolume}).appendTo(self.$volume);self.$muteButton=Ox.Button({style:'symbol',tooltip:[Ox._('Mute'),Ox._('Unmute')],type:'image',value:self.options.muted?'unmute':'mute',values:['mute','unmute']}).bindEvent({click:function(){toggleMuted('button');}}).appendTo(self.$volume);self.$volumeInput=Ox.Range({changeOnDrag:true,max:1,min:0,step:0.001,value:self.options.muted?0:self.options.volume}).bindEvent({change:function(data){setVolume(data.value);}}).appendTo(self.$volume);self.$volumeValue=$('
').addClass('OxVolumeValue').html(self.options.muted?0:Math.round(self.options.volume*100)).appendTo(self.$volume);} self.options.type!='play'&&setPosition(self.options.position);self.results=[];setSizes(false,function(){self.options.fullscreen&&enterFullscreen();});function censor(){if(self.options.type=='play'){self.$video.brightness(self.censored?0.05:self.options.brightness).volume(self.censored?0.01:self.options.volume);}else{self.$brightness.css({opacity:1-(self.censored?0.05:self.options.brightness)});} self.$copyrightIcon[self.censored?'show':'hide']();} function changeVolume(num){self.hasVolumeControl&&showVolume();self.options.volume=Ox.limit(self.options.volume+num,0,1);setVolume(self.options.volume);self.$volumeInput&&self.$volumeInput.value(self.options.volume);} function clearInterfaceTimeout(){clearTimeout(self.interfaceTimeout);self.interfaceTimeout=0;} function dragstart(){Ox.$body.addClass('OxDragging');self.drag={position:self.options.position,paused:self.options.paused} !self.options.paused&&togglePaused();} function drag(e){setPosition(self.drag.position-e.clientDX/25);that.triggerEvent('positioning',{position:self.options.position});} function dragend(){Ox.$body.removeClass('OxDragging');!self.drag.paused&&togglePaused();that.triggerEvent('position',{position:self.options.position});} function durationchange(){self.videoWidth=self.$video.videoWidth();self.videoHeight=self.$video.videoHeight();self.videoCSS=getVideoCSS();self.posterMarkerCSS=getPosterMarkerCSS();self.$video.css(self.videoCSS);self.$poster&&self.$poster.css(self.videoCSS);self.$posterMarker&&Ox.forEach(self.$posterMarker,function(marker,position){marker.css(self.posterMarkerCSS[position]);});self.out=self.options.playInToOut&&self.out-1;}).map(function(annotation){return{id:annotation.id,'in':annotation['in'],out:annotation.out};}) results=Ox.filter(self.options.annotations,function(annotation){return Ox.decodeHTMLEntities(Ox.stripTags(annotation.text.toLowerCase())).indexOf(query)>-1;}).map(function(annotation){return{id:annotation.id,'in':annotation['in'],out:annotation.out};});} return results;} function focusFind(){!self.interfaceIsVisible&&showControls();setTimeout(function(){if(self.$find.is(':hidden')){toggleFind();}else{self.$findInput.focusInput(true);}},0);} function formatPosition(position){position=Ox.isUndefined(position)?self.options.position:position;return Ox.formatDuration(position,self.options.showMilliseconds);} function getCensored(){var censored=false;Ox.forEach(self.options.censored,function(v){if(v['in']self.options.position){censored=true;return false;}});return censored;} function getChapterTitle(){var chapterTitle='';self.options.chapters&&Ox.forEach(self.options.chapters,function(v,i){if(v.position<=self.options.position&&(i==self.options.chapters.length-1||self.options.chapters[i+1].position>self.options.position)){chapterTitle=v.title;return false;}});return chapterTitle;} function getCSS(element){var css;if(element=='copyrightIcon'){css={width:self.iconSize+'px',height:self.iconSize+'px'};}else if(element=='controlsTop'||element=='controlsBottom'){css={width:self.width+'px'};}else if(element=='find'){css={width:Math.min(216,self.width)+'px'};}else if(element=='loadingIcon'){css={width:self.iconSize+'px',height:self.iconSize+'px'};}else if(element=='logo'){var logoHeight=Math.round(self.height/10),logoMargin=Math.round(self.height/20);css={left:logoMargin+'px',top:logoMargin+(self.controlsTopAreVisible?16:0)+'px',height:logoHeight+'px'};}else if(element=='player'){var height=self.options.fullscreen?window.innerHeight:self.height;if(self.options.externalControls){height+=(!!self.options.controlsTop.length+!!self.options.controlsBottom.length)*self.barHeight;} css=Ox.extend({width:self.width+'px',height:height+'px'},self.options.fullscreen?{left:0,top:0}:{},self.exitFullscreen?{left:self.absoluteOffset.left,top:self.absoluteOffset.top}:{});}else if(element=='playIcon'){var playIconPadding=Math.round(self.iconSize*1/8),playIconSize=self.iconSize-2*playIconPadding-4;css={width:playIconSize+'px',height:playIconSize+'px',padding:playIconPadding+'px',borderRadius:Math.round(self.iconSize/2)+'px'};}else if(element=='progress'){css={width:self.timelineImageWidth+'px',marginLeft:-self.timelineImageWidth+'px'};}else if(element=='subtitle'){var offset=0,videoCSS;if(self.options.subtitlesOffset){videoCSS=getVideoCSS();offset=Math.floor((self.options.subtitlesOffset/100)*videoCSS.height)+videoCSS.top;offset=Math.max(offset,0);} css={bottom:(Math.floor(self.height/16) +offset +(!!self.controlsBottomAreVisible*16))+'px',width:self.width+'px',fontSize:Math.floor(self.height/20)+'px',WebkitTextStroke:(self.height/1000)+'px rgb(0, 0, 0)'};}else if(element=='spaceBottom'||element=='timeline'){css={width:self.timelineWidth+'px'};}else if(element=='spaceTop'||element=='title'){css={width:getTitleWidth()+'px'};}else if(element=='videoContainer'){css={width:self.width+'px',height:self.height+'px'};}else if(element=='volume'){css={width:Math.min(184,self.width)};} return css;} function getPosition(e){if($.browser.mozilla){return Ox.limit((e.layerX-48-self.barHeight/2)/self.timelineImageWidth*self.$video.duration(),0,self.$video.duration());}else{return Ox.limit((e.offsetX-self.barHeight/2)/self.timelineImageWidth*self.$video.duration(),0,self.$video.duration());}}function getPositionWidth(){return 48+!!self.options.showMilliseconds*2 +self.options.showMilliseconds*6;} function getPosterMarkerCSS(){self.videoCSS=getVideoCSS();var left=Math.floor((self.videoCSS.width-self.videoCSS.height)/2),right=Math.ceil((self.videoCSS.width-self.videoCSS.height)/2);return{center:{left:self.videoCSS.left+left+'px',top:self.videoCSS.top+'px',width:(self.videoCSS.height-2)+'px',height:(self.videoCSS.height-2)+'px'},left:{left:self.videoCSS.left+'px',top:self.videoCSS.top+'px',width:left+'px',height:self.videoCSS.height+'px'},right:{left:self.videoCSS.left+left+self.videoCSS.height+'px',top:self.videoCSS.top+'px',width:right+'px',height:self.videoCSS.height+'px'}};} function getProgressImageURL(){if(!self.timelineImageWidth)return;var width=self.timelineImageWidth,height=self.barHeight,canvas=$('').attr({width:width,height:height})[0],context=canvas.getContext('2d'),imageData,data;context.fillStyle='rgba(255, 0, 0, 0.5)';context.fillRect(0,0,width,height);imageData=context.getImageData(0,0,width,height),data=imageData.data;self.buffered.forEach(function(range){var left=Math.round(range[0]*width/self.$video.duration()),right=Math.round(range[1]*width/self.$video.duration());Ox.loop(left,right,function(x){Ox.loop(height,function(y){index=x*4+y*4*width;data[index+3]=0;});});});context.putImageData(imageData,0,0);return canvas.toDataURL();} function getSubtitle(){var subtitle='';if(self.options.enableSubtitles){Ox.forEach(self.options.subtitles,function(v){if(v['in']<=self.options.position&&v.out>=self.options.position&&(!v.tracks||Ox.contains(v.tracks,self.options.subtitlesTrack))){subtitle=v.text;return false;}});} return subtitle;} function getSubtitles(){return self.options.enableSubtitles?self.options.subtitles.filter(function(v){return!v.tracks||Ox.contains(v.tracks,self.options.subtitlesTrack);}):[];} function getTimeline(){var $timeline=Ox.SmallVideoTimeline({disabled:!self.options.enableTimeline,duration:self.options.duration,find:self.options.find,imageURL:self.options.timeline,'in':self.options['in'],invertHighlight:self.options.invertHighlight,mode:'player',out:self.options.out,paused:self.options.paused,position:self.options.position,results:self.results,showInToOut:self.options.playInToOut,showMilliseconds:self.options.showMilliseconds,subtitles:self.options.enableSubtitles?self.options.subtitles:[],width:getTimelineWidth()}).css({float:'left'}).css({background:'-moz-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(64, 64, 64, 0.5))'}).css({background:'-o-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(64, 64, 64, 0.5))'}).css({background:'-webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(64, 64, 64, 0.5))'}).bindEvent({position:function(data){setPosition(data.position,'timeline');that.triggerEvent('position',{position:self.options.position});}});$timeline.children().css({marginLeft:getTimelineLeft()+'px'});$timeline.find('.OxInterface').css({marginLeft:getTimelineLeft()+'px'});return $timeline;} function getTimelineLeft(){var left=0;Ox.forEach(self.options.controlsBottom,function(control){if(control=='timeline'){return false;} left+=control=='position'?self.positionWidth:16});return left;} function getTimelineWidth(){return(self.options.fullscreen?window.innerWidth:self.options.width)-self.options.controlsBottom.reduce(function(prev,curr){return prev+(curr=='timeline'||curr=='space'?0:Ox.startsWith(curr,'space')?parseInt(curr.substr(5)):curr=='position'?getPositionWidth():16);},0);} function getTitleWidth(){return(self.options.fullscreen?window.innerWidth:self.options.width) -self.options.controlsTop.reduce(function(prev,curr){return prev+(curr=='title'||curr=='chapterTitle'||curr=='space'?0:Ox.startsWith(curr,'space')?parseInt(curr.substr(5)):16);},0);} function getVideo(){return self.options.video.filter(function(video){return(!self.options.audioTrack||video.track==self.options.audioTrack)&&(!self.options.resolution||video.resolution==self.options.resolution);});} function getVideoCSS(videoWidth,videoHeight){var playerWidth=self.width,playerHeight=self.height,playerRatio=playerWidth/playerHeight,videoWidth=videoWidth||self.videoWidth,videoHeight=videoHeight||self.videoHeight,videoRatio=videoWidth/videoHeight,videoIsWider=videoRatio>playerRatio,width,height;if(self.options.scaleToFill){width=videoIsWider?playerHeight*videoRatio:playerWidth;height=videoIsWider?playerHeight:playerWidth/videoRatio;}else{width=videoIsWider?playerWidth:playerHeight*videoRatio;height=videoIsWider?playerWidth/videoRatio:playerHeight;} width=Math.round(width);height=Math.round(height);return{left:Math.floor((playerWidth-width)/2),top:Math.floor((playerHeight-height)/2),width:width,height:height};} function getVolumeImage(){var symbol;if(self.options.muted||self.options.volume==0){symbol='Unmute';}else if(self.options.volume<1/3){symbol='VolumeUp';}else if(self.options.volume<2/3){symbol='VolumeDown';}else{symbol='Mute';} return symbol;} function goToNext(type,direction){var position,positions;if(type=='chapter'&&self.options.chapters){positions=self.options.chapters.map(function(chapter){return chapter.position;});}else if(type=='result'&&self.results){positions=Ox.unique(self.results.map(function(result){return result['in'];}));} if(positions){position=Ox.nextValue(positions,self.options.position,direction);setPosition(position);that.triggerEvent('position',{position:self.options.position});}} function goToPoint(){that.triggerEvent('gotopoint');} function hideControlMenus(){['find','settings','volume'].forEach(function(element){var $element=self['$'+element];$element&&$element.is(':visible')&&$element.animate({opacity:0},250,function(){$element.hide().css({opacity:1});});});} function hideControls(){clearTimeout(self.interfaceTimeout);self.interfaceTimeout=setTimeout(function(){if(!self.exitFullscreen&&!self.inputHasFocus&&!self.mouseIsInControls){self.interfaceIsVisible=false;self.controlsTopAreVisible=false;self.controlsBottomAreVisible=false;self.$controlsTop&&self.$controlsTop.animate({opacity:0},250);self.$controlsBottom&&self.$controlsBottom.animate({opacity:0},250);hideControlMenus();self.$logo&&self.$logo.animate({top:getCSS('logo').top,opacity:0.25},250,function(){self.options.logoLink&&self.$logo.off('click');self.options.logoTitle&&self.$logo.off('mouseenter mouseleave');});self.$subtitle&&self.$subtitle.animate({bottom:getCSS('subtitle').bottom},250);}},self.options.fullscreen?2500:1000);} function hideLoadingIcon(){self.$loadingIcon.hide().stop();} function hideMarkers(){self.$posterMarker&&Ox.forEach(self.$posterMarker,function(marker){marker.hide();});self.$pointMarker&&Ox.forEach(self.$pointMarker,function(markers){Ox.forEach(markers,function(marker){marker.hide();});});} function hidePoster(){if(self.loadedMetadata&&self.posterIsVisible){self.$poster.animate({opacity:0},250);self.posterIsVisible=false;}} function isEqual(a,b){return Math.abs(a-b)<0.001;} function itemchange(data){var item=self.$video.options('items')[data.item];Ox.Log('Video','ITEMCHANGE',item);} function requiresusergesture(){Ox.Log('Video','requires user gesture');var $playIcon;function removeBehaviorsRestrictions(){window.removeEventListener('keydown',removeBehaviorsRestrictions);window.removeEventListener('mousedown',removeBehaviorsRestrictions);window.removeEventListener('touchstart',removeBehaviorsRestrictions);$playIcon.remove();showLoadingIcon();self.options.showIconOnLoad=false;} window.addEventListener('keydown',removeBehaviorsRestrictions);window.addEventListener('mousedown',removeBehaviorsRestrictions);window.addEventListener('touchstart',removeBehaviorsRestrictions);hideLoadingIcon();$playIcon=$('').addClass('OxPlayIcon OxVideo OxInterface').attr({src:Ox.UI.getImageURL('symbolPlay','videoIcon')}).css(getCSS('playIcon')).css({opacity:1}).appendTo(self.$videoContainer);} function loadImage(){self.$image.one({load:function(){hideLoadingIcon();}}).attr({src:self.options.video(Math.min(self.options.position,Math.floor(self.options.duration*self.options.fps)/self.options.fps),self.options.width)});} function loadedmetadata(){Ox.Log('Video','LOADEDMETADATA') var hadDuration=!!self.options.duration;self.loadedMetadata=true;self.videoWidth=self.$video.videoWidth();self.videoHeight=self.$video.videoHeight();self.videoCSS=getVideoCSS();self.posterMarkerCSS=getPosterMarkerCSS();self.$video.css(self.videoCSS);self.$poster&&self.$poster.css(self.videoCSS);self.$posterMarker&&Ox.forEach(self.$posterMarker,function(marker,position){marker.css(self.posterMarkerCSS[position]);});self.out=self.options.playInToOut&&self.out-1){self.options.subtitles=Ox.parseSRT(self.options.subtitles);loadedsubtitles();}else{Ox.get(self.options.subtitles,function(data){self.options.subtitles=Ox.parseSRT(data);loadedsubtitles();});self.options.subtitles=[];}}}} function playing(){self.options.position=self.$video.currentTime();if((self.playInToOut&&self.options.position>=self.options.out)||(self.options.playInToOut&&self.options.position>=self.out)){if(self.options.loop){setPosition(self.options['in']);self.$video.play();}else{togglePaused();if(self.options.rewind){setTimeout(rewind,250);}else{setPosition(self.options.out?self.options.out:self.out);} that.triggerEvent('ended');}}else{setPosition(self.options.position,'video');} that.triggerEvent('playing',{position:self.options.position});} function playInToOut(){if(self.options.out>self.options['in']){self.playInToOut=true;setPosition(self.options['in']);self.options.paused&&togglePaused();}} function progress(){var buffered=self.$video.buffered();for(var i=0;iself.buffered[i][1]){self.buffered[i][0]=0;}} self.$progress.attr({src:getProgressImageURL()});} function renderSettings(){return Ox.VideoPlayerMenu({items:[{disabled:true,title:Ox._('Resolution')}].concat(self.resolutions.map(function(resolution){return{group:'resolution',id:resolution,checked:resolution==self.options.resolution,title:resolution+'p'};}),self.audioTracks.length>1?[{},{disabled:true,title:Ox._('Audio')}].concat(self.audioTracks.map(function(track){return{group:'audioTrack',id:track,checked:track==self.options.audioTrack,title:Ox._(track)};})):[],self.options.subtitles.length?[{},{disabled:true,title:Ox._('Subtitles')}].concat(self.subtitlesTracks.map(function(track){return{group:'subtitlesTrack',id:track,checked:self.options.enableSubtitles?track==self.options.subtitlesTrack:track=='',title:Ox._(track)};})):[],self.options.timelineTypes.length?[{},{disabled:true,title:Ox._('Timeline')}].concat(self.options.timelineTypes.map(function(type){return{group:'timeline',id:type.id,checked:type.id==self.options.timelineType,title:type.title};})):[],self.options.enableDownload?[{},{id:'download',title:Ox._('Download')}]:[])}).addClass('OxControls OxSettings').bindEvent({click:function(data){var resolution,type;if(data.group=='resolution'){resolution=parseInt(data.id,10);if(resolution!=self.options.resolution){self.options.resolution=resolution;setResolution();}}else if(data.group=='audioTrack'){self.options.audioTrack=data.id;setAudioTrack();}else if(data.group=='subtitlesTrack'){self.options.subtitlesTrack=data.id=='None'?'':data.id;self.options.enableSubtitles=!!self.options.subtitlesTrack;setSubtitlesTrack();}else if(data.group=='timeline'){type=self.options.timelineTypes[Ox.indexOf(self.options.timelineTypes,function(type){return type.title==title;})].id;if(type!=self.options.timelineType){self.options.timelineType=type;setTimelineType();}}else if(data.id=='download'){that.triggerEvent('download');}}});} function rewind(){setPosition(self.options.playInToOut?self.options['in']:0);} function seeked(){Ox.Log('Video','seeked') clearTimeout(self.seekTimeout);self.seekTimeout=0;Ox.Log('Video','hide loading icon') hideLoadingIcon();self.$video.show();self.$playIcon&&self.$playIcon.show();hidePoster();} function seeking(){Ox.Log('Video','XX seeking') if(!self.seekTimeout){self.seekTimeout=setTimeout(function(){self.$playIcon&&self.$playIcon.hide();Ox.Log('Video','XX show') showLoadingIcon();},250);}} function setAudioTrack(){updateVideo();} function setCensored(){var censored=getCensored();if(censored!=self.censored){self.censored=censored;censor();}} function setChapterTitle(){var chapterTitle=getChapterTitle();if(chapterTitle!=self.chapterTitle){self.chapterTitle=chapterTitle;self.$chapterTitle.html(self.chapterTitle)}} function setMarkers(){self.$posterMarker&&Ox.forEach(self.$posterMarker,function(marker){isEqual(self.options.position,self.options.posterFrame)?marker.show():marker.hide();});self.$pointMarker&&Ox.forEach(self.$pointMarker,function(markers,point){Ox.forEach(markers,function(marker){isEqual(self.options.position,self.options[point])?marker.css({display:'block'}):marker.hide();});});} function setPoint(){that.triggerEvent('setpoint');} function setPosition(position,from){self.options.position=Ox.limit(position,self['in'],self.out);self.options.paused&&self.options.showMarkers&&setMarkers();self.options.censored.length&&setCensored();self.options.enableSubtitles&&self.$subtitle&&setSubtitle();self.$chapterTitle&&setChapterTitle();self.$position&&self.$position.html(formatPosition());if(self.options.type=='play'){if(self.loadedMetadata&&from!='video'){self.$video.currentTime(self.options.position);} if(self.iconIsVisible){self.$playIcon.animate({opacity:0},250);self.iconIsVisible=false;} self.$timeline&&self.$timeline.options({position:self.options.position});}else{loadImage();}} function setResolution(){updateVideo();that.triggerEvent('resolution',{resolution:self.options.resolution});} function setSize($element,css,animate,callback){if($element){if(animate){$element.animate(css,250,function(){callback&&callback();});}else{$element.css(css);callback&&callback();}}} function setSizes(animate,callback){self.width=self.options.fullscreen?window.innerWidth:self.options.width;self.height=self.options.fullscreen?window.innerHeight:self.options.height;self.videoCSS=getVideoCSS();self.iconSize=Ox.limit(Math.round(self.height/10),16,32);if(self.$timeline||self.$spaceBottom){self.timelineWidth=getTimelineWidth();if(self.$timeline){self.timelineImageWidth=self.timelineWidth-self.barHeight;}} setSize(that,getCSS('player'),animate,callback);setSize(self.$videoContainer,getCSS('videoContainer'),animate);setSize(self.$video,self.videoCSS,animate);setSize(self.$poster,self.videoCSS,animate);setSize(self.$logo,getCSS('logo'),animate);setSize(self.$loadingIcon,getCSS('loadingIcon'),animate);setSize(self.$playIcon,getCSS('playIcon'),animate);setSize(self.$copyrightIcon,getCSS('copyrightIcon'),animate);setSize(self.$subtitle,getCSS('subtitle'),animate);setSize(self.$controlsTop,getCSS('controlsTop'),animate);setSize(self.$title,getCSS('title'),animate);setSize(self.$chapterTitle,getCSS('title'),animate);setSize(self.$spaceTop,getCSS('spaceTop'),animate);setSize(self.$controlsBottom,getCSS('controlsBottom'),animate);setSize(self.$timeline,getCSS('timeline'),animate,function(){self.$timeline&&self.$timeline.options({width:self.timelineWidth});});setSize(self.$spaceBottom,getCSS('spaceBottom'),animate);setSize(self.$find,getCSS('find'),animate,function(){var width=Math.min(128,self.width-88);self.$findInput.options({width:width});self.$findInput.children('input').css({width:(width-12)+'px'});});setSize(self.$volume,getCSS('volume'),animate,function(){self.$volumeInput.options({size:Math.min(128,self.width-56)});});if(self.$posterMarker){self.posterMarkerCSS=getPosterMarkerCSS();Ox.forEach(self.$posterMarker,function(marker,position){setSize(marker,self.posterMarkerCSS[position],animate);});}} function setSubtitle(){var subtitle=getSubtitle();if(subtitle!=self.subtitle){self.subtitle=subtitle;setSubtitleText();}} function setSubtitleText(){self.$subtitle.html(self.subtitle?Ox.highlight(self.subtitle,self.options.find,'OxHighlight',true).replace(/\n/g,'
'):' 
 ');} function setSubtitlesTrack(){var enableSubtitles=self.options.enableSubtitles&&!!self.options.subtitlesTrack;self.options.enableSubtitles=enableSubtitles;setSubtitle();self.$timeline&&self.$timeline.options({subtitles:getSubtitles()});if(enableSubtitles&&!!self.options.subtitlesTrack){that.triggerEvent('subtitlestrack',{track:self.options.subtitlesTrack});}else{that.triggerEvent('subtitles',{subtitles:self.options.enableSubtitles});}} function setTimelineType(){that.triggerEvent('timeline',{timeline:self.options.timelineType});} function setVideo(){if(Ox.isObject(self.options.video[0])){self.audioTracks=Ox.sort(Ox.unique(self.options.video.map(function(video){return video.track;})));if(!Ox.contains(self.audioTracks,self.options.audioTrack)){self.options.audioTrack=self.audioTracks[0];} self.resolutions=Ox.sort(Ox.unique(self.options.video.map(function(video){return video.resolution;})));if(!Ox.contains(self.resolutions,self.options.resolution)){self.options.resolution=self.resolutions[0];} self.video=getVideo();}else{self.video=[{src:self.options.video}];self.resolutions=[];self.audioTracks=[];}} function setVolume(volume){self.options.volume=volume;if(!!self.options.volume==self.options.muted){toggleMuted();}else{self.$volumeButton&&self.$volumeButton.options({title:getVolumeImage()});self.$volumeValue&&self.$volumeValue.html(self.options.muted?0:Math.round(self.options.volume*100));} !self.censored&&self.$video.volume(self.options.volume);that.triggerEvent('volume',{volume:self.options.volume});} function showControls(){clearTimeout(self.interfaceTimeout);if(!self.interfaceIsVisible){self.interfaceIsVisible=true;if(self.$controlsTop){self.controlsTopAreVisible=true;} if(self.$controlsBottom){self.controlsBottomAreVisible=true;} self.$controlsTop&&self.$controlsTop.animate({opacity:1},250);self.$controlsBottom&&self.$controlsBottom.animate({opacity:1},250);['find','settings','volume'].forEach(function(element){var $element=self['$'+element];$element&&$element.is(':visible')&&$element.animate({opacity:1},250);});self.$logo&&self.$logo.animate({top:getCSS('logo').top,opacity:0.5},250,function(){self.options.logoLink&&self.$logo.on({click:function(){document.location.href=self.options.logoLink;}});self.options.logoTitle&&self.$logo.on({mouseenter:function(e){self.$logoTooltip.show(e);},mouseleave:self.$logoTooltip.hide});});self.$subtitle&&self.$subtitle.animate({bottom:getCSS('subtitle').bottom},250);}} function showLoadingIcon(){self.$loadingIcon.start().show();} function showVolume(){if(self.$volume){!self.interfaceIsVisible&&showControls();self.$volume.is(':hidden')&&toggleVolume();}} function sizechange(){self.videoWidth=self.$video.videoWidth();self.videoHeight=self.$video.videoHeight();self.videoCSS=getVideoCSS();self.$video.css(self.videoCSS);};function submitFindInput(value,hasPressedEnter){self.options.find=value;self.results=find(self.options.find);if(self.$find){self.$results.html(self.results.length);self.$previousResultButton.options({disabled:!self.results.length});self.$nextResultButton.options({disabled:!self.results.length});self.$clearButton.options({disabled:!self.options.find});} self.subtitle&&setSubtitleText();self.$timeline&&self.$timeline.options({find:self.options.find,results:self.results});if(hasPressedEnter){if(self.results.length){goToNext('result',1);that.gainFocus();}else{self.$findInput.focusInput(true);}} that.triggerEvent('find',{find:self.options.find});} function submitPositionInput(){self.$positionInput.hide();self.$position.html('').show();setPosition(Ox.parseDuration(self.$positionInput.value()));if(self.playOnSubmit){togglePaused();self.$video.play();self.playOnSubmit=false;} if(self.focus=='mouseenter'&&!self.mouseHasLeft){that.gainFocus();} self.mouseHasLeft&&hideControls();that.triggerEvent('position',{position:self.options.position});that.triggerEvent('submit');} function toggleFind(){var show=self.$find.is(':hidden');!show&&self.$findInput.blurInput();self.$find.toggle();show&&self.$findInput.focusInput(false);} function toggleFullscreen(from){var parentOffset,playOnFullscreen;self.options.fullscreen=!self.options.fullscreen;if(!self.options.paused){self.$video.pause();playOnFullscreen=true;} if(self.options.fullscreen){self.$parent=that.parent();parentOffset=self.$parent.offset();self.absoluteOffset=that.offset();self.relativeOffset={left:self.absoluteOffset.left-parentOffset.left,top:self.absoluteOffset.top-parentOffset.top};that.detach().addClass('OxFullscreen').css({left:self.absoluteOffset.left+'px',top:self.absoluteOffset.top+'px',zIndex:1000}).appendTo(Ox.$body);if(self.options.externalControls){self.externalControls=true;self.options.externalControls=false;self.$videoContainer.css({top:0});} setSizes(true,function(){playOnFullscreen&&self.$video.play();enterFullscreen();});}else{self.exitFullscreen=true;that.off('mousemove');that.find('.OxControls').trigger('mouseleave').off('mouseenter mouseleave');clearTimeout(self.interfaceTimeout);if(self.externalControls){self.options.externalControls=true;self.$videoContainer.css({top:'16px'});} setSizes(true,function(){self.exitFullscreen=false;that.detach().removeClass('OxFullscreen').css({left:self.relativeOffset.left+'px',top:self.relativeOffset.top+'px',zIndex:1}).appendTo(self.$parent);playOnFullscreen&&self.$video.play();self.options.enableKeyboard&&that.gainFocus();});} if(self.$fullscreenButton&&from!='button'){self.$fullscreenButton.toggle();} that.triggerEvent('fullscreen',{fullscreen:self.options.fullscreen});} function toggleLoop(from){self.options.loop=!self.options.loop;self.$video.options('loop',self.options.loop);if(self.$loopButton&&from!='button'){self.$loopButton.toggle();} that.triggerEvent('loop',{loop:self.options.loop});} function toggleMuted(from){self.hasVolumeControl&&showVolume();self.options.muted=!self.options.muted;self.$video.muted(self.options.muted);if(!self.options.muted&&!self.options.volume){self.options.volume=1;self.$video.volume(1);} if(self.$muteButton&&from!='button'){self.$muteButton.toggle();} self.$volumeButton&&self.$volumeButton.options({title:getVolumeImage()});self.$volumeInput&&self.$volumeInput.value(self.options.muted?0:self.options.volume);self.$volumeValue&&self.$volumeValue.html(self.options.muted?0:Math.round(self.options.volume*100));that.triggerEvent('muted',{muted:self.options.muted});} function togglePaused(from){self.options.paused=!self.options.paused;self.$timeline&&self.$timeline.options({paused:self.options.paused});if(!self.loadedMetadata){return;} if(self.options.paused){self.$video.pause();clearInterval(self.playInterval);if(self.options.showIcon){togglePlayIcon();self.$playIcon.animate({opacity:1},250);} self.playInToOut=false;}else{hidePoster();if(self.options.playInToOut&&self.options.position>self.options.out-self.secondsPerFrame){setPosition(self.options['in']);} self.$video.play();self.playInterval=setInterval(playing,self.millisecondsPerFrame);if(self.options.showIcon){self.$playIcon.animate({opacity:0},250,togglePlayIcon);}else if(self.options.showIconOnLoad){self.$playIcon.animate({opacity:0},250);} self.options.showMarkers&&hideMarkers();} if(self.$playButton&&from!='button'){self.$playButton.toggle();} that.triggerEvent('paused',{paused:self.options.paused});self.options.paused&&that.triggerEvent('position',{position:self.options.position});} function togglePlayIcon(){self.$playIcon.attr({src:Ox.UI.getImageURL('symbol'+(self.options.paused?'Play':'Pause'),'videoIcon')});} function toggleScale(from){self.options.scaleToFill=!self.options.scaleToFill;self.videoCSS=getVideoCSS();self.$video.animate(self.videoCSS,250);self.$poster&&self.$poster.animate(self.videoCSS,250);self.$subtitle&&self.$subtitle.animate({bottom:getCSS('subtitle').bottom},250);if(self.$scaleButton&&from!='button'){self.$scaleButton.toggle();} if(self.$posterMarker){self.posterMarkerCSS=getPosterMarkerCSS();Ox.forEach(self.$posterMarker,function(marker,position){marker.animate(self.posterMarkerCSS[position],250);});} that.triggerEvent('scale',{scale:self.options.scaleToFill?'fill':'fit'});} function toggleSize(){self.options.sizeIsLarge=!self.options.sizeIsLarge;that.triggerEvent('size',{size:self.options.sizeIsLarge?'large':'small'});} function toggleVolume(){self.$volume.toggle();} function updateVideo(){if(!self.options.paused){self.playOnLoad=true;togglePaused('button');} self.loadedMetadata=false;showLoadingIcon();self.video=getVideo();self.$video.options({items:self.video});self.$playButton&&self.$playButton.options({disabled:true});} that.changeVolume=function(num){changeVolume(num);return that;};that.playInToOut=function(){playInToOut();return that;};that.toggleLoop=function(){toggleLoop();return that;};that.togglePaused=function(){togglePaused();return that;};that.toggleMuted=function(){toggleMuted();return that;};return that;};Ox.VideoPlayerMenu=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({items:[]}).options(options||{}).update({}).on({click:function(e){var $target=$(e.target),group,id;that.hide();if(!$target.is('.OxLine')&&!$target.is('.OxSpace')&&!$target.is('.OxDisabled')){group=$target.parent().data().group;id=$target.parent().data().id;self.$items.filter(function($item){return $item.data().group==group;}).forEach(function($item){$($item.children()[1]).attr({src:Ox.UI.getImageURL('symbol'+($item.data().id==id?'Check':'None'))});});that.triggerEvent('click',{group:group,id:id});}}});self.$items=[];self.height=2;self.options.items.forEach(function(item){var $item;if(!Ox.isEmpty(item)){$item=$('
').addClass('OxItem'+(item.disabled?' OxDisabled':'')).data({group:item.group,id:item.id}).appendTo(that);if(!item.disabled){$item.on({mouseenter:function(){$(this).addClass('OxSelected');},mouseleave:function(){$(this).removeClass('OxSelected');}});} $('
').html(item.title).appendTo($item);$('').attr({src:Ox.UI.getImageURL('symbol'+(item.checked?'Check':'None'))}).appendTo($item);self.$items.push($item);self.height+=14;}else{$('
').addClass('OxSpace').appendTo(that);$('
').addClass('OxLine').appendTo(that);$('
').addClass('OxSpace').appendTo(that);self.height+=5;}});that.css({height:self.height+'px'});return that;};'use strict';Ox.VideoPlayerPanel=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({annotationsCalendarSize:256,annotationsMapSize:256,annotationsRange:'all',annotationsSize:256,annotationsSort:'position',annotationsTooltip:'annotations',audioTrack:'',censored:[],censoredIcon:'',censoredTooltip:'',clickLink:null,cuts:[],duration:0,enableDownload:false,enableSubtitles:false,find:'',fps:25,fullscreen:false,getLargeTimelineURL:null,height:0,'in':0,itemName:{singular:'video',plural:'videos'},layers:[],loop:false,muted:false,out:0,paused:true,playbackRate:1,playInToOut:false,position:0,poster:'',resolution:0,scaleToFill:false,selected:'',showAnnotations:false,showAnnotationsCalendar:false,showAnnotationsMap:false,showLayers:{},showTimeline:false,showUsers:false,smallTimelineURL:'',subtitles:[],subtitlesDefaultTrack:'English',subtitlesLayer:null,subtitlesOffset:0,subtitlesTrack:'English',timeline:'',timelineTooltip:'timeline',video:'',volume:1,width:0}).options(options||{}).update({fullscreen:function(){self.$video.options({fullscreen:self.options.fullscreen});},height:function(){self.$video.options({height:getPlayerHeight()});},'in':function(){setPoint('in',self.options['in']);},loop:function(){self.$video.options({loop:self.options.loop});},out:function(){setPoint('out',self.options.out);},paused:function(){self.$video.options({paused:self.options.paused});},playbackRate:function(){self.$video.options({playbackRate:self.options.playbackRate});},position:function(){self.$video.options({position:self.options.position});self.$timeline.options({position:self.options.position});self.$annotationPanel.options({position:self.options.position});},selected:function(){self.$annotationPanel.options({selected:self.options.selected});},showAnnotations:function(){self.$mainPanel.toggleElement(1);},showTimeline:function(){self.$videoPanel.toggleElement(1);},timeline:function(){self.$timeline.options({type:self.options.timeline});},volume:function(){self.$video.options({volume:self.options.volume});},width:function(){self.$video.options({width:getPlayerWidth()});self.$timeline.options({width:getTimelineWidth()});}}).css({height:self.options.height+'px',width:self.options.width+'px'}).bindEvent({resize:resizeElement,key_0:toggleMuted,key_comma:function(){movePositionTo('cut',-1);},key_control_c:function(){that.triggerEvent('copy',[{annotation:self.options.selected,'in':self.options['in'],out:self.options.out}]);},key_control_shift_c:function(){that.triggerEvent('copyadd',[{annotation:self.options.selected,'in':self.options['in'],out:self.options.out}]);},key_dot:function(){movePositionTo('cut',1);},key_equal:function(){self.$video.changeVolume(0.1);},key_i:function(){self.$annotationPanel.options({selected:''});setPoint('in',self.options.position,false,true);},key_k:function togglePlaybackRate(){that.options({playbackRate:self.options.playbackRate==1?2:self.options.playbackRate==2?0.5:1});},key_l:toggleLoop,key_left:function(){movePositionBy(-1/self.options.fps);},key_minus:function(){self.$video.changeVolume(-0.1);},key_o:function(){self.$annotationPanel.options({selected:''});setPoint('out',self.options.position,false,true);},key_p:playInToOut,key_right:function(){movePositionBy(1/self.options.fps);},key_shift_down:function(){movePositionBy(self.options.duration);},key_shift_i:function(){goToPoint('in');},key_shift_left:function(){movePositionBy(-1);},key_shift_o:function(){goToPoint('out');},key_shift_right:function(){movePositionBy(1);},key_shift_up:function(){movePositionBy(-self.options.position);},key_slash:selectCut,key_space:togglePaused});self.options.subtitles=options.subtitles!==void 0?self.options.subtitles:parseSubtitles();self.fullscreen=false;self.results=[];self.$player=Ox.Element().css({overflow:'hidden'});self.$video=Ox.VideoPlayer({annotations:getAnnotations(),audioTrack:self.options.audioTrack,censored:self.options.censored,censoredIcon:self.options.censoredIcon,censoredTooltip:self.options.censoredTooltip,controlsTop:['fullscreen','title','find'],controlsBottom:['play','playInToOut','volume','scale','timeline','loop','position','settings'],enableDownload:self.options.enableDownload,enableFind:true,enableKeyboard:true,enableMouse:true,enablePosition:true,enableSubtitles:self.options.enableSubtitles,enableTimeline:true,find:self.options.find,fullscreen:self.options.fullscreen,height:getPlayerHeight(),'in':self.options['in'],loop:self.options.loop,muted:self.options.muted,out:self.options.out,paused:self.options.paused,position:self.options.position,resolution:self.options.resolution,scaleToFill:self.options.scaleToFill,subtitles:Ox.clone(self.options.subtitles,true),subtitlesDefaultTrack:self.options.subtitlesDefaultTrack,subtitlesOffset:self.options.subtitlesOffset,subtitlesTrack:self.options.subtitlesTrack,timeline:self.options.smallTimelineURL,video:self.options.video,volume:self.options.volume,width:getPlayerWidth()}).bindEvent({censored:function(){that.triggerEvent('censored');},download:function(data){that.triggerEvent('downloadvideo',data);},find:function(data){self.$timeline.options({find:data.find});self.$annotationPanel.options({highlight:data.find});that.triggerEvent('find',data);},fullscreen:function(data){self.options.fullscreen=data.fullscreen;},loop:function(data){that.triggerEvent('loop',data);},muted:function(data){that.triggerEvent('muted',data);},paused:function(data){self.options.paused=data.paused;that.triggerEvent('paused',data);},playing:function(data){setPosition(data.position,true);},position:function(data){setPosition(data.position);},positioning:function(data){setPosition(data.position,false,true);},resolution:function(data){that.triggerEvent('resolution',data);},scale:function(data){that.triggerEvent('scale',data);},select:selectAnnotation,subtitles:function(data){self.options.enableSubtitles=data.subtitles;self.$timeline.options({subtitles:getSubtitles()});that.triggerEvent('subtitles',data);},subtitlestrack:function(data){var enableSubtitles=!!data.track;if(enableSubtitles!=self.options.enableSubtitles){self.options.enableSubtitles=enableSubtitles;that.triggerEvent('subtitles',{subtitles:enableSubtitles});} self.options.subtitlesTrack=data.track;self.$timeline.options({subtitles:getSubtitles()});},volume:function(data){that.triggerEvent('volume',data);}}).appendTo(self.$player);self.$controls=Ox.Element().addClass('OxMedia').bindEvent({toggle:toggleControls});self.$timeline=Ox.LargeVideoTimeline({cuts:self.options.cuts,duration:self.options.duration,find:self.options.find,getImageURL:self.options.getLargeTimelineURL,'in':self.options['in'],out:self.options.out,position:self.options.position,subtitles:getSubtitles(),videoId:self.options.videoId,type:self.options.timeline,width:getTimelineWidth()}).css({left:'4px',top:'4px'}).bindEvent({key_left:function(){self.options.paused&&movePositionBy(-1/self.options.fps);},key_right:function(){self.options.paused&&movePositionBy(1/self.options.fps);},key_space:togglePaused,mousedown:that.gainFocus,position:dragendTimeline,positioning:dragTimeline}).appendTo(self.$controls);self.$videoPanel=Ox.SplitPanel({elements:[{element:self.$player},{collapsed:!self.options.showTimeline,collapsible:true,element:self.$controls,size:80,tooltip:self.options.timelineTooltip}],orientation:'vertical'});self.$annotationPanel=Ox.AnnotationPanel({calendarSize:self.options.annotationsCalendarSize,clickLink:self.options.clickLink,editable:false,highlight:self.options.find,'in':self.options['in'],itemName:self.options.itemName,layers:self.options.layers,mapSize:self.options.annotationsMapSize,out:self.options.out,position:self.options.position,range:self.options.annotationsRange,selected:self.options.selected,showCalendar:self.options.showAnnotationsCalendar,showLayers:Ox.clone(self.options.showLayers),showMap:self.options.showAnnotationsMap,showUsers:self.options.showUsers,sort:self.options.annotationsSort,width:self.options.annotationsSize}).bindEvent({annotationsrange:function(data){self.options.annotationsRange=data.range;that.triggerEvent('annotationsrange',data);},annotationssort:function(data){self.options.annotationsSort=data.sort;that.triggerEvent('annotationssort',data);},info:function(data){that.triggerEvent('info',data);},open:function(){setPosition(self.options['in']);},resize:resizeAnnotations,resizeend:resizeendAnnotations,resizecalendar:function(data){that.triggerEvent('resizecalendar',data);},resizemap:function(data){that.triggerEvent('resizemap',data);},select:selectAnnotation,toggle:toggleAnnotations,togglecalendar:function(data){self.options.showAnnotationsCalendar=!data.collapsed;that.triggerEvent('togglecalendar',data);},togglelayer:function(data){that.triggerEvent('togglelayer',{collapsed:data.collapsed,layer:data.layer});},togglemap:function(data){self.options.showAnnotationsMap=!data.collapsed;that.triggerEvent('togglemap',data);}});['0','b','backslash','closebracket','comma','dot','equal','f','g','i','minus','n','o','openbracket','p','shift_0','shift_g','shift_i','shift_o','slash','space'].forEach(function(key){key='key_'+key;self.$annotationPanel.bindEvent(key,function(){that.triggerEvent(key);});});that.setElement(self.$mainPanel=Ox.SplitPanel({elements:[{element:self.$videoPanel},{collapsed:!self.options.showAnnotations,collapsible:true,element:self.$annotationPanel,resizable:true,resize:[192,256,320,384],size:self.options.annotationsSize,tooltip:self.options.annotationsTooltip}],orientation:'horizontal'}));function dragTimeline(data){self.options.position=data.position;self.$video.options({position:self.options.position});self.$annotationPanel.options({position:self.options.position});} function dragendTimeline(data){dragTimeline(data);that.triggerEvent('position',{position:self.options.position});} function getAnnotations(){return!self.options.layers?[]:Ox.flatten(self.options.layers.map(function(layer){return layer.items.map(function(item){return{id:item.id,'in':item['in'],out:item.out,text:item.value};});})).sort(sortAnnotations);} function getNextPosition(type,direction){var positions;if(type=='cut'){positions=[0].concat(self.options.cuts,self.options.duration);} return Ox.nextValue(positions,self.options.position,direction);} function getPlayerHeight(){return self.options.height -self.options.showTimeline*80-1;} function getPlayerWidth(){return self.options.width -(self.options.showAnnotations&&!self.fullscreen)*self.options.annotationsSize-1;} function getSubtitles(){return self.options.enableSubtitles?self.options.subtitles.filter(function(v){return Ox.contains(v.tracks,self.options.subtitlesTrack);}):[];} function getTimelineWidth(){return self.options.width -(self.options.showAnnotations&&!self.fullscreen)*self.options.annotationsSize-16-1;} function goToPoint(point){setPosition(self.options[point]);} function playInToOut(){self.$video.playInToOut();} function movePositionBy(sec){setPosition(Ox.limit(self.options.position+sec,0,self.options.duration));} function movePositionTo(type,direction){setPosition(getNextPosition(type,direction));} function parseSubtitles(){return self.options.subtitlesLayer?self.options.layers.filter(function(layer){return layer.id==self.options.subtitlesLayer;})[0].items.map(function(subtitle){return{id:subtitle.id,'in':subtitle['in'],out:subtitle.out,text:subtitle.value.replace(/\n/g,' ').replace(//g,'\n'),tracks:subtitle.languages||[self.options.subtitlesDefaultTrack]};}):[];} function resizeAnnotations(data){self.options.annotationsSize=data.size;self.$video.options({width:getPlayerWidth()});self.$timeline.options({width:getTimelineWidth()});self.$annotationPanel.options({width:data.size});} function resizeendAnnotations(data){that.triggerEvent('annotationssize',data.size);} function resizeElement(data){self.options.height=data.size;self.$video.options({height:getPlayerHeight()});} function selectAnnotation(data){self.options.selected=data.id;if(self.options.selected){setPosition(data['in']);setPoint('in',data['in'],true);setPoint('out',data.out,true);} self.$annotationPanel.options({selected:self.options.selected});that.triggerEvent('select',{id:self.options.selected});} function selectCut(){var points={'in':Ox.last(self.options.cuts),out:self.options.duration};Ox.forEach(self.options.cuts,function(cut,i){if(cut>self.options.position){points={'in':i==0?0:self.options.cuts[i-1],out:cut-1/self.options.fps};return false;}});setPoint('in',points['in']);setPoint('out',points.out);} function setPoint(point,position,keepSelected,triggerEvent){self.options[point]=position;if(self.options.selected&&!keepSelected){selectAnnotation({id:''});} self.$video.options(point,position);self.$timeline.options(point,position);self.$annotationPanel.options(point,position);if(self.options['in']>self.options.out){setPoint(point=='in'?'out':'in',position,keepSelected);}else if(triggerEvent){that.triggerEvent('points',{'in':self.options['in'],out:self.options.out,position:self.options.position});}} function setPosition(position,playing,dragging){var minute=Math.floor(position/60),previousMinute=Math.floor(self.options.position/60);self.options.position=position;!playing&&self.$video.options({position:self.options.position});self.$timeline.options({position:self.options.position});self.$annotationPanel.options({position:self.options.position});if((!playing||minute!=previousMinute)&&!dragging){that.triggerEvent('position',{position:!playing?self.options.position:minute*60});}} function sortAnnotations(a,b){var ret=0;if(a['in']b['in']){ret=1;}else if(a.outb.out){ret=1;}else if(a.valueb.value){ret=1;} return ret;} function toggleAnnotations(data){self.options.showAnnotations=!data.collapsed;self.$video.options({width:getPlayerWidth()});self.$timeline.options({width:getTimelineWidth()});that.triggerEvent('toggleannotations',{showAnnotations:self.options.showAnnotations});} function toggleControls(data){self.options.showTimeline=!data.collapsed;self.$video.options({height:getPlayerHeight()});that.triggerEvent('toggletimeline',{showTimeline:self.options.showTimeline});} function toggleLoop(){self.$video.toggleLoop();} function toggleMuted(){self.$video.toggleMuted();} function togglePaused(){self.$video.togglePaused();self.$video.options('paused')&&that.triggerEvent('position',{position:self.$video.options('position')});} that.toggleAnnotations=function(){self.$mainPanel.toggleElement(1);};that.toggleTimeline=function(){self.$videoPanel.toggleElement(1);};that.playInToOut=function(){self.$video.playInToOut();};return that;} 'use strict';Ox.VideoPreview=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({duration:0,getFrame:null,fps:25,frameRatio:16/9,height:256,position:void 0,scaleToFill:false,timeline:'',videoTooltip:null,width:256}).options(options||{}).update({height:function(){that.css({height:self.options.height+'px'});self.$frame.css(getFrameCSS());},position:function(){self.$frame.attr({src:self.options.getFrame(self.options.position)});},width:function(){that.css({width:self.options.width+'px'});stopLoading();self.$frame.attr({src:self.options.getFrame()}).css(getFrameCSS());self.$timeline&&self.$timeline.css({width:self.options.width+'px'});}}).addClass('OxVideoPreview').css({width:self.options.width+'px',height:self.options.height+'px'});self.loaded=[];self.queue=[];self.$frameElement=Ox.$('
').addClass('OxFrame').appendTo(that);self.$frame=Ox.$('').attr({src:self.options.getFrame(self.options.position)}).css(getFrameCSS()).appendTo(self.$frameElement);if(self.options.timeline){self.$timeline=$('').addClass('OxTimeline').attr({src:self.options.timeline}).css({width:self.options.width+'px'}).appendTo(that);} self.$interface=Ox.Element({tooltip:function(event){var position=getPosition(event.clientX-that.offset().left),tooltip=Ox.isFunction(self.options.videoTooltip)?self.options.videoTooltip():self.options.videoTooltip;self.$frame.attr({src:getClosestFrame(position)});self.timeout&&clearTimeout(self.timeout);self.timeout=setTimeout(function(){self.$frame.attr({src:self.options.getFrame(position)});},250);return'
' +(tooltip?tooltip+'
':'') +''+Ox.formatDuration(position,2)+'' +'
';}}).addClass('OxInterface').on({click:click,mouseenter:startLoading,mouseleave:function(){stopLoading();self.$frame.attr({src:self.options.getFrame(self.options.position)});}}).bindEvent({touchend:touchend,touchmove:touchmove,touchstart:startLoading}).appendTo(that);function click(e){that.triggerEvent('click',{position:getPosition(e.clientX-that.offset().left)});} function getClosestFrame(position){return self.loaded.length==0?self.options.getFrame(self.options.position):self.loaded.sort(function(a,b){return Math.abs(a.position-position)-Math.abs(b.position-position);})[0].frame;} function getFrameCSS(){var css={},elementWidth=self.options.width,elementHeight=self.options.height-(self.options.timeline?16:0),elementRatio=elementWidth/elementHeight,frameRatio=self.options.frameRatio,frameIsWider=frameRatio>elementRatio;if(self.options.scaleToFill){css.width=frameIsWider?elementHeight*frameRatio:elementWidth;css.height=frameIsWider?elementHeight:elementWidth/frameRatio;css.marginLeft=frameIsWider?(elementWidth-css.width)/2:0;css.marginTop=frameIsWider?0:(elementHeight-css.height)/2;}else{css.width=frameIsWider?elementWidth:elementHeight*frameRatio;css.height=frameIsWider?elementWidth/frameRatio:elementHeight;css.marginLeft=frameIsWider?0:(elementWidth-css.width)/2;css.marginTop=frameIsWider?(elementHeight-css.height)/2:0;} return Ox.map(css,function(value){return Math.round(value)+'px';});} function getPosition(x){return Math.round(self.options.duration*x/self.options.width*self.options.fps)/self.options.fps;} function startLoading(){var last,steps=[Math.round(self.options.width/2)];while((last=steps[steps.length-1])>1){steps.push(Math.round(last/2));} steps.forEach(function(step){Ox.loop(0,self.options.width,step,function(x){var position=getPosition(x),frame=self.options.getFrame(position);if(!self.loaded.some(function(image){return image.frame==frame;})&&!self.queue.some(function(image){return image.frame==frame;})){self.queue.push({frame:frame,position:position});}});});self.queue.length&&loadFrame();function loadFrame(){var image=self.queue.shift();$('').load(function(){self.loaded.push(image);self.queue.length&&loadFrame();}).attr({src:image.frame})}} function stopLoading(){self.queue=[];self.timeout&&clearTimeout(self.timeout);} function touchend(e){var position=getPosition(e.clientX-that.offset().left);stopLoading();self.$frame.attr({src:getClosestFrame(position)});that.triggerEvent('click',{position:position});} function touchmove(e){var position=getPosition(e.clientX-that.offset().left);self.$frame.attr({src:getClosestFrame(position)});} return that;};'use strict';Ox.VideoTimelinePanel=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({annotationsCalendarSize:256,annotationsMapSize:256,annotationsRange:'all',annotationsSize:256,annotationsSort:'position',annotationsTooltip:'annotations',audioTrack:'',censored:[],censoredIcon:'',censoredTooltip:'',clickLink:null,cuts:[],duration:0,followPlayer:false,getFrameURL:null,getLargeTimelineURL:null,height:0,'in':0,itemName:{singular:'video',plural:'videos'},layers:[],loop:false,muted:false,out:0,paused:true,playbackRate:1,position:0,resolution:0,selected:'',showAnnotations:false,showAnnotationsCalendar:false,showAnnotationsMap:false,showLayers:{},showUsers:false,smallTimelineURL:'',subtitles:[],timeline:'',timelines:[],video:'',volume:1,width:0}).options(options||{}).update({height:function(){self.$player.options({height:self.options.height});},paused:function(){self.$player.options({paused:self.options.paused});},playbackRate:function(){self.$player.options({playbackRate:self.options.playbackRate});},position:function(){setPosition(self.options.position);},showAnnotations:function(){self.$panel.toggleElement(1);},timeline:function(){self.$player.options({timeline:self.options.timeline});},width:function(){self.$player.options({width:getPlayerWidth()});}}).css({height:self.options.height+'px',width:self.options.width+'px'}).bindEvent({resize:resizeElement,key_0:toggleMuted,key_equal:function(){self.$video.changeVolume(0.1);},key_k:function togglePlaybackRate(){that.options({playbackRate:self.options.playbackRate==1?2:self.options.playbackRate==2?0.5:1});},key_minus:function(){self.$video.changeVolume(-0.1);},key_space:togglePaused});self.$player=Ox.VideoTimelinePlayer({audioTrack:self.options.audioTrack,censored:self.options.censored,censoredIcon:self.options.censoredIcon,censoredTooltip:self.options.censoredTooltip,cuts:self.options.cuts,duration:self.options.duration,followPlayer:self.options.followPlayer,getFrameURL:self.options.getFrameURL,getLargeTimelineURL:self.options.getLargeTimelineURL,height:self.options.height,muted:self.options.muted,paused:self.options.paused,playbackRate:self.options.playbackRate,position:self.options.position,resolution:self.options.resolution,smallTimelineURL:self.options.smallTimelineURL,subtitles:self.options.subtitles,timeline:self.options.timeline,timelines:self.options.timelines,video:self.options.video,videoRatio:self.options.videoRatio,volume:self.options.volume,width:getPlayerWidth()}).bindEvent({censored:function(){that.triggerEvent('censored');},follow:function(data){that.triggerEvent('follow',data);},muted:function(data){that.triggerEvent('muted',data);},paused:function(data){self.options.paused=data.paused;that.triggerEvent('paused',data);},playing:function(data){setPosition(data.position,true);},position:function(data){setPosition(data.position);},timeline:function(data){that.triggerEvent('timeline',data);},volume:function(data){that.triggerEvent('volume',data);}});self.$annotationPanel=Ox.AnnotationPanel({calendarSize:self.options.annotationsCalendarSize,clickLink:self.options.clickLink,editable:false,highlight:self.options.find,'in':self.options['in'],itemName:self.options.itemName,layers:self.options.layers,mapSize:self.options.annotationsMapSize,out:self.options.out,position:self.options.position,range:self.options.annotationsRange,selected:self.options.selected,showCalendar:self.options.showAnnotationsCalendar,showLayers:Ox.clone(self.options.showLayers),showMap:self.options.showAnnotationsMap,showUsers:self.options.showUsers,sort:self.options.annotationsSort,width:self.options.annotationsSize}).bindEvent({annotationsrange:function(data){self.options.annotationsRange=data.range;that.triggerEvent('annotationsrange',data);},annotationssort:function(data){self.options.annotationsSort=data.sort;that.triggerEvent('annotationssort',data);},info:function(data){that.triggerEvent('info',data);},open:function(){setPosition(self.options['in']);},resize:resizeAnnotations,resizeend:resizeendAnnotations,resizecalendar:function(data){that.triggerEvent('resizecalendar',data);},resizemap:function(data){that.triggerEvent('resizemap',data);},select:selectAnnotation,toggle:toggleAnnotations,togglecalendar:function(data){self.options.showAnnotationsCalendar=!data.collapsed;that.triggerEvent('togglecalendar',data);},togglelayer:function(data){that.triggerEvent('togglelayer',{collapsed:data.collapsed,layer:data.layer});},togglemap:function(data){self.options.showAnnotationsMap=!data.collapsed;that.triggerEvent('togglemap',data);}});that.setElement(self.$panel=Ox.SplitPanel({elements:[{element:self.$player},{collapsed:!self.options.showAnnotations,collapsible:true,element:self.$annotationPanel,resizable:true,resize:[192,256,320,384],size:self.options.annotationsSize,tooltip:self.options.annotationsTooltip}],orientation:'horizontal'}));function getPlayerWidth(){return self.options.width-self.options.showAnnotations*self.options.annotationsSize-1;} function resizeAnnotations(data){self.options.annotationsSize=data.size;self.$player.options({width:getPlayerWidth()});self.$annotationPanel.options({width:data.size});} function resizeendAnnotations(data){that.triggerEvent('annotationssize',data.size);} function resizeElement(data){self.options.height=data.size;self.$player.options({height:self.options.height});} function selectAnnotation(data){self.options.selected=data.id;if(self.options.selected){setPosition(data['in']);} self.$annotationPanel.options({selected:self.options.selected});that.triggerEvent('select',{id:self.options.selected});} function setPosition(position,playing){var minute=Math.floor(position/60),previousMinute=Math.floor(self.options.position/60);self.options.position=position;!playing&&self.$player.options({position:self.options.position});self.$annotationPanel.options({position:self.options.position});if(!playing||minute!=previousMinute){that.triggerEvent('position',{position:!playing?self.options.position:minute*60});}} function toggleAnnotations(data){self.options.showAnnotations=!data.collapsed;self.$player.options({width:getPlayerWidth()});that.triggerEvent('toggleannotations',{showAnnotations:self.options.showAnnotations});} function toggleMuted(){self.$player.toggleMuted();} function togglePaused(){self.$player.togglePaused();self.$player.options('paused')&&that.triggerEvent('position',{position:self.$player.options('position')});} that.toggleAnnotations=function(){self.$panel.toggleElement(1);};return that;};'use strict';Ox.VideoTimelinePlayer=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({audioTrack:'',censored:[],censoredIcon:'',censoredTooltip:'',cuts:[],duration:0,find:'',followPlayer:false,getFrameURL:null,getLargeTimelineURL:null,height:0,'in':0,matches:[],muted:false,out:0,paused:false,playbackRate:1,position:0,showMilliseconds:false,smallTimelineURL:'',subtitles:[],timeline:'',timelines:[],video:'',videoRatio:1,volume:1,width:0}).options(options||{}).update({height:setHeight,paused:function(){self.options.paused=!self.options.paused;togglePaused();},playbackRate:function(){self.$video.options({playbackRate:self.options.playbackRate});},position:setPosition,timeline:function(){self.$menuButton.checkItem('timelines_'+self.options.timeline);updateTimeline();},volume:function(){self.$video.options({volume:self.options.volume});},width:setWidth});self.fps=25;self.frame=self.options.position*self.fps;self.frames=self.options.duration*self.fps;self.tileWidth=1500;self.tileHeight=64;self.margin=8;self.contentWidth=self.options.width-2*self.margin;self.contentHeight=self.options.height-32;self.positionWidth=48 +!!self.options.showMilliseconds*2 +self.options.showMilliseconds*6;self.tiles=Math.ceil(self.frames/self.tileWidth);self.videoWidth=Math.round(self.tileHeight*self.options.videoRatio);self.lines=getLines();self.videoLines=getVideoLines();if(Ox.isObject(self.options.video[0])){self.audioTracks=Ox.sort(Ox.unique(self.options.video.map(function(video){return video.track;}))).map(function(track){return{id:track,title:Ox._(track),checked:self.options.audioTrack==track};});} self.$menubar=Ox.Bar({size:16});self.$menuButton=Ox.MenuButton({items:[].concat(self.audioTracks.length>1?[{id:'audioTracks',title:Ox._('Audio'),items:[{group:'audioTrack',min:1,max:1,items:self.audioTracks}]}]:[],[{id:'timelines',title:Ox._('Timeline'),items:[{group:'timeline',min:1,max:1,items:Ox.map(self.options.timelines,function(timeline){return Ox.extend({checked:timeline.id==self.options.timeline},timeline);})}]},{},{id:'followPlayer',title:'Follow Player While Playing',checked:self.options.followPlayer}]),style:'square',title:'set',tooltip:Ox._('Options'),type:'image'}).css({float:'left'}).bindEvent({change:function(data){var id=data.id;if(id=='audioTrack'){self.options.audioTrack=data.checked[0].id;self.$video.options({audioTrack:self.options.audioTrack});}else if(id=='timeline'){self.options.timeline=data.checked[0].id;updateTimeline();that.triggerEvent('timeline',{timeline:self.options.timeline});}else if(id=='followPlayer'){self.options.followPlayer=data.checked;if(!self.options.paused&&self.options.followPlayer){self.scrollTimeout&&clearTimeout(self.scrollTimeout);scrollToPosition();} that.triggerEvent('follow',{follow:self.options.followPlayer});}}}).appendTo(self.$menubar);self.$scrollButton=Ox.Button({style:'symbol',title:'arrowDown',tooltip:Ox._('Scroll to Player'),type:'image'}).css({float:'right'}).hide().bindEvent({click:function(){self.scrollTimeout&&clearTimeout(self.scrollTimeout);scrollToPosition();}}).appendTo(self.$menubar);self.$timelinePlayer=Ox.Element().addClass('OxMedia').css({overflowX:'hidden',overflowY:'auto'}).on({mousedown:mousedown,mouseleave:mouseleave,mousemove:mousemove,scroll:scroll}).bindEvent({mousedown:function(){this.gainFocus();},key_0:toggleMuted,key_down:function(){self.options.position+=self.contentWidth/self.fps;setPosition();},key_equal:function(){changeVolume(0.1);},key_enter:function(){scrollToPosition();},key_k:function togglePlaybackRate(){that.options({playbackRate:self.options.playbackRate==1?2:self.options.playbackRate==2?0.5:1});},key_left:function(){self.options.position-=self.videoWidth/self.fps;setPosition();},key_minus:function(){changeVolume(-0.1);},key_right:function(){self.options.position+=self.videoWidth/self.fps;setPosition();},key_shift_left:function(){self.options.position-=1/self.fps;setPosition();},key_shift_right:function(){self.options.position+=1/self.fps;setPosition();},key_space:function(){togglePaused()},key_up:function(){self.options.position-=self.contentWidth/self.fps;setPosition();},touchend:function(e){mousedown(e);mouseleave();},touchmove:mousedown,touchstart:mousedown});self.$playerbar=Ox.Bar({size:16});self.$playButton=Ox.Button({style:'symbol',title:'play',tooltip:Ox._('Play'),type:'image'}).css({float:'left'}).bindEvent({click:function(){togglePaused();}}).appendTo(self.$playerbar);self.$muteButton=Ox.Button({style:'symbol',title:self.options.muted?'unmute':'mute',tooltip:self.options.muted?Ox._('Unmute'):Ox._('Mute'),type:'image'}).css({float:'left'}).bindEvent({click:toggleMuted}).appendTo(self.$playerbar);self.$smallTimeline=getSmallTimeline().appendTo(self.$playerbar);self.$position=Ox.Element().addClass('OxPosition').css({width:self.positionWidth-4+'px'}).html(formatPosition()).on({click:function(){if(!self.options.paused){self.playOnSubmit=true;togglePaused();} self.$position.hide();self.$positionInput.value(formatPosition()).show().focusInput(false);}}).appendTo(self.$playerbar);self.$positionInput=Ox.Input({value:formatPosition(),width:self.positionWidth}).addClass('OxPositionInput').bindEvent({blur:submitPositionInput,submit:submitPositionInput}).appendTo(self.$playerbar);self.$positionInput.children('input').css({width:(self.positionWidth-6)+'px',fontSize:'9px'});self.$panel=Ox.SplitPanel({elements:[{element:self.$menubar,size:16},{element:self.$timelinePlayer},{element:self.$playerbar,size:16}],orientation:'vertical'}).addClass('OxVideoTimelinePlayer');that.setElement(self.$panel);self.$lines=[];self.$timelines=[];self.$timeline=renderTimeline();Ox.loop(self.lines,function(i){addLine(i);});Ox.last(self.$lines).css({height:self.tileHeight+1.5*self.margin+'px'});self.$frameBox=$('
').addClass('OxVideoBox').css({position:'absolute',right:0,top:self.margin/2-1+'px',width:self.videoWidth+'px',height:self.tileHeight+'px'}).appendTo(self.$timelines[self.videoLines[1]][0]);self.$frame=Ox.VideoPlayer({audioTrack:self.options.audioTrack,censored:self.options.censored,censoredIcon:self.options.censoredIcon,censoredTooltip:self.options.censoredTooltip,duration:self.options.duration,height:self.tileHeight,position:self.options.position,scaleToFill:true,type:'in',video:self.options.getFrameURL,width:self.videoWidth}).bindEvent({censored:function(){that.triggerEvent('censored');}}).appendTo(self.$frameBox);$('
').addClass('OxFrameInterface').css({position:'absolute',left:0,top:0,width:self.videoWidth+'px',height:self.tileHeight+'px'}).appendTo(self.$frameBox);self.$videoBox=$('
').addClass('OxVideoBox').css({position:'absolute',right:0,top:self.margin/2-1+'px',width:self.videoWidth+'px',height:self.tileHeight+'px',zIndex:5}).appendTo(self.$timelines[self.videoLines[0]][0]);self.$video=Ox.VideoPlayer({audioTrack:self.options.audioTrack,censored:self.options.censored,censoredIcon:self.options.censoredIcon,censoredTooltip:self.options.censoredTooltip,duration:self.options.duration,height:self.tileHeight,muted:self.options.muted,paused:self.options.paused,playbackRate:self.options.playbackRate,position:self.options.position,scaleToFill:true,video:self.options.video,width:self.videoWidth}).bindEvent({censored:function(){that.triggerEvent('censored');},ended:function(){togglePaused(true);},playing:function(data){self.options.position=data.position;setPosition(true);}}).appendTo(self.$videoBox);$('
').addClass('OxFrameInterface OxVideoInterface').css({position:'absolute',left:0,top:0,width:self.videoWidth+'px',height:self.tileHeight+'px'}).appendTo(self.$videoBox);self.$tooltip=Ox.Tooltip({animate:false}).css({textAlign:'center'});setTimeout(function(){scrollToPosition();});function addLine(i){self.$lines[i]=$('
').css({position:'absolute',left:self.margin+'px',top:self.margin/2+i*(self.tileHeight+self.margin)+'px',width:self.contentWidth+'px',height:self.tileHeight+self.margin+'px',overflowX:'hidden'}).appendTo(self.$timelinePlayer);self.$timelines[i]=[self.$timeline.clone(true).css({width:self.frame+self.videoWidth+'px',marginLeft:-i*self.contentWidth+'px'}),self.$timeline.clone(true).css({marginLeft:-i*self.contentWidth+self.videoWidth-1+'px'})];self.$lines[i].append(self.$timelines[i][1]).append(self.$timelines[i][0]);} function changeVolume(num){self.options.volume=Ox.limit(self.options.volume+num,0,1);setVolume();} function formatPosition(position){position=Ox.isUndefined(position)?self.options.position:position;return Ox.formatDuration(position,self.options.showMilliseconds);} function getLines(scrollbarIsVisible){var lines;if(scrollbarIsVisible){self.contentWidth-=Ox.UI.SCROLLBAR_SIZE;} lines=Math.ceil((self.frames-1+self.videoWidth)/self.contentWidth);return!scrollbarIsVisible&&lines*(self.tileHeight+self.margin)+self.margin>self.contentHeight?getLines(true):lines;} function getPosition(e){return(e.offsetX?e.offsetX:e.clientX-$(e.target).offset().left)/self.fps;} function getPositionScrollTop(){var scrollTop=self.$timelinePlayer.scrollTop(),videoTop=[self.margin+Ox.min(self.videoLines)*(self.tileHeight+self.margin),self.margin+Ox.max(self.videoLines)*(self.tileHeight+self.margin)],offset=self.contentHeight-self.tileHeight-self.margin;return videoTop[0]scrollTop+offset?videoTop[1]-offset:null;} function getSmallTimeline(){var $timeline=Ox.SmallVideoTimeline({duration:self.options.duration,imageURL:self.options.smallTimelineURL,mode:'player',paused:self.options.paused,position:self.options.position,showMilliseconds:self.options.showMilliseconds,width:getSmallTimelineWidth()}).css({float:'left'}).css({background:'-moz-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(64, 64, 64, 0.5))'}).css({background:'-o-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(64, 64, 64, 0.5))'}).css({background:'-webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(64, 64, 64, 0.5))'}).bindEvent({position:function(data){self.options.position=data.position;setPosition();that.triggerEvent('position',{position:self.options.position});}});$timeline.children().css({marginLeft:'32px'});$timeline.find('.OxInterface').css({marginLeft:'32px'});return $timeline;} function getSmallTimelineWidth(){return self.options.width-32-self.positionWidth;} function getSubtitle(position){var subtitle='';Ox.forEach(self.options.subtitles,function(v){if(v['in']<=position&&v.out>position){subtitle=v;return false;}});return subtitle;} function getVideoLine(){self.videoLine=Math.floor(getVideoFrame()/self.contentWidth);} function getVideoLines(){var videoFrame=getVideoFrame(),videoLeft=videoFrame%self.contentWidth,lines=[];lines[0]=Math.floor(videoFrame/self.contentWidth);lines[1]=lines[0]+(videoLeft+self.videoWidth>self.contentWidth?1:0) if(videoLeft+Math.floor(self.videoWidth/2)>self.contentWidth){lines.reverse();} return lines;} function getVideoFrame(){return Math.floor(self.options.position*self.fps);} function mousedown(e){var $target=$(e.target),isTimeline=$target.is('.OxTimelineInterface'),isVideo=$target.is('.OxFrameInterface');if(isTimeline){self.options.position=getPosition(e);setPosition();if(!self.triggered){that.triggerEvent('position',{position:self.options.position});self.triggered=true;setTimeout(function(){self.triggered=false;},250);}}else if(isVideo){togglePaused();}} function mouseleave(){self.$tooltip.hide();} function mousemove(e){var $target=$(e.target),isTimeline=$target.is('.OxTimelineInterface'),isVideo=$target.is('.OxFrameInterface'),position,subtitle;if(isTimeline||isVideo){position=isTimeline?getPosition(e):self.options.position;subtitle=getSubtitle(position);self.$tooltip.options({title:(subtitle?''+Ox.highlight(subtitle.text,self.options.find,'OxHighlight').replace(/\n/g,'
')+'

':'')+Ox.formatDuration(position,3)}).show(e.clientX,e.clientY);}else{self.$tooltip.hide();}} function renderTimeline(){var $timeline=$('
').css({position:'absolute',width:self.frames+'px',height:self.tileHeight+self.margin+'px',overflow:'hidden'});Ox.loop(self.tiles,function(i){$('').attr({src:self.options.getLargeTimelineURL(self.options.timeline,i)}).css({position:'absolute',left:i*self.tileWidth+'px',top:self.margin/2+'px'}).data({index:i}).appendTo($timeline);});$('
').addClass('OxTimelineInterface').css({position:'absolute',left:0,top:self.margin/2+'px',width:self.frames+'px',height:self.tileHeight+'px'}).appendTo($timeline);return $timeline;} function scroll(){updateScrollButton();if(!self.options.paused&&self.options.followPlayer){self.scrollTimeout&&clearTimeout(self.scrollTimeout);self.scrollTimeout=setTimeout(function(){scrollToPosition();self.scrollTimeout=0;},2500);}} function scrollToPosition(){var positionScrollTop=getPositionScrollTop();positionScrollTop&&self.$timelinePlayer.stop().animate({scrollTop:positionScrollTop},250,function(){self.$scrollButton.hide();});} function setHeight(){self.contentHeight=self.options.height-32;if(!self.options.paused&&self.options.followPlayer){self.scrollTimeout&&clearTimeout(self.scrollTimeout);scrollToPosition();}} function setPosition(fromVideo){var isPlaying=!self.options.paused,max,min,videoLines,videoLines_;self.options.position=Ox.limit(self.options.position,0,self.options.duration);self.frame=Math.floor(self.options.position*self.fps);videoLines=getVideoLines();videoLines_=Ox.flatten([self.videoLines,videoLines]);min=Ox.min(videoLines_);max=Ox.max(videoLines_);Ox.loop(min,max+1,function(i){self.$timelines[i][0].css({width:self.frame+self.videoWidth+'px'});});if(videoLines[1]!=self.videoLines[1]){self.$frameBox.detach().appendTo(self.$timelines[videoLines[1]][0]);} if(videoLines[0]!=self.videoLines[0]){isPlaying&&self.$video.togglePaused();self.$videoBox.detach().appendTo(self.$timelines[videoLines[0]][0]);isPlaying&&self.$video.togglePaused();} if(videoLines[0]!=videoLines[1]){self.$frame.options({position:self.paused?self.options.position:Math.floor(self.options.position)});} if(fromVideo&&!self.scrollTimeout&&videoLines[1]!=self.videoLines[1]&&videoLines[1]>videoLines[0]){self.videoLines=videoLines;self.options.followPlayer?scrollToPosition():updateScrollButton();}else{self.videoLines=videoLines;} if(!fromVideo){self.$video.options({position:self.options.position});self.$frame.options({position:self.options.position});scrollToPosition();} self.$smallTimeline.options({position:self.options.position});self.$position.html(formatPosition());that.triggerEvent(fromVideo?'playing':'position',{position:self.options.position});} function setSubtitles(){self.$timeline.find('.OxSubtitle').remove();self.$subtitles=[];self.options.subtitles.forEach(function(subtitle,i){var found=self.options.find&&subtitle.text.toLowerCase().indexOf(self.options.find.toLowerCase())>-1;self.$subtitles[i]=$('
').addClass('OxSubtitle'+(found?' OxHighlight':'')).css({position:'absolute',left:(subtitle['in']*self.fps)+'px',width:(((subtitle.out-subtitle['in'])*self.fps)-2)+'px'}).html(Ox.highlight(subtitle.text,self.options.find,'OxHighlight')).appendTo(self.$timeline);});} function setTimeline(){self.$timelinePlayer.empty();} function setVolume(){self.$video.options({volume:self.options.volume});that.triggerEvent('volume',{volume:self.options.volume});} function setWidth(){self.contentWidth=self.options.width-2*self.margin;self.lines=getLines();Ox.loop(self.lines,function(i){if(self.$lines[i]){self.$lines[i].css({width:self.contentWidth+'px'});self.$timelines[i][0].css({marginLeft:-i*self.contentWidth+'px'});self.$timelines[i][1].css({marginLeft:-i*self.contentWidth+self.videoWidth-1+'px'});}else{addLine(i);}});while(self.$lines.length>self.lines){self.$lines[self.$lines.length-1].remove();self.$lines.pop();self.$timelines.pop();} Ox.last(self.$lines).css({height:self.tileHeight+1.5*self.margin+'px'});if(!self.options.paused&&self.options.followPlayer){self.scrollTimeout&&clearTimeout(self.scrollTimeout);scrollToPosition();} self.$smallTimeline.options({width:getSmallTimelineWidth()})} function submitPositionInput(){self.$positionInput.hide();self.$position.html('').show();self.options.position=Ox.parseDuration(self.$positionInput.value());setPosition();if(self.playOnSubmit){togglePaused();self.playOnSubmit=false;} that.triggerEvent('position',{position:self.options.position});} function toggleMuted(){self.options.muted=!self.options.muted;self.$video.options({muted:self.options.muted});self.$muteButton.options({title:self.options.muted?'unmute':'mute',tooltip:self.options.muted?Ox._('Unmute'):Ox._('Mute')});that.triggerEvent('muted',{muted:self.options.muted});} function togglePaused(fromVideo){self.options.paused=!self.options.paused;if(!self.options.paused&&self.options.followPlayer){self.scrollTimeout&&clearTimeout(self.scrollTimeout);scrollToPosition();} !fromVideo&&self.$video.options({paused:self.options.paused});self.$playButton.options({title:self.options.paused?'play':'pause'});} function updateScrollButton(){var scrollTop=self.$timelinePlayer.scrollTop(),positionScrollTop=getPositionScrollTop();if(positionScrollTop===null){self.$scrollButton.hide();}else{self.$scrollButton.options({title:positionScrollTop-1?self.options.items[self.selected].id:'';} function getSelectedPosition(){return Ox.getIndexById(self.options.items,self.options.selected);} function renderItems(blur){if(self.editing){self.options.items[getSelectedPosition()].value=that.find(self.options.type+':visible').val();} that.empty();if(self.options.items.length==0){self.$items=[Ox.Editable({editable:false,placeholder:self.options.placeholder,type:self.options.type,value:''}).appendTo(that)];}else{sortItems();if(self.options.highlightGroup){var selectedItem=Ox.getObjectById(self.options.items,self.options.selected)||{};} self.$items=self.options.items.map(function appendItem(item,i){if(i&&self.options.type=='input'){$('').addClass('OxSeparator').html(self.options.separator+' ').appendTo(that);} return Ox.Editable({autocomplete:self.options.autocomplete,autocompleteReplace:self.options.autocompleteReplace,autocompleteReplaceCorrect:self.options.autocompleteReplaceCorrect,autocompleteSelect:self.options.autocompleteSelect,autocompleteSelectHighlight:self.options.autocompleteSelectHighlight,autocompleteSelectMaxWidth:self.options.autocompleteSelectMaxWidth,autocompleteSelectOffset:self.options.autocompleteSelectOffset,autocompleteSelectSubmit:self.options.autocompleteSelectSubmit,autocompleteSelectUpdate:self.options.autocompleteSelectUpdate,blurred:self.editing&&i==self.selected?blur:false,clickLink:self.options.clickLink,editable:self.options.editable&&item.editable,editing:self.editing&&i==self.selected,format:self.options.format,globalAttributes:self.options.globalAttributes,highlight:self.options.highlight,maxHeight:self.options.maxHeight,submitOnBlur:self.options.submitOnBlur,type:self.options.type,unformat:self.options.unformat,value:item.value,width:self.options.type=='input'?0:self.options.width-9}).addClass(item.id==self.options.selected?'OxSelected':'').addClass(self.options.highlightGroup&&item.group==selectedItem.group?'OxGroup':'').data({id:item.id,position:i}).bindEvent({blur:function(data){that.gainFocus();that.triggerEvent('blur',{id:item.id,value:data.value});self.blurred=true;setTimeout(function(){self.blurred=false;},250);},cancel:function(data){var id=$(this).data('id');self.editing=false;that.gainFocus();data.value===''?submitItem(id,''):that.triggerEvent('blur',data);},change:function(data){that.triggerEvent('change',{id:item.id,value:data.value});},edit:function(){if(item.id!=self.options.selected){selectItem(item.id);} self.editing=true;that.$tooltip&&that.$tooltip.options({title:''});that.triggerEvent('edit');},insert:function(data){that.triggerEvent('insert',data);},open:function(data){that.triggerEvent('open');},submit:function(data){var id=$(this).data('id');self.editing=false;that.gainFocus();submitItem(id,data.value);}}).appendTo(that);});}} function selectFirst(){if(self.selected>-1){self.selected>0?selectItem(0):that.triggerEvent('selectprevious');}} function selectItem(idOrPosition){if(Ox.isString(idOrPosition)){self.options.selected=idOrPosition;self.selected=getSelectedPosition();}else{self.selected=idOrPosition;self.options.selected=getSelectedId();} if(self.editing){self.editing=false;that.blurItem();} that.find('.OxSelected').removeClass('OxSelected');that.find('.OxGroup').removeClass('OxGroup') if(self.selected>-1){self.$items[self.selected].addClass('OxSelected');self.options.highlightGroup&&that.updateItemGroup()} triggerSelectEvent();} function selectLast(){if(self.selected>-1){self.selected-1){self.selected-1){self.selected>0?selectItem(self.selected-1):that.triggerEvent('selectprevious');}} function singleclick(e){var $target=$(e.target),$element=$target.is('.OxEditableElement')?$target:$target.parents('.OxEditableElement'),position;if(!$target.is('.OxInput')){if($element.length){position=$element.data('position');if(position!=self.selected){selectItem(position);}else if(e.metaKey){selectNone();}}else if(!self.blurred){if(self.editing){that.blurItem();}else{if(self.selected>-1){selectNone();}else{that.triggerEvent('selectnone');}}} that.gainFocus();}} function sortItems(){if(!Ox.isEmpty(self.options.sort)){self.options.items=Ox.sortBy(self.options.items,self.options.sort,self.options.getSortValue?{value:self.options.getSortValue}:{});self.selected=getSelectedPosition();}} function submitItem(id,value){var item=Ox.getObjectById(self.options.items,id);Ox.Log('AE','submitItem',id,item) if(value===''){deleteItem(item.id);}else{that.triggerEvent(item.value===value?'blur':'submit',{id:item.id,value:value});item.value=value;}} function tooltip(e){var $target=$(e.target),$element=$target.closest('.OxEditableElement'),position=$element.data('position'),item=self.options.items[position],isLink=$target.closest('a').length,click=isLink?'Shift-click':'Click',doubleclick=isLink?'shift-doubleclick':'doubleclick';return item===undefined||self.editing?'':(self.options.tooltipText?self.options.tooltipText(item)+'
':'')+(self.options.editable?Ox._(click+' to select')+(item.editable?Ox._(', '+doubleclick+' to edit'):''):'');} var triggerSelectEvent=Ox.debounce(function(){that.triggerEvent('select',{id:self.options.selected});},true);that.addItem=function(position,item){if(self.options.editable){self.options.items.splice(position,0,item);renderItems();} return that;};that.blurItem=function(){self.editing=false;self.$items.forEach(function($item){$item.options({editing:false});});return that;};that.editItem=function(){Ox.Log('AE','EDIT ITEM',self.options.editable,self.options.selected);if(self.options.editable&&self.options.selected){self.editing=true;self.$items[self.selected].options({editing:true});that.$tooltip&&that.$tooltip.options({title:''});}else if(!self.options.editable){that.triggerEvent('open');} return that;};that.reloadItems=function(){renderItems();return that;};that.removeItem=function(){if(self.options.editable&&self.options.selected){deleteItem();} return that;};that.updateItem=function(value){if(self.options.selected){self.$items[self.selected].options({value:value});}};that.updateItemGroup=function(){var group=self.selected>-1?self.options.items[self.selected].group:'';self.$items.forEach(function($item,index){$item[self.options.highlightGroup&&group&&self.options.items[index].group==group?'addClass':'removeClass']('OxGroup');});} return that;};'use strict';Ox.ArrayInput=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({input:{get:Ox.Input,getEmpty:function(){return'';},isEmpty:function(value){return value==='';},setWidth:function($input,width){$input.options({width:width});}},label:'',max:0,sort:false,value:[],width:256}).options(options||{}).update({value:setValue,width:setWidths});self.options.value=self.options.value||[];if(self.options.label){self.$label=Ox.Label({title:self.options.label,width:self.options.width}).appendTo(that);} self.$element=[];self.$input=[];self.$removeButton=[];self.$addButton=[];(self.options.value.length?self.options.value:[self.options.input.getEmpty()]).forEach(function(value,i){addInput(i,value);});self.options.value=getValue();function addInput(index,value,focus){self.$element.splice(index,0,Ox.Element().css({height:'16px',marginTop:self.options.label||index>0?'8px':0}).data({index:index}));if(index==0){self.$element[index].appendTo(that);}else{self.$element[index].insertAfter(self.$element[index-1]);} self.$input.splice(index,0,self.options.input.get({width:self.options.width-48}).css({float:'left'}).bindEvent({change:function(data){if(self.options.sort&&!self.options.input.isEmpty(data.value)){sortInputs();} self.options.value=getValue();that.triggerEvent('change',{value:self.options.value});}}).appendTo(self.$element[index]));if(value){self.$input[index].options({value:value})} if(focus&&self.$input[index].focusInput){self.$input[index].focusInput(true);} self.$removeButton.splice(index,0,Ox.Button({title:self.$input.length==1?'close':'remove',type:'image'}).css({float:'left',marginLeft:'8px'}).on({click:function(){var index=$(this).parent().data('index');if(!self.options.input.isEmpty(self.$input[index])){self.$input[index].value(self.options.input.getEmpty());self.options.value=getValue();that.triggerEvent('change',{value:self.options.value});} if(self.$input.length==1){if(self.$input[0].focusInput){self.$input[0].focusInput(true);}}else{removeInput(index);that.triggerEvent('remove');}}}).appendTo(self.$element[index]));self.$addButton.splice(index,0,Ox.Button({disabled:index==self.options.max-1,title:'add',type:'image'}).css({float:'left',marginLeft:'8px'}).on({click:function(){var index=$(this).parent().data('index');addInput(index+1,self.options.input.getEmpty(),true);that.triggerEvent('add');}}).appendTo(self.$element[index]));updateInputs();} function getValue(){return Ox.map(self.$input,function($input){return $input.value();}).filter(function(value){return!self.options.input.isEmpty(value);});};function removeInput(index){Ox.Log('Form','remove',index);['input','removeButton','addButton','element'].forEach(function(element){var key='$'+element;self[key][index].remove();self[key].splice(index,1);});updateInputs();} function setValue(){while(self.$input.length){removeInput(0);} (self.options.value.length?self.options.value:[self.options.input.getEmpty()]).forEach(function(value,i){addInput(i,value);});} function setWidths(){self.$label&&self.$label.options({width:self.options.width});self.$element.forEach(function($element,i){$element.css({width:self.options.width+'px'});self.options.input.setWidth(self.$input[i],self.options.width-48);});} function sortInputs(){Ox.sort(self.$element,function($element){return self.$input[$element.data('index')].value();}).forEach(function($element){$element.detach();});self.$element.forEach(function($element,i){$element.data({index:i}).appendTo(that);});} function updateInputs(){self.$element.forEach(function($element,i){$element.data({index:i});self.$removeButton[i].options({title:self.$element.length==1?'close':'remove'});self.$addButton[i].options({disabled:self.$element.length==self.options.max});});} that.setErrors=function(values){self.$input.forEach(function($input){$input[values.indexOf($input.value())>-1?'addClass':'removeClass']('OxError');});};return that;};'use strict';Ox.Button=function(options,self){self=self||{};var that=Ox.Element('',self).defaults({disabled:false,group:false,id:'',overlap:'none',selectable:false,size:'medium',style:'default',title:'',tooltip:'',type:'text',value:void 0,values:[],width:'auto'}).options(Ox.isArray(options.tooltip)?Ox.extend(Ox.clone(options),{tooltip:options.tooltip[0]}):options||{}).update({disabled:setDisabled,tooltip:function(){if(Ox.isArray(self.options.tooltip)&&that.$tooltip){that.$tooltip.options({title:self.options.tooltip[self.value]});}},title:setTitle,value:function(){setValue();setTitle();self.options.selectable&&setSelected();},values:function(){setValue();setTitle();},width:function(){that.css({width:(self.options.width-14)+'px'});}}).addClass('OxButton Ox'+Ox.toTitleCase(self.options.size) +(self.options.disabled?' OxDisabled':'') +(self.options.selectable&&self.options.value?' OxSelected':'') +(self.options.style!='default'?' Ox'+Ox.toTitleCase(self.options.style):'') +(self.options.overlap!='none'?' OxOverlap'+Ox.toTitleCase(self.options.overlap):'')).attr({disabled:self.options.disabled,type:self.options.type=='text'?'button':'image'}).css(self.options.width=='auto'?{}:{width:(self.options.width-14)+'px'}).on({click:click,mousedown:mousedown});if(self.options.values.length){self.options.values=self.options.values.map(function(value){return{id:value.id||value,title:value.title||value};});self.value=Ox.getIndexById(self.options.values,self.options.value);if(self.value==-1){self.value=0;self.options.value=self.options.values[0].id;} self.options.title=self.options.values[self.value].title;}else if(self.options.selectable){self.options.value=self.options.value||false;} setValue();setTitle();if(Ox.isArray(options.tooltip)){self.options.tooltip=options.tooltip;if(!that.$tooltip){that.$tooltip=Ox.Tooltip();} that.$tooltip.options({title:self.options.tooltip[self.value]});} function click(){if(!self.options.disabled){that.$tooltip&&that.$tooltip.hide();that.triggerEvent('click');if(self.options.values.length||self.options.selectable){that.toggle();that.triggerEvent('change',{value:self.options.value});}}} function mousedown(e){if(self.options.type=='image'&&$.browser.safari){e.preventDefault();}} function setDisabled(){that.attr({disabled:self.options.disabled});that[self.options.disabled?'addClass':'removeClass']('OxDisabled');self.options.disabled&&that.$tooltip&&that.$tooltip.hide();self.options.type=='image'&&setTitle();} function setSelected(){that[self.options.value?'addClass':'removeClass']('OxSelected');self.options.type=='image'&&setTitle();} function setTitle(){if(self.options.type=='image'){that.attr({src:Ox.UI.getImageURL('symbol'+self.options.title[0].toUpperCase() +self.options.title.slice(1),self.options.style=='overlay'?'overlay'+(self.options.disabled?'Disabled':self.options.selectable&&self.options.value?'Selected':''):self.options.style=='video'?'video':self.options.disabled?'disabled':self.options.selectable&&self.options.value?'selected':'')});}else{that.val(self.options.title);}} function setValue(){if(self.options.values.length){self.options.values=self.options.values.map(function(value){return{id:value.id||value,title:value.title||value};});self.value=Ox.getIndexById(self.options.values,self.options.value);if(self.value==-1){self.value=0;self.options.value=self.options.values[0].id;} self.options.title=self.options.values[self.value].title;}else if(self.options.selectable){self.options.value=self.options.value||false;}} that.toggle=function(){if(self.options.values.length>1){self.value=1-Ox.getIndexById(self.options.values,self.options.value);self.options.title=self.options.values[self.value].title;self.options.value=self.options.values[self.value].id;setTitle();that.$tooltip&&that.$tooltip.options({title:self.options.tooltip[self.value]});}else{self.options.value=!self.options.value;} self.options.selectable&&setSelected();return that;} return that;};'use strict';Ox.ButtonGroup=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({buttons:[],max:1,min:1,overlap:'none',selectable:false,size:'medium',style:'default',type:'text',value:options.max!=1?[]:''}).options(options||{}).update({value:function(){var position=Ox.getIndexById(self.options.buttons,self.options.value);if(position>-1){self.$buttons[position].trigger('click');}else if(self.options.min==0){self.$buttons.forEach(function($button,i){$button.options('value')&&$button.trigger('click');});}}}).addClass('OxButtonGroup' +(self.options.style!='default'?' Ox'+Ox.toTitleCase(self.options.style):'') +(self.options.overlap!='none'?' OxOverlap'+Ox.toTitleCase(self.options.overlap):''));self.options.buttons=self.options.buttons.map(function(button,i){return Ox.extend({disabled:button.disabled,id:button.id||button,overlap:self.options.overlap=='left'&&i==0?'left':self.options.overlap=='right'&&i==self.options.buttons.length-1?'right':'none',style:self.options.style,title:button.title||button,tooltip:button.tooltip,width:button.width},self.options.selectable?{selected:Ox.makeArray(self.options.value).indexOf(button.id||button)>-1}:{});});if(self.options.selectable){self.optionGroup=new Ox.OptionGroup(self.options.buttons,self.options.min,self.options.max,'selected');self.options.buttons=self.optionGroup.init();self.options.value=self.optionGroup.value();} self.$buttons=[];self.options.buttons.forEach(function(button,pos){self.$buttons[pos]=Ox.Button({disabled:button.disabled||false,group:true,id:button.id,overlap:button.overlap,selectable:self.options.selectable,size:self.options.size,style:self.options.style=='squared'?'default':self.options.style,title:button.title,tooltip:button.tooltip,type:self.options.type,value:button.selected||false,width:button.width}).bindEvent(self.options.selectable?{change:function(){toggleButton(pos);}}:{click:function(){that.triggerEvent('click',{id:button.id});}}).appendTo(that);});function getButtonById(id){return self.$buttons[Ox.getIndexById(self.options.buttons,id)];} function toggleButton(pos){var toggled=self.optionGroup.toggle(pos);if(!toggled.length){self.$buttons[pos].value(!self.$buttons[pos].value());}else{toggled.forEach(function(i){i!=pos&&self.$buttons[i].value(!self.$buttons[i].value());});self.options.value=self.optionGroup.value();that.triggerEvent('change',{title:self.options.value===''?'':Ox.isString(self.options.value)?Ox.getObjectById(self.options.buttons,self.options.value).title:self.options.value.map(function(value){return Ox.getObjectById(self.options.buttons,value).title;}),value:self.options.value});}} that.disableButton=function(id){getButtonById(id).options({disabled:true});};that.enableButton=function(id){getButtonById(id).options({disabled:false});};that.buttonOptions=function(id,options){return getButtonById(id).options(options);};return that;};'use strict';Ox.Checkbox=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({disabled:false,group:false,indeterminate:false,label:'',labelWidth:64,overlap:'none',style:'rounded',title:'',value:false,width:options&&(options.label||options.title)?'auto':16}).options(options||{}).update({disabled:function(){var disabled=self.options.disabled;that.attr({disabled:disabled});self.$button.options({disabled:disabled});self.$title&&self.$title.options({disabled:disabled});},indeterminate:function(){if(self.options.indeterminate){self.$button.options({values:['remove']});self.$button.options({value:'remove'});}else{self.$button.options({values:['none','check']});self.$button.options({value:self.options.value?'check':'none'});}},label:function(){self.$label.options({title:self.options.label});},title:function(){self.$title.options({title:self.options.title});},value:function(){self.$button.toggle();},width:function(){that.css({width:self.options.width+'px'});self.$title&&self.$title.options({width:getTitleWidth()});}}).addClass('OxCheckbox'+(self.options.overlap=='none'?'':' OxOverlap'+Ox.toTitleCase(self.options.overlap))).attr({disabled:self.options.disabled}).css(self.options.width!='auto'?{width:self.options.width}:{});if(self.options.title){self.options.width!='auto'&&that.css({width:self.options.width+'px'});self.$title=Ox.Label({disabled:self.options.disabled,id:self.options.id+'Label',overlap:'left',style:self.options.style,title:self.options.title,width:getTitleWidth()}).css({float:'right'}).on({click:clickTitle}).appendTo(that);} if(self.options.label){self.$label=Ox.Label({overlap:'right',textAlign:'right',title:self.options.label,width:self.options.labelWidth}).css({float:'left'}).appendTo(that);} self.$button=Ox.Button({disabled:self.options.disabled,id:self.options.id+'Button',style:self.options.style!='rounded'?self.options.style:'',type:'image',value:self.options.indeterminate?'remove':self.options.value?'check':'none',values:self.options.indeterminate?['remove']:['none','check']}).addClass('OxCheckbox').bindEvent({change:clickButton}).appendTo(that);function clickButton(){self.options.value=!self.options.value;if(self.options.indeterminate){self.options.indeterminate=false;self.$button.options({values:['none','check']});self.$button.options({value:self.options.value?'check':'none'});} that.triggerEvent('change',{value:self.options.value});} function clickTitle(){!self.options.disabled&&self.$button.trigger('click');} function getTitleWidth(){return self.options.width-16 -!!self.options.label*self.options.labelWidth;} return that;};'use strict';Ox.CheckboxGroup=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({checkboxes:[],max:1,min:1,type:'group',value:options.max!=1?[]:'',width:256}).options(options||{}).update({value:function(){var value=Ox.clone(self.options.value);self.$checkboxes.forEach(function($checkbox,index){var checked=Ox.contains(value,$checkbox.options('id'));if(checked!=$checkbox.value()){$checkbox.value(!$checkbox.value());toggleCheckbox(index);}});},width:function(){self.$checkboxes.forEach(function($checkbox){$checkbox.options({width:self.options.width});});}}).addClass('OxCheckboxGroup Ox'+Ox.toTitleCase(self.options.type));self.options.checkboxes=self.options.checkboxes.map(function(checkbox){return{checked:Ox.makeArray(self.options.value).indexOf(checkbox.id||checkbox)>-1,id:checkbox.id||checkbox,title:checkbox.title||checkbox};});self.optionGroup=new Ox.OptionGroup(self.options.checkboxes,self.options.min,self.options.max,'checked');self.options.checkboxes=self.optionGroup.init();self.options.value=self.optionGroup.value();self.$checkboxes=[];if(self.options.type=='group'){self.checkboxWidth=Ox.splitInt(self.options.width+(self.options.checkboxes.length-1)*6,self.options.checkboxes.length).map(function(v,i){return v+(i':'',tooltip:options.tooltip},self).defaults({blurred:false,clickLink:null,editable:true,editing:false,format:null,globalAttributes:[],height:0,highlight:null,maxHeight:void 0,placeholder:'',submitOnBlur:true,tags:null,tooltip:'',type:'input',unformat:null,value:'',width:0}).options(options||{}).update({editing:function(){if(self.options.editing){self.options.editing=false;edit();}else{submit();}},height:function(){setCSS({height:self.options.height+'px'});},width:function(){setCSS({width:self.options.width+'px'});},highlight:function(){formatValue();},placeholder:function(){formatValue();},value:function(){formatValue();self.$input&&self.$input.options({value:formatInputValue()});}}).addClass('OxEditableElement OxKeyboardFocus' +(self.options.editable?' OxEditable':'')).on({click:function(e){var $target=$(e.target);if(!e.shiftKey&&($target.is('a')||($target=$target.parents('a')).length)){e.preventDefault();if(self.options.clickLink){e.target=$target[0];self.options.clickLink(e);}else{document.location.href=$target.attr('href');}} return false;}}).bindEvent({doubleclick:edit,singleclick:function(e){}});self.options.value=self.options.value.toString();self.css={};self.$value=Ox.Element(self.options.type=='input'?'':'
').addClass('OxValue').appendTo(that);formatValue();if(self.options.editing){setTimeout(function(){self.options.editing=false;edit();});} function blur(data){self.options.value=parseValue();if(self.options.value!==self.originalValue){self.originalValue=self.options.value;that.triggerEvent('change',{value:self.options.value});} that.triggerEvent('blur',data);} function cancel(){self.options.editing=false;that.removeClass('OxEditing');self.options.value=self.originalValue;self.$input.value(formatInputValue()).hide();self.$test.html(formatTestValue());formatValue();self.$value.show();that.triggerEvent('cancel',{value:self.options.value});} function change(data){self.options.value=parseValue(data.value);formatValue();self.$test.html(formatTestValue());setSizes();} function edit(){var height,width;if(self.options.editable&&!self.options.editing){self.options.editing=true;that.addClass('OxEditing');self.originalValue=self.options.value;if(!self.$input){self.$input=Ox.Input({autocomplete:self.options.autocomplete,autocompleteReplace:self.options.autocompleteReplace,autocompleteReplaceCorrect:self.options.autocompleteReplaceCorrect,autocompleteSelect:self.options.autocompleteSelect,autocompleteSelectHighlight:self.options.autocompleteSelectHighlight,autocompleteSelectMaxWidth:self.options.autocompleteSelectMaxWidth,autocompleteSelectOffset:self.options.autocompleteSelectOffset,autocompleteSelectSubmit:self.options.autocompleteSelectSubmit,autocompleteSelectUpdate:self.options.autocompleteSelectUpdate,changeOnKeypress:true,element:self.options.type=='input'?'':'
',style:'square',type:self.options.type,value:formatInputValue()}).css(self.css).bindEvent({blur:self.options.submitOnBlur?submit:blur,cancel:cancel,change:change,insert:function(data){that.triggerEvent('insert',data);},submit:submit}).appendTo(that);self.$input.find('input').css(self.css);self.$test=self.$value.clone().css(Ox.extend({display:'inline-block'},self.css)).html(formatTestValue()).css({background:'rgb(192, 192, 192)'}).appendTo(that);} self.minWidth=8;self.maxWidth=that.parent().width();self.minHeight=13;self.maxHeight=self.options.type=='input'?self.minHeight:self.options.maxHeight||that.parent().height();setSizes();self.$value.hide();self.$input.show();if(!self.options.blurred){setTimeout(function(){self.$input.focusInput(self.options.type=='input');},0);that.$tooltip&&that.$tooltip.options({title:''});that.triggerEvent('edit');}}else if(!self.options.editable){that.triggerEvent('open');} self.options.blurred=false;} function formatInputValue(){return self.options.type=='input'?(self.options.unformat||Ox.decodeHTMLEntities)(self.options.value):self.options.value.replace(//g,'\n\n');} function formatTestValue(){var value=Ox.encodeHTMLEntities((self.options.unformat||Ox.identity)(self.$input.options('value')));return!value?' ':self.options.type=='input'?value.replace(/ /g,' '):value.replace(/\n$/,'\n ').replace(/ /g,'  ').replace(/(^ | $)/,' ').replace(/\n/g,'
')} function formatValue(){var value=self.options.value;that.removeClass('OxPlaceholder');if(self.options.value===''&&self.options.placeholder){value=self.options.placeholder;that.addClass('OxPlaceholder');}else if(self.options.format){value=self.options.format(self.options.value);} if(self.options.highlight){value=Ox.highlight(value,self.options.highlight,'OxHighlight',true);} self.$value.html(value);self.$value[self.options.value===''?'removeClass':'addClass']('OxSelectable');} function parseValue(){var value=Ox.clean(self.$input.value().replace(/\n\n+/g,'\0')).replace(/\0/g,'\n\n').trim();return(self.options.type=='input'?Ox.encodeHTMLEntities(value):Ox.sanitizeHTML(value,self.options.tags,self.options.globalAttributes));} function setCSS(css){self.$test&&self.$test.css(css);self.$input&&self.$input.css(css);self.$input&&self.$input.find(self.options.type).css(css);} function setSizes(){var height,width;self.$test.css({display:'inline-block'});height=self.options.height||Ox.limit(self.$test.height(),self.minHeight,self.maxHeight);width=self.$test.width();if(self.options.type=='textarea'){width+=Ox.UI.SCROLLBAR_SIZE;} width=self.options.width||Ox.limit(width,self.minWidth,self.maxWidth);self.$test.css({display:'none'});self.$input.options({width:width,height:height});self.$input.find(self.options.type).css({width:width+'px',height:height+'px'});} function submit(){self.options.editing=false;that.removeClass('OxEditing');self.$input.value(formatInputValue()).hide();self.$test.html(formatTestValue());formatValue();self.$value.show();that.$tooltip&&that.$tooltip.options({title:self.options.tooltip});that.triggerEvent('submit',{value:self.options.value});} that.css=function(css){self.css=css;that.$element.css(css);self.$value.css(css);self.$test&&self.$test.css(css);self.$input&&self.$input.css(css);return that;};return that;};Ox.EditableContent=function(options,self){self=self||{};if(options.tooltip){self.tooltip=options.tooltip;options.tooltip=function(e){return that.hasClass('OxEditing')?'':Ox.isString(self.tooltip)?self.tooltip:self.tooltip(e);}} var that=Ox.Element(options.type=='textarea'?'
':'',self).defaults({clickLink:null,collapseToEnd:true,editable:true,editing:false,format:null,globalAttributes:[],highlight:null,placeholder:'',submitOnBlur:true,tags:null,tooltip:'',type:'input',value:''}).options(options||{}).update({editing:function(){if(self.options.editing){self.options.editing=false;edit();}else{submit();}},placeholder:function(){!self.options.editing&&that.html(formatValue());},highlight:function(){!self.options.editing&&that.html(formatValue());},value:function(){!self.options.editing&&that.html(formatValue());}}).addClass('OxEditableContent OxKeyboardFocus').on({blur:self.options.submitOnBlur?submit:blur,click:function(e){var $target=$(e.target);if(!e.shiftKey&&($target.is('a')||($target=$target.parents('a')).length)){e.preventDefault();if(self.options.clickLink){e.target=$target[0];self.options.clickLink(e);}else{document.location.href=$target.attr('href');}} return false;},keydown:function(e){if(e.keyCode==13){if(e.shiftKey||self.options.type=='input'){submit();}else{var selection=window.getSelection(),node=selection.anchorNode,offset=selection.anchorOffset,range=document.createRange(),text=node.textContent;e.preventDefault();node.textContent=text.substr(0,offset) +'\n'+(text.substr(offset)||' ');range.setStart(node,offset+1);range.setEnd(node,offset+1);selection.removeAllRanges();selection.addRange(range);} return false;}else if(e.keyCode==27){cancel();return false;} setTimeout(function(){that.css({padding:that.text()?0:'0 2px'});});},paste:function(e){if(e.originalEvent.clipboardData&&e.originalEvent.clipboardData.getData){var value=e.originalEvent.clipboardData.getData('text/plain');value=Ox.encodeHTMLEntities(value).replace(/\n\n\n/g,'

\n');document.execCommand('insertHTML',false,value);e.originalEvent.stopPropagation();e.originalEvent.preventDefault();return false;}}}).bindEvent({doubleclick:edit});self.options.value=self.options.value.toString();that.html(formatValue());if(self.options.editing){setTimeout(function(){self.options.editing=false;edit();});} function blur(){} function cancel(){if(self.options.editing){that.loseFocus();self.options.editing=false;that.removeClass('OxEditing').attr({contenteditable:false}).html(formatValue());if(self.options.type=='input'){that.css({padding:0});} that.triggerEvent('cancel',{value:self.options.value});}} function edit(){if(self.options.editable&&!self.options.editing){var value=formatInputValue();that.$tooltip&&that.$tooltip.remove();that.addClass('OxEditing').removeClass('OxPlaceholder').attr({contenteditable:true});if(value){that.text(value);}else{that.text('');if(self.options.type=='input'){that.css({padding:'0 2px'});}} self.options.editing=true;that.gainFocus();setTimeout(updateSelection);that.triggerEvent('edit');}else if(!self.options.editable){that.triggerEvent('open');}} function formatInputValue(){return self.options.type=='input'?Ox.decodeHTMLEntities(self.options.value):self.options.value.replace(//g,'\n\n');} function formatValue(){var value=self.options.value;that.removeClass('OxPlaceholder');if(self.options.value===''&&self.options.placeholder){value=self.options.placeholder;that.addClass('OxPlaceholder');}else if(self.options.format){value=self.options.format(self.options.value);} if(self.options.highlight){value=Ox.highlight(value,self.options.highlight,'OxHighlight',true);} that[self.options.value===''?'removeClass':'addClass']('OxSelectable');return value;} function parseValue(){var value=Ox.clean(that.text().replace(/\n\n+/g,'\0')).replace(/\0/g,'\n\n').trim();return(self.options.type=='input'?Ox.encodeHTMLEntities(value):Ox.sanitizeHTML(value,self.options.tags,self.options.globalAttributes));} function submit(){if(self.options.editing){that.loseFocus();self.options.editing=false;self.options.value=parseValue();that.removeClass('OxEditing').attr({contenteditable:false}).html(formatValue());if(self.options.type=='input'){that.css({padding:0});} that.triggerEvent('submit',{value:self.options.value});}} function updateSelection(){var range=document.createRange(),selection=window.getSelection();that[0].focus();if(self.options.collapseToEnd){selection.removeAllRanges();range.selectNodeContents(that[0]);selection.addRange(range);} setTimeout(function(){selection.collapseToEnd();});} return that;};'use strict';Ox.FileButton=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({disabled:false,image:options&&options.maxFiles==1?'file':'files',maxFiles:-1,maxSize:-1,style:'default',title:'',type:'text',width:options.type=='image'?16:256}).options(options||{}).update({disabled:function(){self.$button.options({disabled:self.options.disabled});self.$input[self.options.disabled?'hide':'show']();},title:function(){self.$button.options({title:self.options.title});}}).addClass('OxFileButton').css({overflow:'hidden'});self.files=[];self.multiple=self.options.maxFiles!=1;self.$button=Ox.Button({disabled:self.options.disabled,style:self.options.style,title:self.options.type=='image'?self.options.image:self.options.title,type:self.options.type,width:self.options.type=='image'?'auto':self.options.width}).css({float:'left'}).appendTo(that);self.$input=renderInput();self.options.disabled&&self.$input.hide();function selectFiles(e){var filelist=e.target.files,files=[];self.files=[];Ox.loop(filelist.length,function(i){files.push(filelist.item(i));});files.sort(self.options.maxSize==-1?function(a,b){a=a.name.toLowerCase();b=b.name.toLowerCase();return ab?1:0;}:function(a,b){return a.size-b.size;}).forEach(function(file){if((self.options.maxFiles==-1||self.files.length').attr(Ox.extend({title:self.options.title,type:'file'},self.multiple?{multiple:true}:{})).css({float:'left',width:self.options.width+'px',height:'16px',marginLeft:-self.options.width+'px',opacity:0}).on({change:selectFiles}).appendTo(that);} that.blurButton=function(){self.$input.blur();};that.focusButton=function(){self.$input.focus();};return that;} 'use strict';Ox.FileInput=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({disabled:false,label:'',labelWidth:128,maxFiles:-1,maxLines:-1,maxSize:-1,value:[],width:256}).options(options||{}).update({disabled:function(){that[self.options.disabled?'addClass':'removeClass']('OxDisabled');self.$button.options({disabled:self.options.disabled});self.$input&&self.$input[self.options.disabled?'hide':'show']();},label:function(){self.$label&&self.$label.options({title:self.options.label});}}).addClass('OxFileInput'+(self.options.disabled?' OxDisabled':'')).css({width:self.options.width+'px'});self.multiple=self.options.maxFiles!=1;self.size=getSize();if(self.options.label){self.$label=Ox.Label({overlap:'right',textAlign:'right',title:self.options.label,width:self.options.labelWidth}).appendTo(that);} self.$bar=Ox.Bar({size:14}).css(Ox.extend({width:getWidth()-2+'px'},self.multiple&&self.options.value.length?{borderBottomLeftRadius:0,borderBottomRightRadius:0}:{})).appendTo(that);self.$title=$('
').css({float:'left',width:getWidth()-104+'px',paddingLeft:'6px',overflow:'hidden',textOverflow:'ellipsis'}).html(getTitleText()).appendTo(self.$bar);self.$size=$('
').css({float:'left',width:'64px',height:'14px',paddingRight:'16px',textAlign:'right'}).html(getSizeText()).appendTo(self.$bar);self.$button=Ox.Button({disabled:self.options.disabled,style:'symbol',title:self.multiple||self.options.value.length==0?'add':'close',type:'image'}).attr({title:self.multiple||self.options.value.length==0?'':'Clear'}).css({float:'left',marginTop:'-1px'}).bindEvent({click:clearFile}).appendTo(self.$bar);if(self.multiple||self.options.value.length==0){self.$input=renderInput();self.options.disabled&&self.$input.hide();} if(self.multiple){self.$files=$('
').addClass('OxFiles').css({width:getWidth()-2+'px',height:getHeight()}).appendTo(that);self.options.value.length==0&&self.$files.hide();self.$list=Ox.TableList({columns:[{id:'name',visible:true,width:getWidth()-94},{align:'right',format:function(value){return Ox.formatValue(value,'B');},id:'size',visible:true,width:64},{align:'right',format:function(value,data){return Ox.Button({style:'symbol',title:'close',type:'image'}).attr({title:Ox._('Remove File')}).css({margin:'-1px -4px 0 0'}).bindEvent({click:function(){self.$list.options({selected:[value]});removeFiles([value]);}});},id:'id',visible:true,width:28}],items:getItems(),sort:[{key:'name',operator:'+'}],unique:'id'}).css({left:0,top:0,width:getWidth()-2+'px',height:'64px'}).bindEvent({'delete':function(data){removeFiles(data.ids);}}).appendTo(self.$files);} function addFiles(e){var filelist=e.target.files,files=[];Ox.loop(filelist.length,function(i){files.push(filelist.item(i));});files.sort(self.options.maxSize==-1?function(a,b){a=a.name.toLowerCase();b=b.name.toLowerCase();return ab?1:0;}:function(a,b){return a.size-b.size;}).forEach(function(file){if(!exists(file)&&(self.options.maxFiles==-1||self.options.value.length').attr(Ox.extend({title:self.multiple?Ox._('Add Files'):Ox._('Select File'),type:'file'},self.multiple?{multiple:true}:{})).css({float:'left',width:'16px',height:'14px',margin:'-1px -7px 0 -16px',opacity:0}).on({change:addFiles}).appendTo(self.$bar);} that.clear=function(){clearFile();return that;};return that;};'use strict';Ox.Filter=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({findKeys:[],list:null,listName:Ox._('Smart List'),sortKeys:[],value:{conditions:[],operator:'&'},viewKeys:[]}).options(options||{}).update({value:function(){setValue();renderConditions();}});self.conditionOperators={boolean:[{id:'=',title:Ox._('is')},{id:'!=',title:Ox._('is not')}],date:[{id:'=',title:Ox._('is')},{id:'!=',title:Ox._('is not')},{id:'<',title:Ox._('is before')},{id:'!<',title:Ox._('is not before')},{id:'>',title:Ox._('is after')},{id:'!>',title:Ox._('is not after')},{id:'=,',title:Ox._('is between')},{id:'!=,',title:Ox._('is not between')}],'enum':[{id:'=',title:Ox._('is')},{id:'!=',title:Ox._('is not')},{id:'<',title:Ox._('is less than')},{id:'!<',title:Ox._('is not less than')},{id:'>',title:Ox._('is greater than')},{id:'!>',title:Ox._('is not greater than')},{id:'=,',title:Ox._('is between')},{id:'!=,',title:Ox._('is not between')}],item:[{id:'==',title:Ox._('is')},{id:'!==',title:Ox._('is not')}],list:[{id:'==',title:Ox._('is')},{id:'!==',title:Ox._('is not')}],number:[{id:'=',title:Ox._('is')},{id:'!=',title:Ox._('is not')},{id:'<',title:Ox._('is less than')},{id:'!<',title:Ox._('is not less than')},{id:'>',title:Ox._('is greater than')},{id:'!>',title:Ox._('is not greater than')},{id:'=,',title:Ox._('is between')},{id:'!=,',title:Ox._('is not between')}],place:[{id:'==',title:Ox._('is')},{id:'!==',title:Ox._('is not')},{id:'=',title:Ox._('contains')},{id:'!=',title:Ox._('does not contain')},{id:'^',title:Ox._('starts with')},{id:'!^',title:Ox._('does not start with')},{id:'$',title:Ox._('ends with')},{id:'!$',title:Ox._('does not end with')}],string:[{id:'==',title:Ox._('is')},{id:'!==',title:Ox._('is not')},{id:'=',title:Ox._('contains')},{id:'!=',title:Ox._('does not contain')},{id:'^',title:Ox._('starts with')},{id:'!^',title:Ox._('does not start with')},{id:'$',title:Ox._('ends with')},{id:'!$',title:Ox._('does not end with')}],text:[{id:'=',title:Ox._('contains')},{id:'!=',title:Ox._('does not contain')}],year:[{id:'==',title:Ox._('is')},{id:'!==',title:Ox._('is not')},{id:'<',title:Ox._('is before')},{id:'!<',title:Ox._('is not before')},{id:'>',title:Ox._('is after')},{id:'!>',title:Ox._('is not after')},{id:'=,',title:Ox._('is between')},{id:'!=,',title:Ox._('is not between')}]};self.defaultValue={boolean:'true',date:Ox.formatDate(new Date(),'%F'),'enum':0,float:0,hue:0,integer:0,item:void 0,list:'',place:'',string:'',text:'',time:'00:00:00',year:new Date().getFullYear().toString()};self.operators=[{id:'&',title:Ox._('all')},{id:'|',title:Ox._('any')}];setValue();self.$operator=Ox.FormElementGroup({elements:[Ox.Label({title:Ox._('Match'),overlap:'right',width:48}),Ox.FormElementGroup({elements:[Ox.Select({items:self.operators,value:self.options.value.operator,width:48}).bindEvent({change:changeOperator}),Ox.Label({overlap:'left',title:Ox._('of the following conditions'),width:160})],float:'right',width:208})],float:'left'});self.$save=Ox.InputGroup({inputs:[Ox.Checkbox({width:16}),Ox.Input({id:'list',placeholder:Ox._('Untitled'),width:128})],separators:[{title:Ox._('Save as {0}',[self.options.listName]),width:112}]});self.$limit=Ox.InputGroup({inputs:[Ox.Checkbox({width:16}),Ox.FormElementGroup({elements:[Ox.Input({type:'int',width:56}),Ox.Select({items:[{id:'items',title:Ox._('items')},{},{id:'hours',title:Ox._('hours')},{id:'days',title:Ox._('days')},{},{id:'GB',title:'GB'}],overlap:'left',width:64})],float:'right',width:120}),Ox.Select({items:self.options.sortKeys,width:128}),Ox.FormElementGroup({elements:[Ox.Select({items:[{id:'ascending',title:Ox._('ascending')},{id:'descending',title:Ox._('descending')}],width:128}),Ox.Label({overlap:'left',title:Ox._('order'),width:72})],float:'right',width:200})],separators:[{title:Ox._('Limit to'),width:56},{title:Ox._('sorted by'),width:60},{title:Ox._('in'),width:32}]});self.$view=Ox.InputGroup({inputs:[Ox.Checkbox({width:16}),Ox.Select({items:self.options.viewKeys,width:128}),Ox.Select({items:self.options.sortKeys,width:128}),Ox.FormElementGroup({elements:[Ox.Select({items:[{id:'ascending',title:Ox._('ascending')},{id:'descending',title:Ox._('descending')}],width:128}),Ox.Label({overlap:'left',title:Ox._('order'),width:72})],float:'right',width:200})],separators:[{title:Ox._('View'),width:48},{title:Ox._('sorted by'),width:60},{title:Ox._('in'),width:32}]});self.$items=self.options.list?[self.$operator,self.$save]:[self.$operator];self.numberOfAdditionalFormItems=self.$items.length;self.$form=Ox.Form({items:self.$items}).appendTo(that);renderConditions();function addCondition(pos,subpos,isGroup){subpos=Ox.isUndefined(subpos)?-1:subpos;var condition,key;if(subpos==-1){condition=self.options.value.conditions[pos-1]}else{condition=self.options.value.conditions[pos].conditions[subpos-1];} key=Ox.getObjectById(self.options.findKeys,condition.key);condition={key:key.id,operator:condition.operator,value:self.defaultValue[key.type]||''};if(isGroup){Ox.Log('Form','isGroup',self.options.value.operator) condition={conditions:[condition],operator:self.options.value.operator=='&'?'|':'&'};} if(subpos==-1){self.options.value.conditions.splice(pos,0,condition);}else{self.options.value.conditions[pos].conditions.splice(subpos,0,condition);} renderConditions(pos,subpos);if(!isUselessCondition(pos,subpos)){triggerChangeEvent();}} function changeConditionKey(pos,subpos,key){subpos=Ox.isUndefined(subpos)?-1:subpos;Ox.Log('Form','changeConditionKey',pos,subpos,key);var condition=subpos==-1?self.options.value.conditions[pos]:self.options.value.conditions[pos].conditions[subpos],oldFindKey=Ox.getObjectById(self.options.findKeys,condition.key),newFindKey=Ox.getObjectById(self.options.findKeys,key),oldConditionType=getConditionType(oldFindKey.type),newConditionType=getConditionType(newFindKey.type),changeConditionType=oldConditionType!=newConditionType,changeConditionFormat=!Ox.isEqual(oldFindKey.format,newFindKey.format),changeConditionAutocomplete=!Ox.isEqual(oldFindKey.autocomplete,newFindKey.autocomplete),wasUselessCondition=isUselessCondition(pos,subpos);Ox.Log('Form','old new',oldConditionType,newConditionType) condition.key=key;if(changeConditionType||changeConditionFormat||changeConditionAutocomplete){if(Ox.getIndexById(self.conditionOperators[newConditionType],condition.operator)==-1){condition.operator=self.conditionOperators[newConditionType][0].id;} if(['string','text'].indexOf(oldConditionType)==-1||['string','text'].indexOf(newConditionType)==-1){condition.value=newFindKey.type=='item'?newFindKey.values[0].id:(self.defaultValue[newFindKey.type]||'');} renderConditions();} if(!(wasUselessCondition&&isUselessCondition(pos,subpos))){triggerChangeEvent();}} function isBetweenCondition(condition){if(condition.key=="resolution"){return Ox.isArray(condition.value)&&Ox.isArray(condition.value[0])} return Ox.isArray(condition.value)} function changeConditionOperator(pos,subpos,operator){subpos=Ox.isUndefined(subpos)?-1:subpos;Ox.Log('FILTER','chCoOp','query',self.options.value) var condition=subpos==-1?self.options.value.conditions[pos]:self.options.value.conditions[pos].conditions[subpos],isBetween=operator.indexOf(',')>-1,wasBetween=isBetweenCondition(condition),wasUselessCondition=isUselessCondition(pos,subpos);Ox.Log('FILTER','chCoOp','iB/wB',isBetween,wasBetween) condition.operator=operator;if(isBetween&&!wasBetween){condition.operator=condition.operator.replace(',','');condition.value=[condition.value,condition.value] renderConditions();}else if(!isBetween&&wasBetween){condition.value=condition.value[0] renderConditions();} if(!(wasUselessCondition&&isUselessCondition(pos,subpos))){triggerChangeEvent();}} function changeConditionValue(pos,subpos,value){Ox.Log('FILTER','cCV',pos,subpos,value);var condition=subpos==-1?self.options.value.conditions[pos]:self.options.value.conditions[pos].conditions[subpos];condition.value=value;triggerChangeEvent();} function changeGroupOperator(pos,value){self.options.value.conditions[pos].operator=value;triggerChangeEvent();} function changeOperator(data){var hasGroups=false;self.options.value.operator=data.value;Ox.forEach(self.options.value.conditions,function(condition){if(condition.conditions){hasGroups=true;return false;}});hasGroups&&renderConditions();self.options.value.conditions.length>1&&triggerChangeEvent();} function getConditionType(type){type=Ox.isArray(type)?type[0]:type;if(['float','hue','integer','time'].indexOf(type)>-1){type='number';} return type;} function isUselessCondition(pos,subpos){subpos=Ox.isUndefined(subpos)?-1:subpos;var conditions=subpos==-1?self.options.value.conditions[pos].conditions||[self.options.value.conditions[pos]]:[self.options.value.conditions[pos].conditions[subpos]],isUseless=false;Ox.forEach(conditions,function(condition){isUseless=['string','text'].indexOf(getConditionType(Ox.getObjectById(self.options.findKeys,condition.key).type))>-1&&(self.options.value.operator=='&'?['','^','$']:['!','!^','!$']).indexOf(condition.operator)>-1&&condition.value==='';if(!isUseless){return false;}});return isUseless;} function removeCondition(pos,subpos){subpos=Ox.isUndefined(subpos)?-1:subpos;var wasUselessCondition=isUselessCondition(pos,subpos);if(subpos==-1||self.options.value.conditions[pos].conditions.length==1){self.options.value.conditions.splice(pos,1);}else{self.options.value.conditions[pos].conditions.splice(subpos,1);} renderConditions();if(!wasUselessCondition){triggerChangeEvent();}} function renderButtons(pos,subpos){subpos=Ox.isUndefined(subpos)?-1:subpos;var isGroup=subpos==-1&&self.options.value.conditions[pos].conditions;return[].concat([Ox.Button({id:'remove',title:self.options.value.conditions.length==1?'close':'remove',tooltip:self.options.value.conditions.length==1?Ox._('Reset this condition'):isGroup?Ox._('Remove this group of conditions'):Ox._('Remove this condition'),type:'image'}).css({margin:'0 4px 0 '+(isGroup?'292px':'8px')}).bindEvent({click:function(data){var key,that=this;that.focus();setTimeout(function(){if(self.options.value.conditions.length==1){key=self.options.findKeys[0];self.options.value.conditions=[{key:key.id,value:'',operator:self.conditionOperators[key.type][0].id}];renderConditions();triggerChangeEvent();}else if(that.parent().data('subposition')==-1){removeCondition(that.parent().data('position'));}else{removeCondition(that.parent().data('position'),that.parent().data('subposition'));}});}}),Ox.Button({id:'add',title:'add',tooltip:Ox._('Add a condition'),type:'image'}).css({margin:'0 '+(subpos==-1?'4px':'0')+' 0 4px'}).bindEvent({click:function(data){var that=this;that.focus();setTimeout(function(){if(that.parent().data('subposition')==-1){addCondition(that.parent().data('position')+1);}else{addCondition(that.parent().data('position'),that.parent().data('subposition')+1);}});}})],subpos==-1?[Ox.Button({id:'addgroup',title:'bracket',tooltip:Ox._('Add a group of conditions'),type:'image'}).css({margin:'0 0 0 4px'}).bindEvent({click:function(data){var that=this;that.focus();setTimeout(function(){addCondition(that.parent().data('position')+1,-1,true);});}})]:[]);} function renderCondition(condition,pos,subpos){subpos=Ox.isUndefined(subpos)?-1:subpos;var condition=subpos==-1?self.options.value.conditions[pos]:self.options.value.conditions[pos].conditions[subpos];Ox.Log('Form','renderCondition',condition,pos,subpos) return Ox.FormElementGroup({elements:[renderConditionKey(condition),renderConditionOperator(condition),renderConditionValue(condition)].concat(renderButtons(pos,subpos))}).css({marginLeft:subpos==-1?0:'24px'}).data({position:pos,subposition:subpos});} function renderConditionKey(condition){return Ox.Select({items:self.options.findKeys,overlap:'right',value:condition.key,width:128}).bindEvent({change:function(data){var $element=this.parent();changeConditionKey($element.data('position'),$element.data('subposition'),data.value);}});} function renderConditionOperator(condition){var key=Ox.getObjectById(self.options.findKeys,condition.key),conditionType=getConditionType(key.type),conditionOperators=self.conditionOperators[conditionType]||self.conditionOperators["string"];Ox.Log('FILTER','rCO',condition,conditionType,conditionOperators) return Ox.Select({items:conditionOperators,overlap:'right',value:condition.operator+(isBetweenCondition(condition)?',':''),width:128}).bindEvent({change:function(data){var $element=this.parent();changeConditionOperator($element.data('position'),$element.data('subposition'),data.value);}});} function renderConditionValue(condition){return(!isBetweenCondition(condition)?renderInput(condition):Ox.InputGroup({inputs:[renderInput(condition,0).options({id:'start'}),renderInput(condition,1).options({id:'end'})],separators:[{title:Ox._('and'),width:32}]})).bindEvent({change:change,submit:change});function change(data){var $element=this.parent();changeConditionValue($element.data('position'),$element.data('subposition'),data.value);}} function renderConditions(focusPos,focusSubpos){Ox.Log('Form','renderConditions',self.options.value) var $conditions=[],focusIndex;while(self.$form.options('items').length>self.numberOfAdditionalFormItems){self.$form.removeItem(1);} self.options.value.conditions.forEach(function(condition,pos){if(!condition.conditions){$conditions.push(renderCondition(condition,pos));if(pos==focusPos&&focusSubpos==-1){focusIndex=$conditions.length-1;}}else{$conditions.push(renderGroup(condition,pos));condition.conditions.forEach(function(subcondition,subpos){$conditions.push(renderCondition(subcondition,pos,subpos));if(pos==focusPos&&subpos==focusSubpos){focusIndex=$conditions.length-1;}});}});$conditions.forEach(function($condition,pos){var $input;self.$form.addItem(1+pos,$condition);if(focusIndex==pos){$input=$condition.options('elements')[2];if($input.focusInput){$input.focusInput();}}});} function renderGroup(condition,pos){var subpos=-1;var $condition=Ox.FormElementGroup({elements:[Ox.Label({title:self.options.value.operator=='&'?(pos==0?'Both':'and'):(pos==0?'Either':'or'),overlap:'right',width:48}).addClass('OxGroupLabel'),Ox.FormElementGroup({elements:[Ox.Select({items:self.operators,value:self.options.value.operator=='&'?'|':'&',width:48}).bindEvent({change:function(data){var $element=this.parent().parent();changeGroupOperator($element.data('position'),data.value);}}),Ox.Label({overlap:'left',title:Ox._('of the following conditions'),width:160})],float:'right',width:208}),].concat(renderButtons(pos,subpos,true)),float:'left'}).data({position:pos});return $condition;} function renderInput(condition,index){Ox.Log('Form','renderInput',condition) var $input,findKey=Ox.getObjectById(self.options.findKeys,condition.key),isBetween=isBetweenCondition(condition),isHue,type=findKey.type=='integer'?'int':findKey.type,value=!isBetween?condition.value:condition.value[index],formatArgs,formatType,title;if(type=='boolean'){$input=Ox.Select({items:['true','false'],max:1,min:1,value:value?'true':'false',width:288});}else if(type=='enum'){Ox.Log('FILTER',findKey,condition) $input=Ox.Select({items:findKey.values.map(function(v,i){return{id:i,title:v}}),value:value,width:!isBetween?288:128});}else if(type=='item'){$input=Ox.Select({items:findKey.values,max:1,min:1,value:value,width:288});}else if(type=='list'){Ox.Log('FILTER',findKey) $input=Ox.Input({autocomplete:findKey.values,autocompleteSelect:true,autocompleteSelectSubmit:true,value:value,width:288});}else if(findKey.format){formatArgs=findKey.format.args;formatType=findKey.format.type;if(formatType=='color'){isHue=formatArgs[0]=='hue';$input=Ox.Range({max:isHue?360:1,min:0,size:!isBetween?288:128,width:!isBetween?288:128,step:isHue?1:0.01,thumbSize:48,thumbValue:true,trackColors:isHue?['rgb(255, 0, 0)','rgb(255, 255, 0)','rgb(0, 255, 0)','rgb(0, 255, 255)','rgb(0, 0, 255)','rgb(255, 0, 255)','rgb(255, 0, 0)']:['rgb(0, 0, 0)','rgb(255, 255, 255)'],value:value});}else if(formatType=='date'){$input=Ox.DateInput(!isBetween?{value:value,width:{day:66,month:66,year:140}}:{value:value,width:{day:32,month:32,year:48}});}else if(formatType=='duration'){$input=Ox.TimeInput(!isBetween?{seconds:true,value:value,width:{hours:91,minutes:91,seconds:90}}:{seconds:true,value:value,width:{hours:38,minutes:37,seconds:37}});}else if(formatType=='ISBN'){$input=Ox.Input({type:type,value:Ox.formatISBN.apply(null,[value].concat(formatArgs)),width:288});}else if(formatType=='number'){$input=Ox.Input({type:type,value:value,width:288});}else if(formatType=='resolution'){$input=Ox.InputGroup({inputs:[Ox.Input({id:'width',type:'int',value:value[0]}),Ox.Input({id:'height',type:'int',value:value[1]})],separators:[{title:'x',width:16}],width:!isBetween?288:128})}else if(['currency','percent','unit','value'].indexOf(formatType)>-1){title=formatType=='percent'?'%':formatArgs[0];$input=Ox.FormElementGroup({elements:[Ox.Input({type:type,value:value,width:!isBetween?242:80}),formatType=='value'?Ox.Select({overlap:'left',items:['K','M','G','T'].map(function(prefix,i){return{id:Math.pow(1000,i+1),title:prefix+title};}),width:48}):Ox.Label({overlap:'left',textAlign:'center',title:title,width:48})],float:'right',join:function(value){return formatType=='value'?value[0]*value[1]:value[0];},split:function(value){},width:!isBetween?288:128})}}else{$input=Ox.Input({type:type,value:value,autocomplete:findKey.autocomplete,autocompleteSelect:true,autocompleteSelectSubmit:true,width:!isBetween?288:128});} return $input;} function setValue(){if(Ox.isEmpty(self.options.value)){self.options.value={conditions:[],operator:'&'};}else if(self.options.value.operator==''){self.options.value.operator='&';} Ox.Log('Form','Ox.Filter self.options',self.options);if(!self.options.value.conditions.length){self.options.value.conditions=[{key:self.options.findKeys[0].id,value:'',operator:self.conditionOperators[getConditionType(self.options.findKeys[0].type)][0].id}];}} function triggerChangeEvent(){var value=Ox.clone(self.options.value,true);that.triggerEvent('change',{value:value});} that.getList=function(){if(self.$save){var value=self.$save.value();return{save:value[0],name:value[1],query:self.options.value};}};that.value=function(){if(arguments.length==0){return self.options.value;}else{return that.options({value:arguments[0]});}};return that;};'use strict';Ox.Form=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({error:'',id:'',items:[],validate:function(valid){return Ox.every(valid);}}).options(options||{}).addClass('OxForm');Ox.extend(self,{$items:[],$messages:[],itemIds:[],itemIsValid:[]});self.options.items.forEach(function(item,i){validateItem(i,function(valid){self.itemIsValid[i]=valid;});self.itemIds[i]=item.options('id')||item.id;self.$items[i]=Ox.FormItem({element:item}).appendTo(that);item.bindEvent({autovalidate:function(data){validateForm(i,data.valid);data.valid&&self.$items[i].setMessage('');},change:function(data){that.triggerEvent('change',{id:self.itemIds[i],data:data});validateItem(i,function(valid){validateForm(i,valid);});},submit:function(data){self.formIsValid&&that.submit();},validate:function(data){validateForm(i,data.valid);setTimeout(function(){self.$items[i].setMessage(data.valid?'':data.message);},0);}});});self.formIsValid=self.options.validate(self.itemIsValid);function getItemIndexById(id){return self.itemIds.indexOf(id);} function validateForm(pos,valid){self.itemIsValid[pos]=valid;if(self.options.validate(self.itemIsValid)!=self.formIsValid){self.formIsValid=!self.formIsValid;that.triggerEvent('validate',{valid:self.formIsValid});}} function validateItem(pos,callback){var item=self.options.items[pos],validate=item.options('validate');if(validate){validate(item.value(),function(data){callback(data.valid);});}else{callback(item.value&&!Ox.isEmpty(item.value));}} that.addItem=function(pos,item){Ox.Log('Form','addItem',pos) self.options.items.splice(pos,0,item);self.$items.splice(pos,0,Ox.FormItem({element:item}));pos==0?self.$items[pos].insertBefore(self.$items[0]):self.$items[pos].insertAfter(self.$items[pos-1]);} that.removeItem=function(pos){Ox.Log('Form','removeItem',pos);self.$items[pos].remove();self.options.items.splice(pos,1);self.$items.splice(pos,1);} that.setMessages=function(messages){Ox.forEach(messages,function(v){self.$items[getItemIndexById(v.id)].setMessage(v.message);});};that.submit=function(){that.triggerEvent('submit',{values:that.values()});};that.valid=function(){return self.formIsValid;};that.values=function(){var values={};if(arguments.length==0){self.$items.forEach(function($item,i){values[self.itemIds[i]]=self.$items[i].value();});return values;}else{Ox.Log('Form','SET FORM VALUES',arguments[0]) Ox.forEach(arguments[0],function(value,key){var index=getItemIndexById(key);index>-1&&self.options.items[index].value(value);});return that;}};return that;};'use strict';Ox.FormElementGroup=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({id:'',elements:[],float:'left',join:null,separators:[],split:null,value:options.split?'':[],width:0}).options(options||{}).update({value:setValue}).addClass('OxInputGroup');if(Ox.isEmpty(self.options.value)){self.options.value=getValue();}else{setValue();} (self.options.float=='left'?self.options.elements:Ox.clone(self.options.elements).reverse()).forEach(function($element){$element.css({float:self.options.float}).bindEvent({autovalidate:function(data){that.triggerEvent({autovalidate:data});},change:change,validate:function(data){that.triggerEvent({validate:data});}}).appendTo(that);});function change(data){self.options.value=getValue();that.triggerEvent('change',{value:self.options.value});} function getValue(){var value=self.options.elements.map(function($element){return $element.value?$element.value():void 0;});return self.options.join?self.options.join(value):value;} function getWidth(){} function setValue(){var values=self.options.split?self.options.split(self.options.value):self.options.value;values.forEach(function(value,i){self.options.elements[i].value&&self.options.elements[i].value(value);});} function setWidth(){} that.replaceElement=function(pos,element){Ox.Log('Form','Ox.FormElementGroup replaceElement',pos,element) self.options.elements[pos].replaceWith(element.$element);self.options.elements[pos]=element;};that.value=function(){var values;if(arguments.length==0){values=self.options.elements.map(function(element){return element.value?element.value():void 0;});return self.options.join?self.options.join(values):values;}else{return that.options({value:arguments[0]});}};return that;};'use strict';Ox.FormItem=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({element:null,error:''}).options(options||{}).addClass('OxFormItem');self.description=self.options.element.options('description');if(self.description){$('
').addClass('OxFormDescription OxSelectable').html(self.description).appendTo(that);} that.append(self.options.element);self.$message=Ox.Element().addClass('OxFormMessage OxSelectable').appendTo(that);that.setMessage=function(message){self.$message.html(message)[message!==''?'show':'hide']();};that.value=function(){return self.options.element.value();};return that;};'use strict';Ox.FormPanel=function(options,self){self=self||{};var that=Ox.Element({},self).defaults({form:[],listSize:256}).options(options||{});self.section=0;self.sectionTitle=self.options.form[self.section].title;self.$list=Ox.TableList({columns:[{id:'id',visible:false},{format:function(value){return $('').attr({src:Ox.UI.getImageURL('symbolCheck')}).css({width:'10px',height:'10px',margin:'2px 2px 2px 0',opacity:value?1:0.1})},id:'valid',title:Ox._('Valid'),visible:true,width:16},{format:function(value){return(Ox.indexOf(self.options.form,function(section){return section.title==value;})+1)+'. '+value;},id:'title',title:Ox._('Title'),visible:true,width:self.options.listSize-16}],items:self.options.form.map(function(section){return{id:section.id,title:section.title,valid:false};}),max:1,min:1,selected:[self.options.form[0].id],sort:[{key:'id',operator:'+'}],unique:'id',width:self.options.listSize}).bindEvent({select:function(data){self.$sections[self.section].hide();self.section=Ox.getIndexById(self.options.form,data.ids[0]);self.$sections[self.section].show();that.triggerEvent('select',{section:data.ids[0]});}});self.$section=$('
').css({overflowY:'auto'});self.$forms=[];self.$sections=self.options.form.map(function(section,i){return $('
').css({width:(section.descriptionWidth||section.items[0].options('width'))+'px',margin:'16px'}).append($('
').addClass('OxSelectable').css({marginBottom:'8px',fontWeight:'bold'}).html((i+1)+'. '+section.title)).append($('
').addClass('OxSelectable').css({marginBottom:'16px'}).html(section.description)).append(self.$forms[i]=Ox.Form({items:section.items,validate:section.validate}).bindEvent({change:function(data){self.$list.value(section.id,'valid',self.$forms[i].valid());that.triggerEvent('change',{section:section.id,data:data});},validate:function(data){self.$list.value(section.id,'valid',data.valid);that.triggerEvent('validate',{section:section.id,data:data});}})).hide().appendTo(self.$section);});self.$list.bindEvent('load',function(){self.$forms.forEach(function($form,i){self.$list.value(self.options.form[i].id,'valid',$form.valid());});});self.$sections[0].show();that.setElement(Ox.SplitPanel({elements:[{element:self.$list,size:self.options.listSize},{element:self.$section}],orientation:'horizontal'}));that.renderPrintVersion=function(title){var $printVersion=$('
').css({overflowY:'auto'});$printVersion.append($('
').addClass('OxFormSectionTitle').css({height:'16px',padding:'16px 16px 8px 16px',fontWeight:'bold'}).html(title));self.$sections.forEach(function($section,i){var $clone=$section.clone(true),textareas={section:$section.find('textarea'),clone:$clone.find('textarea')};textareas.section.each(function(i){$(textareas.clone[i]).val($(this).val());});$printVersion.append($('
').css({height:'1px',margin:'8px 0 8px 0',background:'rgb(128, 128, 128)'})).append($clone.show());});return $printVersion;};that.values=function(){var values={};self.options.form.forEach(function(section,i){values[section.id]=self.$forms[i].values();});return values;};return that;};'use strict';Ox.Input=function(options,self){self=self||{};var that=Ox.Element({element:(options||{}).element||'
'},self).defaults({arrows:false,arrowStep:1,autocomplete:null,autocompleteReplace:false,autocompleteReplaceCorrect:false,autocompleteSelect:false,autocompleteSelectHighlight:false,autocompleteSelectMax:0,autocompleteSelectMaxWidth:0,autocompleteSelectOffset:{left:4,top:0},autocompleteSelectSubmit:false,autocompleteSelectUpdate:false,autovalidate:null,changeOnKeypress:false,clear:false,clearTooltip:'',decimals:0,disabled:false,height:16,key:'',min:-Infinity,max:Infinity,label:'',labelWidth:64,overlap:'none',placeholder:'',readonly:false,serialize:null,style:'rounded',textAlign:'left',type:'text',validate:null,value:'',width:128}).options(options||{}).update(function(key,value){var inputWidth;if(['autocomplete','autocompleteReplace','autocompleteSelect','autovalidate'].indexOf(key)>-1){if(self.options.autocomplete&&self.options.autocompleteSelect){self.$autocompleteMenu=constructAutocompleteMenu();} self.bindKeyboard=self.options.autocomplete||self.options.autovalidate;}else if(key=='disabled'){self.$input.attr({disabled:value});}else if(key=='height'){that.css({height:value+'px'});self.$input.css({height:value-6+'px'});}else if(key=='label'){self.$label.options({title:value});}else if(key=='labelWidth'){self.$label.options({width:value});inputWidth=getInputWidth();self.$input.css({width:inputWidth+'px'});self.hasPasswordPlaceholder&&self.$placeholder.css({width:inputWidth+'px'});}else if(key=='placeholder'){setPlaceholder();}else if(key=='readonly'){self.$input.attr({readonly:value});}else if(key=='type'){self.$input[0].type=value}else if(key=='value'){if(self.options.type=='float'&&self.options.decimals){self.options.value=self.options.value.toFixed(self.options.decimals);} self.$input.val(self.options.value);that.is('.OxError')&&that.removeClass('OxError');setPlaceholder();}else if(key=='width'){that.css({width:self.options.width+'px'});inputWidth=getInputWidth();self.$input.css({width:inputWidth+'px'});self.hasPasswordPlaceholder&&self.$placeholder.css({width:inputWidth+'px'});}}).addClass('OxInput OxKeyboardFocus OxMedium Ox'+Ox.toTitleCase(self.options.style) +(self.options.type=='textarea'?' OxTextarea':'')).css(Ox.extend({width:self.options.width+'px'},self.options.type=='textarea'?{height:self.options.height+'px'}:{})).bindEvent(Ox.extend(self.options.type!='textarea'?{key_enter:submit}:{},{key_control_i:insert,key_escape:cancel,key_shift_enter:submit}));if(Ox.isArray(self.options.autocomplete)&&self.options.autocompleteReplace&&self.options.autocompleteReplaceCorrect&&self.options.value===''){self.options.value=self.options.autocomplete[0]} if(self.options.type=='float'){self.decimals=Ox.repeat('0',self.options.decimals||1) Ox.extend(self.options,{autovalidate:'float',textAlign:'right',value:self.options.value||'0.'+self.decimals});}else if(self.options.type=='int'){Ox.extend(self.options,{autovalidate:'int',textAlign:'right',value:self.options.value||'0'});} if(self.options.label){self.$label=Ox.Label({overlap:'right',style:self.options.style,textAlign:'right',title:self.options.label,width:self.options.labelWidth}).css({float:'left'}).on({click:function(){}}).appendTo(that);} if(self.options.arrows){self.arrows=[];self.arrows[0]=[Ox.Button({overlap:'right',title:'left',type:'image'}).css({float:'left'}).on({click:function(){clickArrow(-1);}}).appendTo(that),Ox.Button({overlap:'left',title:'right',type:'image'}).css({float:'right'}).on({click:function(){clickArrow(1);}}).appendTo(that)]} self.bindKeyboard=self.options.autocomplete||self.options.autovalidate||self.options.changeOnKeypress;self.hasPasswordPlaceholder=self.options.type=='password'&&self.options.placeholder;self.inputWidth=getInputWidth();if(self.options.clear){self.$button=Ox.Button({overlap:'left',style:self.options.style=='squared'?'squared':'',title:'close',tooltip:self.options.clearTooltip,type:'image'}).css({float:'right'}).bindEvent({click:clear,doubleclick:submit}).appendTo(that);} self.$input=$(self.options.type=='textarea'?'