Smalltalk current createPackage: 'Presentation' properties: #{}!
Widget subclass: #Presentation
	instanceVariableNames: 'currentSlide slides'
	package: 'Presentation'!

!Presentation methodsFor: 'accessing'!

author
	^'John Smith'
!

currentSlide
	^currentSlide
!

currentSlide: aSlide
	currentSlide := aSlide
!

description
	^'A presentation written in Jtalk'
!

email
	^'john@smith.com'
!

slideClasses
	^self subclassResponsibility
!

slideTransition
	^'fade'
!

slides
	slides ifNil: [self initSlides].
	^slides
!

style
	"Should return a CSS style"
	^ ''
!

title
	^ self class title.
!

url
	^'http://jtalk-project.org'
! !

!Presentation methodsFor: 'actions'!

currentSlideIndex
	^ self slides indexOf: self currentSlide ifAbsent: [1]
!

moveAt: anInteger
	| next |
	next := self slides 
			at: anInteger
			ifAbsent: [nil].
	next ifNotNil: [currentSlide := next. next show]
!

nextSlide
	| next |
	self currentSlide ifNotNil: [
		next := self slides 
			at: (self currentSlideIndex) + 1
			ifAbsent: [nil].
		next ifNotNil: [currentSlide := next. next show]]
!

previousSlide
	| next |
	self currentSlide ifNotNil: [
		next := self slides 
			at: (self currentSlideIndex) - 1
			ifAbsent: [nil].
		next ifNotNil: [currentSlide := next. next show]]
!

showCurrentSlide
	self currentSlide ifNotNil: [
		'.slide' asJQuery hide.
		('#', self currentSlide id) asJQuery show.
          	'title' asJQuery text: self title, ' - ', self currentSlide id.
        ]
! !

!Presentation methodsFor: 'enumerating'!

slidesDo: aBlockWithArg
	self slides do: [:aSlide| aBlockWithArg value: aSlide].
! !

!Presentation methodsFor: 'initialization'!

initSlides
	slides := self slideClasses collect: [:each | each on: self]
! !

!Presentation methodsFor: 'rendering'!

renderOn: html
	html style
		type: 'text/css';
		with: self style.
	html div 
		id: 'slides';
		with: [self renderSlidesOn: html]
!

renderSlidesOn: html
	self slides do: [:each | 
		each renderOn: html].
	currentSlide ifNil: [currentSlide := self slides first].
	self showCurrentSlide
! !

Presentation class instanceVariableNames: 'current'!

!Presentation class methodsFor: 'accessing'!

concretePresentations
	^ self allSubclasses select: [:aPresentationClass| aPresentationClass isConcrete]
!

title
	^ 'Slides'
! !

!Presentation class methodsFor: 'enumerating'!

concretePresentationsDo: aBlockWithArg
	self concretePresentations do: aBlockWithArg.
! !

!Presentation class methodsFor: 'testing'!

isConcrete
	^false
! !

Presentation subclass: #ESUG2011Presentation
	instanceVariableNames: ''
	package: 'Presentation'!

!ESUG2011Presentation methodsFor: 'accessing'!

author
	^'Nicolas Petton'
!

description
	^'ESUG 2011, Edinburgh'
!

email
	^'nico@objectfusion.fr'
!

slideClasses
	^Array new
		add: IntroSlide;
		add: AboutSlide;
		add: WhatIsJtalkSlide;
		add: JtalkFeaturesSlide;
		add: WorkspaceSlide;
		add: IDESlide;
		add: CountersSlide;
		add: JtalkAndJavascriptSlide;
		add: JtalkAndJavascriptSlide2;
		add: JtalkAndJavascriptSlide3;
		add: JtalkAndJavascriptSlide4;
		add: JtalkAndCLI;
		add: JtalkAndNode;
		add: JtalkAndNode2;
		add: JtalkAndNode3;
		add: JtalkAndWebOS;
		add: JtalkAndEnyo;
		add: ContributionsSlide;
		yourself
!

style
	^'
body {
    font-family: Helvetica,Arial,sans;
}

#slides {
    width: 100%;
    height: 100%;
    overflow: hidden;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background: #555;
}

.slide {
    background: #fff;
    color: #444;
    text-align: left;
    font-size: 20px;
    line-height: 1.8em;
    height: 500px;
    width: 700px;
    padding: 60px;
    position: absolute;
    left: 50%;
    top: 50%;
    margin-left: -420px;
    margin-top: -320px;
    box-shadow: 0 0 20px #111;
    -moz-box-shadow: 0 0 20px #111;
    -webkit-box-shadow: 0 0 20px #111;
}

.slide.transparent {
    background: transparent;
    box-shadow: 0 0 0 none;
    -moz-box-shadow: 0 0 0 transparent;
    -webkit-box-shadow: 0 0 0 transparent;
    color: #fff !!important;
}

.slide.black {
    background: black;
    background-image: -webkit-gradient(
	linear,
	left bottom,
	left top,
	color-stop(0.38, rgb(79,79,79)),
	color-stop(0.69, rgb(33,33,33)),
	color-stop(0.86, rgb(4,4,4))
    );
    background-image: -moz-linear-gradient(
	center bottom,
	rgb(79,79,79) 38%,
	rgb(33,33,33) 69%,
	rgb(4,4,4) 86%
    );
    color: #fff !!important;
}

.slide.black h1, .slide.black h2, .slide.black h3,
.slide.transparent h1, .slide.transparent h2, .slide.transparent h3 {
    color: #fff;
    text-shadow: 0 1px 4px #aaa;
}

.slide.black a, .slide.transparent a {
    color: #ccc;
}

.slide.white {
    color: #333 !!important;
}

.slide.white h1, .slide.white h2, .slide.white h3 {
    color: #333;
}

.slide.white a {
    color: #333;
}


.slide h1, .slide h2, .slide h3 {
    color: #333;
    /* text-align: center; */
}

.slide h1 {
    font-family: "Droid Sans";
    font-size: 36px;
    text-shadow: 0 1px 4px #aaa;
    margin-top: 30px;
    margin-bottom: 50px;
}

/* .slide ul, .slide li { */
/*     padding: 0; */
/*     margin: 0; */
/* } */

.slide button {
    font-size: 18px;
}

.slide a {
    color: #555;
    text-decoration: none;
    cursor: pointer;
}

.slide a:hover {
    color: #fff;
    background: #555;
}

.slide .right {
    text-align: right;
}

.slide .section.center {
    text-align: center;
    display: table-cell;
    vertical-align: middle;
    width: 700px;
    height: 500px;
}

.slide code {
    font-family: "Droid Sans Mono";
    color: #444;
    border: 1px solid #ddd;
    background: #eee;
    border-radius: 4px;
    padding: 2px;
    font-size: 16px;
}

.slide .code2 {
    font-family: "Droid Sans Mono";
    line-height: 1.2em;
    color: #444;
    padding: 2px;
    font-size: 16px;
}


.slide .CodeMirror {
    width: 500px;
    height: 300px;
    text-align: left;
}

.slide .CodeMirror-scroll {
    text-align: left;
}

.slide .fancy {
    margin-top: 30px;
    -webkit-transform: rotate(-10deg);
    -moz-transform: rotate(-10deg);
    transform: rotate(-10deg);
    color: red;
}

