Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/examples/lessons/6_English_VocabularyBirds/js/karma.js
diff options
context:
space:
mode:
Diffstat (limited to 'examples/lessons/6_English_VocabularyBirds/js/karma.js')
-rwxr-xr-xexamples/lessons/6_English_VocabularyBirds/js/karma.js1018
1 files changed, 0 insertions, 1018 deletions
diff --git a/examples/lessons/6_English_VocabularyBirds/js/karma.js b/examples/lessons/6_English_VocabularyBirds/js/karma.js
deleted file mode 100755
index 03f027b..0000000
--- a/examples/lessons/6_English_VocabularyBirds/js/karma.js
+++ /dev/null
@@ -1,1018 +0,0 @@
-/* Documentation Note:
- * Public methods and properties are commented with /** some text *\/
- * and private methods and properties are commented with //
- *
- * Please leave it that way to keep this documentation sane
- */
-
-
-/*
-* Karma Framework
-* http://karmaeducation.org
-*
-* Copyright (c) 2009
-* Bryan W Berry bryan@olenepal.org
-* Felipe López Toledo zer.subzero@gmail.com
-*
-* Under MIT License:
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-* OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-/**
-* @fileOverview Contains karma library
-* @author Bryan Berry <bryan@olenepal.org>
-* @author Felipe Lopez Toledo <zer.subzero@gmail.com>
-*/
-
-
-//common.js modules use exports object
-if(!this.exports) {
- exports = {};
-}
-
-
-
-/** Checks if the current document type is set to HTML 5, throws
- * an error otherwise, then initializes the karma object and returns
- * a reference to that object.
- * @namespace Global namespace for Karma library
- * @param {Object} [options={}] options for intializing Karma library
- * @param {String} [options.locale=''] sets current locale Not Yet Implemented
- * @param {Array} [options.image=[]] array of images to be converted into a collection
- * @param {Array} [options.audio=[]] array of audio to be converted into a collection
- * @param {Array} [options.video=[]] array of videos to be converted into a collection
- * @param {Array} [options.svg=[]] array of SVG elements to be
- * converted into a collection. Each SVG element must already exist in the html document
- * @param {Array} [options.canvas=[]] array of canvas elements
- * to be converted into a collection. Each canvas element must already exist in the
- * html document and width and height of each element must be set as attributes
- * @throws {Error} if the document type declaration is not set to HTML 5, e.g.
- * <!DOCTYPE html>
- * @throws {Error} If any of the initialization parameters are invalid values
- * @returns {Object} Karma.karma -- reference to the initialized Karma library
- * @example
- *
- * var k = Karma({
- * image: [
- * {name: "ninja", file: "ninja.png"},
- * {name: "cowboy", file: "cowboy.png"}
- * ],
- * audio: [
- * {name: "woosh", file: "woosh.ogg"},
- * {name: "yeehaw", file: "yeehaw.ogg"}
- * ],
- * video: [
- * {name: "attack", file: "attack.ogv"},
- * {name: "ride", file: "ride.ogv"}
- * ]
- * canvas: [
- * {name: "ninja", domId: "ninjaCanvas"},
- * {name: "cowboy", domId: "cowboyCanvas"}
- * ],
- * svg: [
- * {name: "ninja", domId: "ninjaSvg"},
- * {name: "cowboy", domId: "cowboySvg"}
- * ],
- * });
- * Next, call the ready function with a callback to your program code
- *
- * k.ready(function () { ... your application code . . . }
- *
- * after that you can access each asset like so
- * k.image.ninja;
- * k.svg.cowboy;
- * k.audio.yeehaw.play();
- * k.canvas.ninja.drawImage(k.image.ninja, 0, 0);
- *
- */
-var Karma = exports.Karma = function (options) {
- Karma._isHtml5(document.doctype.nodeName);
-
- if ( Karma.karma._initialized === true ) {
- return Karma.karma;
- } else {
- return Karma.karma._init(options);
- }
-};
-
-
-//helper functions
-
-/**This emulates the Object.create method in ecmascript 5 spec
- * This isn't a full implementation as it doesn't support
- * This has the same functionality as Crockford's beget method
- * and this primary building block for prototypal inheritance in
- * this library
- * @param {Object} target that the new object's prototype should point to
- * @returns {Object} object whose prototype points to target
- * @example
- *
- * var ninja = { weapon : "sword" };
- * var ninja1 = Karma.create(ninja);
- * ninja1.sword === "sword"
- */
-Karma.create = function (target){
- function F () {};
- F.prototype = target;
- return new F();
-};
-
-/** Returns a shallow copy of the passed in object
- * @param {Object} target to be copied
- * @returns {Object} a shallow copy of target
- */
-Karma.clone = function (target){
- var copy = {};
- for ( var i in target ) {
- if(target.hasOwnProperty(i)){
- copy[i] = target[i];
- }
- }
- return copy;
-};
-
-/** Extends properties of the target object with those of
- * the source object
- * @param {Object} target object to be extended
- * @param {Object} source whose properties will extend target
- * @returns {Object} target extended by source
- */
-Karma.objectPlus = function (target, source){
- for ( var i in source){
- if (source.hasOwnProperty(i)){
- target[i] = source[i];
- }
- }
- return target;
-};
-
-/** Creates a new object that is a prototype of the first argument
- * then extends it with the properties of the second argument
- * @param {Object} parent1 will be prototype of returned object
- * @param {Object} parent2 will extend properties of returned object
- * @returns {Object} object that whose prototype is parent1 and has
- * been extended with properties of parent2
- */
-Karma.copyObjectPlus = function (parent1, parent2){
- function F () {};
- F.prototype = parent1;
- var G = new F();
- return Karma.objectPlus(G, parent2);
-};
-
-//Enables function chaining for a specified list of function names
-//IMPORTANT: use of closures here with "this" and "that" is __very__
-//complicated here
-Karma._makeChain = function (chainingFunctions) {
- var that = this;
- var _chainFunction = function ( name ){
- that[ name ] = function ( ){
- var type = typeof this.ctx[name];
- if ( type === "function") {
- this.ctx[ name ].apply( this.ctx, arguments );
- }else if ( type === "string" ){
- this.ctx[ name ] = arguments[0];
- }else {
- throw ("wtf?!: impossible to chain " + name + "!");
- }
- return this;
- };
- };
-
- for (var i = 0; i < chainingFunctions.length; i++){
- _chainFunction( chainingFunctions[ i ] );
- }
-};
-
-//Throws big ugly error if doctype isn't html5
-Karma._isHtml5 = function (doctype){
- var regex = new RegExp('^html$', 'i');
- if(!regex.test(doctype)){
- var errorMsg = "ERROR: The doctype must be set to <!DOCTYPE html> " +
- "in order to use Karma. Karma require you use html5";
- var errorElem = document.createElement('div');
- errorElem.setAttribute('id', 'errorDoctype');
- errorElem.innerText = errorMsg;
- document.body.appendChild(errorElem);
- throw new Error(errorMsg);
- }
-};
-
-
-/** Stores global settings for the Karma library
- * @class This object stores the global settings for the Karma library
- */
-Karma.karma = {
- /** This is the global locale as passed to Karma(),
- * such as "en", "es_SP"
- * @type string
- * @default undefined
- */
- locale : undefined,
- /** Collection of images with special helper
- * methods added to each reference
- * @type object
- * @default empty object
- */
- image : {},
- /** Collection of audio with special helper
- * methods added to each reference
- * @type object
- * @default empty object
- */
- audio : {},
- /** Collection of canvas with special helper
- * methods added to each reference
- * @type object
- * @default empty object
- */
- canvas : {},
- /** Collection of svgs with special helper
- * methods added to each reference
- * @type object
- * @default empty object
- */
- svg : {},
- /** Collection of videos with special helper
- * methods added to each reference
- * @type object
- * @default empty object
- */
- video : {},
- _localized : false,
- _assetPath : "assets/",
- _localePath : "",
- _initialized : false,
- _statusDiv: undefined,
- _loaderDiv : undefined,
- _counters : { total : 0, errors : 0, loaded : 0},
-
- //init initializes all the assets passed to Karma, that's it
- //it returns 'this' so it can be used for function chaining
- _init: function(options) {
- this._initialized = true;
-
- //set up message that show count of assets loaded
- //and has an ordered list to append error messages to
- var _statusDiv = this._statusDiv = document.createElement('div');
- this._loaderDiv = this._loaderDiv = document.createElement('div');
- var errorList = document.createElement('ol');
-
- _statusDiv.setAttribute('id', 'karma-status');
- _statusDiv.setAttribute('style', 'position:absolute;');
- _statusDiv.innerHTML = 'Karma is loading ...';
- this._loaderDiv.setAttribute('id', 'karma-loader');
- this._loaderDiv.setAttribute('class', 'status');
- errorList.setAttribute('id', 'errorList');
-
- _statusDiv.appendChild(this._loaderDiv);
- this._statusDiv.appendChild(errorList);
- document.body.appendChild(_statusDiv);
-
-
- //chain the functions for kCanvas and kSvg
- Karma._makeChain.call(Karma.kCanvas,
- Karma.kCanvas._chainingFunctions);
- //Karma._makeChain.apply(Karma.kSvg, Karma.kSvg._chainingFunctions);
-
-
-
- //regular expression that matches the name of aprivate property
- // the karma object
- var regexPrivate = new RegExp('^_.*');
-
- for ( var option in options ) {
- if (options.hasOwnProperty(option)){
- if (option === "image" || option === "audio" || option ===
- "svg" || option === "video" || option === "canvas"){
-
- if(!(options[option] instanceof Array)){
- throw new Error("" + option + " must be an array");
- } else if (options[option].length === 0){
- continue;
- }
- } else if (regexPrivate.test(option)){
- //don't overwrite a private property of karma object
- continue;
- }
-
- switch (option){
- case "locale":
-
- if (this._isValidLocale(options[option])){
- this.locale = this._normalizeLocale(options[option]);
- this._localized = true;
- this._localePath = Karma._computeLocalePath(this.locale);
- } else {
- throw new Error("locale provided to karma._init() is invalid");
- }
-
- break;
- case "image":
- options[option]._type = 'image';
- Karma._makeImages(options[option]);
- break;
- case "audio":
- options[option]._type = 'audio';
- Karma._makeAudio(options[option]);
- break;
- case "video":
- options[option]._type = 'video';
- Karma._makeVideos(options[option]);
- break;
- case "svg":
- options[option]._type = 'svg';
- Karma._makeSvgs(options[option]);
- break;
- case "canvas":
- options[option]._type = 'canvas';
- Karma._makeCanvases(options[option]);
- break;
- }
- }
- }
-
-
-
- return this;
- },
-
- /** Waits until all assets loaded, i.e. ready, then calls callback
- * @param {Function} [cb] callback function
- * @returns this
- * @throws {Error} if Karma.karma is not initialized with the
- * Karma({ options }) function
- * @example
- *
- * var k = Karma({ . . . your assets here . . . });
- * k.ready(function(){ .. your code here . . .});
- *
- * your code will not be called until all assets have been loaded
- *
- */
- ready : function( cb ) {
- var that = this;
- if (Karma.karma._initialized !== true){
- throw new Error("Karma.karma not initialized");
- }
-
- if (this._counters.loaded !== this._counters.total){
- setTimeout(function(){ that.ready(cb);}, 5);
- } else if (cb) {
- //hide the "Karma is loading..." message
- this._statusDiv.setAttribute('style', 'display:none;');
-
- cb();
- } else if (!cb) {
- //hide the "Karma is loading..." message
- this._statusDiv.setAttribute('style', 'display:none;');
-
- //if no options passed, show it works message
- this._showStarterMessage();
- }
-
-
-
-
- return this;
- },
-
- //Display Apache-like "It works" message if no options
- _showStarterMessage : function (){
- var starterMsg = document.createElement('div');
- starterMsg.setAttribute('id', 'starterMsg');
- starterMsg.innerHTML = "<h1>It Works</h1>";
- document.body.appendChild(starterMsg);
- },
-
- //Updates visible counter of how many assets are loaded
- _updateStatus : function (errorMsg) {
- var loaded = this._counters.loaded;
- var total = this._counters.total;
- var errors = this._counters.errors;
- this._loaderDiv.innerHTML = "Loaded " + loaded + " / " + total +
- "" + (errors > 0 ? " Errors [ " + errors +" ]" : '');
- if (errorMsg) {
- var liError = document.createElement('li');
- liError.innerHTML = errorMsg;
- var errorList = document.getElementById('errorList');
- errorList.appendChild(liError);
- }
- },
-
- //matches 2 letter country code then optionally
- //a dash or underscore followed by a country or language identifier
- //i currently only allow a language identifier 2-3 chars long
- _isValidLocale : function (locale) {
- var localeRegex = new RegExp('^[a-zA-Z][a-zA-Z]([-_][a-zA-z]{2,3})?$');
- return localeRegex.test(locale);
- },
-
- _normalizeLocale : function(locale) {
- var lang = "";
- var country = "";
- var divider = "";
-
- lang = locale.slice(0, 2).toLowerCase();
- divider = "_";
- country = locale.slice(3, 6).toUpperCase();
-
- return locale.length > 2 ? "" + lang + divider + country : lang;
- },
-
- // Below are geometry and math helper methods
-
- /**
- * Converts a value from degrees to radians.
- * @param {Number} angle The angle in degrees
- * @returns {Number} The angle in radians
- */
- radians : function( angle ){
- return ( angle / 180 ) * Math.PI;
- },
- /**
- * Gets the square of the Euclidian (ordinary) distance between 2 points.
- * @param {Object} Point No. 0
- * @param {Number} Point0.x
- * @param {Number} Point0.y
- * @param {Object} Point No. 1
- * @param {Number} Point1.x
- * @param {Number} Point1.y
- * @returns {Number} The square of the Euclidian distance
- * @example
- *
- * p0 = {x:0, y:1};
- * p1 = {x:50, y:70};
- * var d = distance2(p0, p1);
- *
- */
- distance2 : function ( p0, p1 ) {
- return (p1.x - p0.x) * (p1.x - p0.x) + (p1.y - p1.y) * (p1.y - p1.y);
- },
- /**
- * Gets the Euclidian (ordinary) distance between 2 points.<br>
- * <b>Warning:</b> It's slower than distance2 function
- * @param {Object} Point No. 0
- * @param {Number} Point0.x
- * @param {Number} Point0.y
- * @param {Object} Point No. 1
- * @param {Number} Point1.x
- * @param {Number} Point1.y
- * @returns {Number} The Euclidian distance
- * @example
- *
- * p0 = {x:0, y:1};
- * p1 = {x:50, y:70};
- * var d = distance2(p0, p1);
- *
- */
- distance : function ( p0, p1 ) {
- return Math.sqrt( this.distance2( p0, p1 ) );
- },
- /** Returns a random number within the range provided
- * @param {Number} lower limit of the range, lowest number that can be returned
- * @param {Number} upper limit of the range, highest number that can be returned
- * @returns {Number} number that is >= lower and <= upper
- * @example
- *
- * var num = rand(0, 10);
- *
- * num could be 0, 1, 2, 3 ... or 10
- *
- */
- rand : function ( lower, upper ){
- return Math.round( Math.random() * (upper - lower) + lower );
- }
-
-};
-
-/** Prototypal object for images, videos, and audio files but
- * does not include svg or canvas elements
- * @class This object is the prototype for images, videos, and audio files but
- * does not include svg or canvas elements
- * @ throws {Error} if the individual asset is set to be localized but
- * the globale locale is not set on the Karma.karma object
- * @ throws {Error} if the name and file properties are not supplied
- * @example
- * kMedia is the prototype object for images, audio, and videos.
- * These 'media' assets are loaded in a distinctly different way
- * from the canvas or svg assets. They also have distinctly different
- * helper methods
- *
- * You initialize the kMedia assets by passing an array of objects
- */
-Karma.kMedia = {
- /** file location of asset
- * @type String
- * @default ""
- */
- file : "",
- /** media object
- * @type Audio|Image|Video
- * @default undefined
- */
- media : undefined,
- //actual path to the file
- _path : "",
- //if using localized version of this asset
- _localized : false,
- //audio, image, or video
- _type : "",
- //initializes kMedia instance with values provided by user
- _init : function (asset) {
- asset._localized = asset._localized || false;
- Karma.karma._counters.total++;
-
- if (asset.name === undefined || asset.file === undefined){
- throw new Error("properties name and file have to be defined");
- } else {
- this.name = asset.name;
- this.file = asset.file;
- }
-
- //_type is a private variable used internally
- if (asset._type === undefined){
- throw new Error("the _type property must be set. " +
- "Blame the karma library authors as this is an internal value");
- } else {
- if (Karma._isValidType(asset._type)){
- this._type = asset._type;
- switch ( this._type ) {
- case "image": this.media = new Image();
- break;
- case "audio": this.media = new Audio();
- break;
- //case "video":
- //NYI
- //this.media = new Video();
- break;
- default: throw new Error("Media type not supported");
- }
-
- } else {
- throw new Error("the _type property supplied is invalid. " +
- "Blame the karma library authors as this is an internal value");
- }
- }
-
- if(Karma._isLocalized(asset._localized)){
- this._localized = asset._localized;
- this._path = Karma.karma._localePath +
- this._type + "/";
- } else {
- this._path = Karma.karma._assetPath +
- this._type + "/";
- }
-
-
- //IMPORTANT: This one magic line loads the file
- this.media.src = this.src = this._path + this.file;
-
- //add event handlers
- this._addEventHandlers();
-
- if (this._type === "audio"){
- this.media.autobuffer = true;
- this.media.load();
- }
-
-
- return this;
- },
- //Adds event handlers to update the counters when
- //the asset is successfully or unsuccessfully loaded
- _addEventHandlers : function () {
- var that = this;
- var loadEvent = "load";
- //Browser Hack recommended by chromium devs
- //http://code.google.com/p/chromium/issues/detail?id=20251&q=loading%20audio&colspec=ID%20Stars%20Pri%20Area%20Type%20Status%20Summary%20Modified%20Owner%20Mstone%20OS#c4
- if (this._type === "audio" || this._type === "video"){
- loadEvent = "canplaythrough";
- }
-
- that.media.addEventListener(
- loadEvent,
- function (e) {
- Karma.karma._counters.loaded++;
- Karma.karma._updateStatus();
- that.status = "loaded";}, false);
-
- that.media.addEventListener(
- "error",
- function (e) {
- Karma.karma._counters.errors++;
- that.status = "error";
- var errorMsg = "Error: " + that._type.toUpperCase() +
- " " + that.name + " cannot be loaded.";
- Karma.karma._updateStatus(errorMsg);
- },
- false);
- that.media.addEventListener(
- "abort",
- function (e) {
- Karma.karma._counters.total++;
- that.status = "aborted";
- var errorMsg = "ABORT: " + that._type.toUpperCase() +
- " " + that.name + " loading was aborted.";
- Karma.karma._updateStatus(errorMsg);
-
- }, false);
-
- }
-
-};
-
-//determine if it is a valid type of asset
-Karma._isValidType = function (type){
- return type === "image" ||
- type === "svg" ||
- type === "audio" ||
- type === "video" ||
- type === "canvas";
-};
-
-Karma._isLocalized = function (boolLocalized) {
- if (typeof boolLocalized === "boolean" ) {
- if(boolLocalized === true &&
- Karma.karma.locale === undefined){
- throw new Error("You cannot localize a media asset" +
- " if the global locale for Karma isn't set");
- } else {
- return boolLocalized;
- }
- } else if (typeof boolLocalized === undefined){
- return false;
- } else{
- throw new Error("This is not a valid value for the localized option");
- }
-};
-
-Karma._computeLocalePath = function(locale) {
- return Karma.karma._assetPath + locale + "/";
-};
-
-Karma._makeImages = function (imgConfigs){
- var makeImage = function (imgConfig){
- var image = undefined;
- imgConfig._type = "image";
- image = Karma.create(Karma.kMedia)._init(imgConfig);
- Karma.karma.image[imgConfig.name] = image;
- };
-
- imgConfigs.forEach(function(imgConfig){ makeImage(imgConfig);});
-
-};
-
-Karma._makeAudio = function (audioConfigs){
- var makeAudio = function (audioConfig){
- var audio = undefined;
- audioConfig._type = "audio";
- audio = Karma.create(Karma.kMedia)._init(audioConfig);
- audio.play = function () {
- //hack to fix the audio "stuttering" problem
- //more info: https://bugs.launchpad.net/karma/+bug/426108
- this.media.currentTime = 0.1;
- this.media.play();
- };
- Karma.karma.audio[audioConfig.name] = audio;
- };
-
- audioConfigs.forEach(function(audioConfig){ makeAudio(audioConfig);});
-
-};
-
-
-Karma._makeCanvases = function (canvasConfigs){
- var makeCanvas = function (canvasConfig){
- var canvas = undefined;
- canvas = Karma.create(Karma.kCanvas)._init(canvasConfig);
- Karma.karma.canvas[canvasConfig.name] = canvas;
- };
-
- canvasConfigs.forEach(function(canvasConfig){ makeCanvas(canvasConfig);});
-
-};
-
-/** Prototypal object for each canvas element submitted to Karma in the
- * Karma() method
- * @throws {Error} if the name and domId for the canvas element are not specified
- * @thows {Error} if the supplied domId does not match an element in the DOM
- * @class This object is the prototype for each canvas element submitted to Karma in the
- * Karma() method
- */
-Karma.kCanvas = {
- /** Name of the canvas, used internally by karma.js
- * @type String
- * @default ''
- */
- name : '',
- /** Width of canvas element
- * @type Number
- * @default 0
- */
- width: 0,
- /** Height of canvas element
- * @type Number
- * @default 0
- */
- height: 0,
- /** Whether canvas is visible
- * @type boolean
- * @default true
- */
- visible: true,
- /** Element ID for canvas element in html document
- * @type String
- * @default undefined
- */
- domId: undefined,
- /** Reference to the DOM element
- * @type DOMElement
- * @default undefined
- */
- node: undefined,
- /** The 2 Dimensional Rendering context property for this canvas
- * @type 2DRenderingContext
- * @default undefined
- */
- ctx: undefined,
- /** Frames Per Second, I don't know what the purpose of this is,
- * Felipe made it up
- * @type Number
- * @default 24
- */
- fps: 24,
-
- //initializes object with values provides by user
- _init: function (config) {
- for (var option in config){
- if (config.hasOwnProperty(option)){
- switch (option){
- case "name":
- this.name = config[option];
- break;
- case "domId":
- this.domId = config[option];
- break;
- case "width":
- if(!this.height){
- throw new Error("If you specify a width you must also" +
- "specify a height");
- }
- this.width = config[option];
- break;
- case "height":
- if(!this.width){
- throw new Error("If you specify a height you must also" +
- "specify a width");
- }
- this.height = parseInt(config.option, 10);
- break;
- case "fps":
- this.fps = parseInt(config.option, 10);
- break;
- }
- }
- }
-
- if(this.domId && document.getElementById(this.domId)){
- this.node = document.getElementById(this.domId);
- this.ctx = this.node.getContext('2d');
- } else {
- throw new Error('you must specify a valid domId that' +
- 'is in your html page');
- }
-
- if(!config.height && !config.width){
- this.width = parseInt(this.node.getAttribute('width'), 10);
- this.height = parseInt(this.node.getAttribute('height'), 10);
- }
-
- return this;
- },
- /** Clear area of canvas element specified by parameters, if no
- * parameters supplied, clears entire canvas
- * @param {Number} [x=0] x coordinate, defaults to zero if left blank
- * @param {Number} [y=0] y coordinate, defaults to zero if left blank
- * @param {Number} [width=0] width of area to be cleared, defaults
- * entire width of canvas
- * @param {Number} [height=0] height of area to be cleared, defaults
- * entire height of canvas
- * @returns this
- * @example
- *
- * k.canvas.ninja.clear();
- * // clears the entire ninja canvas
- *
- * k.canvas.ninja.clear(0, 10, 20, 30);
- * //clears a specific portion of the ninja canvas
- *
- */
- clear : function ( x, y, width, height ) {
- var that = this;
- that.ctx.clearRect(
- x || 0,
- y || 0,
- width || that.width,
- height || that.height
- );
- return that;
- },
-
- //These are all properties or methods of the canvas element's
- //2 dimensional context
- _chainingFunctions : [
- "globalAlpha", "globalCompositeOperation", "lineWidth", "lineCap",
- "lineJoin", "miterLimit", "font", "textAlign", "textBaseline", "save",
- "restore", "scale", "rotate", "translate", "transform", "setTransform",
- "clearRect", "fillRect", "strokeRect", "beginPath", "closePath",
- "moveTo", "lineTo", "quadraticCurveTo", "bezierCurveTo", "arcTo",
- "arc", "rect", "fill", "stroke", "clip", "fillText", "strokeText",
- "measureText", "isPointInPath", "strokeStyle", "fillStyle",
- "createLinearGradient", "createRadialGradient", "createPattern",
- "shadowOffsetX", "shadowOffsetY", "shadowBlur", "shadowColor",
- //"mozTextStyle", "mozDrawText", "mozMeasureText", "mozPathText",
- "mozTextAlongPath", "drawImage", "getImageData", "putImageData",
- "createImageData", "drawWindow"
- ]
-};
-
-
-
-Karma._makeSvgs = function (svgConfigs){
- var makeSvg = function (svgConfig){
- var svg = undefined;
- svg = Karma.create(Karma.kSvg)._init(svgConfig);
- Karma.karma.svg[svgConfig.name] = svg;
- };
-
- svgConfigs.forEach(function(svgConfig){ makeSvg(svgConfig);});
-
-};
-
-/** Prototypal object for each svg element submitted to Karma in the
- * Karma() method
- * @throws {Error} if the name and domId for the svg element are not specified
- * @thows {Error} if the supplied domId does not match an element in the DOM
- * @class This object is the prototype for each svg element submitted to Karma in the
- * Karma() method
- */
-Karma.kSvg = {
- /** name of instance, used internally
- * @typeof string
- * @default ""
- */
- name : "",
- /** width of element
- * @type number
- * @default 0
- */
- width: 0,
- /** height of element
- * @type number
- * @default 0
- */
- height: 0,
- /** Status of element, either "loaded" or "error"
- * @type string
- * @default ""
- */
- status: "",
- /** Whether canvas is visible
- * @type boolean
- * @default true
- */
- visible: true,
- /** Element ID for canvas element in html document
- * @type String
- * @default undefined
- */
- domId: undefined,
- /** Reference to the DOM element
- * @type DOMElement
- * @default undefined
- */
- node: undefined,
- /** Reference to the SVGDocument
- * @type SVGDocument
- * @default undefined
- */
- doc: undefined,
- /** Reference to the root element of the SVG Document
- * @type DocumentElement
- * @default undefined
- */
- root: undefined,
- _localized : undefined,
- _chainingFunctions: [],
- _init: function (config) {
- Karma.karma._counters.total++;
-
- for (var option in config){
- if (config.hasOwnProperty(option)){
- switch (option){
- case "name":
- this.name = config[option];
- break;
- case "domId":
- this.domId = config[option];
- break;
- case "width":
- if(!this.height){
- throw new Error("If you specify a width you must also" +
- "specify a height");
- }
- this.width = parseInt(config[option], 10);
- break;
- case "height":
- if(!this.width){
- throw new Error("If you specify a height you must also" +
- "specify a width");
- }
- this.height = config[option];
- break;
- case "fps":
- this.fps = config[option];
- break;
- }
- }
- }
-
- if(this.domId && document.getElementById(this.domId)){
- this.node = document.getElementById(this.domId);
- } else {
- throw new Error('you must specify a valid domId that' +
- 'is in your html page');
- }
-
- if(!config.height && !config.width){
- this.width = parseInt(this.node.getAttribute('width'), 10);
- this.height = parseInt(this.node.getAttribute('height'), 10);
- }
-
- var that = this;
- that._addEventHandlers();
-
- return this;
-
-
- },
- _addEventHandlers : function () {
- var that = this;
- that.doc = that.node.getSVGDocument();
- that.node.addEventListener(
- "load",
- function (e) {
- that.doc = that.node.getSVGDocument();
- that.root = that.doc.documentElement;
- Karma.karma._counters.loaded++;
- Karma.karma._updateStatus();
- that.status = "loaded";
- }, false);
-
- that.node.addEventListener(
- "error",
- function (e) {
- Karma.karma._counters.loaded--;
- Karma.karma._counters.errors++;
- that.status = "error";
- var errorMsg = "Error: " + that._type.toUpperCase() +
- " " + that.name + " cannot be loaded.";
- Karma.karma._updateStatus(errorMsg);
- },
- false);
- that.node.addEventListener(
- "abort",
- function (e) {
- that.status = "aborted";
- var errorMsg = "ABORT: " + that._type.toUpperCase() +
- " " + that.name + " loading was aborted.";
- Karma.karma._updateStatus(errorMsg);
-
- }, false);
-
- }
-};
-
-Karma._makeVideos = function (video){
-
-};