The โClickaroundโ series of web applications now have the functionality that means they could be used for quite โpersonalizedโ purposes. When web applications are like this, a good thing you can do as a programmer to facilitate this โpersonalizedโ feeling is to use HTTP cookies as a means by which to, perhaps, save the user time with their configurations, by perhaps saving a previous snapshot โlookโ to the โClickaroundโ session the user has been involved in in the past, and be able to recall that snapshot, via the use of those cookies, which are stored within the โbowelsโ of the web browser they are using.
So to do this we make use of the previously created Undo and Redo functionality we talked about with Canvas Annotation Email Attachment Undo Tutorial and a lot of the HTTP Cookie logic we used today you would have similar code in JavaScript Stylesheet Toggler Tutorial.
Only changes to the external Javascript worldjs were involved likethis today for our HTTP cookie logic for any/all of โฆ
- welcometonation
html with a live
run link
- world
html with a live
run link
- australia
htm with a live
run link
- brazil
htm with a live
run link
- china
htm with a live
run link
- germany
htm with a live
run link
- india
htm with a live
run link
- ireland
htm with a live
run link
- nigeria
htm with a live
run link
- united_states
htm with a live
run link
Hope you might try some or all of these web applications, and try storing away some steps into a snapshot that can be recalled.
Previous relevant Canvas Annotation Email Attachment Mobile Tutorial is shown below.
Following up on yesterdayโs Canvas Annotation Email Attachment Audio Tutorial as shown below, we found it quite interesting getting functionality for this working on mobile platforms. Some of the issues particular to mobile work are โฆ
- we needed to use php://input more rather than relying on $_POST[] to be filled in for mobile platforms when posting data to the email PHP
- we needed to cater for both HTML audio and video tag scenarios
- we needed to cater for both HTML5 input tag capture attribute (about which you may want to read this useful link โฆ thanks) to allow for mobile capture and we reused HTML5 FileReader functionality to read existing audio/visual data a user might point at
- we needed to cater for too big a data size, even more so for the video data
- we needed to cater for all data appearing as data URI in the mobile_ prefixed HTML email attachment file name
- we needed to cater for incomplete data URI (ie. data:;base64,) data URI header for more specified headers such as data:video/quicktime;base64,
- we needed to cater for media extensions other than .wav
- we needed to cater for no Flash available, as on all iOS devices
So, once again, the changes were to external Javascript worldjs needed to change likethis today, regarding this new โCanvas Annotation Emailโ clickable image and/or audible attachment email ideas specific to mobile platform usage, and our emailing PHP you could call world
php changed likethis for any/all of โฆ
- welcometonation
html with a live
run link
- world
html with a live
run link
- australia
htm with a live
run link
- brazil
htm with a live
run link
- china
htm with a live
run link
- germany
htm with a live
run link
- india
htm with a live
run link
- ireland
htm with a live
run link
- nigeria
htm with a live
run link
- united_states
htm with a live
run link
Hope you might try some or all of these web applications, perhaps on a mobile device now, and their โCanvas Annotationโ and โEmail Attachmentโ functionality.
Previous relevant Canvas Annotation Email Attachment Audio Tutorial is shown below.
We got struck again, in some kind of weird psycho drama โฆ but we digress โฆ kind of an โonions of the 4th dimensionโ way, that an email (image attachment) is okay as a communication tool, and then to make it clickable is okay, but what if parts of it were clickable to present some audio input? Yesterdayโs clickable images make this a logical next step, and a lot, but not all, of the work was done to prepare for todayโs audio, because it contained โoverlayedโ images, and the means to further โoverlayโ these by an HTML map element.
You may recall from yesterday we listed some concerns regarding HTML map element involvement as per โฆ
- having multiple attachments happen in the PHP โฆ no problems really
- involving an HTML attachment in email โฆ seems to be alright, and maybe got confused, sometimes, with attitudes towards links, in emails, by email clients
- not only involving an HTML attachment in email but perhaps needing to have Javascript in it
โฆ and, regarding that third point, that the HTML map element could handle clickable images not needing to invoke any client Javascript work. Well, today, with audio, it will need to invoke some onclick event logic, but it appears the Gmail email client, at least, doesnโt mind, so that is good.
So the capture of audio data is a bit of a cross browser and cross platform issue, so we may get teething issues for mobile users, and over time weโll look into that, but we allow, again, our (HTML5) canvas based web application to now offer both HTML input=url text boxes (for clickable image navigation) and a microphone icon button (to record audio) on the occasion of the user using the Annotation menu and including images that they fit.
It is at the โreading of the emailโ end of things, the user now could get more than one attachment, in the attachment types โฆ
- image
- audio files
- web applications โฆ non-mobile and mobile
โฆ and if they download in that order, they should be able, on non-mobile platforms, to be able to double click (in the (hard disk) Downloads folder or, if within an email client like Gmail, click the latest of the downloaded files list up in the top right icons โlistโ, which you can see happening in todayโs tutorial picture) the โweb applicationโ to have a clickable image and/or audible web application come up in their default web browser, as you can see with todayโs tutorial picture. As mentioned earlier, as of writing, am not sure of behaviours on some mobile platforms, yet, but weโll be delving into that as time goes on.
Anyway, yet again, the changes were to external Javascript worldjs needed to change likethis today, regarding this new โCanvas Annotation Emailโ clickable image and/or audible attachment email ideas, and our emailing PHP you could call world
php changed likethis for any/all of โฆ
- welcometonation
html with a live
run link
- world
html with a live
run link
- australia
htm with a live
run link
- brazil
htm with a live
run link
- china
htm with a live
run link
- germany
htm with a live
run link
- india
htm with a live
run link
- ireland
htm with a live
run link
- nigeria
htm with a live
run link
- united_states
htm with a live
run link
Hope you might try some or all of these web applications, and their โCanvas Annotationโ and โEmail Attachmentโ functionality.
Previous relevant Canvas Annotation Email Attachment Map Element Tutorial is shown below.
It struck us, in a kind of an โonions of the 4th dimensionโ way, that an email (image attachment) is okay as a communication tool, but what if parts of it were clickable in some way? Yesterdayโs user acceptance brought this โbackโ to the forefront, because it contained โoverlayedโ images. We say โbackโ (rather than the so much vastly different back) because weโve had this on a list, but some of the worries holding this back, such as โฆ
- having multiple attachments happen in the PHP
- involving an HTML attachment in email
- not only involving an HTML attachment in email but perhaps needing to have Javascript in it
โฆ were addressed, respectively, with โฆ
- no problems really
- seems to be alright, and maybe got confused, sometimes, with attitudes towards links, in emails, by email clients
- we donโt need, so far, to have Javascript in it
Maybe of the three above youโve jumped straight to the answer of 3 as a curiosity. Well, we just wonder at the uses of the HTML map element, and weโve raved so many times here at this blog about it before, but today brings up another occasion to rave. Using the HTML map element as the means by which users click parts of images and navigate towards places involved no event logic at all. Sort of felt like driving an automatic car after a long stint in a manual one โฆ what are we (in Australia here) going to do with our left foot โฆ after all, most of my better thoughts come from this region.
Anyway, we end up at the (HTML5) canvas based web application offering HTML input=url text boxes on the occasion of users using the Annotation menu and including images that they fit. If the users fill in URLs, and it is optional, then we have all the information necessary to perform todayโs new functionality.
It is at the โreading of the emailโ end of things, the user now gets two attachments โฆ
- image
- web application
โฆ and if they download in that order, they should be able, on non-mobile platforms, to be able to double click (in the (hard disk) Downloads folder or, if within an email client like Gmail, click the latest of the downloaded files list up in the top right icons โlistโ, which you can see happening in todayโs tutorial picture) the โweb applicationโ to have a clickable image web application come up in their default web browser, as you can see with todayโs tutorial picture. Not sure, as of writing, what arrangements will be on mobile platforms.
Anyway, the changes were to external Javascript worldjs needed to change likethis today, regarding this new โCanvas Annotation Emailโ clickable image attachment email ideas, and our emailing PHP you could call world
php changed likethis for any/all of โฆ
- welcometonation
html with a live
run link
- world
html with a live
run link
- australia
htm with a live
run link
- brazil
htm with a live
run link
- china
htm with a live
run link
- germany
htm with a live
run link
- india
htm with a live
run link
- ireland
htm with a live
run link
- nigeria
htm with a live
run link
- united_states
htm with a live
run link
Hope you might try some or all of these web applications, and their โCanvas Annotationโ and โEmail Attachmentโ functionality.
Previous relevant Canvas Annotation Email Attachment User Acceptance Tutorial is shown below.
An important part of a web (or desktop or mobile) application is user acceptance. User acceptance is, as the words would imply, the giving of your (developing) web application to real users, to test out usability โฆ or UX (user experience). We do this today for our โCanvas Annotation Email Attachmentโ web application, and use it to โAnnotateโ a make believe trip, some of the โtalking pointsโ of which are โoverlayedโ on our โWelcome to Nationโ map introduced a couple of days ago when we presented Canvas Annotation Email Attachment Transparency Tutorial and this resulted in an email sent with the attachment as you see in todayโs tutorial picture.
User acceptance often throws up surprising findings, some easy to handle, and others that are likely to be extremely hard to implement, or impossible, or unworkable at this time. We addressed some of the easier ones to improve the web application, as listed below โฆ
- as far as โoverlayโ thoughts go overlaying a transparent image on top of a clean map goes, we found, before user acceptance, that we would have had to type in the URL to the web application, again, at the address bar, rather than having a way to do it in the web application, so we turned the โYourโ in โYour Annotations++โ to be a dropdown, that if you change its value, you start the web application again, and can immediately arrange to overlay what you may have emailed off (to yourself, possibly) and downloaded locally onto your hard disk
- (after the email today โฆ alas) โฆ as far as the red or yellow click/touch blobs appearing (a little annoyingly) during Annotation operations, we allow you, now, to click on any part of the green bit of the Annotation menu, to turn off these blobs โฆ alas โฆ and you may want to do your own research, perhaps starting at this very useful link we โbit the bulletโ and made non-generic HTML changes, as well as generic external Javascript changes, to allow for this โฆ adding a new global variable blobc containing the colour of the โblobโ โฆ no, not that โblobโ, this ..
- allow an original URL image to be supplied on the address bar URL as with this URL for todayโs โfantasy tripโ from โAlice Springs to Broomeโ
โฆ and so what functionality features featured in our user acceptance test โฆ
- a good source of geographical information is Google โฆ thanks
- the base overlay image used the โwhere isโ functionality we introduced with Canvas Clickaround Where Is Primer Tutorial
โฆ is teamed with the background transparency functionality of Canvas Annotation Email Attachment Transparency Tutorial
โฆ to (self-)email the canvas contents as an Email Attachment we learnt in Canvas Image Email Attachment Primer Tutorial
โฆ invoking the first of three of those changes that we saw needed to happen as a result of user acceptance testing, and so (asynchrononously โฆ who said our sex canโt do two things at once) an email arrives with its attachment, which can be downloaded to our MacBook Proโs hard disk
- (meanwhile โฆ back at the second incarnation of the web application we use the functionality first talked about with Canvas Email Attachment New Image Tutorial to overlay our โoverlayโ work, of the first incarnation, via an email download off the local hard disk so that)
โฆ scribble (of Canvas Email Attachment Scribble Tutorial) was used to draw the Tanami Track
- pretty much original Annotation functionality (of Canvas Image Email Attachment Primer Tutorial) put in some place names and other information
- yesterdayโs Canvas Annotation Email Attachment Image Fit Tutorial image fitting was used to fit images into tight spots โoverlayedโ onto the map, the whole canvas result of which is emailed off as an attachment
- which brings us to the end resultant email attachment downloaded image of our โfantasy tripโ from โAlice Springs to Broomeโ
Again, for todayโs work, the external Javascript worldjs needed to change (regarding the user acceptance testing) likethis today, regarding this new โCanvas Annotation Emailโ image fitting ideas, and our (common) PHP you could call intair
php is unchanged for any/all of (changed slightly) โฆ
- welcometonation
html changed thisway with a live
run link
- world
html changed thisway with a live
run link
- australia
html changed thisway with a live
run link
- brazil
html changed thisway with a live
run link
- china
html changed thisway with a live
run link
- germany
html changed thisway with a live
run link
- india
html changed thisway with a live
run link
- ireland
html changed thisway with a live
run link
- nigeria
html changed thisway with a live
run link
- united_states
html changed thisway with a live
run link
Hope you will try some or all of these web applications, and their โCanvas Annotationโ and โEmail Attachmentโ functionality, maybe even in a real world situation, emailing the results out to somebody, perhaps?
Previous relevant Canvas Annotation Email Attachment Image Fit Tutorial is shown below.
There is still more to do with regard to image manipulations functionality regarding our โCanvas Annotation Email Attachmentโ and โClickaroundโ web applications. We want to be able to offer image scaling via user defined click or touch event outcomes on our HTML canvas.
What we do today in the form of a new HTML select element dropdown containing image placement options โฆ
- place or overlay images not according to user click or touch events on the HTML canvas element, but use other โAnnotation++โ menu settings
- fit the image into the rectangle formed by the userโs last two click or touch canvas co-ordinates
- fit the image into the rectangle width, only, formed by the userโs last two click or touch canvas co-ordinates
- fit the image into the rectangle height, only, formed by the userโs last two click or touch canvas co-ordinates
The workings of this new functionality includes the HTML canvas methods โฆ
So, for todayโs work, only the external Javascript worldjs needed to change likethis today, regarding this new โCanvas Annotation Emailโ image fitting ideas, and our (common) PHP you could call intair
php is unchanged for any/all of โฆ
- welcometonation
html with a live
run link
- world
html with a live
run link
- australia
htm with a live
run link
- brazil
htm with a live
run link
- china
htm with a live
run link
- germany
htm with a live
run link
- india
htm with a live
run link
- ireland
htm with a live
run link
- nigeria
htm with a live
run link
- united_states
htm with a live
run link
Hope you will try some or all of these web applications, and their โCanvas Annotationโ and โEmail Attachmentโ functionality.
Previous relevant Canvas Annotation Email Attachment Transparency Tutorial is shown below.
Weโve thought of some more useful functionality regarding our โCanvas Annotation Email Attachmentโ and โClickaroundโ web applications. To explore possibilities here going forward, and with regard to ideas regarding genericization possibilities, which arenโt a straightforward โyesโ decision for todayโs ideas.
What we do today is โฆ
- we add to the โWhere Is?โ functionality of โClickaroundโ web applications that we first talked about with Canvas Clickaround Where Is Primer Tutorial by allowing not only a Place Name (of an Airport) to be the only option that results in active usefulness with the web application, but also allow that same HTML input type=text element to specify a latitude;longitude[;placeName] for the case of the majority of places on Earth that donโt have an airport
- we add an extra functionality type similar to the โUndoโ button of Canvas Annotation Email Attachment Undo Tutorial as shown way below that simply undoes the HTML canvas original image (the map), replacing it with a transparent background HTML canvas element that is then loaded with all the rest of the new Annotations you, the user, had added, since โฆ hope you can see how useful this idea could be for a whole new set of โoverlayโ thoughts, which weโll endeavour to refine in your mind as time goes on
- we add a whole new โClickaroundโ and โCanvas Annotation Email Attachmentโ web application we are calling โWelcome To Nationโ because we use the wonderful map developed by TreatyRepublic.net, thanks, in the tutorial sequence culminating in Australian Indigenous Language HTML Map jQuery YQL Tutorial
Now that second new functionality we are trialling with that new third new HTML and Javascript source code welcometonationhtml with its live
run link.
Often with genericization possibilities, the detail of how things could work, or perhaps not, in a โgeneric wayโ, are best โplayed outโ in terms of a new โplayerโ into the scene. So that is how we proceed today. This trialling also affects that first piece of functionality, with โWelcome to Nationโ usage, having the window.open() โcompilerโ of selected โWhere Is?โ dropdown selections opening back in the โwelcometonation.htmlโ rather than the default (for all other โClickaroundโ web applications, as it stands right now) โworld.htmlโ โฆ a job to do here, for later, is to check that the userโs โlatitude;longitude[;placeName]โ entry falls within that โsubsetโ map of the world โฆ no such checks here today.
Anyway, going through this motion โฆ yes โฆ we found there is thinking to do making โgenericizationโ of that second functionality idea work, and this is for tomorrow, and on. As is explaining how โoverlayโ possibilities expand here with that second idea above.
But the real wonder is in the intricacy of the culture, โthe oldest surviving culture in the worldโ, of the Koori people, the first people of Australia, and so with that third optionโs new Welcome to Nation web application is a new first option of the โweb applicationโ โClickaroundโ dropdown at the right that points at the HTML map element Indigenous Australian Language Map web application Indigenous Australian Language Regions, where you point at a region and can open search engine and other information relevant to that indigenous language and peoples of interest.
So, for todayโs work, the external Javascript worldjs needed to change likethis today, regarding this new โCanvas Annotation Emailโ background transparency idea, and our (common) PHP you could call intair
php changed quitea bit, as it controls โWhere Is?โ functionality ideas to any/all of โฆ
- welcometonation
html with a live
run link
- world
html with a live
run link
- australia
htm with a live
run link
- brazil
htm with a live
run link
- china
htm with a live
run link
- germany
htm with a live
run link
- india
htm with a live
run link
- ireland
htm with a live
run link
- nigeria
htm with a live
run link
- united_states
htm with a live
run link
Hope you try some or all of these out.
Previous relevant Canvas Annotation Email Attachment Scale and Clip Tutorial is shown below.
Weโve been busy continuing on with our Annotations functionality quest, specifically regarding Image content for Annotations, and the ability to be able to Scale and Clip (or crop) those images within the HTML canvas element that hosts them. This is also part of the functionality we need in our โtoolboxโ for our eventual destination with all this Annotation (with optional Email Attachment) functionality.
Some considerations with Scale, Clip and Rotation (the latter of which we first set our sights on with Canvas Annotation Email Attachment Rotation Tutorial as shown below) thoughts are โฆ
- what should the origin point of rotation be? โฆ we follow the lead of this excellent link โฆ thanks โฆ and choose the centre of the canvas element โฆ but also as of todayโs work we offer the last click/touch position to be an option for positioning
- should the canvas dimensions change? โฆ this is debatable โฆ and we continue, for now, to say โnoโ to this โฆ but we are still open to changing this
- do you rotate all canvas content or just an added imageโs content? โฆ we allow for both modes of use โฆ weโve added the ability for Annotation computer font text to rotate, as of today, as well
- what should the origin point of clipping be? โฆ we allow a percentage or pixel user defined method of defining
Todayโs scaling and clipping calls on the full canvas.drawImage() specification. Up to now weโve only ventured to the first of the three incarnations of ctx.drawImage calls below โฆ
void ctx.drawImage(image, dx, dy);
void ctx.drawImage(image, dx, dy, dWidth, dHeight);
void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
โฆ as you can read more about at that great link โฆ but we make use of all three with todayโs work, especially the third call with the clipping parameters โsx, sy, sWidth, sHeightโ supplementing scaling parameters โdWidth, dHeightโ.
So yet again, no HTML files needed to change today, and our (common) external Javascript you could call worldjs changed quitea bit, adding Scaling and Clipping functionality to the recently added Rotation functionality affecting any/all of โฆ
- world
html with a live
run link
- australia
htm with a live
run link
- brazil
htm with a live
run link
- china
htm with a live
run link
- germany
htm with a live
run link
- india
htm with a live
run link
- ireland
htm with a live
run link
- nigeria
htm with a live
run link
- united_states
htm with a live
run link
Weโll be back to explain more soon.
Previous relevant Canvas Annotation Email Attachment Rotation Tutorial is shown below.
Itโs time to return to Annotations, specifically Image content for Annotations, and the ability to be able to Rotate those images, or the whole HTML canvas element that hosts them. Itโs part of the functionality we need in our โtoolboxโ for our eventual destination with all this Annotation functionality.
Some considerations with Rotation thoughts are โฆ
- what should the origin point of rotation be? โฆ we follow the lead of this excellent link โฆ thanks โฆ and choose the centre of the canvas element
- should the canvas dimensions change? โฆ this is debatable โฆ and we have, for now, said โnoโ to this โฆ but we are open to changing this, along with โcroppingโ and โscalingโ and โspecified offsets for rotated imagesโ for follow up tutorials
- do you rotate all canvas content or just an added imageโs content? โฆ we allow for both modes of use
Along the way, today, we thought we should add, at least for non-mobile platforms with an โonmouseoverโ event (available), the means to show โcanvasโ co-ordinates to assist these users with โOffset X and Yโ decisions, perhaps.
Once again, no HTML files needed to change today, and our (common) external Javascript you could call worldjs changed quitea bit, adding Rotation functionality affecting any/all of โฆ
- world
html with a live
run link
- australia
htm with a live
run link
- brazil
htm with a live
run link
- china
htm with a live
run link
- germany
htm with a live
run link
- india
htm with a live
run link
- ireland
htm with a live
run link
- nigeria
htm with a live
run link
- united_states
htm with a live
run link
Canvas Annotation Email Attachment Undo Tutorial is shown below.
A web application allowing user defined Annotations is better when there is an โUndoโ and โRedoโ functionality option. This is because with any user intervention, there can be erroneous work, which sometimes can be a real pain to recover from scratch.
With โUndoโ and โRedoโ functionality, however, you do not want the user to think it is as much a part of the โmainstreamโ of the web applicationโs functionality, so we supply a โ-โ (minus) button for โUndoโ and a โ+โ (plus) button for โRedoโ, and make them smaller than other Annotation functionality buttons.
So how do we achieve this functionality? We actually do it by actually โฆ
- always clearing the contents of the HTML canvas element
- always place the original image via canvas.drawImage() method
- calling on a stored Javascript array containing HTML canvas drawing statements, flagging the ones that represent a single user defined action, that one โsingle user defined actionโ being what an โUndoโ or โRedoโ action works regarding
There is a great resource for information about the Javascript โArrayโ object called ECMAScriptยฎ Language Specification (we got to via this link, which is also excellent as an โArrayโ object member functionality synopsis (and which we urge you to consult), thanks).
You may wonder about how canvas.drawImage() parameter 1 (an image object) is handled. We assume you will only be interested in โUndoโs and โRedoโs of the last image (object) involved, which is stored in a global variable (and rereferenced by โUndoโ and/or โRedoโ) when the Annotations are created (and built up) by the user.
So yet again, our worldhtml (with its live
run) did not need to change for this new โUndoโ/โRedoโ functionality but our external Javascript you could call world
js changed quitea bit, setting up these Javascript arrays storing HTML canvas commands, for later use in โUndoโ and โRedoโ scenarios instigated by users clicking the relevant respective (small) โ-โ and โ+โ buttons.
As for โฆ
We โmightโ have genericized the world.html changes into other HTMLs of its ilk โฆ well, we decided against that for now โฆ but will later โฆ and partly the reason is that there is more to do, and we just want to concentrate on world.html
โฆ we can now apply changes to the other HTML web applications โฆ
- australia
htm changed thisway with a live
run link
- brazil
htm changed thisway with a live
run link
- china
htm changed thisway with a live
run link
- germany
htm changed thisway with a live
run link
- india
htm changed thisway with a live
run link
- ireland
htm changed thisway with a live
run link
- nigeria
htm changed thisway with a live
run link
- united_states
htm changed thisway with a live
run link
Also changing is the email attachment PHP helper you could call worldphp changed in thisway.
Hope this HTML canvas web application set gives you some ideas for work of your own. To read some of the background to this, try Canvas Email Attachment Scribble Tutorial as shown below.
Previous relevant Canvas Email Attachment Scribble Tutorial is shown below.
Personally think that Annotations are better when there is a โScribbleโ functionality option. Perhaps you want to โsign offโ on your Annotations. Without a โScribbleโ option, itโs a bit impersonal relying on computer fonts as the means by which you โsignโ the work.
And down the track itโs helping with our โfinal aimโ, which will be revealed as time goes on.
To โScribbleโ the main mouse event that interests us is the โonmousemoveโ event which happens when the mouse โฆ moves โฆ in which case if you are in โScribbleโ mode, draw a line between the last two data points. So from that you would glean, and weโll fill in, as well, that โฆ
- the user needs to tell the computer it wants to start into โScribbleโ mode (like a green light on the traffic light) โฆ after a 2 second delay to allow the user to position themselves with their mouse โฆ so we introduce a button for that, that the user can click โฆ but how does the user do what was considered in the early days of all graphical application work โฆ โpen upโ โฆ ie. mouse up โฆ so โฆ
- if onmouseup (or touchend) gets triggered we want it not to draw lines but be ready to resume (like a yellow light on the traffic light) โฆ and when in this mode โฆ
- if onmousedown gets triggered while โthe traffic light is yellowโ (ie. in the mode above) we want it to start to draw lines again with any mouse moves โฆ and to call the whole thing off โฆ
- if the keyboard is used stop any โScribbleโ operations (or click the crossed out button supplied) (like a red light on the traffic light)
Reinventing penmanpersonship is a bit of a stretch, but nevertheless, adds a degree of authenticity to your content, for this is what you are doing, should you go on and email your work as an email attachment โฆ you become an uploader of content โฆ yet again, no doubt. This is a lot more common on the net for all of us, as each day passes. Maybe also, as each night passes. Even as Collingwood streams down the left wing, and passes, no doubt.
Yet again, our worldhtml did not need to change for this new โScribbleโ functionality but our external Javascript you could call world
js changed quite a bit, setting up these mouse (or touch) event logics, as its Javascript โsetTimeoutโ delayed onload function โฆ
function touchHandler(event) // thanks to //stackoverflow.com/questions/1517924/javascript-mapping-touch-events-to-mouse-events
{
var touches = event.changedTouches,
first = touches[0],
type = "";
//if (event.targetTouches.length == 1) {
switch(event.type)
{
//case "touchstart": type="mousedown"; break;
case "touchmove": type="mousemove"; break;
case "touchend": type="mouseup"; break;
default: return;
}
//initMouseEvent(type, canBubble, cancelable, view, clickCount,
// screenX, screenY, clientX, clientY, ctrlKey,
// altKey, shiftKey, metaKey, button, relatedTarget);
var simulatedEvent = document.createEvent("MouseEvent");
simulatedEvent.initMouseEvent(type, true, true, window, 1,
first.screenX, first.screenY,
first.clientX, first.clientY, false,
false, false, false, 0/*left*/, null);
first.target.dispatchEvent(simulatedEvent);
event.preventDefault();
event.stopPropagation();
switch(type)
{
//case "mousedown": if (isScribble == 1) { isScribble=2; } break;
case "mousemove": if (isScribble == 2) {
if (x == 0 && y == 0 && lastx == 0 && lasty == 0) {
if (event.pageX || event.pageY) {
x = event.pageX - elemLeft;
y = event.pageY - elemTop;
} else {
x = event.clientX - elemLeft;
y = event.clientY - elemTop;
}
lastx=x;
lasty=y;
} else {
lastx=x;
lasty=y;
if (event.pageX || event.pageY) {
x = event.pageX - elemLeft;
y = event.pageY - elemTop;
} else {
x = event.clientX - elemLeft;
y = event.clientY - elemTop;
}
}
if (x != lastx || y != lasty) {
document.getElementById('divannotation').style.display='block';
document.getElementById('myisubject').style.display = 'inline';
document.getElementById('myiemail').style.display = 'inline';
context.strokeStyle=document.getElementById('mycolour').value;
context.beginPath();
context.moveTo(x,y);
context.lineTo(lastx,lasty);
context.stroke();
}
}
break;
case "mouseup": if (isScribble == 2) { isScribble=1; } break;
default: return;
}
}
function tryit() {
var tds=document.getElementsByTagName('td'), hstuff='';
if (tds.length > 0) {
hstuff+="<div style='position: absolute; top:600px; left:860px; display:none; background-color: lightgreen; ' id='divan" + "notation'><h4>Your Annotations++</h4>";
hstuff+=" <img src='//www.rjmprogramming.com.au/MarkItUp/line.png' onclick=' doline(); ' alt='Line' title='Line'></img>";
hstuff+=" <img src='//www.rjmprogramming.com.au/MarkItUp/rectangle.png' onclick=' dorectangle(); ' alt='Rectangle' title='Rectangle'></img>";
hstuff+=" <img src='//www.rjmprogramming.com.au/MarkItUp/rectangleborder.png' onclick=' dorectangleborder(); ' alt='Rectangle Border' title='Rectangle Border'></img>";
hstuff+=" <img src='//www.rjmprogramming.com.au/MarkItUp/circle.png' onclick=' docircle(); ' alt='Circle' title='Circle'></img>";
hstuff+=" <img src='//www.rjmprogramming.com.au/MarkItUp/clear.png' onclick=' clearall(); ' alt='Clear' title='Clear'></img>";
hstuff+=" <img src='//www.rjmprogramming.com.au/MarkItUp/sline.png' onclick=\" alert('Ready to Scribble in two seconds. Any key stroke stops scribbling.'); setTimeout(intwo,2000); \" alt='Scribble' title=''></img>";
hstuff+=" <img src='//www.rjmprogramming.com.au/MarkItUp/zline.png' onclick=' isScribble=0; ' alt='End of scribble' title='End of scribble'></img>";
hstuff+=" <img src='//www.rjmprogramming.com.au/MarkItUp/image.png' onclick=\" document.getElementById('file').click(); document.getElementById('file').style.display='block'; document.getElementById('dpf').style.display='block'; \" alt='Image' title='Image'></img><input style='display:none;' id='file' type='file' name='file'><div id=dpf style='display:none;'> <span class='readBytesButtons'><button style='display:none;' data-endbyte='4' data-startbyte='0'>1-5</button><button style='display:none;' data-endbyte='14' data-startbyte='5'>6-15</button><button style='display:none;' data-endbyte='7' data-startbyte='6'>7-8</button><br>... vs Image URL: <input type='url' value='+' onblur='readUBlob(this.value,0,0);' style='width:60%;'></input><br>... Offset X: <input style='width:25%;' id='xoff' type='number' value='0'></input> Offset Y: <input style='width:25%;' id='yoff' type='number' value='0'></input><br><button onclick='readBlob(0,0);'>Place into Canvas</button><button onclick='readOBlob(0,0);'>Overlay into Canvas</button></div><div id='byte_range' style='display:none;'></div><div id='byte_content' style='display:none;'></div><input id='fil' value='' type='hidden'></input><img id='spareimg' src='' style='display:none;'></img>";
hstuff+="<br>Annotation (optional): <input onblur='placeannotation(this);' id='iannotation' type='text' value=''></input><br><span>Anno B&W (optional): <input onblur='placeannotation(this);' id='jannotation' type='text' value=''></input><br>Style: <input type='text' id='myfont' value='18px Verdana'></input> <input type='text' id='mycolour' value='black'></input></span><br>";
hstuff+="<form style='display:none;' id='myform' method='post' enctype='application/x-www-urlencoded' action='//www.rjmprogramming.com.au/HTMLCSS/world.php' target='myiframetwo'><input type='hidden' name='mysubject' id='mysubject' value='My World Map'></input><input type='hidden' name='myfname' id='myfname' value=''></input><input type='submit' id='bsubmit' value='Submit' style='display:none;'></input><input type='hidden' name='ismobile' id='ismobile' value=''></input><input type='hidden' name='mode' id='mode' value='1'></input><input type='hidden' name='to' id='to' value=''></input><input type='hidden' name='mydurl' id='mydurl' value=''></input></form>";
hstuff+="<iframe style='display:none;' id='myiframetwo' src='//www.rjmprogramming.com.au/HTMLCSS/world.php'></iframe>";
hstuff+="<input style='display:none;' onblur='fixmyemail(this.value + String.fromCharCode(32),1);' type='text' id='myisubject' value='My World Map '></input> <input style='background-color: yellow;' type='button' value='Email (optional)' onclick=' capture(document.getElementById(" + '"' + "mydurl" + '"' + "),document.getElementById(" + '"' + "bsubmit" + '"' + "),document.getElementById(" + '"' + "myemail" + '"' + ")); '></input> <a style='display:none;' target='_blank' id='myemail' href='mailto:fill.in.email@address?subject=My%20World%20Map&body='></a><input style='display:none;' onblur='fixmyemail(this.value,0);' type='text' id='myiemail' value='' title='Fill this in for emailed attachment'></input>";
hstuff+="</div>";
if (tds[eval(-1 + tds.length)].innerHTML.indexOf('diva' + 'nnotaxtion') == -1) tds[eval(-1 + tds.length)].innerHTML+=hstuff;
var today = new Date();
var dd = today.getDate();
var mm = today.getMonth()+1; //January is 0!
var yyyy = today.getFullYear();
var hh = today.getHours();
var minm = today.getMinutes(); //January is 0!
var ss = today.getSeconds();
document.getElementById('myfname').value = "world_" + yyyy + "_" + mm + "_" + hh + "_" + minm + "_" + ss + ".png";
document.getElementById('myform').action = document.getElementById('myform').action.replace('?mode=1', '');
document.getElementById('mode').value = '';
document.getElementById('ismobile').value = 'y';
document.getElementById('myisubject').style.display = 'inline';
document.getElementById('myiemail').style.display = 'inline';
document.getElementById('myform').action = document.getElementById('myform').action.replace('?mode=1', '');
document.getElementById('myform').action = document.getElementById('myform').action.replace('mode=1', 'mode=');
//document.getElementById('myemail').href = '#' + document.getElementById('myemail').href;
}
document.body.addEventListener('keyup', function(event) {
if (isScribble == 2 || isScribble == 1) {
isScribble=0;
}
});
if (isTouch || isiPad) {
//elem.addEventListener("touchstart", touchHandler, true);
elem.addEventListener("touchmove", touchHandler, true);
elem.addEventListener("touchend", touchHandler, true);
elem.addEventListener("touchcancel", touchHandler, true);
//elem.addEventListener('touchstart', function(event) {
// if (isScribble == 1) {
// isScribble=2;
// }
//});
} else {
elem.addEventListener('mouseup', function(event) {
if (isScribble == 2) {
isScribble=1;
}
});
elem.addEventListener('touchend', function(event) {
if (isScribble == 2) {
isScribble=1;
}
});
elem.addEventListener('touchstart', function(event) {
if (isScribble == 1) {
isScribble=2;
}
});
elem.addEventListener('mousedown', function(event) {
if (isScribble == 1) {
isScribble=2;
}
});
elem.addEventListener('mousemove', function(event) {
if (isScribble == 2) {
if (x == 0 && y == 0 && lastx == 0 && lasty == 0) {
if (event.pageX || event.pageY) {
x = event.pageX - elemLeft;
y = event.pageY - elemTop;
} else {
x = event.clientX - elemLeft;
y = event.clientY - elemTop;
}
lastx=x;
lasty=y;
} else {
lastx=x;
lasty=y;
if (event.pageX || event.pageY) {
x = event.pageX - elemLeft;
y = event.pageY - elemTop;
} else {
x = event.clientX - elemLeft;
y = event.clientY - elemTop;
}
}
if (x != lastx || y != lasty) {
document.getElementById('divannotation').style.display='block';
document.getElementById('myisubject').style.display = 'inline';
document.getElementById('myiemail').style.display = 'inline';
context.strokeStyle=document.getElementById('mycolour').value;
context.beginPath();
context.moveTo(x,y);
context.lineTo(lastx,lasty);
context.stroke();
}
}
});
}
setTimeout(tryit, 2000);
โฆ as you can see from thislink. Regarding some mobile platform issues weโd like to thank this really useful link โฆ so, thanks. And if actions speak louder than words no doubt youโll be wanting the liverun link.
As for โฆ
We โmightโ have genericized the world.html changes into other HTMLs of its ilk โฆ well, we decided against that for now โฆ but will later โฆ and partly the reason is that there is more to do, and we just want to concentrate on world.html
โฆ from last timeโs Canvas Email Attachment New Image Tutorial as shown below, that still remains the case โฆ there is more to do. Hope to see you back again for that then.
Previous relevant Canvas Email Attachment New Image Tutorial is shown below.
When we last left off with Canvas Image Email Attachment External Javascript Tutorial project we posed two ongoing โtrailersโ/โspoiler alertsโ โฆ
- We โmightโ have genericized the world.html changes into other HTMLs of its ilk โฆ well, we decided against that for now โฆ but will later โฆ and partly the reason is that there is more to do, and we just want to concentrate on world.html with โฆ
- Did you guess what functionality we might want to do next? We want to allow the user to โoverlayโ or โclobberโ the existing canvasโs map image with an image of their choosing in one of two entry methods โฆ
- via a Browse button selection of an image on their computer โฆ or โฆ
- via the specification of a URL pointing at an image (on the web, probably)
Weโve grappled with the relatively newly arrived brilliance of HTML5 with ideas off Browse buttons and their manipulation of file data, the methods of which donโt even need PHP or ASP.Net (or any other server side language) to proceed โฆ cute, huh?! We referenced this great link when we presented PHP/HTML/Javascript Media & Document File Browse Tutorial, and you may want to reference that regarding the useful Javascript HTML5 FileReader methods. Another really useful link for todayโs work is โฆ what we just linked โฆ we presume โฆ thanks. We find FileReader.readAsDataURL() method to be just what we want today to take the data of a file as a data URL and be able to use the canvas.drawImage() to place that image data onto the canvas by โoverlayingโ it or โclobberingโ it.
Our worldhtml did not need to change for this new image friendly functionality but our external Javascript you could call world
js changed quite a bit as you can see from thislink.
To envisage all this, you really should try a liverun of our interactive World Map (with Annotation and Email Attachment functionality) web application. We hope some Browse button thoughts start springing forth from the bit below the hair (or if youโre standing on your head right now โฆ the bit above the hair).
Previous relevant Canvas Image Email Attachment External Javascript Tutorial is shown below.
Rome wasnโt built in a day โฆ just read โSPQR A History of Ancient Romeโ by Mary Beard, to confirm that. And software takes time, and often revisits and rethinks, in between, running it past people, perhaps. So it is with the build up of our โcauseโ, which weโll eventually reveal, that started with Canvas Image Email Attachment Primer Tutorial as shown below, and moves on today, in two directions โฆ
- Organization wise โฆ we move some of the โAnnotation++โ functionality specifics to external Javascript โฆ via โฆ
<script type='text/javascript' src='world.js' defer></script>
โฆ to be more modular, and to apply it to other web applications like world.html that arenโt world.html (which we will also do event-U-al-ly โฆ maybe even today?! โฆ youโll see at the end of this blog posting if we have) - Functionality wise โฆ we allow for more than โAnnotationsโ now โฆ hence the โAnnotation++โ notation above โฆ weโve been delving into our HTML canvas codes for logic to draw lines and rectangles (including a โhuge white rectangleโ to โclearโ the canvas) and circles today
When you redesign arrangements this way, you should retest all the functionality combinations to make sure you havenโt broken anything โฆ because that would be kindaโ stUpid. The adage should be that you leave things better than when you start, to do a good job โฆ doh!
So thereโs still an important bit of โbaseโ functionality missing, and weโll get to that next time, though maybe youโve guessed what it would be yourself?!
So take a look at our HTML and Javascript and CSS worldhtml which changed as per thislink which now calls on new external Javascript you could call world
js if you like. Unchanged is the concept (and the content) regarding the HTML using PHP server side code you could call world
php within an HTML iframe element. Again, please donโt think youโll be able to achieve this functionality just with client-side Javascript. It involves server data. So here is a live
run link in order for you to try this new functionality, which kicks into action from the second canvas click/touch, and on.
Hint: Donโt be shy to try some โrgba([red0-255],[blue0-255],[green0-255],[opacity0.0-1.0])โ colour field possibilities in combination with the filled in rectangle option to improve your โoverlayโ functionality possibilities, as with todayโs main tutorial picture.
Previous relevant Canvas Image Email Attachment Primer Tutorial is shown below.
Maybe you remember the series of blog postings that we last visited with HTML5 Canvas Map Clickaround Onresize Tutorial some time ago? Weโve been, over the last couple of days, working out how to โฆ
- take an HTML canvas elementโs [canvasContext].drawImage() image
- be able to overlay some interactively entered textual annotations over the top of user entered rectangle corners
- take a snapshot of this canvas with its annotations via [canvasContext].toDataURL() (woh!)
- use an HTML form element with method=POST target=myiframetwo to post the data to our (new) PHP (featuring the use of php://input for the first time, for us anyway) โฆ which โฆ
- emails that snapshot to someone
We allow for โฆ
- non-mobile platforms to use their email clients, perhaps, via a body link to an image file stored on the rjmprogramming.com.au domain web server โฆ or, because such functionality is awkward for mobile platforms, we โฆ
- allow for the canvas contents be turned into image data that can be used as the data for an email attachment, thus allowing the web server to not have to store the data (there) now
Hereโs some of the PHP code to create that email with its attachment, for your perusal (where $idata has that data URL data of the canvasโs contents, that is image/png data (in base64)) โฆ
//$headers = 'From: ' . 'rmetcalfe@rjmprogramming.com.au' . $eol;
$headers = 'Reply-To: ' . 'rmetcalfe@rjmprogramming.com.au' . $eol;
// 'X-Mailer: PHP/' . phpversion();
$contents = "";
if ($idata != "") $contents = $idata;
if (strpos('~' . $mybody, '~http') !== false || $contents != "") {
if ($contents == "") $contents = @file_get_contents($mybody);
if ($contents != '') {
//
date_default_timezone_set('Australia/Perth');
//
//$mysubject .= ' ... ' . $mybody;
$fs = explode("/", $mybody);
$filename = $fs[-1 + sizeof($fs)];
$content = chunk_split(base64_encode($contents));
//
// a random hash will be necessary to send mixed content
$separator = md5(time());
//
$headers .= "MIME-Version: 1.0" . $eol;
$headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol . $eol;
$headers .= "Content-Transfer-Encoding: 7bit" . $eol;
$headers .= "This is a MIME encoded message." . $eol . $eol;
//
// message
$headers .= "--" . $separator . $eol;
$headers .= "Content-Type: text/plain; charset=\"iso-8859-1\"" . $eol;
$headers .= "Content-Transfer-Encoding: 8bit" . $eol . $eol;
//
$headers .= "Please see attached image below:" . $eol . $eol;
//
// attachment
$headers .= "--" . $separator . $eol;
$headers .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"" . $eol;
$headers .= "Content-Transfer-Encoding: base64" . $eol;
$headers .= "Content-Disposition: attachment;filename=\"" . $filename . "\"" . $eol;
$headers .= $content . $eol . $eol;
$headers .= "--" . $separator . "--";
//
ourpremail($tem, $mysubject, "", $headers); // emails to $tem
}
}
And so, with our proof of concept ideas, the world becomes (hopefully, lots of) our (collective) oyster(s), given a little imagination, here. Really, take a look at our HTML and Javascript and CSS worldhtml which changed as per thislink. It has new PHP server side code you could call world
php within an HTML iframe element. Please donโt think youโll be able to achieve this functionality just with client-side Javascript. It involves server data. So here is a live
run link in order for you to try this new functionality, which kicks into action from the second canvas click/touch, and on.
Previous relevant HTML5 Canvas Map Clickaround Onresize Tutorial is shown below.
Yesterday we came back after quite some time in the (PHP) server world to some client (Javascript and HTML) work, and today, after yesterdayโs HTML5 Canvas Map Clickaround Overlay Tutorial as shown below, we tackle a client Javascript event, the โonresizeโ event (best intervened with in terms of looking at the Javascript DOM โwindowโ object rather than the โdocumentโ object), that is often โleft until lastโ in a programmerโs mind โฆ and often not thought about at all. Thatโs often me โฆ but not today.
Perhaps the reason it is (often) neglected is that the design (youโve come up with) leaves lots of room, and the styling โposition:absolute;โ concept is not used at all with your web application. Yesterday, though, โposition:absolute;โ is pivotal to the working of the web application, as is the positioning of the HTML canvas element at (0,0) โฆ why? โฆ the slightly glib answer here is that to complicate life is to complicate your web application, and if you can cater for the simple case, why not work with that simple case, with its simplified coding logic?
Okay, so whatโs the scenario with yesterdayโs HTML5 Canvas Map Clickaround Overlay Tutorial where the Javascript โonresizeโ event gets triggered. On a laptop or desktop computer, it is when you โdragโ (a window corner) and, we anticipate, shrink your window (by then โdroppingโ (a window corner)) to end up with a window smaller than the set established size, width or height, we cater for with the HTML canvas elementโs width or height.
Now we currently rely on the right hand side being the user controlling side, but if a user shrinks the window, and we refuse to get into any โzoomingโ logic โฆ my strong advice is not to go there โฆ you have two choices to my mind โฆ
- โcopyโ the right hand HTML (into an existant blank HTML div elementโs innerHTML) and โoverlayโ at (0,0) (with less opacity than the rest)
- โcopyโ the right hand HTML and use Javascript (where myWidth is calculated width of the HTML canvas element โฆ remember this functionality from yesterday?) โฆ and use window.open(โโ,โTitleโ,โtop=0px,left=โ + eval(20 + myWidth) + โpx,width=350px,height=600pxโ) (along with a global variable wadd) โฆ for a popup window, as per โฆ
and then use wadd.document.write([someHTML]) โฆ as per โฆ
wadd = window.open("","Your Place and Airports Map Goes Here ...","top=0px,left=" + eval(20 + myWidth) + "px,width=350px,height=600px");
var newhtml="<!doctype html><html><head>" + document.head.innerHTML + "</head><body>" + document.getElementById('dhuh').innerHTML.replace(/opacity:0.0;/g, "opacity:1.0;").replace('"Cloudy"', '').replace('id="myqiframe', 'id="myiframe').replace('id="mypqiframe', 'id="mypiframe').replace('id="myqa', 'id="mya');
wadd.document.write(newhtml);
Youโve probably guessed by the added detail in the second of above, the first idea was awkward, but if you want to pursue it yourself, via leads, look for the (left in) if (additional != โ) { } logic parts in the HTML/Javascript coding of cloudy_worldhtml (or try the live
run).
We later use a Javascript setTimeout() call to wait a while while the hidden right hand sideโs HTML iframe element is filled out with the Airport Data Near Your World Map Clicked Position, and through that knowledge over to the โwaddโ window (where it is viewable, presumably โฆ unless youโve repositioned again (which is okay to test if you want)).
So, today, everything should be as per yesterday with no โresizingโ (and of course the programmer adage to โnot make things backward in functionalityโ would tell you that to hold onto this โtooth and nailโ should be thought of as extremely important โฆ probably of higher priority than any new functionality โฆ think probably users get pretty annoyed by things that used to work, not working later, because of your own newly introduced bug).
It behoves me, my liege, to leave you with the HTML/Javascript code differences, to make this happen, from yesterday, here, and we hope it helps you in some small way. We also want to thank the โpowers that beโ for the excellent advice at this link, for this topic โฆ thanks, as always.
Previous relevant HTML5 Canvas Map Clickaround Overlay Tutorial is shown below.
After some time in the (PHP) server world, itโs time to dive back into some client (Javascript and HTML) work, in this client/server world of web applications.
Today we revisit the โoverlayโ theme of blog postings, as the web application world is full of possibilities for overlay ideas.
This time we overlay an HTML div element completely on top of an HTML canvas element, with some opacity (or some transparency), during the body โonloadโ event. We do not adjust the DOM โz-indexโ style property for either element. So what happens in this scenario when you click on this โmultipleโ HTML element combination? Well, it pans out you click on the HTML div element, so we have another task to do at the body โonloadโ event, to see things right, regarding the working of this web application, which starts where we left off with HTML5 Canvas Map Clickaround Follow Up Tutorial as shown below.
From this basis, this is how we got to today โฆ there was HTML cloudy_worldhtml that changed like here.
Youโll see in the code above some great code presented at useful link (thanks) which is great for defining an HTML elementโs size via โฆ
function SetBox(what) {
var div = document.getElementById(what);
if (div.getBoundingClientRect) { // Internet Explorer, Firefox 3+, Google Chrome, Opera 9.5+, Safari 4+
// do stuff
}
}
โฆ and we hope you can see that the implications for โoverlayโ ideas you have are huge โฆ and that is fine โฆ but you may wonder how the HTML div element is made to drape right over all the canvas element โฆ well, it uses styling as per โฆ
- position: absolute;
- top and left and width and height parameters are all defined
- borderTop defined as having a size the same as height above as per our HTML div id=โboxdivโ element โฆ
document.getElementById('boxdiv').style.position = 'absolute';
document.getElementById('boxdiv').style.top = y + "px";
document.getElementById('boxdiv').style.left = x + "px";
document.getElementById('boxdiv').style.width = w + "px";
document.getElementById('boxdiv').style.height = h + "px";
document.getElementById('boxdiv').style.borderTop = h + 'px solid rgba(255,255,255,0.5)';
โฆ and youโll also see with the code how the HTML div id=โboxdivโ elementโs โonclickโ details are transferred to the (effectively underlying) HTML canvas element, where all the previous business logic of the web application resided, and continues to function (once you make variables โxโ and โyโ global and control how they are derived at the HTML div id=โboxdivโ elementโs โonclickโ event logic).
So please try the liverun to see all this in action.
Previous relevant HTML5 Canvas Map Clickaround Follow Up Tutorial is shown below.
HTML5 brought in the incredibly useful โcanvasโ element, for the first time. Its existence opens up a whole new world of possibilities for web applications that are graphical by nature, as we saw yesterday with HTML5 Canvas Map Clickaround Primer Tutorial as shown below. Today, we extend that functionality as of yesterday, by adding the use of a public data feed to enhance the information we present with the Google Map โiframeโ we use, and for this we need to thank, profusely, The Global Airport Database project by Arash Partow โฆ thanks very much. Now this database (really a file), as you can imagine, has data that changes over time, so is probably best used as a data feed. Nevertheless, the exercise of using it as a snapshot is useful, and we go ahead and show the nearest 4 airports on the database, in that Google Map โiframeโ as of April, 2015.
This involved the use of PHP (intairphp) to read the file and parse it, which wasnโt hard as it contains well formed โ:โ delimited data, and there is just the check needed for security hidden data given a latitude and longitude of zero โฆ unless Iโm mistaken, and where the water goes down the sink the other way as you cross the equator due south of London has several hundred microscopic airports run by ants โฆ what a movie script?!
With the canvas elementโs drawImage() method, we use to position the image map of interest, you can draw more than your own geometrical constructs, you can have an image, and that image could be a map, as for todayโs โWorld Clickaroundโ web application (with access to maps of Brazil and Ireland and United States of America too), where you click on the map (and thanks to mapsofworld.com for downloadable free maps here) to show a Google Map of interest via Google Chart Map Chart. Maybe you can use the map of the World to โฆ
- plan a trip
- look up where relatives live
- count the fire hydrants in Monaco
This web application calls on tiny bits of mapping knowledge, namely the โorientationโ of your โmapโ, as you are effectively digitizing to show where you want your Google Map to zoom in on.
Please have a go of our liverun or download the HTML programming source code you could call world
htm (brazil
htm, ireland
htm, united_states
htm), or do both?!
From yesterday, this is how we got to today โฆ there was new PHP you could call intairphp โฆ and then there was changed HTML, the changes for which look like โฆ worldhtm, brazilhtm, irelandhtm, united_stateshtm
Previous relevant HTML5 Canvas Map Clickaround Primer Tutorial is shown below.
HTML5 brought in the incredibly useful โcanvasโ element, for the first time. Its existence opens up a whole new world of possibilities for web applications that are graphical by nature.
With the canvas elementโs drawImage() method you can draw more than your own geometrical constructs, you can have an image, and that image could be a map, as for todayโs โIreland Clickaroundโ web application (with access to maps of Brazil and United States of America and the World too), where you click on the map (and thanks to mapsofworld.com for downloadable free maps here) to show a Google Map of interest via Google Chart Map Chart. Maybe you can use the map of Ireland to โฆ
- plan a trip
- look up where relatives live
- imagine youโre in OโConnell Street
This web application calls on tiny bits of mapping knowledge, namely the โorientationโ of your โmapโ, as you are effectively digitizing to show where you want your Google Map to zoom in on.
This is one of those occasions that your (simple) software is a lot more effective using the Mercator map projection (that exaggerates the polar areas (like you might have had at school) because the simple latitude and longitude distances everywhere are the same (but relative areas definitely are not (ie. much bigger than reality near the poles))). Unfortunately, our United States of America projection is not Mercator, but youโll still get a โball parkโ Google Maps feel.
So we can have it that if the user doesnโt zoom, they need no orientation checks, but otherwise we need to determine a scale, by the user clicking on Dublin, on the map, and from that, we can work out the scaling that needs to be applied, as the top left co-ordinate is arranged to be (0,0) via the style=โposition: absolute; top:0; left:0; โ part of โฆ
<canvas id="canvaselement" width=600 height=600 style="position: absolute; top:0; left:0; " />
Please have a go of our liverun or download the HTML programming source code you could call ireland
html (brazil
html, united_states
html, world
html), or do both?!
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
If this was interesting you may be interested in this too.
3 Responses to Canvas Annotation Email Attachment Cookie Tutorial