.slide .comment {
    opacity: 0.6;
    font-weight: normal;
}

.slide .red {
    color: red;
}

.slide .blue {
    color: blue;
}

.slide#WhatIsJtalk {
    background: white url("esug2011/images/balloon.jpg") 650px 50px no-repeat;
}

.slide#ide {
    background: black url("esug2011/images/ide_star_wars.png") center center no-repeat;
}

.slide#JtalkAndCLI {
    background: white url("esug2011/images/terminal.png") 620px 20px no-repeat;
}

.slide#JtalkAndNode {
    background: white url("esug2011/images/nodejs.png") 580px 40px no-repeat;
}
.slide#JtalkAndNode2 {
    background: white url("esug2011/images/nodejs.png") 580px 40px no-repeat;
}

.slide#JtalkAndNode3 {
    background: white url("esug2011/images/nodejs.png") 580px 40px no-repeat;
}

.slide#JtalkAndWebOS {
    background: white url("esug2011/images/devices.jpg") 380px 280px no-repeat;
}

.slide#JtalkAndEnyo {
    background: white url("esug2011/images/enyo.png") 130px 150px no-repeat;
}

.slide#links {
    background: white url("esug2011/images/asterix.png") 30px 130px no-repeat;
}

.slide#links .section {
    margin-left: 250px;
    margin-top: 200px;
    font-family: "Droid Sans";
    font-size: 26px;
    font-weight: bold;
}


#meta {
    position: absolute;
    font-size: 12px;
    opacity: 0.6;
    bottom: 0;
    right: 0;
    z-index: 2;
    background: #333;
    text-align: right;
    padding: 0 10px;
    line-height: 1.8em;
    color: #eee;
    border-top-left-radius: 5px;
}

#meta:hover {
    opacity: 0.8;
}

#meta p {
    display: inline;
    padding: 0 5px;
}

#meta a {
    //background: #ccc;
    color: #ccc;
    text-decoration: none;
    padding: 0 5px;
}

.slide {
    
}
'
!

url
	^'http://jtalk-project.org'
! !

ESUG2011Presentation class instanceVariableNames: 'current'!

!ESUG2011Presentation class methodsFor: 'accessing'!

title
	^'Jtalk'
! !

!ESUG2011Presentation class methodsFor: 'testing'!

isConcrete
	^true
! !

Presentation subclass: #FOSDEM2012Presentation
	instanceVariableNames: ''
	package: 'Presentation'!

!FOSDEM2012Presentation methodsFor: 'accessing'!

author
	^'Laurent Laffont, Johnny Thornton'
!

description
	^'FOSDEM 2012, Brussels'
!

email
	^'laurent.laffont@gmail.com,  johnnyt@xan.do'
!

slideClasses
^ {
	FOSDEMIntroSlide.
	FOSDEMAmberZeroNine.
	CountersSlide.
	IDESlide.
	JtalkAndJavascriptSlide.
	FOSDEMJSPlayGroundSlide.
	FOSDEMJSToSmalltalk.
	FOSDEMBookletSlide.
	FOSDEMTwitter.
	FOSDEMCanvasSlide.
	FOSDEMAmberBackend.
	FOSDEMREPLSlide.
	FOSDEMCLISlide.
	FOSDEMContributionsSlide
}
!

style
	^'
body {
    font-family: Helvetica,Arial,sans;
}

#slides {
    width: 100%;
    height: 100%;
    overflow: hidden;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background: #555;
}

.slide {
    background: #fff;
    color: #444;
    text-align: left;
    font-size: 20px;
    line-height: 1.8em;
    height: 500px;
    width: 700px;
    padding: 60px;
    position: absolute;
    left: 50%;
    top: 50%;
    margin-left: -420px;
    margin-top: -320px;
    box-shadow: 0 0 20px #111;
    -moz-box-shadow: 0 0 20px #111;
    -webkit-box-shadow: 0 0 20px #111;
}

.slide.transparent {
    background: transparent;
    box-shadow: 0 0 0 none;
    -moz-box-shadow: 0 0 0 transparent;
    -webkit-box-shadow: 0 0 0 transparent;
    color: #fff !!important;
}

.slide.black {
    background: black;
    background-image: -webkit-gradient(
	linear,
	left bottom,
	left top,
	color-stop(0.38, rgb(79,79,79)),
	color-stop(0.69, rgb(33,33,33)),
	color-stop(0.86, rgb(4,4,4))
    );
    background-image: -moz-linear-gradient(
	center bottom,
	rgb(79,79,79) 38%,
	rgb(33,33,33) 69%,
	rgb(4,4,4) 86%
    );
    color: #fff !!important;
}

.slide.black h1, .slide.black h2, .slide.black h3,
.slide.transparent h1, .slide.transparent h2, .slide.transparent h3 {
    color: #fff;
    text-shadow: 0 1px 4px #aaa;
}

.slide.black a, .slide.transparent a {
    color: #ccc;
}

.slide.white {
    color: #333 !!important;
}

.slide.white h1, .slide.white h2, .slide.white h3 {
    color: #333;
}

.slide.white a {
    color: #333;
}


.slide h1, .slide h2, .slide h3 {
    color: #333;
    /* text-align: center; */
}

.slide h1 {
    font-family: "Droid Sans";
    font-size: 36px;
    text-shadow: 0 1px 4px #aaa;
    margin-top: 30px;
    margin-bottom: 50px;
}

.slide button {
    font-size: 18px;
}

.slide a {
    color: #555;
    text-decoration: none;
    cursor: pointer;
}

.slide a:hover {
    color: #fff;
    background: #555;
}

.slide .right {
    text-align: right;
}

.slide .section.center {
    text-align: center;
    display: table-cell;
    vertical-align: middle;
    width: 700px;
    height: 500px;
}

.slide code {
    font-family: "Droid Sans Mono";
    color: #444;
    border: 1px solid #ddd;
    background: #eee;
    border-radius: 4px;
    padding: 2px;
    font-size: 16px;
}

.slide .code2 {
    font-family: "Droid Sans Mono";
    line-height: 1.2em;
    color: #444;
    padding: 2px;
    font-size: 16px;
}


.slide .CodeMirror {
    width: 700px;
    height: 300px;
    text-align: left;
}

.slide .CodeMirror-scroll {
    text-align: left;
}

.slide .fancy {
    margin-top: 30px;
    -webkit-transform: rotate(-10deg);
    -moz-transform: rotate(-10deg);
    transform: rotate(-10deg);
    color: red;
}

.slide .comment {
    opacity: 0.6;
    font-weight: normal;
}

.slide .red {
    color: red;
}

.slide .blue {
    color: blue;
}

#meta {
    position: absolute;
    font-size: 12px;
    opacity: 0.6;
    bottom: 0;
    right: 0;
    z-index: 2;
    background: #333;
    text-align: right;
    padding: 0 10px;
    line-height: 1.8em;
    color: #eee;
    border-top-left-radius: 5px;
}

#meta:hover {
    opacity: 0.8;
}

#meta p {
    display: inline;
    padding: 0 5px;
}

#meta a {
    //background: #ccc;
    color: #ccc;
    text-decoration: none;
    padding: 0 5px;
}

.slide {
    
}

