API Docs for: 1.4.4
Show:

File: scriptasaurus\ukeGeeks.scriptasaurus.js

/**
 * Finds page HTML elements & creates ukeGeek objects;
 * Reads song text, parses, draws choard diagrams.
 *
 * @class scriptasaurus
 * @namespace ukeGeeks
 * @static
 * @singleton
 */
ukeGeeks.scriptasaurus = (function() {
	/**
	 * attach public members to this object
	 * @property _public
	 * @type {Object}
	 */
	var _public = {};

	/**
	 * Preps this class for running
	 * @method init
	 * @param isIeFamily {bool} TRUE if UserAgent (Browser to you and me) is Internet Explorer
	 * @return {void}
	 */
	_public.init = function(isIeFamily) {
		var defs = ukeGeeks.definitions;

		ukeGeeks.settings.environment.isIe = isIeFamily;
		// TODO: known problem -- need to preload Sorprano chord libarary then we can retune if needed
		defs.addInstrument(defs.sopranoUkuleleGcea);
		defs.useInstrument(defs.instrument.sopranoUke);
		if (ukeGeeks.settings.defaultInstrument != defs.instrument.sopranoUke) {
			defs.useInstrument(ukeGeeks.settings.defaultInstrument);
		}
	};

	/**
	 * Runs all Scriptasaurus methods using the element Ids defined in the settings class.
	 * This is your "Do All". See data.song for structure.
	 * @method run
	 * @return {songObject}
	 */
	_public.run = function() {
		//console.log('run (Classic Mode)');
		var handles = _getHandlesFromId();
		if (!handles || !handles.diagrams || !handles.text || !handles.wrap) {
			return null;
		}
		_errList = [];
		var song = _runSong(handles);
		showErrors(_errList[0]);
		return song;
	};

	/**
	 * Same as "run" except runs using class names, this allows you to have multiple songs on a single page.
	 * @method runByClasses
	 * @return {Array of songObject}
	 */
	_public.runByClasses = function() {
		var songs = [];
		var songWraps = ukeGeeks.toolsLite.getElementsByClass(ukeGeeks.settings.wrapClasses.wrap);
		for (var i = 0; i < songWraps.length; i++) {
			var handles = _getHandlesFromClass(songWraps[i]);
			if (handles === null) {
				continue;
			}
			songs.push(_runSong(handles));
		}
		return songs;
	};

	/**
	 * Is this really nececessary?
	 * @method setTuningOffset
	 * @param offset {int} (optional) default 0. Number of semitones to shift the tuning. See ukeGeeks.definitions.instrument.
	 */
	_public.setTuningOffset = function(offset) {
		ukeGeeks.definitions.useInstrument(offset);
	};

	var _errList = [];
	// song

	/**
	 *
	 * @method _runSong
	 * @private
	 * @param handles {ukeGeeks.data.htmlHandles}
	 * @return {songObj}
	 */
	var _runSong = function(handles) {
		// console.log('run Song');

		// read Music, find chords, generate HTML version of song:
		var cpm = new ukeGeeks.cpmParser();
		cpm.init();
		var song = cpm.parse(handles.text.innerHTML);
		ukeGeeks.definitions.replace(song.defs);

		var chrdPrsr = new ukeGeeks.chordParser();
		chrdPrsr.init();
		handles.text.innerHTML = chrdPrsr.parse(song.body);
		song.chords = chrdPrsr.getChords();

		// Draw the Chord Diagrams:
		var painter = new ukeGeeks.chordPainter();
		painter.init(handles);
		painter.show(song.chords);
		// Show chord diagrams inline with lyrics
		if (ukeGeeks.settings.inlineDiagrams) {
			ukeGeeks.toolsLite.addClass(handles.wrap, 'ugsInlineDiagrams');
			painter.showInline(song.chords);
		}

		// Do Tablature:
		var tabs = new ukeGeeks.tabs();
		tabs.init();
		tabs.replace(handles.text);

		// error reporting:
		_errList.push(painter.getErrors());

		var container = handles.wrap;
		if (container) {
			ukeGeeks.toolsLite.setClass(container, 'ugsNoChords', !song.hasChords);
		}

		if (ukeGeeks.settings.opts.autoFixOverlaps) {
			ukeGeeks.overlapFixer.Fix(handles.text);
		}

		// done!
		return song;
	};

	/**
	 * Shows a JavaScript alert box containing list of unknown chords.
	 * @method showErrors
	 * @return {void}
	 */
	var showErrors = function(errs) {
		if (errs.length < 1) {
			return;
		}

		//console.log(typeof(errs[0]));
		var s = '';
		for (var i = 0; i < errs.length; i++) {
			s += (s.length > 0) ? ', ' : '';
			s += errs[i];
		}
		alert('Forgive me, but I don\'t know the following chords: ' + s);
	};

	/**
	 *
	 * @method _getHandlesFromClass
	 * @private
	 * @param wrap {domElement}
	 * @return {ukeGeeks.data.htmlHandles}
	 */
	var _getHandlesFromClass = function(wrap) {
		var diagrams = ukeGeeks.toolsLite.getElementsByClass(ukeGeeks.settings.wrapClasses.diagrams, wrap);
		var text = ukeGeeks.toolsLite.getElementsByClass(ukeGeeks.settings.wrapClasses.text, wrap);
		if ((diagrams === undefined) || (diagrams.length < 1) || (text === undefined) || (text.length < 1)) {
			return null;
		}
		return new ukeGeeks.data.htmlHandles(wrap, diagrams[0], text[0]);
	};

	/**
	 *
	 * @method _getHandlesFromId
	 * @private
	 * @return {ukeGeeks.data.htmlHandles}
	 */
	var _getHandlesFromId = function() {
		return new ukeGeeks.data.htmlHandles(
			document.getElementById(ukeGeeks.settings.ids.container),
			document.getElementById(ukeGeeks.settings.ids.canvas),
			document.getElementById(ukeGeeks.settings.ids.songText)
		);
	};

	return _public;
}());