diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/res/smw/data/ext.smw.dataItem.time.js')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/res/smw/data/ext.smw.dataItem.time.js | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/res/smw/data/ext.smw.dataItem.time.js b/www/wiki/extensions/SemanticMediaWiki/res/smw/data/ext.smw.dataItem.time.js new file mode 100644 index 00000000..d018a902 --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/res/smw/data/ext.smw.dataItem.time.js @@ -0,0 +1,246 @@ +/** + * SMW Time DataItem JavaScript representation + * + * @see SMW\DITime + * + * @since 1.9 + * + * @file + * @ingroup SMW + * + * @licence GNU GPL v2 or later + * @author mwjames + */ +( function( $, mw, smw ) { + 'use strict'; + + /** + * Inheritance class + * + * @type Object + */ + smw.dataItem = smw.dataItem || {}; + + /** + * Date constructor + * + * @since 1.9 + * + * @param {string|number} + * @param {string|number} + * + * @return {this} + */ + var time = function ( timestamp, raw ) { + var FLAG_YEAR = 1; + var FLAG_MONTH = 2; + var FLAG_DAY = 4; + var FLAG_TIME = 8; + + this.timestamp = timestamp !== '' && timestamp !== undefined ? timestamp : null; + this.raw = raw !== '' && raw !== undefined ? raw : null; + this.precision = 0; + + // Returns a normalized timestamp as JS date object + if ( typeof this.timestamp === 'number' ) { + this.date = new Date( this.timestamp * 1000 ); + } + + if ( typeof this.timestamp === 'string' ) { + if ( this.timestamp.match(/^\d+(\.\d+)?$/) ) { + this.date = new Date( parseFloat( this.timestamp ) * 1000 ); + } + } + + // SMW serialization format with: + if ( this.raw !== null ) { + var date = this.raw.split( '/' ); + + // [0] contains the calendar model + this.calendarModel = date[0]; + this.precision = FLAG_YEAR; + + if ( typeof date[2] !== 'undefined' ) { + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date + // Note: January is 0, February is 1, and so on + date[2] = date[2] - 1; + this.precision = this.precision | FLAG_MONTH; + } else { + date[2] = 0; + } + + if ( typeof date[3] !== 'undefined' ) { + this.precision = this.precision | FLAG_DAY; + } else { + date[3] = 0; + } + + if ( typeof date[4] !== 'undefined' ) { + this.precision = this.precision | FLAG_TIME; + } else { + date[4] = 0; + } + + if ( typeof date[5] === 'undefined' ) { + date[5] = 0; + } + + if ( typeof date[6] === 'undefined' ) { + date[6] = 0; + } + + // Date is called as a constructor with more than one argument, the + // specifed arguments represent local time. If UTC is desired, use + // new Date(Date.UTC(...)) + this.date = new Date( Date.UTC( date[1], date[2], date[3], date[4], date[5], date[6] ) ); + }; + + return this; + }; + + /** + * Map wgMonthNames and create an indexed array + * + */ + var monthNames = []; + $.map ( mw.config.get( 'wgMonthNames' ), function( index ) { + if( index !== '' ) { + monthNames.push( index ); + } + } ); + + /** + * Constructor + * + * @type object + */ + smw.dataItem.time = function( timestamp, raw ) { + if ( $.type( timestamp ) === 'string' || 'number' ) { + this.constructor( timestamp, raw ); + } else { + throw new Error( 'smw.dataItem.time: timestamp must be a string or number' ); + } + }; + + /* Public methods */ + + var fn = { + + constructor: time, + + /** + * Returns type + * + * @see SMW\DITime::getDIType() + * + * @since 1.9 + * + * @return {string} + */ + getDIType: function() { + return '_dat'; + }, + + /** + * Returns a MW timestamp representation of the value + * + * @see SMW\DITime::getMwTimestamp() + * + * @since 1.9 + * + * @return {string} + */ + getMwTimestamp: function() { + return this.timestamp; + }, + + /** + * Returns Date object + * + * @since 1.9 + * + * @return {Date} + */ + getDate: function() { + return this.date; + }, + + /** + * Returns an ISO string + * + * @see SMWTimeValue::getISO8601Date() + * + * @since 1.9 + * + * @return {string} + */ + getISO8601Date: function() { + return this.date.toISOString(); + }, + + /** + * Returns a formatted time (HH:MM:SS) + * + * In case of no time '00:00:00' is returned + * + * @since 1.9 + * + * @return {string} + */ + getTimeString: function() { + var d = this.date; + if ( d.getUTCHours() + d.getUTCMinutes() + d.getUTCSeconds() === 0 ){ + return '00:00:00'; + } + return ( d.getUTCHours() < 10 ? '0' + d.getUTCHours() : d.getUTCHours() ) + + ':' + ( d.getUTCMinutes() < 10 ? '0' + d.getUTCMinutes() : d.getUTCMinutes() ) + + ':' + ( d.getUTCSeconds() < 10 ? '0' + d.getUTCSeconds() : d.getUTCSeconds() ); + }, + + /** + * Returns MediaWiki's date and time formatting + * + * @since 1.9 + * + * @return {string} + */ + getMediaWikiDate: function() { + + var FLAG_YEAR = 1; + var FLAG_MONTH = 2; + var FLAG_DAY = 4; + var FLAG_TIME = 8; + + var CM_GREGORIAN = 1; + var CM_JULIAN = 2; + + // Fallback + if ( this.date === undefined ) { + return ''; + }; + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date + // Use the precision from the raw date + if ( this.precision > 0 ) { + var calendarModel = this.calendarModel !== undefined && this.calendarModel == CM_JULIAN ? ' <sup>JL</sup>' : ''; + + return '' + + ( ( this.precision & FLAG_DAY ) ? ( this.date.getUTCDate() ) + ' ' + ( monthNames[(this.date.getUTCMonth())] ) + ' ' : '' ) + + ( ( this.precision & FLAG_YEAR ) ? ( this.date.getUTCFullYear() ) + ' ' : '' ) + + ( ( this.precision & FLAG_TIME ) && this.getTimeString() !== '00:00:00' ? ( this.getTimeString() ) : '' ) + calendarModel; + }; + + return this.date.getUTCDate() + ' ' + + monthNames[this.date.getUTCMonth()] + ' ' + + this.date.getUTCFullYear() + + ( this.getTimeString() !== '00:00:00' ? ' ' + this.getTimeString() : '' ); + } + }; + + // Alias + fn.getValue = fn.getMwTimestamp; + + // Assign methods + smw.dataItem.time.prototype = fn; + +} )( jQuery, mediaWiki, semanticMediaWiki ); |