.slide.blue3d {
  background: #feffff;
  background: -moz-linear-gradient(top, #feffff 0%, #d2ebf9 100%);
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#feffff), color-stop(100%,#d2ebf9));
  background: -webkit-linear-gradient(top, #feffff 0%,#d2ebf9 100%);
  background: -o-linear-gradient(top, #feffff 0%,#d2ebf9 100%);
  background: -ms-linear-gradient(top, #feffff 0%,#d2ebf9 100%);
  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr="#feffff", endColorstr="#d2ebf9",GradientType=0 );
  background: linear-gradient(top, #feffff 0%,#d2ebf9 100%);
}


.slide.red3d {
  background: #febbbb;
  background: -moz-linear-gradient(top, #febbbb 0%, #fe9090 71%, #ff5c5c 95%);
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#febbbb), color-stop(71%,#fe9090), color-stop(95%,#ff5c5c));
  background: -webkit-linear-gradient(top, #febbbb 0%,#fe9090 71%,#ff5c5c 95%);
  background: -o-linear-gradient(top, #febbbb 0%,#fe9090 71%,#ff5c5c 95%);
  background: -ms-linear-gradient(top, #febbbb 0%,#fe9090 71%,#ff5c5c 95%);
  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr="#febbbb", endColorstr="#ff5c5c",GradientType=0 );
  background: linear-gradient(top, #febbbb 0%,#fe9090 71%,#ff5c5c 95%);
}


.slide.green3d {
  background: #cdeb8e;
  background: -moz-linear-gradient(top, #cdeb8e 0%, #a5c956 100%);
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#cdeb8e), color-stop(100%,#a5c956));
  background: -webkit-linear-gradient(top, #cdeb8e 0%,#a5c956 100%);
  background: -o-linear-gradient(top, #cdeb8e 0%,#a5c956 100%);
  background: -ms-linear-gradient(top, #cdeb8e 0%,#a5c956 100%);
  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr="#cdeb8e", endColorstr="#a5c956",GradientType=0 );
  background: linear-gradient(top, #cdeb8e 0%,#a5c956 100%);
}

@-webkit-keyframes rotate-horizontal {
	0% { -webkit-transform: perspective(1000px) rotateY(-10deg);}
	100% { -webkit-transform: perspective(1000px) rotateY(10deg);}
}

.animate p{
-webkit-animation: rotate-horizontal 2s infinite alternate ease-in-out;
}

#FOSDEMAmberBackend img {
	margin: 5px;
	-webkit-animation: rotate-horizontal 2s infinite alternate ease-in-out;
}

.slide#FOSDEMContributionsSlide {
    background: white url("esug2011/images/asterix.png") 30px 130px no-repeat;
}

.slide#FOSDEMContributionsSlide .section {
    margin-left: 250px;
    margin-top: 200px;
    font-family: "Droid Sans";
    font-size: 26px;
    font-weight: bold;
}


.slide#ide {
    background: black url("esug2011/images/ide_star_wars.png") center center no-repeat;
}


.tweet {
	background-color: #aaa;
	color: black;
	padding: 10px;
	border-radius: 10px;
	border: 5px solid #eee;
	margin: 10px;
}

.tweet img {
	vertical-align: top;
	margin-right: 10px;
}

.tweet span:first-child {
	float: right;
}
'
!

url
	^'http://amber-lang.net'
! !

!FOSDEM2012Presentation class methodsFor: 'testing'!

isConcrete
	^true
!

title
	^'Amber'
! !

Presentation subclass: #SweSUG2012Presentation
	instanceVariableNames: ''
	package: 'Presentation'!

!SweSUG2012Presentation methodsFor: 'accessing'!

author
	^'Göran Krampe'
!

description
	^'SweSUG 2012, Stockholm'
!

email
	^'goran@krampe.se'
!

slideClasses
	^Array new
		add: SweSUGIntroSlide;
		add: SweSUGAboutSlide;
		add: SweSUGWhatIsAmberSlide;
		add: SweSUGAmberFeaturesSlide;
		add: SweSUGWorkspaceSlide;
		add: IDESlide;
		add: CountersSlide;
		add: JtalkAndJavascriptSlide;
		add: JtalkAndJavascriptSlide2;
		add: JtalkAndJavascriptSlide3;
		add: JtalkAndJavascriptSlide4;
		add: JtalkAndCLI;
		add: JtalkAndNode;
		add: JtalkAndNode2;
		add: JtalkAndNode3;
		add: JtalkAndWebOS;
		add: JtalkAndEnyo;
		add: ContributionsSlide;
		yourself
!

style
	^'
body {
    font-family: Helvetica,Arial,sans;
}

#slides {
    width: 100%;
    height: 100%;
    overflow: hidden;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background: #555;
}

.slide {
    background: #fff;
    color: #444;
    text-align: left;
    font-size: 20px;
    line-height: 1.8em;
    height: 500px;
    width: 700px;
    padding: 60px;
    position: absolute;
    left: 50%;
    top: 50%;
    margin-left: -420px;
    margin-top: -320px;
    box-shadow: 0 0 20px #111;
    -moz-box-shadow: 0 0 20px #111;
    -webkit-box-shadow: 0 0 20px #111;
}

.slide.transparent {
    background: transparent;
    box-shadow: 0 0 0 none;
    -moz-box-shadow: 0 0 0 transparent;
    -webkit-box-shadow: 0 0 0 transparent;
    color: #fff !!important;
}

.slide.black {
    background: black;
    background-image: -webkit-gradient(
	linear,
	left bottom,
	left top,
	color-stop(0.38, rgb(79,79,79)),
	color-stop(0.69, rgb(33,33,33)),
	color-stop(0.86, rgb(4,4,4))
    );
    background-image: -moz-linear-gradient(
	center bottom,
	rgb(79,79,79) 38%,
	rgb(33,33,33) 69%,
	rgb(4,4,4) 86%
    );
    color: #fff !!important;
}

.slide.black h1, .slide.black h2, .slide.black h3,
.slide.transparent h1, .slide.transparent h2, .slide.transparent h3 {
    color: #fff;
    text-shadow: 0 1px 4px #aaa;
}

.slide.black a, .slide.transparent a {
    color: #ccc;
}

.slide.white {
    color: #333 !!important;
}

.slide.white h1, .slide.white h2, .slide.white h3 {
    color: #333;
}

.slide.white a {
    color: #333;
}


.slide h1, .slide h2, .slide h3 {
    color: #333;
    /* text-align: center; */
}

.slide h1 {
    font-family: "Droid Sans";
    font-size: 36px;
    text-shadow: 0 1px 4px #aaa;
    margin-top: 30px;
    margin-bottom: 50px;
}

/* .slide ul, .slide li { */
/*     padding: 0; */
/*     margin: 0; */
/* } */

.slide button {
    font-size: 18px;
}

.slide a {
    color: #555;
    text-decoration: none;
    cursor: pointer;
}

.slide a:hover {
    color: #fff;
    background: #555;
}

.slide .right {
    text-align: right;
}

.slide .section.center {
    text-align: center;
    display: table-cell;
    vertical-align: middle;
    width: 700px;
    height: 500px;
}

.slide code {
    font-family: "Droid Sans Mono";
    color: #444;
    border: 1px solid #ddd;
    background: #eee;
    border-radius: 4px;
    padding: 2px;
    font-size: 16px;
}

.slide .code2 {
    font-family: "Droid Sans Mono";
    line-height: 1.2em;
    color: #444;
    padding: 2px;
    font-size: 16px;
}


.slide .CodeMirror {
    width: 500px;
    height: 300px;
    text-align: left;
}

.slide .CodeMirror-scroll {
    text-align: left;
}

.slide .fancy {
    margin-top: 30px;
    -webkit-transform: rotate(-10deg);
    -moz-transform: rotate(-10deg);
    transform: rotate(-10deg);
    color: red;
}

.slide .comment {
    opacity: 0.6;
    font-weight: normal;
}

.slide .red {
    color: red;
}

.slide .blue {
    color: blue;
}

.slide#WhatIsJtalk {
    background: white url("esug2011/images/balloon.jpg") 650px 50px no-repeat;
}

.slide#ide {
    background: black url("esug2011/images/ide_star_wars.png") center center no-repeat;
}

.slide#JtalkAndCLI {
    background: white url("esug2011/images/terminal.png") 620px 20px no-repeat;
}

.slide#JtalkAndNode {
    background: white url("esug2011/images/nodejs.png") 580px 40px no-repeat;
}
.slide#JtalkAndNode2 {
    background: white url("esug2011/images/nodejs.png") 580px 40px no-repeat;
}

.slide#JtalkAndNode3 {
    background: white url("esug2011/images/nodejs.png") 580px 40px no-repeat;
}

.slide#JtalkAndWebOS {
    background: white url("esug2011/images/devices.jpg") 380px 280px no-repeat;
}

