      1 /**
      2  * Generate a random uuid.
      3  * Written by http://www.broofa.com (robert@broofa.com)
      4  *
      5  * Copyright (c) 2010 Robert Kieffer
      6  * Dual licensed under the MIT and GPL licenses.
      7  * @returns {String}
      8  * @example
      9  *   var uuid = JXG.Util.genUUID();
     10  *   > uuid = '92329D39-6F5C-4520-ABFC-AAB64544E172'
     11  */
     12
     13 /*global JXG: true, define: true*/
     14 /*jslint nomen: true, plusplus: true, bitwise: true*/
     15
     16 /* depends:
     17  jxg
     18  */
     19
     20 define(['jxg'], function (JXG) {
     21
     22     'use strict';
     23
     24     // constants
     25     var uuidCharsStr = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
     26         uuidChars = uuidCharsStr.split('');
     27
     28     /**
     29      * General utility routines
     30      * @namespace
     31      */
     32     JXG.Util = JXG.Util || {};
     33
     34     JXG.Util.genUUID = function (prefix) {
     35         var r, i,
     36             uuid = [],
     37             rnd = 0;
     38
     39         prefix = prefix || '';
     40
     41         if (prefix !== '' && prefix.substr(prefix.length - 1) !== '-') {
     42             prefix = prefix + '-';
     43         }
     44
     45         for (i = 0; i < 36; i++) {
     46             if (i === 8 || i === 13 || i === 18 || i === 23) {
     47                 uuid[i] = '-';
     48             } else if (i === 14) {
     49                 uuid[i] = '4';
     50             } else {
     51                 if (rnd <= 0x02) {
     52                     rnd = 0x2000000 + (Math.random() * 0x1000000) | 0;
     53                 }
     54
     55                 r = rnd & 0xf;
     56                 rnd = rnd >> 4;
     57                 uuid[i] = uuidChars[(i === 19) ? (r & 0x3) | 0x8 : r];
     58             }
     59         }
     60
     61         return prefix + uuid.join('');
     62     };
     63
     64     return JXG.Util;
     65 });