IDE_Morph.prototype.openIn = function (world) { var hash, usr, myself = this, urlLanguage = null; // get persistent user data, if any if (localStorage) { usr = localStorage['-snap-user']; if (usr) { usr = SnapCloud.parseResponse(usr)[0]; if (usr) { SnapCloud.username = usr.username || null; SnapCloud.password = usr.password || null; if (SnapCloud.username) { this.source = 'cloud'; } } } } SnapCloud.isloggedin(function () { str = SnapCloud.encodeDict( { username: SnapCloud.username } ); localStorage['-snap-user'] = str; myself.source = 'cloud'; myself.showMessage('now connected.', 2); }, myself.cloudError() ); this.buildPanes(); world.add(this); world.userMenu = this.userMenu; // override SnapCloud's user message with Morphic SnapCloud.message = function (string) { var m = new MenuMorph(null, string), intervalHandle; m.popUpCenteredInWorld(world); intervalHandle = setInterval(function () { m.destroy(); clearInterval(intervalHandle); }, 2000); }; // prevent non-DialogBoxMorphs from being dropped // onto the World in user-mode world.reactToDropOf = function (morph) { if (!(morph instanceof DialogBoxMorph)) { if (world.hand.grabOrigin) { morph.slideBackTo(world.hand.grabOrigin); } else { world.hand.grab(morph); } } }; this.reactToWorldResize(world.bounds); function getURL(url) { try { var request = new XMLHttpRequest(); request.open('GET', url, false); request.send(); if (request.status === 200) { return request.responseText; } throw new Error('unable to retrieve ' + url); } catch (err) { myself.showMessage('unable to retrieve project'); return ''; } } // dynamic notifications from non-source text files // has some issues, commented out for now /* this.cloudMsg = getURL('http://snap.berkeley.edu/cloudmsg.txt'); motd = getURL('http://snap.berkeley.edu/motd.txt'); if (motd) { this.inform('Snap!', motd); } */ function interpretUrlAnchors() { var dict; if (location.hash.substr(0, 6) === '#open:') { hash = location.hash.substr(6); if (hash.charAt(0) === '%' || hash.search(/\%(?:[0-9a-f]{2})/i) > -1) { hash = decodeURIComponent(hash); } if (contains( ['project', 'blocks', 'sprites', 'snapdata'].map( function (each) { return hash.substr(0, 8).indexOf(each); } ), 1 )) { this.droppedText(hash); } else { this.droppedText(getURL(hash)); } } else if (location.hash.substr(0, 5) === '#run:') { hash = location.hash.substr(5); if (hash.charAt(0) === '%' || hash.search(/\%(?:[0-9a-f]{2})/i) > -1) { hash = decodeURIComponent(hash); } if (hash.substr(0, 8) === '') { this.rawOpenProjectString(hash); } else { this.rawOpenProjectString(getURL(hash)); } this.toggleAppMode(true); this.runScripts(); } else if (location.hash.substr(0, 9) === '#present:') { this.shield = new Morph(); this.shield.color = this.color; this.shield.setExtent(this.parent.extent()); this.parent.add(this.shield); myself.showMessage('Fetching project\nfrom the cloud...'); // make sure to lowercase the username dict = SnapCloud.parseDict(location.hash.substr(9)); dict.Username = dict.Username.toLowerCase(); SnapCloud.getPublicProject( SnapCloud.encodeDict(dict), function (projectData) { var msg; myself.nextSteps([ function () { msg = myself.showMessage('Opening project...'); }, function () {nop(); }, // yield (bug in Chrome) function () { if (projectData.indexOf('