.slide#JtalkAndEnyo {
    background: white url("esug2011/images/enyo.png") 130px 150px no-repeat;
}

.slide#links {
    background: white url("esug2011/images/asterix.png") 30px 130px no-repeat;
}

.slide#links .section {
    margin-left: 250px;
    margin-top: 200px;
    font-family: "Droid Sans";
    font-size: 26px;
    font-weight: bold;
}


#meta {
    position: absolute;
    font-size: 12px;
    opacity: 0.6;
    bottom: 0;
    right: 0;
    z-index: 2;
    background: #333;
    text-align: right;
    padding: 0 10px;
    line-height: 1.8em;
    color: #eee;
    border-top-left-radius: 5px;
}

#meta:hover {
    opacity: 0.8;
}

#meta p {
    display: inline;
    padding: 0 5px;
}

#meta a {
    //background: #ccc;
    color: #ccc;
    text-decoration: none;
    padding: 0 5px;
}

.slide {
    
}
'
!

url
	^'http://www.amber-lang.net'
! !

!SweSUG2012Presentation class methodsFor: 'accessing'!

title
	^'Amber rocks!!'
! !

!SweSUG2012Presentation class methodsFor: 'testing'!

isConcrete
	^true
! !

Widget subclass: #PresentationNavigator
	instanceVariableNames: 'presentationBrush currentPresentation slideSelect'
	package: 'Presentation'!

!PresentationNavigator methodsFor: 'accessing'!

currentPresentation
	^  currentPresentation ifNil: [currentPresentation := Presentation concretePresentations first new].
!

currentPresentation: aPresentation
	currentPresentation := aPresentation.
!

style
	^ '
#navigator {
    z-index: 1;
    position: fixed;
    top: 0;
    left: 50%;
    margin-left: -150px;
    padding: 5px;
    border-radius: 5px;
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
    background: #333;
    opacity: 0.3;
    color: #eee;
}

#navigator a {
    font-weight: bold;
    color: #eee;
    text-decoration: none;
    cursor: pointer;
    padding: 0 2px;
    font-size: 14px;
}

#navigator:hover {
    opacity: 0.8;
}
'
! !

!PresentationNavigator methodsFor: 'callbacks'!

nextSlide
	self currentPresentation nextSlide.
	self updateHash.
!

previousSlide
	self currentPresentation previousSlide.
	self updateHash.
!

reload
	|slideIndex|
	slideIndex := self currentPresentation currentSlideIndex.
	self currentPresentation: self currentPresentation class new.
	self renderCurrentPresentation.
	self selectSlideAt: slideIndex.
!

selectPresentation: aPresentationClass
	self currentPresentation: aPresentationClass new.
	self renderCurrentPresentation.
!

selectPresentationNamed: aString
	|presentationClass|
	presentationClass :=  (Smalltalk current at: aString).
	presentationClass ifNotNil: [ self selectPresentation: presentationClass ].
!

selectSlideAt: anInteger
	self currentPresentation moveAt: anInteger.
	self updateHash.
!

updateHash
	document location hash: self currentPresentation class name, '-', self currentPresentation currentSlideIndex.
! !

!PresentationNavigator methodsFor: 'hash'!

checkHash
	| hash presentation |
	hash := (document location hash  replace: '^#' with: '') tokenize: '-'. 
	presentation := Presentation concretePresentations 
				detect: [:aPresentationClass | aPresentationClass name == hash first]
				ifNone: [^ self].
	presentation == self currentPresentation class ifFalse: [
          	self selectPresentationNamed: presentation.
          	self selectSlideAt: hash last
        ].
!

checkHashChange
	(window jQuery: window) bind: 'hashchange' do: [self checkHash]
! !

!PresentationNavigator methodsFor: 'keybindings'!

setKeybindings
	(window jQuery: document) keyup: [:e || node |
		node := e target nodeName asLowercase.
		(node = 'textarea' or: [node = 'input']) ifFalse: [
			e keyCode = 39 ifTrue: [self nextSlide].
			e keyCode = 37 ifTrue: [self previousSlide]]]
! !

!PresentationNavigator methodsFor: 'rendering'!

open
	(window jQuery: document)  ready: [
          	self 
          		appendToJQuery: 'body' asJQuery;
          		setKeybindings;
          		checkHashChange.
        ].
!

renderCurrentPresentation
	presentationBrush contents: [:html |
        	self currentPresentation renderOn: html.
        ].
	self updateSlideSelect.
!

renderOn: html
	html style
		type: 'text/css';
		with: self style.
	html div
		id: 'navigator';
		with: [	self
					renderToolsOn: html;
					renderPresentationSelectOn: html;
                      			renderSlideSelectOn: html].

	presentationBrush := html div 
							id: 'presentation';
							yourself.

	self checkHash.
	self renderCurrentPresentation.
!

renderPresentationSelectOn: html
	|presentationSelect|
	presentationSelect := html select.
	presentationSelect
		onChange: [self  selectPresentationNamed:  presentationSelect asJQuery val];
		with: [	Presentation concretePresentationsDo: [:aPresentationClass |   
                                                              							html option
                                                              								value: aPresentationClass name;
                                                              								with: aPresentationClass title ] ].
!

renderSlideSelectOn: html
	slideSelect := html select.
	slideSelect onChange: [ self  selectSlideAt:  slideSelect asJQuery val ].
	self updateSlideSelect.
!

renderToolsOn: html
	html a 
		with: 'IDE';
		onClick: [TabManager current open].
	html a
		with: 'Reload';
		onClick: [self reload].
	html a
		with: '←';
		onClick: [self previousSlide].
	html a
		with: '→';
		onClick: [self nextSlide].
!

updateSlideSelect
	slideSelect contents: [:html| |index|
		                       		index := 0.
                		       		self currentPresentation slidesDo: [ :aSlide|  
                                		                                    				index := index + 1.
                                                		                    				html option
                                                                		    					value: index;
                                                            								with: aSlide title ] ].
