Best JavaScript code snippet using testcafe
praytimes.js
Source:praytimes.js
1//--------------------- Copyright Block ----------------------2/* 3PrayTimes.js: Prayer Times Calculator (ver 2.3)4Copyright (C) 2007-2011 PrayTimes.org5Developer: Hamid Zarrabi-Zadeh6License: GNU LGPL v3.07TERMS OF USE:8 Permission is granted to use this code, with or 9 without modification, in any website or application 10 provided that credit is given to the original work 11 with a link back to PrayTimes.org.12This program is distributed in the hope that it will 13be useful, but WITHOUT ANY WARRANTY. 14PLEASE DO NOT REMOVE THIS COPYRIGHT BLOCK.15 16*/ 17//--------------------- Help and Manual ----------------------18/*19User's Manual: 20http://praytimes.org/manual21Calculation Formulas: 22http://praytimes.org/calculation23//------------------------ User Interface -------------------------24 getTimes (date, coordinates [, timeZone [, dst [, timeFormat]]]) 25 26 setMethod (method) // set calculation method 27 adjust (parameters) // adjust calculation parameters 28 tune (offsets) // tune times by given offsets 29 getMethod () // get calculation method 30 getSetting () // get current calculation parameters31 getOffsets () // get current time offsets32//------------------------- Sample Usage --------------------------33 var PT = new PrayTimes('ISNA');34 var times = PT.getTimes(new Date(), [43, -80], -5);35 document.write('Sunrise = '+ times.sunrise)36*/37 38//----------------------- PrayTimes Class ------------------------39function PrayTimes(method) {40 //------------------------ Constants --------------------------41 var42 43 // Time Names44 timeNames = {45 tahajjud : 'Tahajjud',46 imsak : 'Imsak',47 fajr : 'Fajr',48 sunrise : 'Sunrise',49 dhuhr : 'Dhuhr',50 asr : 'Asr',51 sunset : 'Sunset',52 maghrib : 'Maghrib',53 isha : 'Isha',54 midnight : 'Midnight'55 },56 // Calculation Methods57 methods = {58 MWL: {59 name: 'Muslim World League',60 params: { fajr: 18, isha: 17 } },61 ISNA: {62 name: 'Islamic Society of North America (ISNA)',63 params: { fajr: 15, isha: 15 } },64 Egypt: {65 name: 'Egyptian General Authority of Survey',66 params: { fajr: 19.5, isha: 17.5 } },67 Makkah: {68 name: 'Umm Al-Qura University, Makkah',69 params: { fajr: 18.5, isha: '90 min' } }, // fajr was 19 degrees before 1430 hijri70 Karachi: {71 name: 'University of Islamic Sciences, Karachi',72 params: { fajr: 18, isha: 18 } },73 Tehran: {74 name: 'Institute of Geophysics, University of Tehran',75 params: { fajr: 17.7, isha: 14, maghrib: 4.5, midnight: 'Jafari' } }, // isha is not explicitly specified in this method76 Jafari: {77 name: 'Shia Ithna-Ashari, Leva Institute, Qum',78 params: { fajr: 16, isha: 14, maghrib: 4, midnight: 'Jafari' } },79 Algeria: {80 name: 'Algerian Minister of Religious Affairs and Wakfs',81 params: { fajr: 18, isha: 17 } },82 Diyanet: {83 name: 'Diyanet Ä°Åleri BaÅkanlıÄı',84 params: { fajr: 18, isha: 17 } },85 EgyptBis: {86 name: 'Egyptian General Authority (Bis)',87 params: { fajr: 20, isha: 18 } },88 FixedIsha: {89 name: 'Fixed Isha Angle Interval',90 params: { fajr: 19.5, isha: '90 min' } },91 FranceUOIF: {92 name: 'France UOIF - Angle 12°',93 params: { fajr: 12, isha: 12 } },94 France15: {95 name: 'France - Angle 15°',96 params: { fajr: 15, isha: 15 } },97 France18: {98 name: 'France - Angle 18°',99 params: { fajr: 18, isha: 18 } },100 JAKIM: {101 name: 'JAKIM (Jabatan Kemajuan Islam Malaysia)',102 params: { fajr: 20, isha: 18 } },103 MUIS: {104 name: 'MUIS (Majlis Ugama Islam Singapura)',105 params: { fajr: 20, isha: 18 } },106 Kemenag: {107 name: 'SIHAT/KEMENAG (Kementerian Agama RI)',108 params: { fajr: 20, isha: 18 } },109 Tunisia: {110 name: 'Tunisian Ministry of Religious Affairs',111 params: { fajr: 18, isha: 18 } },112 AwqafUAE: {113 name: 'UAE General Authority of Islamic Affairs And Endowments',114 params: { fajr: 19.5, isha: '90 min' } },115 LondonUIPT: {116 name: 'London Unified Islamic Prayer Timetable',117 params: { fajr: 18, isha: 18 } },118 },119 // Default Parameters in Calculation Methods120 defaultParams = {121 maghrib: '0 min', midnight: 'Standard'122 },123 124 125 //----------------------- Parameter Values ----------------------126 /*127 128 // Asr Juristic Methods129 asrJuristics = [ 130 'Standard', // Shafi`i, Maliki, Ja`fari, Hanbali131 'Hanafi' // Hanafi132 ],133 // Midnight Mode134 midnightMethods = [ 135 'Standard', // Mid Sunset to Sunrise136 'Jafari' // Mid Sunset to Fajr137 ],138 // Adjust Methods for Higher Latitudes139 highLatMethods = [140 'NightMiddle', // middle of night141 'AngleBased', // angle/60th of night142 'OneSeventh', // 1/7th of night143 'None' // No adjustment144 ],145 // Time Formats146 timeFormats = [147 '24h', // 24-hour format148 '12h', // 12-hour format149 '12hNS', // 12-hour format with no suffix150 'Float' // floating point number 151 ],152 */ 153 //---------------------- Default Settings --------------------154 155 calcMethod = 'MWL',156 // do not change anything here; use adjust method instead157 setting = { 158 imsak : '10 min',159 dhuhr : '0 min', 160 asr : 'Standard',161 highLats : 'NightMiddle'162 },163 timeFormat = '24h',164 timeSuffixes = ['am', 'pm'],165 invalidTime = '-----',166 timePrecision = 'show',167 numIterations = 1,168 offset = {},169 //----------------------- Local Variables ---------------------170 lat, lng, elv, // coordinates171 timeZone, jDate; // time variables172 173 //---------------------- Initialization -----------------------174 175 176 // set methods defaults177 var defParams = defaultParams;178 for (var i in methods) {179 var params = methods[i].params;180 for (var j in defParams)181 if ((typeof(params[j]) == 'undefined'))182 params[j] = defParams[j];183 };184 // initialize settings185 calcMethod = methods[method] ? method : calcMethod;186 var params = methods[calcMethod].params;187 for (var id in params)188 setting[id] = params[id];189 // init time offsets190 for (var i in timeNames)191 offset[i] = 0;192 193 194 //----------------------- Public Functions ------------------------195 return {196 197 // set calculation method 198 setMethod: function(method) {199 if (methods[method]) {200 this.adjust(methods[method].params);201 calcMethod = method;202 }203 },204 // set calculating parameters205 adjust: function(params) {206 for (var id in params)207 setting[id] = params[id];208 },209 // set time offsets210 tune: function(timeOffsets) {211 for (var i in timeOffsets)212 offset[i] = timeOffsets[i];213 },214 // get current calculation method215 getMethod: function() { return calcMethod; },216 // get current setting217 getSetting: function() { return setting; },218 // get current time offsets219 getOffsets: function() { return offset; },220 // get default calc parametrs221 getDefaults: function() { return methods; },222 // return prayer times for a given date223 getTimes: function(date, coords, timezone, dst, format, precision) {224 lat = 1* coords[0];225 lng = 1* coords[1]; 226 elv = coords[2] ? 1* coords[2] : 0;227 timeFormat = format || timeFormat;228 timePrecision = precision || timePrecision;229 if (date.constructor === Date)230 date = [date.getFullYear(), date.getMonth()+ 1, date.getDate()];231 if (typeof(timezone) == 'undefined' || timezone == 'auto')232 timezone = this.getTimeZone(date);233 if (typeof(dst) == 'undefined' || dst == 'auto') 234 dst = this.getDst(date);235 timeZone = 1* timezone+ (1* dst ? 1 : 0);236 jDate = this.julian(date[0], date[1], date[2])- lng/ (15* 24);237 238 return this.computeTimes();239 },240 // convert float time to the given format (see timeFormats)241 getFormattedTime: function(time, format, suffixes) {242 if (isNaN(time))243 return invalidTime;244 if (format == 'Float') return time;245 suffixes = suffixes || timeSuffixes;246 time = DMath.fixHour(time + 0.0 / 60); // don't add 0.5 minutes to round247 var hours = Math.floor(time); 248 var minutes = Math.floor((time - hours)* 60);249 var seconds = Math.floor((((time - hours)* 60) - minutes) * 60);250 //console.log(time + " - " + hours + ":" + minutes + ":" + seconds);251 var suffix = (format == '12h') ? suffixes[hours < 12 ? 0 : 1] : '';252 var hour = (format == '24h') ? this.twoDigitsFormat(hours) : ((hours+ 12 -1)% 12+ 1);253 if (timePrecision == 'show') {254 return hour+ ':' + this.twoDigitsFormat(minutes) + ':' + this.twoDigitsFormat(seconds) + (suffix ? ' '+ suffix : '');255 } else {256 return hour+ ':' + this.twoDigitsFormat(minutes) + (suffix ? ' '+ suffix : '');257 }258 },259 //---------------------- Calculation Functions -----------------------260 // compute mid-day time261 midDay: function(time) {262 var eqt = this.sunPosition(jDate+ time).equation;263 var noon = DMath.fixHour(12- eqt);264 return noon;265 },266 // compute the time at which sun reaches a specific angle below horizon267 sunAngleTime: function(angle, time, direction) {268 var decl = this.sunPosition(jDate+ time).declination;269 var noon = this.midDay(time);270 var t = 1/15* DMath.arccos((-DMath.sin(angle)- DMath.sin(decl)* DMath.sin(lat))/ 271 (DMath.cos(decl)* DMath.cos(lat)));272 return noon+ (direction == 'ccw' ? -t : t);273 },274 // compute asr time 275 asrTime: function(factor, time) { 276 var decl = this.sunPosition(jDate+ time).declination;277 var angle = -DMath.arccot(factor+ DMath.tan(Math.abs(lat- decl)));278 return this.sunAngleTime(angle, time);279 },280 // compute declination angle of sun and equation of time281 // Ref: http://aa.usno.navy.mil/faq/docs/SunApprox.php282 sunPosition: function(jd) {283 var D = jd - 2451545.0;284 var g = DMath.fixAngle(357.529 + 0.98560028* D);285 var q = DMath.fixAngle(280.459 + 0.98564736* D);286 var L = DMath.fixAngle(q + 1.915* DMath.sin(g) + 0.020* DMath.sin(2*g));287 var R = 1.00014 - 0.01671* DMath.cos(g) - 0.00014* DMath.cos(2*g);288 var e = 23.439 - 0.00000036* D;289 var RA = DMath.arctan2(DMath.cos(e)* DMath.sin(L), DMath.cos(L))/ 15;290 var eqt = q/15 - DMath.fixHour(RA);291 var decl = DMath.arcsin(DMath.sin(e)* DMath.sin(L));292 return {declination: decl, equation: eqt};293 },294 // convert Gregorian date to Julian day295 // Ref: Astronomical Algorithms by Jean Meeus296 julian: function(year, month, day) {297 if (month <= 2) {298 year -= 1;299 month += 12;300 };301 var A = Math.floor(year/ 100);302 var B = 2- A+ Math.floor(A/ 4);303 var JD = Math.floor(365.25* (year+ 4716))+ Math.floor(30.6001* (month+ 1))+ day+ B- 1524.5;304 return JD;305 },306 307 //---------------------- Compute Prayer Times -----------------------308 // compute prayer times at given julian date309 computePrayerTimes: function(times) {310 times = this.dayPortion(times);311 var params = setting;312 313 var imsak = this.sunAngleTime(this.eval(params.imsak), times.imsak, 'ccw');314 var fajr = this.sunAngleTime(this.eval(params.fajr), times.fajr, 'ccw');315 var sunrise = this.sunAngleTime(this.riseSetAngle(), times.sunrise, 'ccw'); 316 var dhuhr = this.midDay(times.dhuhr);317 var asr = this.asrTime(this.asrFactor(params.asr), times.asr);318 var sunset = this.sunAngleTime(this.riseSetAngle(), times.sunset);;319 var maghrib = this.sunAngleTime(this.eval(params.maghrib), times.maghrib);320 var isha = this.sunAngleTime(this.eval(params.isha), times.isha);321 return {322 imsak: imsak, fajr: fajr, sunrise: sunrise, dhuhr: dhuhr, 323 asr: asr, sunset: sunset, maghrib: maghrib, isha: isha324 };325 },326 // compute prayer times 327 computeTimes: function() {328 // default times329 var times = { 330 imsak: 5, fajr: 5, sunrise: 6, dhuhr: 12, 331 asr: 13, sunset: 18, maghrib: 18, isha: 18332 };333 // main iterations334 for (var i=1 ; i<=numIterations ; i++) 335 times = this.computePrayerTimes(times);336 times = this.adjustTimes(times);337 338 // add midnight time339 times.midnight = (setting.midnight == 'Jafari') ? 340 times.sunset+ this.timeDiff(times.sunset, times.fajr)/ 2 :341 times.sunset+ this.timeDiff(times.sunset, times.sunrise)/ 2;342 // add tahajjud time343 times.tahajjud = times.sunset+ (this.timeDiff(times.sunset, times.sunrise)/ 3) * 2;344 times = this.tuneTimes(times);345 return this.modifyFormats(times);346 },347 // adjust times 348 adjustTimes: function(times) {349 var params = setting;350 for (var i in times)351 times[i] += timeZone- lng/ 15;352 353 if (params.highLats != 'None')354 times = this.adjustHighLats(times);355 356 if (this.isMin(params.imsak))357 times.imsak = times.fajr- this.eval(params.imsak)/ 60;358 if (this.isMin(params.maghrib))359 times.maghrib = times.sunset+ this.eval(params.maghrib)/ 60;360 if (this.isMin(params.isha))361 times.isha = times.maghrib+ this.eval(params.isha)/ 60;362 times.dhuhr += this.eval(params.dhuhr)/ 60; 363 return times;364 },365 // get asr shadow factor366 asrFactor: function(asrParam) {367 var factor = {Standard: 1, Hanafi: 2}[asrParam];368 return factor || this.eval(asrParam);369 },370 // return sun angle for sunset/sunrise371 riseSetAngle: function() {372 //var earthRad = 6371009; // in meters373 //var angle = DMath.arccos(earthRad/(earthRad+ elv));374 var angle = 0.0347* Math.sqrt(elv); // an approximation375 return 0.833+ angle;376 },377 // apply offsets to the times378 tuneTimes: function(times) {379 for (var i in times)380 times[i] += offset[i]/ 60; 381 return times;382 },383 // convert times to given time format384 modifyFormats: function(times) {385 for (var i in times)386 times[i] = this.getFormattedTime(times[i], timeFormat); 387 return times;388 },389 // adjust times for locations in higher latitudes390 adjustHighLats: function(times) {391 var params = setting;392 var nightTime = this.timeDiff(times.sunset, times.sunrise); 393 times.imsak = this.adjustHLTime(times.imsak, times.sunrise, this.eval(params.imsak), nightTime, 'ccw');394 times.fajr = this.adjustHLTime(times.fajr, times.sunrise, this.eval(params.fajr), nightTime, 'ccw');395 times.isha = this.adjustHLTime(times.isha, times.sunset, this.eval(params.isha), nightTime);396 times.maghrib = this.adjustHLTime(times.maghrib, times.sunset, this.eval(params.maghrib), nightTime);397 398 return times;399 },400 401 // adjust a time for higher latitudes402 adjustHLTime: function(time, base, angle, night, direction) {403 var portion = this.nightPortion(angle, night);404 var timeDiff = (direction == 'ccw') ? 405 this.timeDiff(time, base):406 this.timeDiff(base, time);407 if (isNaN(time) || timeDiff > portion) 408 time = base+ (direction == 'ccw' ? -portion : portion);409 return time;410 },411 412 // the night portion used for adjusting times in higher latitudes413 nightPortion: function(angle, night) {414 var method = setting.highLats;415 var portion = 1/2 // MidNight416 if (method == 'AngleBased')417 portion = 1/60* angle;418 if (method == 'OneSeventh')419 portion = 1/7;420 return portion* night;421 },422 // convert hours to day portions 423 dayPortion: function(times) {424 for (var i in times)425 times[i] /= 24;426 return times;427 },428 //---------------------- Time Zone Functions -----------------------429 // get local time zone430 getTimeZone: function(date) {431 var year = date[0];432 var t1 = this.gmtOffset([year, 0, 1]);433 var t2 = this.gmtOffset([year, 6, 1]);434 return Math.min(t1, t2);435 },436 437 // get daylight saving for a given date438 getDst: function(date) {439 return 1* (this.gmtOffset(date) != this.getTimeZone(date));440 },441 // GMT offset for a given date442 gmtOffset: function(date) {443 var localDate = new Date(date[0], date[1]- 1, date[2], 12, 0, 0, 0);444 var GMTString = localDate.toGMTString();445 var GMTDate = new Date(GMTString.substring(0, GMTString.lastIndexOf(' ')- 1));446 var hoursDiff = (localDate- GMTDate) / (1000* 60* 60);447 return hoursDiff;448 },449 450 //---------------------- Misc Functions -----------------------451 // convert given string into a number452 eval: function(str) {453 return 1* (str+ '').split(/[^0-9.+-]/)[0];454 },455 // detect if input contains 'min'456 isMin: function(arg) {457 return (arg+ '').indexOf('min') != -1;458 },459 // compute the difference between two times 460 timeDiff: function(time1, time2) {461 return DMath.fixHour(time2- time1);462 },463 // add a leading 0 if necessary464 twoDigitsFormat: function(num) {465 return (num <10) ? '0'+ num : num;466 }467 468}}469//---------------------- Degree-Based Math Class -----------------------470var DMath = {471 dtr: function(d) { return (d * Math.PI) / 180.0; },472 rtd: function(r) { return (r * 180.0) / Math.PI; },473 sin: function(d) { return Math.sin(this.dtr(d)); },474 cos: function(d) { return Math.cos(this.dtr(d)); },475 tan: function(d) { return Math.tan(this.dtr(d)); },476 arcsin: function(d) { return this.rtd(Math.asin(d)); },477 arccos: function(d) { return this.rtd(Math.acos(d)); },478 arctan: function(d) { return this.rtd(Math.atan(d)); },479 arccot: function(x) { return this.rtd(Math.atan(1/x)); },480 arctan2: function(y, x) { return this.rtd(Math.atan2(y, x)); },481 fixAngle: function(a) { return this.fix(a, 360); },482 fixHour: function(a) { return this.fix(a, 24 ); },483 fix: function(a, b) { 484 a = a- b* (Math.floor(a/ b));485 return (a < 0) ? a+ b : a;486 }487}488//---------------------- Init Object -----------------------...
KeyframeTrack.js
Source:KeyframeTrack.js
1import {2 InterpolateLinear,3 InterpolateSmooth,4 InterpolateDiscrete5} from '../constants.js';6import { CubicInterpolant } from '../math/interpolants/CubicInterpolant.js';7import { LinearInterpolant } from '../math/interpolants/LinearInterpolant.js';8import { DiscreteInterpolant } from '../math/interpolants/DiscreteInterpolant.js';9import { AnimationUtils } from './AnimationUtils.js';10class KeyframeTrack {11 constructor( name, times, values, interpolation ) {12 if ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );13 if ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );14 this.name = name;15 this.times = AnimationUtils.convertArray( times, this.TimeBufferType );16 this.values = AnimationUtils.convertArray( values, this.ValueBufferType );17 this.setInterpolation( interpolation || this.DefaultInterpolation );18 }19 // Serialization (in static context, because of constructor invocation20 // and automatic invocation of .toJSON):21 static toJSON( track ) {22 const trackType = track.constructor;23 let json;24 // derived classes can define a static toJSON method25 if ( trackType.toJSON !== this.toJSON ) {26 json = trackType.toJSON( track );27 } else {28 // by default, we assume the data can be serialized as-is29 json = {30 'name': track.name,31 'times': AnimationUtils.convertArray( track.times, Array ),32 'values': AnimationUtils.convertArray( track.values, Array )33 };34 const interpolation = track.getInterpolation();35 if ( interpolation !== track.DefaultInterpolation ) {36 json.interpolation = interpolation;37 }38 }39 json.type = track.ValueTypeName; // mandatory40 return json;41 }42 InterpolantFactoryMethodDiscrete( result ) {43 return new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );44 }45 InterpolantFactoryMethodLinear( result ) {46 return new LinearInterpolant( this.times, this.values, this.getValueSize(), result );47 }48 InterpolantFactoryMethodSmooth( result ) {49 return new CubicInterpolant( this.times, this.values, this.getValueSize(), result );50 }51 setInterpolation( interpolation ) {52 let factoryMethod;53 switch ( interpolation ) {54 case InterpolateDiscrete:55 factoryMethod = this.InterpolantFactoryMethodDiscrete;56 break;57 case InterpolateLinear:58 factoryMethod = this.InterpolantFactoryMethodLinear;59 break;60 case InterpolateSmooth:61 factoryMethod = this.InterpolantFactoryMethodSmooth;62 break;63 }64 if ( factoryMethod === undefined ) {65 const message = 'unsupported interpolation for ' +66 this.ValueTypeName + ' keyframe track named ' + this.name;67 if ( this.createInterpolant === undefined ) {68 // fall back to default, unless the default itself is messed up69 if ( interpolation !== this.DefaultInterpolation ) {70 this.setInterpolation( this.DefaultInterpolation );71 } else {72 throw new Error( message ); // fatal, in this case73 }74 }75 console.warn( 'THREE.KeyframeTrack:', message );76 return this;77 }78 this.createInterpolant = factoryMethod;79 return this;80 }81 getInterpolation() {82 switch ( this.createInterpolant ) {83 case this.InterpolantFactoryMethodDiscrete:84 return InterpolateDiscrete;85 case this.InterpolantFactoryMethodLinear:86 return InterpolateLinear;87 case this.InterpolantFactoryMethodSmooth:88 return InterpolateSmooth;89 }90 }91 getValueSize() {92 return this.values.length / this.times.length;93 }94 // move all keyframes either forwards or backwards in time95 shift( timeOffset ) {96 if ( timeOffset !== 0.0 ) {97 const times = this.times;98 for ( let i = 0, n = times.length; i !== n; ++ i ) {99 times[ i ] += timeOffset;100 }101 }102 return this;103 }104 // scale all keyframe times by a factor (useful for frame <-> seconds conversions)105 scale( timeScale ) {106 if ( timeScale !== 1.0 ) {107 const times = this.times;108 for ( let i = 0, n = times.length; i !== n; ++ i ) {109 times[ i ] *= timeScale;110 }111 }112 return this;113 }114 // removes keyframes before and after animation without changing any values within the range [startTime, endTime].115 // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values116 trim( startTime, endTime ) {117 const times = this.times,118 nKeys = times.length;119 let from = 0,120 to = nKeys - 1;121 while ( from !== nKeys && times[ from ] < startTime ) {122 ++ from;123 }124 while ( to !== - 1 && times[ to ] > endTime ) {125 -- to;126 }127 ++ to; // inclusive -> exclusive bound128 if ( from !== 0 || to !== nKeys ) {129 // empty tracks are forbidden, so keep at least one keyframe130 if ( from >= to ) {131 to = Math.max( to, 1 );132 from = to - 1;133 }134 const stride = this.getValueSize();135 this.times = AnimationUtils.arraySlice( times, from, to );136 this.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride );137 }138 return this;139 }140 // ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable141 validate() {142 let valid = true;143 const valueSize = this.getValueSize();144 if ( valueSize - Math.floor( valueSize ) !== 0 ) {145 console.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );146 valid = false;147 }148 const times = this.times,149 values = this.values,150 nKeys = times.length;151 if ( nKeys === 0 ) {152 console.error( 'THREE.KeyframeTrack: Track is empty.', this );153 valid = false;154 }155 let prevTime = null;156 for ( let i = 0; i !== nKeys; i ++ ) {157 const currTime = times[ i ];158 if ( typeof currTime === 'number' && isNaN( currTime ) ) {159 console.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );160 valid = false;161 break;162 }163 if ( prevTime !== null && prevTime > currTime ) {164 console.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );165 valid = false;166 break;167 }168 prevTime = currTime;169 }170 if ( values !== undefined ) {171 if ( AnimationUtils.isTypedArray( values ) ) {172 for ( let i = 0, n = values.length; i !== n; ++ i ) {173 const value = values[ i ];174 if ( isNaN( value ) ) {175 console.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );176 valid = false;177 break;178 }179 }180 }181 }182 return valid;183 }184 // removes equivalent sequential keys as common in morph target sequences185 // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)186 optimize() {187 // times or values may be shared with other tracks, so overwriting is unsafe188 const times = AnimationUtils.arraySlice( this.times ),189 values = AnimationUtils.arraySlice( this.values ),190 stride = this.getValueSize(),191 smoothInterpolation = this.getInterpolation() === InterpolateSmooth,192 lastIndex = times.length - 1;193 let writeIndex = 1;194 for ( let i = 1; i < lastIndex; ++ i ) {195 let keep = false;196 const time = times[ i ];197 const timeNext = times[ i + 1 ];198 // remove adjacent keyframes scheduled at the same time199 if ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {200 if ( ! smoothInterpolation ) {201 // remove unnecessary keyframes same as their neighbors202 const offset = i * stride,203 offsetP = offset - stride,204 offsetN = offset + stride;205 for ( let j = 0; j !== stride; ++ j ) {206 const value = values[ offset + j ];207 if ( value !== values[ offsetP + j ] ||208 value !== values[ offsetN + j ] ) {209 keep = true;210 break;211 }212 }213 } else {214 keep = true;215 }216 }217 // in-place compaction218 if ( keep ) {219 if ( i !== writeIndex ) {220 times[ writeIndex ] = times[ i ];221 const readOffset = i * stride,222 writeOffset = writeIndex * stride;223 for ( let j = 0; j !== stride; ++ j ) {224 values[ writeOffset + j ] = values[ readOffset + j ];225 }226 }227 ++ writeIndex;228 }229 }230 // flush last keyframe (compaction looks ahead)231 if ( lastIndex > 0 ) {232 times[ writeIndex ] = times[ lastIndex ];233 for ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {234 values[ writeOffset + j ] = values[ readOffset + j ];235 }236 ++ writeIndex;237 }238 if ( writeIndex !== times.length ) {239 this.times = AnimationUtils.arraySlice( times, 0, writeIndex );240 this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );241 } else {242 this.times = times;243 this.values = values;244 }245 return this;246 }247 clone() {248 const times = AnimationUtils.arraySlice( this.times, 0 );249 const values = AnimationUtils.arraySlice( this.values, 0 );250 const TypedKeyframeTrack = this.constructor;251 const track = new TypedKeyframeTrack( this.name, times, values );252 // Interpolant argument to constructor is not saved, so copy the factory method directly.253 track.createInterpolant = this.createInterpolant;254 return track;255 }256}257KeyframeTrack.prototype.TimeBufferType = Float32Array;258KeyframeTrack.prototype.ValueBufferType = Float32Array;259KeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;...
loopedslider.js
Source:loopedslider.js
1/*2 * loopedSlider 0.5.6 - jQuery plugin3 * written by Nathan Searles 4 * http://nathansearles.com/loopedslider/5 *6 * Copyright (c) 2009 Nathan Searles (http://nathansearles.com/)7 * Dual licensed under the MIT (MIT-LICENSE.txt)8 * and GPL (GPL-LICENSE.txt) licenses.9 *10 * Built for jQuery library11 * http://jquery.com12 * Compatible with jQuery 1.3.2+13 *14 */15/*16 * markup example for $("#loopedSlider").loopedSlider();17 *18 * <div id="loopedSlider"> 19 * <div class="container">20 * <div class="slides">21 * <div><img src="01.jpg" alt="" /></div>22 * <div><img src="02.jpg" alt="" /></div>23 * <div><img src="03.jpg" alt="" /></div>24 * <div><img src="04.jpg" alt="" /></div>25 * </div>26 * </div>27 * <a href="#" class="previous">previous</a>28 * <a href="#" class="next">next</a> 29 * </div>30 *31*/32if(typeof jQuery != 'undefined') {33 jQuery(function($) {34 $.fn.extend({35 loopedSlider: function(options) {36 var settings = $.extend({}, $.fn.loopedSlider.defaults, options);37 38 return this.each(39 function() {40 if($.fn.jquery < '1.3.2') {return;}41 var $t = $(this);42 var o = $.metadata ? $.extend({}, settings, $t.metadata()) : settings;43 44 var distance = 0;45 var times = 1;46 var slides = $(o.slides,$t).children().size();47 var width = $(o.slides,$t).children().outerWidth();48 var position = 0;49 var active = false;50 var number = 0;51 var interval = 0;52 var restart = 0;53 var pagination = $("."+o.pagination+" li a",$t);54 if(o.addPagination && !$(pagination).length){55 var buttons = slides;56 $($t).append("<ul class="+o.pagination+">");57 $(o.slides,$t).children().each(function(){58 if (number<buttons) {59 $("."+o.pagination,$t).append("<li><a rel="+(number+1)+" href=\"#\" >"+(number+1)+"</a></li>");60 number = number+1;61 } else {62 number = 0;63 return false;64 }65 $("."+o.pagination+" li a:eq(0)",$t).parent().addClass("active");66 });67 pagination = $("."+o.pagination+" li a",$t);68 } else {69 $(pagination,$t).each(function(){70 number=number+1;71 $(this).attr("rel",number);72 $(pagination.eq(0),$t).parent().addClass("active");73 });74 }75 if (slides===1) {76 $(o.slides,$t).children().css({position:"absolute",left:position,display:"block"});77 return;78 }79 $(o.slides,$t).css({width:(slides*width)});80 $(o.slides,$t).children().each(function(){81 $(this).css({position:"absolute",left:position,display:"block"});82 position=position+width;83 });84 $(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:-width});85 if (slides>3) {86 $(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:-width});87 }88 if(o.autoHeight){autoHeight(times);}89 $(".next",$t).click(function(){90 if(active===false) {91 animate("next",true);92 if(o.autoStart){93 if (o.restart) {autoStart();}94 else {clearInterval(sliderIntervalID);}95 }96 } return false;97 });98 $(".previous",$t).click(function(){99 if(active===false) { 100 animate("prev",true);101 if(o.autoStart){102 if (o.restart) {autoStart();}103 else {clearInterval(sliderIntervalID);}104 }105 } return false;106 });107 if (o.containerClick) {108 $(o.container,$t).click(function(){109 if(active===false) {110 animate("next",true);111 if(o.autoStart){112 if (o.restart) {autoStart();}113 else {clearInterval(sliderIntervalID);}114 }115 } return false;116 });117 }118 $(pagination,$t).click(function(){119 if ($(this).parent().hasClass("active")) {return false;}120 else {121 times = $(this).attr("rel");122 $(pagination,$t).parent().siblings().removeClass("active");123 $(this).parent().addClass("active");124 animate("fade",times);125 if(o.autoStart){126 if (o.restart) {autoStart();}127 else {clearInterval(sliderIntervalID);}128 }129 } return false;130 });131 if (o.autoStart) {132 sliderIntervalID = setInterval(function(){133 if(active===false) {animate("next",true);}134 },o.autoStart);135 function autoStart() {136 if (o.restart) {137 clearInterval(sliderIntervalID);138 clearInterval(interval);139 clearTimeout(restart);140 restart = setTimeout(function() {141 interval = setInterval( function(){142 animate("next",true);143 },o.autoStart);144 },o.restart);145 } else {146 sliderIntervalID = setInterval(function(){147 if(active===false) {animate("next",true);}148 },o.autoStart);149 }150 };151 }152 function current(times) {153 if(times===slides+1){times = 1;}154 if(times===0){times = slides;}155 $(pagination,$t).parent().siblings().removeClass("active");156 $(pagination+"[rel='" + (times) + "']",$t).parent().addClass("active");157 };158 function autoHeight(times) {159 if(times===slides+1){times=1;}160 if(times===0){times=slides;} 161 var getHeight = $(o.slides,$t).children(":eq("+(times-1)+")",$t).outerHeight();162 $(o.container,$t).animate({height: getHeight},o.autoHeight); 163 }; 164 function animate(dir,clicked){ 165 active = true; 166 switch(dir){167 case "next":168 times = times+1;169 distance = (-(times*width-width));170 current(times);171 if(o.autoHeight){autoHeight(times);}172 if(slides<3){173 if (times===3){$(o.slides,$t).children(":eq(0)").css({left:(slides*width)});}174 if (times===2){$(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:width});}175 }176 $(o.slides,$t).animate({left: distance}, o.slidespeed,function(){177 if (times===slides+1) {178 times = 1;179 $(o.slides,$t).css({left:0},function(){$(o.slides,$t).animate({left:distance})}); 180 $(o.slides,$t).children(":eq(0)").css({left:0});181 $(o.slides,$t).children(":eq("+(slides-1)+")").css({ position:"absolute",left:-width}); 182 }183 if (times===slides) $(o.slides,$t).children(":eq(0)").css({left:(slides*width)});184 if (times===slides-1) $(o.slides,$t).children(":eq("+(slides-1)+")").css({left:(slides*width-width)});185 active = false;186 }); 187 break; 188 case "prev":189 times = times-1;190 distance = (-(times*width-width));191 current(times);192 if(o.autoHeight){autoHeight(times);}193 if (slides<3){194 if(times===0){$(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:(-width)});}195 if(times===1){$(o.slides,$t).children(":eq(0)").css({position:"absolute",left:0});}196 }197 $(o.slides,$t).animate({left: distance}, o.slidespeed,function(){198 if (times===0) {199 times = slides;200 $(o.slides,$t).children(":eq("+(slides-1)+")").css({position:"absolute",left:(slides*width-width)});201 $(o.slides,$t).css({left: -(slides*width-width)});202 $(o.slides,$t).children(":eq(0)").css({left:(slides*width)});203 }204 if (times===2 ) $(o.slides,$t).children(":eq(0)").css({position:"absolute",left:0});205 if (times===1) $(o.slides,$t).children(":eq("+ (slides-1) +")").css({position:"absolute",left:-width});206 active = false;207 });208 break;209 case "fade":210 times = [times]*1;211 distance = (-(times*width-width));212 current(times);213 if(o.autoHeight){autoHeight(times);}214 $(o.slides,$t).children().fadeOut(o.fadespeed, function(){215 $(o.slides,$t).css({left: distance});216 $(o.slides,$t).children(":eq("+(slides-1)+")").css({left:slides*width-width});217 $(o.slides,$t).children(":eq(0)").css({left:0});218 if(times===slides){$(o.slides,$t).children(":eq(0)").css({left:(slides*width)});}219 if(times===1){$(o.slides,$t).children(":eq("+(slides-1)+")").css({ position:"absolute",left:-width});}220 $(o.slides,$t).children().fadeIn(o.fadespeed);221 active = false;222 });223 break; 224 default:225 break;226 } 227 };228 }229 );230 }231 });232 $.fn.loopedSlider.defaults = {233 container: ".container", //Class/id of main container. You can use "#container" for an id.234 slides: ".slides", //Class/id of slide container. You can use "#slides" for an id.235 pagination: "pagination", //Class name of parent ul for numbered links. Don't add a "." here.236 containerClick: false, //Click slider to goto next slide? true/false237 autoStart: 5000, //Set to positive number for true. This number will be the time between transitions.238 restart: 0, //Set to positive number for true. Sets time until autoStart is restarted.239 slidespeed: 300, //Speed of slide animation, 1000 = 1second.240 fadespeed: 200, //Speed of fade animation, 1000 = 1second.241 autoHeight:1, //Set to positive number for true. This number will be the speed of the animation.242 addPagination: false //Add pagination links based on content? true/false243 };244 });...
TimesRowRenderer-dbg.js
Source:TimesRowRenderer-dbg.js
1/*!2 * UI development toolkit for HTML5 (OpenUI5)3 * (c) Copyright 2009-2017 SAP SE or an SAP affiliate company.4 * Licensed under the Apache License, Version 2.0 - see LICENSE.txt.5 */6sap.ui.define(['jquery.sap.global', 'sap/ui/unified/calendar/CalendarUtils', 'sap/ui/core/date/UniversalDate'],7 function(jQuery, CalendarUtils, UniversalDate) {8 "use strict";9 /**10 * Month renderer.11 * @namespace12 */13 var TimesRowRenderer = {14 };15 /**16 * Renders the HTML for the given control, using the provided {@link sap.ui.core.RenderManager}.17 *18 * @param {sap.ui.core.RenderManager} oRm The RenderManager that can be used for writing to the render output buffer19 * @param {sap.ui.unified.calendar.TimesRow} oTimesRow An object representation of the control that should be rendered20 */21 TimesRowRenderer.render = function(oRm, oTimesRow){22 var oDate = oTimesRow._getStartDate();23 var sTooltip = oTimesRow.getTooltip_AsString();24 var sId = oTimesRow.getId();25 var oAriaLabel = {value: sId + "-Descr", append: true};26 oRm.write("<div");27 oRm.writeControlData(oTimesRow);28 oRm.addClass("sapUiCalTimesRow");29 oRm.addClass("sapUiCalRow");30 oRm.writeClasses();31 if (sTooltip) {32 oRm.writeAttributeEscaped("title", sTooltip);33 }34 if (oTimesRow._getShowHeader()) {35 oAriaLabel.value = oAriaLabel.value + " " + sId + "-Head";36 }37 oRm.writeAccessibilityState(oTimesRow, {38 role: "grid",39 readonly: "true",40 multiselectable: !oTimesRow.getSingleSelection() || oTimesRow.getIntervalSelection(),41 labelledby: oAriaLabel42 });43 oRm.write(">"); // div element44 oRm.write("<span id=\"" + sId + "-Descr\" style=\"display: none;\">" + oTimesRow._rb.getText("CALENDAR_DIALOG") + "</span>");45 if (oTimesRow.getIntervalSelection()) {46 oRm.write("<span id=\"" + sId + "-Start\" style=\"display: none;\">" + oTimesRow._rb.getText("CALENDAR_START_TIME") + "</span>");47 oRm.write("<span id=\"" + sId + "-End\" style=\"display: none;\">" + oTimesRow._rb.getText("CALENDAR_END_TIME") + "</span>");48 }49 this.renderRow(oRm, oTimesRow, oDate);50 oRm.write("</div>");51 };52 TimesRowRenderer.renderRow = function(oRm, oTimesRow, oDate){53 var sId = oTimesRow.getId();54 // header line55 this.renderHeader(oRm, oTimesRow, oDate);56 // time items57 oRm.write("<div id=\"" + sId + "-times\" class=\"sapUiCalItems\">"); // extra DIV around the times to allow rerendering only it's content58 this.renderTimes(oRm, oTimesRow, oDate);59 oRm.write("</div>");60 };61 TimesRowRenderer.renderHeader = function(oRm, oTimesRow, oDate){62 // header63 if (oTimesRow._getShowHeader()) {64 var oLocaleData = oTimesRow._getLocaleData();65 var sId = oTimesRow.getId();66 oRm.write("<div id=\"" + sId + "-Head\">");67 this.renderHeaderLine(oRm, oTimesRow, oLocaleData, oDate);68 oRm.write("</div>");69 }70 };71 TimesRowRenderer.renderHeaderLine = function(oRm, oTimesRow, oLocaleData, oDate){72 var oFormatDate = oTimesRow._getFormatDate();73 var sId = oTimesRow.getId();74 var iItems = oTimesRow.getItems();75 var oItemDate = oTimesRow._getIntervalStart(oDate);76 var iMinutes = oTimesRow.getIntervalMinutes();77 var sWidth = "";78 var sDay = 0;79 var aDayIntervals = [];80 var i = 0;81 for (i = 0; i < iItems; i++) {82 sDay = oFormatDate.format(oItemDate, true);83 if (aDayIntervals.length > 0 && aDayIntervals[aDayIntervals.length - 1].sDay == sDay) {84 aDayIntervals[aDayIntervals.length - 1].iItems++;85 }else {86 aDayIntervals.push({sDay: sDay, iItems: 1});87 }88 oItemDate.setUTCMinutes(oItemDate.getUTCMinutes() + iMinutes);89 }90 for (i = 0; i < aDayIntervals.length; i++) {91 var oDayInterval = aDayIntervals[i];92 sWidth = ( 100 / iItems * oDayInterval.iItems) + "%";93 oRm.write("<div id=\"" + sId + "-Head" + i + "\"class=\"sapUiCalHeadText\" style=\"width:" + sWidth + "\">");94 oRm.write(oDayInterval.sDay);95 oRm.write("</div>");96 }97 };98 TimesRowRenderer.renderTimes = function(oRm, oTimesRow, oDate){99 var oHelper = this.getHelper(oTimesRow, oDate);100 var iItems = oTimesRow.getItems();101 var sWidth = ( 100 / iItems ) + "%";102 var oItemDate = oTimesRow._getIntervalStart(oDate);103 var sOldAmPm = "";104 var sAmPm = "";105 for (var i = 0; i < iItems; i++) {106 if (oHelper.oFormatTimeAmPm) {107 sAmPm = oHelper.oFormatTimeAmPm.format(oItemDate, true);108 if (sOldAmPm == sAmPm) {109 sAmPm = "";110 } else {111 sOldAmPm = sAmPm;112 }113 }114 this.renderTime(oRm, oTimesRow, oItemDate, oHelper, sWidth, sAmPm);115 oItemDate.setUTCMinutes(oItemDate.getUTCMinutes() + oHelper.iMinutes);116 }117 };118 TimesRowRenderer.getHelper = function(oTimesRow, oDate){119 var oHelper = {};120 oHelper.sLocale = oTimesRow._getLocale();121 oHelper.oLocaleData = oTimesRow._getLocaleData();122 oHelper.oNow = CalendarUtils._createUniversalUTCDate(new Date(), undefined, true);123 oHelper.sCurrentTime = oTimesRow._rb.getText("CALENDAR_CURRENT_TIME");124 oHelper.sId = oTimesRow.getId();125 oHelper.oFormatLong = oTimesRow._getFormatLong();126 oHelper.oFormatTime = oTimesRow._getFormatTime();127 oHelper.oFormatTimeAmPm = oTimesRow._oFormatTimeAmPm;128 oHelper.iMinutes = oTimesRow.getIntervalMinutes();129 var sLegendId = oTimesRow.getLegend();130 if (sLegendId) {131 var oLegend = sap.ui.getCore().byId(sLegendId);132 if (oLegend) {133 if (!(oLegend instanceof sap.ui.unified.CalendarLegend)) {134 throw new Error(oLegend + " is not an sap.ui.unified.CalendarLegend. " + oTimesRow);135 }136 oHelper.aTypes = oLegend.getItems();137 } else {138 jQuery.sap.log.warning("CalendarLegend " + sLegendId + " does not exist!", oTimesRow);139 }140 } else {141 oHelper.aTypes = [];142 }143 return oHelper;144 };145 TimesRowRenderer.renderTime = function(oRm, oTimesRow, oDate, oHelper, sWidth, sAmPm){146 var mAccProps = {147 role: "gridcell",148 selected: false,149 label: "",150 describedby: ""151 };152 var sYyyyMMddHHmm = oTimesRow._oFormatYyyyMMddHHmm.format(oDate.getJSDate(), true);153 var iSelected = oTimesRow._checkDateSelected(oDate);154 var oType = oTimesRow._getDateType(oDate);155 var bEnabled = oTimesRow._checkTimeEnabled(oDate);156 oRm.write("<div");157 oRm.writeAttribute("id", oHelper.sId + "-" + sYyyyMMddHHmm);158 oRm.addClass("sapUiCalItem");159 if (sWidth) {160 oRm.addStyle("width", sWidth);161 }162 var oNextInterval = new UniversalDate(oDate.getTime());163 oNextInterval.setUTCMinutes(oNextInterval.getUTCMinutes() + oHelper.iMinutes);164 if (oDate.getTime() <= oHelper.oNow.getTime() && oNextInterval.getTime() > oHelper.oNow.getTime()) {165 oRm.addClass("sapUiCalItemNow");166 mAccProps["label"] = oHelper.sCurrentTime + " ";167 }168 if (iSelected > 0) {169 oRm.addClass("sapUiCalItemSel"); // time selected170 mAccProps["selected"] = true;171 }172 if (iSelected == 2) {173 oRm.addClass("sapUiCalItemSelStart"); // interval start174 mAccProps["describedby"] = mAccProps["describedby"] + " " + oHelper.sId + "-Start";175 } else if (iSelected == 3) {176 oRm.addClass("sapUiCalItemSelEnd"); // interval end177 mAccProps["describedby"] = mAccProps["describedby"] + " " + oHelper.sId + "-End";178 } else if (iSelected == 4) {179 oRm.addClass("sapUiCalItemSelBetween"); // interval between180 } else if (iSelected == 5) {181 oRm.addClass("sapUiCalItemSelStart"); // interval start182 oRm.addClass("sapUiCalItemSelEnd"); // interval end183 mAccProps["describedby"] = mAccProps["describedby"] + " " + oHelper.sId + "-Start";184 mAccProps["describedby"] = mAccProps["describedby"] + " " + oHelper.sId + "-End";185 }186 if (oType && oType.type != sap.ui.unified.CalendarDayType.None) {187 oRm.addClass("sapUiCalItem" + oType.type);188 if (oType.tooltip) {189 oRm.writeAttributeEscaped('title', oType.tooltip);190 }191 }192 if (!bEnabled) {193 oRm.addClass("sapUiCalItemDsbl"); // time disabled194 mAccProps["disabled"] = true;195 }196 oRm.writeAttribute("tabindex", "-1");197 oRm.writeAttribute("data-sap-time", sYyyyMMddHHmm);198 mAccProps["label"] = mAccProps["label"] + oHelper.oFormatLong.format(oDate, true);199 if (oType && oType.type != sap.ui.unified.CalendarDayType.None) {200 // as legend must not be rendered add text of type201 for (var i = 0; i < oHelper.aTypes.length; i++) {202 var oLegendType = oHelper.aTypes[i];203 if (oLegendType.getType() == oType.type) {204 mAccProps["label"] = mAccProps["label"] + "; " + oLegendType.getText();205 break;206 }207 }208 }209 oRm.writeAccessibilityState(null, mAccProps);210 oRm.writeClasses();211 oRm.writeStyles();212 oRm.write(">"); // div element213 oRm.write("<span");214 oRm.addClass("sapUiCalItemText");215 oRm.writeClasses();216 oRm.write(">"); // span217 oRm.write(oHelper.oFormatTime.format(oDate, true));218// oRm.write("</span>");219 if (sAmPm) {220 oRm.write("<span");221 oRm.addClass("sapUiCalItemTextAmPm");222 oRm.writeClasses();223 oRm.write(">"); // span224 oRm.write(sAmPm);225 oRm.write("</span>");226 }227 oRm.write("</span>");228 oRm.write("</div>");229 };230 return TimesRowRenderer;...
time.jsx
Source:time.jsx
1import React from "react";2import PropTypes from "prop-types";3import {4 getHour,5 getMinute,6 newDate,7 getStartOfDay,8 addMinutes,9 cloneDate,10 formatDate,11 isTimeInDisabledRange,12 isTimeDisabled,13 timesToInjectAfter14} from "./date_utils";15export default class Time extends React.Component {16 static propTypes = {17 format: PropTypes.string,18 includeTimes: PropTypes.array,19 intervals: PropTypes.number,20 selected: PropTypes.object,21 onChange: PropTypes.func,22 todayButton: PropTypes.string,23 minTime: PropTypes.object,24 maxTime: PropTypes.object,25 excludeTimes: PropTypes.array,26 monthRef: PropTypes.object,27 timeCaption: PropTypes.string,28 injectTimes: PropTypes.array29 };30 static get defaultProps() {31 return {32 intervals: 30,33 onTimeChange: () => {},34 todayButton: null,35 timeCaption: "Time"36 };37 }38 componentDidMount() {39 // code to ensure selected time will always be in focus within time window when it first appears40 const multiplier = 60 / this.props.intervals;41 const currH = this.props.selected42 ? getHour(this.props.selected)43 : getHour(newDate());44 this.list.scrollTop = 30 * (multiplier * currH);45 }46 handleClick = time => {47 if (48 ((this.props.minTime || this.props.maxTime) &&49 isTimeInDisabledRange(time, this.props)) ||50 (this.props.excludeTimes &&51 isTimeDisabled(time, this.props.excludeTimes)) ||52 (this.props.includeTimes &&53 !isTimeDisabled(time, this.props.includeTimes))54 ) {55 return;56 }57 this.props.onChange(time);58 };59 liClasses = (time, currH, currM) => {60 let classes = ["react-datepicker__time-list-item"];61 if (currH === getHour(time) && currM === getMinute(time)) {62 classes.push("react-datepicker__time-list-item--selected");63 }64 if (65 ((this.props.minTime || this.props.maxTime) &&66 isTimeInDisabledRange(time, this.props)) ||67 (this.props.excludeTimes &&68 isTimeDisabled(time, this.props.excludeTimes)) ||69 (this.props.includeTimes &&70 !isTimeDisabled(time, this.props.includeTimes))71 ) {72 classes.push("react-datepicker__time-list-item--disabled");73 }74 if (75 this.props.injectTimes &&76 (getHour(time) * 60 + getMinute(time)) % this.props.intervals !== 077 ) {78 classes.push("react-datepicker__time-list-item--injected");79 }80 return classes.join(" ");81 };82 renderTimes = () => {83 let times = [];84 const format = this.props.format ? this.props.format : "hh:mm A";85 const intervals = this.props.intervals;86 const activeTime = this.props.selected ? this.props.selected : newDate();87 const currH = getHour(activeTime);88 const currM = getMinute(activeTime);89 let base = getStartOfDay(newDate());90 const multiplier = 1440 / intervals;91 const sortedInjectTimes =92 this.props.injectTimes &&93 this.props.injectTimes.sort(function(a, b) {94 return a - b;95 });96 for (let i = 0; i < multiplier; i++) {97 const currentTime = addMinutes(cloneDate(base), i * intervals);98 times.push(currentTime);99 if (sortedInjectTimes) {100 const timesToInject = timesToInjectAfter(101 base,102 currentTime,103 i,104 intervals,105 sortedInjectTimes106 );107 times = times.concat(timesToInject);108 }109 }110 return times.map((time, i) => (111 <li112 key={i}113 onClick={this.handleClick.bind(this, time)}114 className={this.liClasses(time, currH, currM)}115 >116 {formatDate(time, format)}117 </li>118 ));119 };120 render() {121 let height = null;122 if (this.props.monthRef) {123 height = this.props.monthRef.clientHeight - 39;124 }125 return (126 <div127 className={`react-datepicker__time-container ${128 this.props.todayButton129 ? "react-datepicker__time-container--with-today-button"130 : ""131 }`}132 >133 <div className="react-datepicker__header react-datepicker__header--time">134 <div className="react-datepicker-time__header">135 {this.props.timeCaption}136 </div>137 </div>138 <div className="react-datepicker__time">139 <div className="react-datepicker__time-box">140 <ul141 className="react-datepicker__time-list"142 ref={list => {143 this.list = list;144 }}145 style={height ? { height } : {}}146 >147 {this.renderTimes.bind(this)()}148 </ul>149 </div>150 </div>151 </div>152 );153 }...
format.js
Source:format.js
1/**2 * Formats nested key val array to key val map3 * @param {Array} keyValArray - [['key', 'val'], ..]4 * @returns {Object} - { key: val, ..}5 */6export const formatKeyVal = keyValArray => {7 const keyValObj = {}8 // strip out empties (if BOTH key and val empty)9 for (let keyVal of keyValArray) {10 if (keyVal[0] === '' && keyVal[1] === '') continue11 keyValObj[keyVal[0]] = keyVal[1]12 }13 return keyValObj14}15/**16 * Formats a request object to axios config input17 * @param {Object} request - provided request object18 * @returns {Object} - formatted to axios request config19 */20export const formatToAxios = request => {21 const params = request.params.form22 const headers = request.headers.form23 const body = request.body[request.body.active]24 const axiosConfig = {25 method: request.method,26 url: request.url27 }28 if (headers.length) axiosConfig.headers = formatKeyVal(headers)29 if (params.length) axiosConfig.params = formatKeyVal(params)30 // request body excluded for GET requests31 if (request.method !== 'get') {32 // form data handled on `requests` worker, as read stream for file uploads can't be33 // passed as arg, and new stream needed for each request (see 'utils/request.js')34 if (request.body.active === 'form' && body.length) axiosConfig.data = body35 if (request.body.active === 'text' && body) axiosConfig.data = body36 if (request.body.active === 'json' && body) axiosConfig.data = JSON.parse(body)37 }38 return axiosConfig39}40/**41 * Aggregates all responses from request workers42 * @param {Array} responses - worker responses [ { times: [], statusCodes: [] }, ...]43 * @returns {Object} - { times: [], statusCodes: { code: amount, ... } }44 */45export const aggregateResponses = responses => {46 let times = []47 let statusCodes = {}48 responses.forEach(response => {49 times = times.concat(response.times)50 response.statusCodes.forEach(code => {51 if (statusCodes[code]) {52 statusCodes[code] += 153 } else {54 statusCodes[code] = 155 }56 })57 })58 return { times, statusCodes }59}60/**61 * Sorts array of int times62 * @param {Array} times - unsorted, single depth array of int times63 * @returns {Array} - [ sorted times ... ]64 */65export const sortTimes = times => {66 // TODO: implement better sorting algorithm for large data sets67 return times.sort((a, b) => a - b)68}69/**70 * Formats sorted response times to a percentile distribution71 * @param {Array} sortedResponseTimes - sorted, single depth array of int response times72 * @returns {Object} - { 10: requestTimesforPercentile, 25: requestTimesforPercentile, ...}73 */74export const latencyDistribution = sortedResponseTimes => {75 const distribution = {}76 const times = sortedResponseTimes77 const tenPercent = Math.floor(times.length / 10)78 const twentyFivePercent = Math.floor(times.length / 4)79 const fiftyPercent = Math.floor(times.length / 2)80 const seventyFivePercent = Math.floor((times.length / 4) * 3)81 const ninetyPercent = Math.floor((times.length / 10) * 9)82 const ninetyNinePercent = times.length - Math.floor(times.length / 100)83 const oneHundredPercent = times.length84 if (times.length >= 10 && tenPercent) distribution['10'] = times[tenPercent - 1]85 if (times.length >= 4 && twentyFivePercent) distribution['25'] = times[twentyFivePercent - 1]86 if (times.length >= 2 && fiftyPercent) distribution['50'] = times[fiftyPercent - 1]87 if (times.length >= 4 && seventyFivePercent) distribution['75'] = times[seventyFivePercent - 1]88 if (times.length >= 10 && ninetyPercent) distribution['90'] = times[ninetyPercent - 1]89 if (times.length >= 100 && ninetyNinePercent) distribution['99'] = times[ninetyNinePercent - 1]90 if (ninetyNinePercent) distribution['100'] = times[oneHundredPercent - 1]91 return distribution...
profiler.js
Source:profiler.js
1/*!2 * Augment mw.loader to facilitate module-level profiling.3 *4 * @since 1.325 */6/* global mw */7( function () {8 'use strict';9 var moduleTimes = Object.create( null );10 /**11 * Private hooks inserted into mw.loader code if MediaWiki configuration12 * `$wgResourceLoaderEnableJSProfiler` is `true`.13 *14 * To use this data, run `mw.inspect( 'time' )` from the browser console.15 * See mw#inspect().16 *17 * @private18 * @class19 * @singleton20 */21 mw.loader.profiler = {22 onExecuteStart: function ( moduleName ) {23 var time = performance.now();24 if ( moduleTimes[ moduleName ] ) {25 throw new Error( 'Unexpected perf record for "' + moduleName + '".' );26 }27 moduleTimes[ moduleName ] = {28 executeStart: time,29 executeEnd: null,30 scriptStart: null,31 scriptEnd: null32 };33 },34 onExecuteEnd: function ( moduleName ) {35 var time = performance.now();36 moduleTimes[ moduleName ].executeEnd = time;37 },38 onScriptStart: function ( moduleName ) {39 var time = performance.now();40 moduleTimes[ moduleName ].scriptStart = time;41 },42 onScriptEnd: function ( moduleName ) {43 var time = performance.now();44 moduleTimes[ moduleName ].scriptEnd = time;45 },46 /**47 * For internal use by inspect.reports#time.48 *49 * @private50 * @param {string} moduleName51 * @return {Object|null}52 * @throws {Error} If the perf record is incomplete.53 */54 getProfile: function ( moduleName ) {55 var times, key, execute, script, total;56 times = moduleTimes[ moduleName ];57 if ( !times ) {58 return null;59 }60 for ( key in times ) {61 if ( times[ key ] === null ) {62 throw new Error( 'Incomplete perf record for "' + moduleName + '".', times );63 }64 }65 execute = times.executeEnd - times.executeStart;66 script = times.scriptEnd - times.scriptStart;67 total = execute + script;68 return {69 name: moduleName,70 execute: execute,71 script: script,72 total: total73 };74 }75 };...
times.test.js
Source:times.test.js
1'use strict';2require('should');3describe('times', function ( ) {4 var times = require('../lib/times');5 it('hours to mins, secs, and msecs', function () {6 times.hour().mins.should.equal(60);7 times.hour().secs.should.equal(3600);8 times.hour().msecs.should.equal(3600000);9 times.hours(3).mins.should.equal(180);10 times.hours(3).secs.should.equal(10800);11 times.hours(3).msecs.should.equal(10800000);12 });13 it('mins to secs and msecs', function () {14 times.min().secs.should.equal(60);15 times.min().msecs.should.equal(60000);16 times.mins(2).secs.should.equal(120);17 times.mins(2).msecs.should.equal(120000);18 });19 it('secs as msecs', function () {20 times.sec().msecs.should.equal(1000);21 times.secs(15).msecs.should.equal(15000);22 });...
Using AI Code Generation
1import { Selector } from 'testcafe';2test('My first test', async t => {3 .typeText('#developer-name', 'John Smith')4 .click('#submit-button')5 .wait(3000)6 .click('#tried-test-cafe')7 .click('#macos')8 .click('#submit-button')9 .wait(3000)10 .click('#article-header');11});12test('My second test', async t => {13 .typeText('#developer-name', 'John Smith')14 .click('#submit-button')15 .wait(3000)16 .click('#tried-test-cafe')17 .click('#macos')18 .click('#submit-button')19 .wait(3000)20 .click('#article-header');21});22 .beforeEach( async t => {23 .maximizeWindow()24 .typeText('#developer-name', 'John Smith')25 .click('#submit-button')26 .wait(3000)27 .click('#tried-test-cafe')28 .click('#macos')29 .click('#submit-button')30 .wait(3000)31 .click('#article-header');32 })33 ('My first test', async t => {34 .click('#article-header');35 })36 .times(2);
Using AI Code Generation
1import { Selector } from 'testcafe';2test('My first test', async t => {3 .typeText('#developer-name', 'John Smith')4 .click('#submit-button')5 .expect(Selector('#article-header').innerText).eql('Thank you, John Smith!');6});7import { Selector } from 'testcafe';8test('My first test', async t => {9 .typeText('#developer-name', 'John Smith')10 .click('#submit-button')11 .expect(Selector('#article-header').innerText).eql('Thank you, John Smith!');12});13import { Selector } from 'testcafe';14test('My first test', async t => {15 .typeText('#developer-name', 'John Smith')16 .click('#submit-button')17 .expect(Selector('#article-header').innerText).eql('Thank you, John Smith!');18});19import { Selector } from 'testcafe';20test('My first test', async t => {21 .typeText('#developer-name', 'John Smith')22 .click('#submit-button')23 .expect(Selector('#article-header').innerText).eql('Thank you, John Smith!');24});25import { Selector } from 'testcafe';26test('My first test', async t => {
Using AI Code Generation
1import { Selector } from 'testcafe';2test('My first test', async t => {3 .typeText('#developer-name', 'John Smith')4 .click('#submit-button');5 const articleHeader = await Selector('.result-content').find('h1');6 let headerText = await articleHeader.innerText;7});8> 14 | let headerText = await articleHeader.innerText;9const articleHeader = await Selector('.result-content').find('h1');10const articleHeader = await Selector('.result-content').find('h1').withText('Thank you, John Smith!');
Using AI Code Generation
1import { Selector } from 'testcafe';2test('My first test', async t => {3 .typeText('#developer-name', 'John Smith')4 .click('#windows')5 .click('#submit-button');6});7import { Selector } from 'testcafe';8test('My first test', async t => {9 .typeText('#developer-name', 'John Smith')10 .click('#windows')11 .click('#submit-button');12});13import { Selector } from 'testcafe';14test('My first test', async t => {15 .typeText('#developer-name', 'John Smith')16 .click('#windows')17 .click('#submit-button');18});19import { Selector } from 'testcafe';20test('My first test', async t => {21 .typeText('#developer-name', 'John Smith')22 .click('#windows')23 .click('#submit-button');24});25import { Selector } from 'testcafe';26test('My first test', async t => {27 .typeText('#developer-name', 'John Smith')28 .click('#windows')29 .click('#submit-button');30});31import { Selector } from 'testcafe';32test('My first test', async t => {33 .typeText('#developer-name',
Using AI Code Generation
1import { Selector } from 'testcafe';2test('My test', async t => {3 const slider = Selector('#slider');4 .click(slider)5 .pressKey('right')6 .pressKey('right')7 .pressKey('right')8 .pressKey('right')9 .pressKey('right');10});11import { Selector } from 'testcafe';12test('My test', async t => {13 const slider = Selector('#slider');14 .click(slider)15 .pressKey('right'.times(5));16});17import { Selector } from 'testcafe';18test('My test', async t => {19 const macOSRadioButton = Selector('label').withText('MacOS');20 .click(macOSRadioButton);21});22import { Selector } from 'testcafe
Using AI Code Generation
1import { Selector } from 'testcafe';2test('My test', async t => {3});4import { Selector } from 'testcafe';5test('My test', async t => {6});
Using AI Code Generation
1import { Selector } from 'testcafe';2test('My first test', async t => {3 .click('#populate')4 .click(Selector('input[type=radio]').withAttribute('value', 'Bugs'));5});6import { Selector } from 'testcafe';7test('My first test', async t => {8 .click('#populate')9 .click(Selector('input[type=radio]').nth(1));10});11import { Selector } from 'testcafe';12test('My first test', async t => {13 .click('#populate')14 .click(Selector('input[type=radio]').withText('Bugs'));15});16import { Selector } from 'testcafe';17test('My first test', async t => {18 .click('#populate')19 .click(Selector('input[type=radio]').filter('[value="Bugs"]'));20});21import { Selector } from 'testcafe';22test('My first test', async t => {23 .click('#populate')24 .click(Selector('input[type=radio]').withExactText('Bugs'));25});26import { Selector } from 'testcafe';
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!