File: src/device/Device.js
/**
* license inazumatv.com
* author (at)taikiken / http://inazumatv.com
* date 2015/04/10 - 15:34
*
* Copyright (c) 2011-2015 inazumatv.com, inc.
*
* Distributed under the terms of the MIT license.
* http://www.opensource.org/licenses/mit-license.html
*
* This notice shall be included in all copies or substantial portions of the Software.
*
*/
/**
* @module Sagen
* @submodule Device
* */
( function ( window ){
'use strict';
var
Sagen = window.Sagen;
Sagen.Device = ( function (){
var
Browser = Sagen.Browser,
Android = Browser.Android,
iOS = Browser.iOS,
Mac = Browser.Mac,
Windows = Browser.Windows,
Css3 = Browser.Css3,
Element = Browser.Element,
Safari = Browser.Safari,
Chrome = Browser.Chrome,
Firefox = Browser.Firefox,
IE = Browser.IE,
Edge = Browser.Edge,
Orientation = Sagen.Orientation,
Classes = Sagen.Classes,
/**
* @property _classes
* @static
* @private
* @type {Classes}
*/
_classes;
/**
* @class Device
* @static
* @constructor
*/
function Device () {
throw new Error( 'Device can\'t create instance.' );
}
var p = Device.prototype;
p.constructor = Device;
/**
* @method init
* @static
*/
Device.init = function () {
var
classes = new Classes( [] );
_classes = classes;
Device._default( classes )
._option( classes )
.call( function () {
classes.write();
} );
};
/**
* @method call
* @static
* @param {function} func
*/
Device.call = function ( func ) {
func();
};
/**
* @method _default
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._default = function ( classes ) {
// default
Device._ios( classes )
._android( classes )
._css3( classes )
._os( classes );
return Device;
};
/**
* @method _option
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._option = function ( classes ) {
if ( Sagen.dataSet( 'browser' ) ) {
Device._ie( classes )
._chrome( classes )
._safari( classes )
._firefox( classes )
._edge( classes );
}
if ( Sagen.dataSet( 'canvas' ) ) {
Device._canvas( classes );
}
// orientation
// ToDo: orientation change
if ( Sagen.dataSet( 'orientation' ) && ( iOS.is() || Android.is()) ) {
Orientation.on( Orientation.CHANGE_ORIENTATION, Device._onOrientation );
Orientation.init();
}
return Device;
};
/**
* @method _version
* @static
* @param {Classes} classes
* @param {string} prefix
* @param {Array} numbers
* @return {Device}
* @private
*/
Device._version = function ( classes, prefix, numbers ) {
var
version = '',
_ = '_',
i, limit;
for ( i = 0, limit = numbers.length; i < limit; i = i + 1 ) {
version += numbers[ i ] + '';
classes.add( prefix + version );
version += _;
}
return Device;
};
/**
* @method _ios
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._ios = function ( classes ) {
var
prefix;
if ( iOS.is() ) {
// iOS
prefix = 'ios';
classes.add( prefix );
if ( iOS.iPad() ) {
// ipad
classes.add( 'ipad' ).add( 'tablet' );
} else if ( iOS.iPod() ) {
// ipod
classes.add( 'ipod' ).add( 'mobile' );
} else if ( iOS.iPhone() ) {
// ipod
classes.add( 'iphone' ).add( 'mobile' );
}
// version
Device._version( classes, prefix, iOS.numbers() );
}
return Device;
};
/**
* @method _android
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._android = function ( classes ) {
var
prefix;
if ( Android.is() ) {
// iOS
prefix = 'android';
classes.add( prefix );
if ( Android.tablet() ) {
// ipad
classes.add( 'tablet' );
} else if ( Android.phone() ) {
// ipod
classes.add( 'mobile' );
}
if ( Android.standard() ) {
classes.add( 'android-standard' );
}
if ( Android.hd() ) {
classes.add( 'android-hd' );
}
// version
Device._version( classes, prefix, Android.numbers() );
}
return Device;
};
/**
* @method _css3
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._css3 = function ( classes ) {
if ( Css3.transition() ) {
classes.add( 'transition' );
}
if ( Css3.transform() ) {
classes.add( 'transform' );
}
if ( Css3.matchMedia() ) {
classes.add( 'matchMedia' );
}
if ( Css3.orientation() ) {
classes.add( 'orientation' );
}
if ( Css3.orientationChange() ) {
classes.add( 'orientation-change' );
}
if ( Css3.backgroundSize() ) {
classes.add( 'background-size' );
}
return Device;
};
/**
* @method _element
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._element = function ( classes ) {
if ( Element.touch() ) {
classes.add( 'touch' );
}
if ( Element.querySelector() ) {
classes.add( 'querySelector' );
}
return Device;
};
/**
* @method _os
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._os = function ( classes ) {
var
pc = false;
if ( Mac.is() ) {
classes.add( 'mac' );
pc = true;
}
if ( Windows.is() ) {
classes.add( 'windows' );
pc = true;
}
if ( pc ) {
classes.add( 'other' );
}
return Device;
};
/**
* @method _safari
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._safari = function ( classes ) {
var
prefix;
if ( Safari.is() ) {
prefix = 'safari';
classes.add( prefix );
// version
Device._version( classes, prefix, Safari.numbers() );
}
return Device;
};
/**
* @method _chrome
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._chrome = function ( classes ) {
var
prefix;
if ( Chrome.is() ) {
prefix = 'chrome';
classes.add( prefix );
// version
Device._version( classes, prefix, Chrome.numbers() );
}
return Device;
};
/**
* @method _firefox
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._firefox = function ( classes ) {
var
prefix;
if ( Firefox.is() ) {
prefix = 'firefox';
classes.add( prefix );
// version
Device._version( classes, prefix, Firefox.numbers() );
}
return Device;
};
/**
* @method _firefox
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._edge = function ( classes ) {
var
prefix;
if ( Edge.is() ) {
prefix = 'edge';
classes.add( prefix );
// version
Device._version( classes, prefix, Edge.numbers() );
}
return Device;
};
/**
* @method _ie
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._ie = function ( classes ) {
var
prefix;
if ( IE.is() ) {
prefix = 'ie';
classes.add( prefix );
// version
Device._version( classes, prefix, String( IE.version() ).split( "." ) );
}
return Device;
};
/**
* @method _canvas
* @static
* @param {Classes} classes
* @return {Device}
* @private
*/
Device._canvas = function ( classes ) {
if ( Element.canvas() ) {
classes.add( 'canvas' );
if ( Element.webgl() ) {
classes.add( 'webgl' );
}
}
return Device;
};
/**
* orientation event handler
* @method _onOrientation
* @static
* @param {Object} event
* @private
*/
Device._onOrientation = function ( event ) {
var
direction = event.direction;
if ( direction === 'portrait' ) {
_classes.removeClass( 'landscape' ).addClass( 'portrait' );
} else if ( direction === 'landscape' ) {
_classes.removeClass( 'portrait' ).addClass( 'landscape' );
}
};
return Device;
}() );
}( window ) );