! !

!PresentationNavigator class methodsFor: 'initialize'!

initialize
	^ self open
!

open
	^ self new open
! !

Widget subclass: #Slide
	instanceVariableNames: 'presentation'
	package: 'Presentation'!

!Slide methodsFor: 'accessing'!

backgroundColor
	^'#555'
!

cssClass
	^'slide'
!

id
	^ self class name
!

presentation
	^presentation
!

presentation: aPresentation
	presentation := aPresentation
!

title
	^ self id
! !

!Slide methodsFor: 'actions'!

show
	self backgroundColor ifNotNil: [
		(window jQuery: '#slides') css: 'background' color: self backgroundColor].
	(window jQuery: '.slide') hide: self presentation slideTransition options: #() duration: 300.
	(window jQuery: '#', self id) show: self presentation slideTransition options: #() duration: 300.
! !

!Slide methodsFor: 'rendering'!

renderMetaOn: html
	html div 
		id: 'meta';
		with: [
			html p class: 'title'; with: self presentation title.
			html p class: 'description'; with: self presentation description.
			html a class: 'author'; with: self presentation author; href: 'mailto:', self presentation email.
			html a class: 'url'; with: self presentation url; href: self presentation url]
!

renderOn: html
	html div class: self cssClass; id: self id; with: [
		self renderSlideOn: html.
		self renderMetaOn: html]
!

renderSlideOn: html
! !

!Slide class methodsFor: 'instance creation'!

on: aPresentation
	^self new
		presentation: aPresentation;
		yourself
! !

Slide subclass: #AboutSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!AboutSlide methodsFor: 'accessing'!

backgroundColor
	^'white'
!

cssClass
	^'slide transparent white'
!

id
	^'about'
! !

!AboutSlide methodsFor: 'rendering'!

renderSlideOn: html
	html div class: 'section center'; with: [
		html h1 with: 'About this presentation'.
		html p with: 'This presentation is entirely written in Jtalk and is licensed under CC BY-SA.'.
		html p with: [
			html with: 'Press '.
			html code with: '←'.
			html with: ' to move backward and '.
			html code with: ' →'.
			html with: ' to move forward.'].
		html p with: [
			html with: 'Open a '.
			html button 
				with: 'browser';
				onClick: [Browser openOn: Presentation].
			html with: ' to edit the source code.']]
! !

Slide subclass: #ContributionsSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!ContributionsSlide methodsFor: 'accessing'!

id
	^'links'
! !

!ContributionsSlide methodsFor: 'rendering'!

renderSlideOn: html
	html div class: 'section'; with: [
		html p with: [
			html a href: 'http://jtalk-project.org'; with: 'jtalk-project.org'].
		html p with: [
			html a href: 'https://github.com/NicolasPetton/jtalk'; with: 'github.com/NicolasPetton/jtalk'].
		html p with: [
			html a href: 'http://http://groups.google.com/group/jtalk-project'; with: 'groups.google.com/group/jtalk-project']]
! !

Slide subclass: #CountersSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!CountersSlide methodsFor: 'accessing'!

backgroundColor
	^'#18bd7d'
!

id
	^'counters'
! !

!CountersSlide methodsFor: 'rendering'!

renderSlideOn: html
	html div class: 'section center'; with: [
		html h1 with: 'The counter example'.
		html div with: [
			2 timesRepeat: [Counter new renderOn: html]]]
! !

Slide subclass: #FOSDEMSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!FOSDEMSlide methodsFor: 'accessing'!

codeSnippet
	self subclassResponsibility
! !

!FOSDEMSlide methodsFor: 'rendering'!

renderCodeSnippetOn: html
	(SourceArea new 
			renderOn: html;
			editor)  setValue: self codeSnippet.
!

renderSnippet: aString on: html
	(SourceArea new 
			renderOn: html;
			editor)  setValue: aString.
! !

FOSDEMSlide subclass: #FOSDEMAmberBackend
	instanceVariableNames: ''
	package: 'Presentation'!

!FOSDEMAmberBackend methodsFor: 'accessing'!

cssClass
	^ 'slide green3d'
! !

!FOSDEMAmberBackend methodsFor: 'rendering'!

renderSlideOn: html
	html div
		class: 'section center';
		with: [	html h1: 'Need a backend ?'.
				{'nodejs.png'. 'php.gif'. 'rails.png'.   'pharo.png'. 'ambrhino.jpg'} do: [:aString |
						html img: 'fosdem2012/images/', aString.
				]
		]
! !

FOSDEMSlide subclass: #FOSDEMAmberZeroNine
	instanceVariableNames: ''
	package: 'Presentation'!

!FOSDEMAmberZeroNine methodsFor: 'not yet classified'!

renderSlideOn: html
	html div 
		class: 'section center';
		with: [ 	html 
					h1: 'Amber 0.9.1 is out !!';
					div: [html cite with: 'Now with over 43 forks on github and more than 230 followers the project:  http://www.amber-lang.net  ...is live and kicking!!'];
					div: [html cite with: '-- Nicolas & Göran'] ]
! !

FOSDEMSlide subclass: #FOSDEMBookletSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!FOSDEMBookletSlide methodsFor: 'accessing'!

cssClass
	^ 'slide blue3d'
! !

!FOSDEMBookletSlide methodsFor: 'css'!

style
	^ '
#book { font-size: 1.4em; }
#book .b-load .b-wrap-right { background-color: #DEC3A9;}
#book .b-load .b-wrap-left { background-color: #DDD;} 
'
! !

!FOSDEMBookletSlide methodsFor: 'rendering'!

bookletOptions
	^ #{ 
		'arrows' -> true.
		'keyboard' -> false.
		'pageNumbers' -> false.
		'closed' -> true
	}
!

renderBookOn: html
	html div 
		id: 'book';
		with: [	html div
					class: 'b-load';
					with: [	html 
								div: 'Amber makes it easy to plug existing javascript libraires';
								div: 'Here is an example with the jQuery Booklet plugin';
								div: 'Want to see how ?';
								div: [ html button
										onClick: [Browser openOn: FOSDEMBookletSlide ];
										with: 'Just browse the code :)'.						] 	
																							
					]	
		].
!

renderSlideOn: html
	self renderBookOn: html.
	html link 
		rel:'stylesheet';
		href: 'fosdem2012/lib/booklet/jquery.booklet.1.2.0.css'.
	
	html style: self style.
	
	jQuery 
		getScript: 'fosdem2012/lib/booklet/jquery.booklet.1.2.0.min.js' 	
		do: ['#book' asJQuery booklet: self bookletOptions].
! !

FOSDEMSlide subclass: #FOSDEMCLISlide
	instanceVariableNames: ''
	package: 'Presentation'!

!FOSDEMCLISlide methodsFor: 'rendering'!

codeSnippet
	^ 
'cd examples/nodejs/hello
../../../bin/amberc -m Hello Hello.st Program
node Program.js

Hello world from Amber in Node.js'
!

renderSlideOn: html
	html h1: 'CLI'.
	html with:  'amberc compiles .st files into node programs !!'.
	self renderCodeSnippetOn: html.
! !

FOSDEMSlide subclass: #FOSDEMCanvasSlide
	instanceVariableNames: 'c2d canvas'
	package: 'Presentation'!

!FOSDEMCanvasSlide methodsFor: 'accessing'!

cssClass
	^ 'slide red3d'
! !

!FOSDEMCanvasSlide methodsFor: 'drawing'!

drawOnCanvas
	|c2d|
	c2d := canvas element getContext: '2d'.
	c2d 
		clearRect: 0 
		y: 0 
		width: canvas element width 
		height: canvas element height.
	
	40 atRandom timesRepeat: [ |rgba|
			rgba := ',' join: {255 atRandom. 255 atRandom. 255 atRandom. 10 atRandom / 10}.
			c2d	at: 'fillStyle' put: 'rgba(', rgba, ')'.
			c2d
				fillRect: 600 atRandom 
				y: 300 atRandom 
				width: 200 atRandom 
				height: 200 atRandom ]
! !

!FOSDEMCanvasSlide methodsFor: 'rendering'!

renderSlideOn: html
	html h1: 'Playing with canvas'.
	canvas := html  canvas 
				width: 700;
				height: 400.

	self updateCanvas.
! !

!FOSDEMCanvasSlide methodsFor: 'updating'!

updateCanvas
	self drawOnCanvas.
	window setTimeout: [self updateCanvas] delay: 500.
! !

FOSDEMSlide subclass: #FOSDEMContributionsSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!FOSDEMContributionsSlide methodsFor: 'rendering'!

renderSlideOn: html
	html div class: 'section'; with: [
		html p with: [
			html a href: '/documentation.html'; with: 'Documentation'].
		html p with: [
			html a href: 'http://amber-lang.net'; with: 'amber-lang.net'].
		html p with: [
			html a href: 'https://github.com/NicolasPetton/amber'; with: 'github.com/NicolasPetton/amber'].
		html p with: [
			html a href: 'http://groups.google.com/group/amber-lang'; with: 'groups.google.com/group/amber-lang']]
! !

FOSDEMSlide subclass: #FOSDEMIntroSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!FOSDEMIntroSlide methodsFor: 'not yet classified'!

renderSlideOn: html
	html div class: 'section center animate'; with: [
		html img src: 'fosdem2012/images/amber.png'.
		html p: self presentation author.
          	html p: self presentation description.
		html p: [
			html with: self presentation email]].
! !

FOSDEMSlide subclass: #FOSDEMJSPlayGroundSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!FOSDEMJSPlayGroundSlide methodsFor: 'accessing'!

codeSnippet
^'|logo|
logo:=''img#amberlogo'' asJQuery.

logo
  css:''-webkit-transition'' put:''all 10s ease-in-out''.

<logo.css(''-webkit-transform'', ''rotateY(360deg)'');>.

logo click: [window alert: ''This is cool !!''].

logo inspect'.
! !

!FOSDEMJSPlayGroundSlide methodsFor: 'rendering'!

renderSlideOn: html
	html div
		class: 'section center'; 
		with: [
			self renderCodeSnippetOn: html.
			html img
				id: 'amberlogo'; 
				src: 'fosdem2012/images/amber.png'	]
! !

FOSDEMSlide subclass: #FOSDEMJSToSmalltalk
	instanceVariableNames: ''
	package: 'Presentation'!

!FOSDEMJSToSmalltalk methodsFor: 'accessing'!

codeSnippet
	^
'var counter = window.smalltalk.Counter._new();
counter._appendToJQuery_($(''#jsToSmalltalk''));'.
!

cssClass
	^ 'slide blue3d'
! !

!FOSDEMJSToSmalltalk methodsFor: 'rendering'!

renderSlideOn: html
	html h1: 'Call Smalltalk from Javascript'.
	html div
		id: 'jsToSmalltalk';
		style: 'float: left'.
	self renderCodeSnippetOn: html.
! !

FOSDEMSlide subclass: #FOSDEMREPLSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!FOSDEMREPLSlide methodsFor: 'rendering'!

codeSnippet
	^ 
'./bin/amber
fs := require value: ''fs''.
fs readdir: ''/tmp'' do: [:err :file| console log: file]'.
!

renderSlideOn: html
	html h1: 'REPL'.
	self renderCodeSnippetOn: html.
! !

FOSDEMSlide subclass: #FOSDEMTwitter
	instanceVariableNames: 'twitterDiv'
	package: 'Presentation'!

!FOSDEMTwitter methodsFor: 'accessing'!

cssClass
	^ 'slide black'
! !

!FOSDEMTwitter methodsFor: 'callback'!

loadTweets
	jQuery 
		ajax: 'http://search.twitter.com/search.json?rpp=3&q=%40AmberSmalltalk'
		options: #{
				'type' -> 'GET'.
				'success' -> [ :json | self renderTweets: (json results)].
				'dataType' -> 'jsonp'
			}.
! !

!FOSDEMTwitter methodsFor: 'rendering'!

renderSlideOn: html
	html button
		onClick: [self loadTweets];
		with: 'What about @AmberSmalltalk on Twitter ?'.
	twitterDiv := html div.
!

renderTweet: tweet on: html
	html div 
		class: 'tweet';
		with: [
			html 
				span: (tweet at: 'created_at');
				img: (tweet at: 'profile_image_url');
				span: (tweet at: 'from_user');
				div: (tweet at: 'text'). 
		]
!

renderTweets: tweets
	twitterDiv contents: [	:html|
						tweets do: [	:tweet|  
									self renderTweet: tweet on: html] ]
! !

Slide subclass: #IDESlide
	instanceVariableNames: ''
	package: 'Presentation'!

!IDESlide methodsFor: 'accessing'!

backgroundColor
	^'black'
!

cssClass
	^'slide transparent'
!

id
	^'ide'
! !

!IDESlide methodsFor: 'rendering'!

renderSlideOn: html
"	html div class: 'section center'; with: [
		html h1 
			with: 'The wonderful Jtalk ';
			with: [
				html a 
					with: 'development tools';
					onClick: [TabManager current open]];
			with: '.']
"
! !

Slide subclass: #IntroSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!IntroSlide methodsFor: 'accessing'!

cssClass
	^'slide black'
!

id
	^'intro'
! !

!IntroSlide methodsFor: 'rendering'!

renderSlideOn: html
	html div class: 'section center'; with: [
		html h1 with: 'Jtalk, the Smalltalk for Web developers'.
		html p with: self presentation author, ' & Göran Krampe - ', self presentation description.
		html p with: [
			html a
				with: self presentation email;
				href: 'mailto:', self presentation email].
		html p with: [
			html a
				with: 'goran@krampe.se';
				href: 'mailto:goran@krampe.se'].
		
          	html p with: [
			html a
				with: 'objectfusion.fr';
				href: 'http://www.objectfusion.fr']]
! !

Slide subclass: #JtalkAndCLI
	instanceVariableNames: ''
	package: 'Presentation'!

!JtalkAndCLI methodsFor: 'not yet classified'!

backgroundColor
	^'#0A1'
!

id
	^'JtalkAndCLI'
!

renderSlideOn: html
	html h1 with: [
		html with: 'Jtalk and '.
		html span class: 'blue'; with: 'the command line'].

	html h2 with: 'jtalkc - a fairly elaborate bash script that:'.

	html ul with: [
		html li with: 'Uses Node.js to run the Jtalk Compiler'.
		html li with: 'Compiles .st files to .js'.
		html li with: 'Links .js files into a single one'.
		html li with: 'Adds class initilization and/or call to main'.
		html li with: 'Optionally runs Google Closure compiler']
! !

Slide subclass: #JtalkAndEnyo
	instanceVariableNames: ''
	package: 'Presentation'!

!JtalkAndEnyo methodsFor: 'not yet classified'!

backgroundColor
	^'#0A1'
!

id
	^'JtalkAndEnyo'
!

renderSlideOn: html
	html h1 with: [
		html with: 'Jtalk and '.
		html span class: 'blue'; with: 'Enyo'].
! !

Slide subclass: #JtalkAndJavascriptSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!JtalkAndJavascriptSlide methodsFor: 'accessing'!

backgroundColor
	^'#08C'
!

cssClass
	^'slide transparent'
!

id
	^'jtalkAndJs'
! !

!JtalkAndJavascriptSlide methodsFor: 'rendering'!

renderSlideOn: html
	html div class: 'section center'; with: [
		html h1 with: [
			html with: 'Smalltalk '.
			html span class: 'red'; with: '♥'.
			html with: ' JavaScript']]
! !

Slide subclass: #JtalkAndJavascriptSlide2
	instanceVariableNames: ''
	package: 'Presentation'!

!JtalkAndJavascriptSlide2 methodsFor: 'accessing'!

backgroundColor
	^'#08C'
!

id
	^'jtalkAndJs2'
! !

!JtalkAndJavascriptSlide2 methodsFor: 'rendering'!

renderSlideOn: html
	html h1 with: [
		html with: 'Smalltalk '.
		html span class: 'red'; with: '♥'.
		html with: ' JavaScript'].
	html h2 with: 'Jtalk maps one to one with the JavaScript equivalent:'.
	html ul with: [
		html li with: 'String ⇔ String'.
		html li with: 'Number ⇔ Number'.
		html li with: 'BlockClosure ⇔ function'.
		html li with: 'Dictionary ⇔ Object'.
		html li with: 'Error ⇔ Error'.
		html li with: 'etc.']
! !

Slide subclass: #JtalkAndJavascriptSlide3
	instanceVariableNames: ''
	package: 'Presentation'!

!JtalkAndJavascriptSlide3 methodsFor: 'accessing'!

backgroundColor
	^'#08C'
!

id
	^'jtalkAndJs3'
! !

!JtalkAndJavascriptSlide3 methodsFor: 'rendering'!

renderSlideOn: html
	html h1 with: [
		html with: 'Smalltalk '.
		html span class: 'red'; with: '♥'.
		html with: ' JavaScript'].
	html h2 with: 'Smalltalk ⇒ JavaScript'.
	html ol with: [
		html li 
			with: 'Unary messages begin with an underscore: ';
			with: [html code with: 'yourself'];
			with: ' becomes ';
			with: [html code with: '_yourself()'].
		html li 
			with: 'Binary messages are prefixed with 2 underscores: ';
			with: [html code with: '3@4'];
			with: ' becomes ';
			with: [html code with: '(3).__at(4)'].
		html li 
			with: 'Keyword message follow the same rules as unary messages, with a final underscore: ';
			with: [html code with: 'aDictionary at: 3 put: 4'];
			with: ' becomes ';
			with: [html code with: 'aDictionary._at_put_(3, 4)']]
! !

Slide subclass: #JtalkAndJavascriptSlide4
	instanceVariableNames: ''
	package: 'Presentation'!

!JtalkAndJavascriptSlide4 methodsFor: 'accessing'!

backgroundColor
	^'#08C'
!

id
	^'jtalkAndJs4'
! !

!JtalkAndJavascriptSlide4 methodsFor: 'rendering'!

renderSlideOn: html
	html h1 with: [
		html with: 'JavaScript '.
		html span class: 'red'; with: '♥'.
		html with: ' Smalltalk too!! ';
		with: [html span class: 'comment'; with: '(how cute)']].
	html h2 with: 'JavaScript ⇒ Smalltalk'.
	html ol with: [
		html li 
			with: [html code with: 'someUser.name'];
			with: ' becomes ';
			with: [html code with: 'someUser name'].
		html li 
			with: [html code with: 'someUser name = "John"'];
			with: ' becomes ';
			with: [html code with: 'someUser name: ''John'''].
		html li 
			with: [html code with: 'console.log(''hello world'')'];
			with: ' becomes ';
			with: [html code with: 'console log: ''hello world'''].
		html li 
			with: [html code with: 'window.jQuery(''foo'').css(''background'', ''red'')'];
			with: ' becomes ';
			with: [html br];
			with: [html code with: '(window jQuery: ''foo'') css: ''background'' color: ''red''']]
! !

Slide subclass: #JtalkAndNode
	instanceVariableNames: ''
	package: 'Presentation'!

!JtalkAndNode methodsFor: 'not yet classified'!

backgroundColor
	^'#0A1'
!

id
	^'JtalkAndNode'
!

renderSlideOn: html
	html h1 with: [
		html with: 'Jtalk and '.
		html span class: 'blue'; with: 'Node.js'].

	html h2 with: 'Hello.st:'.
	html pre with: [
		html div class: 'code2'; with:  'Object subclass: #Hello
        instanceVariableNames: ''''
        category: ''Hello''!!

!!Hello class methodsFor: ''main''!!
main
	console log: ''Hello world from JTalk in Node.js''
!! !!']
! !

Slide subclass: #JtalkAndNode2
	instanceVariableNames: ''
	package: 'Presentation'!

!JtalkAndNode2 methodsFor: 'not yet classified'!

backgroundColor
	^'#0A1'
!

id
	^'JtalkAndNode2'
!

renderSlideOn: html
	html h1 with: [
		html with: 'Jtalk and '.
		html span class: 'blue'; with: 'Node.js'].

	html h2 with: 'Makefile:'.
	html pre with: [
		html div class: 'code2'; with:  'Program.js: Hello.st
	../../bin/jtalkc -N -m Hello Hello.st Program

run: Program.js
	./hello

clean:
	rm -f Program.js Hello.js
'].
html h2 with: 'hello:'.
	html pre with: [
		html div class: 'code2'; with:  'node Program.js $@']
! !

Slide subclass: #JtalkAndNode3
	instanceVariableNames: ''
	package: 'Presentation'!

!JtalkAndNode3 methodsFor: 'not yet classified'!

backgroundColor
	^'#0A1'
!

id
	^'JtalkAndNode3'
!

renderSlideOn: html
	html h1 with: [
		html with: 'Jtalk and '.
		html span class: 'blue'; with: 'Node.js'].

	html h2 with: 'make clean && make run:'.

	html pre with: [
		html div class: 'code2'; with:  'rm -f Program.js Hello.js
../../bin/jtalkc -N -m Hello Hello.st Program
Loading libraries  /home/gokr/jtalk/js/boot.js /home/gokr/jtalk/js/Kernel.js
/home/gokr/jtalk/js/Parser.js /home/gokr/jtalk/js/Compiler.js
/home/gokr/jtalk/js/init.js /home/gokr/jtalk/nodejs/nodecompile.js
and compiling ...
Compiling in debugMode: false
Reading file Hello.st
Exporting category Hello as Hello.js
Adding libraries  /home/gokr/jtalk/js/boot.js /home/gokr/jtalk/js/Kernel.js  ...
Adding Jtalk code Hello.js ...
Adding initializer /home/gokr/jtalk/js/init.js ...
Adding call to Hello class >> main ...
Writing Program.js ...
Done.
./hello'.
html span class: 'blue'; with:'Hello world from JTalk in Node.js']
! !

Slide subclass: #JtalkAndWebOS
	instanceVariableNames: ''
	package: 'Presentation'!

!JtalkAndWebOS methodsFor: 'not yet classified'!

backgroundColor
	^'#0A1'
!

id
	^'JtalkAndWebOS'
!

renderSlideOn: html
	html h1 with: [
		html with: 'Jtalk and '.
		html span class: 'blue'; with: 'webOS'].

	html h2 with: 'A really cool mobile OS based on Linux:'.

	html ul with: [
		html li with: 'The primary language in webOS is Javascript'.
		html li with: 'The new UI framework for webOS 3.0 is called Enyo'.
		html li with: 'Regular apps run in V8 + Webkit'.
		html li with: 'Background services run in Node.js']
! !

Slide subclass: #JtalkFeaturesSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!JtalkFeaturesSlide methodsFor: 'accessing'!

id
	^'features'
! !

!JtalkFeaturesSlide methodsFor: 'rendering'!

renderSlideOn: html
	html h1 with: 'Jtalk features'.
	html ul with: [
		html li with: 'Jtalk is (mostly) written in itself, including the parser & compiler'.
		html li with: 'Full Smalltalk object system, including classes & metaclasses, etc'.
		html li with: 'Core libraries (streams, collections, RegExp, etc)'.
		html li with: 'Web related libraries: HTML Canvas, DOM manipulation'.
		html li with: 'Full featured IDE'.
		html li with: [
			html with:'Advanced Smalltalk features, including '.
			html code with: '#doesNotUnderstand:'.
			html with: ' support and '.
			html code with: 'thisContext']]
! !

Slide subclass: #SweSUGSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!SweSUGSlide methodsFor: 'accessing'!

backgroundColor
	^'#555'
!

codeSnippet
	self subclassResponsibility
! !

!SweSUGSlide methodsFor: 'rendering'!

cssClass
	^ 'slide blue3d'
!

renderCodeSnippetOn: html
	(SourceArea new 
			renderOn: html;
			editor)  setValue: self codeSnippet.
!

renderSnippet: aString on: html
	(SourceArea new 
			renderOn: html;
			editor)  setValue: aString.
! !

SweSUGSlide subclass: #SweSUGAboutSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!SweSUGAboutSlide methodsFor: 'accessing'!

backgroundColor
	^'#555'
!

cssClass
	^ 'slide blue3d'
!

id
	^'About'
! !

!SweSUGAboutSlide methodsFor: 'rendering'!

renderSlideOn: html
	html div class: 'section center'; with: [
		html h1 with: 'About this presentation'.
		html p with: 'This presentation is entirely written in Amber. Lots of stuff was heavily copied from the two earlier presentations from ESUG and FOSDEM.'.
		html p with: [
			html with: 'Press '.
			html code with: '←'.
			html with: ' to move backward and '.
			html code with: ' →'.
			html with: ' to move forward.'].
		html p with: [
			html with: 'Open a '.
			html button 
				with: 'browser';
				onClick: [Browser openOn: Presentation].
			html with: ' to edit the source code.']]
! !

SweSUGSlide subclass: #SweSUGAmberFeaturesSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!SweSUGAmberFeaturesSlide methodsFor: 'accessing'!

id
	^'features'
! !

!SweSUGAmberFeaturesSlide methodsFor: 'rendering'!

renderSlideOn: html
	html h1 with: 'Amber features'.
	html ul with: [
		html li with: 'Amber is (mostly) written in itself, including the compiler'.
		html li with: 'Full Smalltalk object system, including classes & metaclasses, etc'.
		html li with: 'Core libraries (streams, collections, RegExp, etc)'.
		html li with: 'Web related libraries: HTML Canvas, DOM manipulation'.
		html li with: 'Very good javascript integration, both ways'.
		html li with: 'Full featured IDE!!'.
		html li with: [
			html with:'Advanced features, including '.
			html code with: '#doesNotUnderstand:'.
			html with: ' support and '.
			html code with: 'thisContext']]
! !

SweSUGSlide subclass: #SweSUGIntroSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!SweSUGIntroSlide methodsFor: 'not yet classified'!

id
	^'Intro'
!

renderSlideOn: html
	html div class: 'section center animate'; with: [
		html img src: 'fosdem2012/images/amber.png'.
		html p: self presentation author.
          	html p: self presentation description.
		html p: [
			html with: self presentation email]].
! !

SweSUGSlide subclass: #SweSUGWhatIsAmberSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!SweSUGWhatIsAmberSlide methodsFor: 'accessing'!

id
	^'WhatIsAmber'
! !

!SweSUGWhatIsAmberSlide methodsFor: 'rendering'!

renderSlideOn: html
	html div class: 'section center'; with: [
		html img: 'esug2011/images/balloon.jpg'.
		html h1 with: 'Amber in a nutshell'.
		html h2 with: 'Amber is a true Smalltalk'.
		html h2 with: 'It compiles to and runs on/in JavaScript'.
		html h2 with: 'MIT license'.
		html h2 class: 'fancy'; with: 'Amber is way cool!!']
! !

SweSUGSlide subclass: #SweSUGWorkspaceSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!SweSUGWorkspaceSlide methodsFor: 'accessing'!

backgroundColor
	^'#18bd7d'
!

id
	^'workspace'
!

renderSlideOn: html
	| workspace |
	workspace := SourceArea new.
	html div class: 'section center'; with: [
		html h1 with: 'Give Amber a try!!'.
		workspace renderOn: html.
		html div with: [
			html button
				with: 'DoIt';
				onClick: [workspace doIt].
			html button
				with: 'PrintIt';
				onClick: [workspace printIt].
			html button
				with: 'InspectIt';
				onClick: [workspace inspectIt]]]
! !

Slide subclass: #WhatIsJtalkSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!WhatIsJtalkSlide methodsFor: 'accessing'!

id
	^'WhatIsJtalk'
! !

!WhatIsJtalkSlide methodsFor: 'rendering'!

renderSlideOn: html
	html div class: 'section center'; with: [
		html h1 with: 'Jtalk in a nutshell'.
		html h2 with: 'Jtalk is an implementation of Smalltalk'.
		html h2 with: 'Jtalk runs on top of the JavaScript runtime'.
		html h2 with: 'Jtalk is an opensource project (MIT)'.
		html h2 class: 'fancy'; with: 'Jtalk is cool!!']
! !

Slide subclass: #WorkspaceSlide
	instanceVariableNames: ''
	package: 'Presentation'!

!WorkspaceSlide methodsFor: 'accessing'!

backgroundColor
	^'#18bd7d'
!

id
	^'workspace'
!

renderSlideOn: html
	| workspace |
	workspace := SourceArea new.
	html div class: 'section center'; with: [
		html h1 with: 'Give Jtalk a try!!'.
		workspace renderOn: html.
		html div with: [
			html button
				with: 'DoIt';
				onClick: [workspace doIt].
			html button
				with: 'PrintIt';
				onClick: [workspace printIt].
			html button
				with: 'InspectIt';
				onClick: [workspace inspectIt]]]
! !

