<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-2777379019967928702</id><updated>2008-06-24T12:02:51.967-04:00</updated><title type='text'>iPhone Minds</title><link rel='alternate' type='text/html' href='http://iphoneminds.com/index.php'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default?start-index=26&amp;max-results=25'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://iphoneminds.com/atom.xml'/><author><name>MindComet</name><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-1824581062970830501</id><published>2008-06-24T11:52:00.003-04:00</published><updated>2008-06-24T12:02:52.006-04:00</updated><title type='text'>Quest for the Best iPhone App Content</title><content type='html'>On Friday, June 20th, &lt;a href="http://www.ilounge.com/" target="_blank"&gt;iLounge&lt;/a&gt; and &lt;a href="http://www.bowers-wilkins.com/" target="_blank"&gt;Bowers &amp; Wilkins&lt;/a&gt; announced the &lt;a href="http://www.ilounge.com/index.php/news/comments/quest-for-the-best-iphone-app-contest/" target="_blank"&gt;Quest for the Best iPhone App Contest&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;There are three categories your can place in, each winning a B&amp;W Zeppelin Speaker System&lt;br /&gt;&lt;li&gt;Best Game&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Best Business/Pro App&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Best Just Plain Cool App&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;For more details on how to enter visit the &lt;a href="http://www.ilounge.com/index.php/news/comments/quest-for-the-best-iphone-app-contest/" target="_blank"&gt;Quest for the Best iPhone App Contest&lt;/a&gt; web site.&lt;br /&gt;&lt;br /&gt;The Quest for the Best iPhone App begins on June 20, 2008 and ends on July 23, 2008 at 11:59PM Pacific Time.</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/06/quest-for-best-iphone-app-content.html' title='Quest for the Best iPhone App Content'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=1824581062970830501' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/1824581062970830501'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/1824581062970830501'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-7099049671078367874</id><published>2008-06-10T13:15:00.008-04:00</published><updated>2008-06-10T16:36:54.597-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone features'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone enterprise'/><category scheme='http://www.blogger.com/atom/ns#' term='3g iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='apple keynote'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='wwdc'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>2008 WWDC Apple Keynote Highlights</title><content type='html'>Apple CEO Steve Jobs kicked off Apple's WWDC Keynote highlighting 147 sessions on developing for Apple products, 62 of those sessions on the iPhone, with 169 hands-on labs. After announcing over 250,000 developers downloading the free SDK and 25,000 purchasing the developers license, Jobs went into the iPhone 2.0 features.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Enterprise&lt;/li&gt;&lt;br /&gt;&lt;li&gt;SDK&lt;/li&gt;&lt;br /&gt;&lt;li&gt;New End-User Features&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;iPhone 2.0 Enterprise&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;The iPhone isn't just for Mac businesses anymore, The iPhone can now integrate with Enterprise applications, ie. Microsoft Outlook and iCal, as well as "push" technology, which can easily be described as synchronization to multiple devices allowing users to synchronize their email, contacts, calendar, etc. With increased security and implementation of the push technology, the iPhone can now be used as a secure and viable Enterprise solution.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;iPhone 2.0 SDK&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Scott Forstall discussed allowing developers to build iPhone applications the same way that Apple does, using the same kernel as Mac OS X and Core Services layer, development couldn't be any easier. If you're already developing applications for the Mac the iPhone won't be much different.&lt;br /&gt;&lt;br /&gt;Included in the SDK now is XCode, Interface Builder, iPhone Simulator, Tethered Debugging, and Instruments. With so much power in this SDK, iPhone applications should blow iPhone users out of the water.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://events.apple.com.edgesuite.net/0806wdt546x/event/index.html" title="Apple's 2008 WWDC Keynote" target="_blank"&gt;Be sure to check out Apple's WWDC Keynote for Scott Forstall's demonstration of these iPhone SDK tools as well as some of the amazing demonstrations from other development companies.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;iPhone 2.0 New End-User Features&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Some of the new features included in the iPhone 2.0 update are Parental Controls and 16 new languages including Japanese and Chinese.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;iPhone 2.0 Software Update - Early July&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;As the Keynote went on Jobs mentioned the iPhone App Store and &lt;a href="http://www.apple.com/mobileme/" title="iPhone MobileMe" target="_blank"&gt;MobileMe&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What really got us excited here at &lt;strong&gt;iPhoneMinds&lt;/strong&gt; was the announcement of the &lt;strong&gt;3G iPhone&lt;/strong&gt;, which can only be purchased and activated in stores July 11th. The 8GB 3G iPhone will cost you 199.99 while the 16GB 3G iPhone will cost you 299.99, the new iPhones also include GPS.&lt;br /&gt;&lt;br /&gt;Tell us what you thought of Apple's 2008 Keynote at WWDC. &lt;a href="mailto:ask@iphoneminds.com"&gt;ask[at]iphoneminds.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;// Jay, aka &lt;a href="http://www.w3prodigy.com/" title="W3prodigy, iPhoneMinds blogger for MindComet" target="_blank"&gt;W3prodigy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://digg.com/apple/2008_WWDC_Apple_Keynote_Highlights" target="_blank" title="Digg 2008 WWDC Apple Keynote Highlights on iPhoneMinds"&gt;Digg 2008 WWDC Apple Keynote Highlights on iPhoneMinds&lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/06/2008-wwdc-apple-keynote-highlights.html' title='2008 WWDC Apple Keynote Highlights'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=7099049671078367874' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/7099049671078367874'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/7099049671078367874'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-4797279627740872022</id><published>2008-05-28T14:36:00.008-04:00</published><updated>2008-05-28T15:27:10.343-04:00</updated><title type='text'>Think different: Some companies are targeting iPhone users when they go mobile</title><content type='html'>Thanks to &lt;a href="http://www.w3prodigy.com/" target="_blank" title="W3prodigy"&gt;Jay&lt;/a&gt; and the iPhone team for their support on this interview/feature in BtoB Magazine!&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.btobonline.com/graphics/bb_logo.gif" /&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Originally published in &lt;a href="http://www.btobonline.com/apps/pbcs.dll/article?AID=/20080527/FREE/226488584/1146/FREE"&gt; BtoB Magazine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;By Amy Syracuse&lt;br /&gt;Story posted: May 27, 2008 - 11:48 am EDT&lt;br /&gt;&lt;br /&gt;Ask an iPhone user what the device means to him or her and you'll likely hear that its advanced capabilities and user-friendly interface have been nothing less than life-changing.&lt;br /&gt;&lt;br /&gt;Such statements might sound like hyperbole-the ravings of an ardent group of Apple-eyed gadget geeks. But recent studies indicate there is truth behind them. The iPhone is changing lives, at least where mobile Web use is involved.&lt;br /&gt;&lt;br /&gt;A survey of 50,000 U.S. households conducted by iSuppli Corp. in the fourth quarter of 2007 found that iPhone users spent just 46.5% of their time on the device making calls, compared to 71.7% for the typical cell phone user. The rest of the time, they were reading and sending e-mail, browsing the Web and checking out Google Maps, among other tasks.&lt;br /&gt;&lt;br /&gt;As these consumers' behaviors change so, too, must those of marketers. Realizing this, more companies are testing campaigns targeting iPhone users to determine whether the way to their hearts is the $400-plus device they're carrying in their pocket.&lt;br /&gt;&lt;br /&gt;One example is Payless Car Rental, which this month unveiled an iPhone-optimized Web site that helps consumers research and reserve rental cars with minimal typing and clicking. The site focuses on the functions that most interest mobile users, with buttons for "Reserve a Car," "View, Modify, or Cancel Reservation" and "Locations." It also has a "Call to Book" button that connects directly to a call center.&lt;br /&gt;&lt;br /&gt;According to Justin Talerico, CEO of ion interactive, a company that offers iPhone-optimized landing pages and other post-click marketing services, optimization should improve consumers' interactions with marketing messages. And even though the iPhone was designed for easy browsing of the Web in its traditional format, there is room for improvement.&lt;br /&gt;&lt;br /&gt;"[iPhone users] come to the table in a more ... purposeful state of mind," Talerico said. "In a way, they're easier to convert. But you make them harder to convert if you give them an experience that's subpar."&lt;br /&gt;&lt;br /&gt;Companies can deliver more satisfactory iPhone browsing experiences by simplifying landing page messaging, developing pages that load quickly over lower bandwidth connections, using fonts that are readable on a 3.5-inch screen and eliminating the need to scroll, regardless of whether the device is in portrait or landscape mode, Talerico said.&lt;br /&gt;&lt;br /&gt;Jeff Lin, project leader of Payless Car Rental's Web marketing strategy team, believes optimization paid off for Payless. "The number of iPhone ... visitors and bookings has increased many fold since the launch of the interface," he said. The press that accompanied the debuth has also helped with branding, Lin added.&lt;br /&gt;&lt;br /&gt;Payless drives traffic to its iPhone site through RSS feeds, publicity and links on www.apple.com and www.paylesscarrental.com. Other companies have used online advertising to connect iPhone users with optimized content, said Jason Spero, VP-marketing for mobile advertising network AdMob.&lt;br /&gt;&lt;br /&gt;In April, AdMob client Land Rover Group made online advertising purchases targeted to iPhone users. When they clicked, consumers reached landing pages where they could watch video, view pictures, access a store locater and click-to-call for a test drive.&lt;br /&gt;&lt;br /&gt;Companies can target advertising buys within AdMob's network according to device manufacturers and models, country or region, demographic groups and other factors. Spero called Land Rover's work "highly successful" and said iPhone users are only becoming more active. "We have seen traffic to iPhones and iTouch devices grow rapidly in the last year," he noted.&lt;br /&gt;&lt;br /&gt;As much as the iPhone has already altered mobile Web usage, Tara Lamberson, VP-marketing and strategy for marketing agency &lt;a href="http://www.mindcomet.com/" target="_blank" title="MindComet Corp. brings you iPhoneMinds."&gt;MindComet Corp.&lt;/a&gt;, believes more "life-changing" developments are on the horizon.&lt;br /&gt;&lt;br /&gt;The June release of Apple's Software Development Kit means select external developers and enterprise customers will be able to create custom widgets, games and even software platforms for the device. Marketers can use branded versions of such applications to boost brand awareness or deliver a call to action, said Lamberson.&lt;br /&gt;&lt;br /&gt;In the long term, Lamberson thinks truly advanced mobile marketing capabilities-things like geo-targeting based on a user's GPS coordinates-aren't unrealistic. But with such opportunity comes tremendous responsibility.&lt;br /&gt;&lt;br /&gt;"Direct marketing on the iPhone should be permission-based," she said. But for those consumers who wish to receive iPhone marketing, "companies can be more relevant just by using those devices."</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/05/think-different-some-companies-are.html' title='Think different: Some companies are targeting iPhone users when they go mobile'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=4797279627740872022' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/4797279627740872022'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/4797279627740872022'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-5146622609494753734</id><published>2008-05-15T16:21:00.005-04:00</published><updated>2008-05-15T16:49:57.865-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>iPhone SDK Development Programming Language</title><content type='html'>Another great question comes in today from an anonymous "M$ .NET developer",&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Hi,&lt;br /&gt; &lt;br /&gt;Please forgive my ignorance, but can you tell me which languages you can develop iPhone applications in? From looking around it seems you need to install xCode 3.1 on OS 10 (10.5?) by installing the iPhone SDK and then write code in Objective C. But can you code in other languages, like C#?&lt;br /&gt; &lt;br /&gt;Also, what language are the code snippets on you site in?&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;There's no need for apologies, we're all learning here! This is a great question. You are correct in your assumption. The first step toward iPhone development bliss is installing the latest beta of the &lt;a href="http://developer.apple.com/iphone/download.action?path=/iphone/iphone_sdk_beta_5_9m2173a/iphone_sdk_9m2173a.dmg"&gt;iPhone SDK&lt;/a&gt; (you'll need a free &lt;a href="http://developer.apple.com/"&gt;Apple Developer Connection&lt;/a&gt; account to download). Unfortunately, you will only be able to install the SDK on the latest version of OS X (10.5.2 at the time of this writing). The iPhone SDK is not supported on Tiger or any previous versions of Leopard. Once you have it downloaded, install it like you would any other .dmg file and you're off!&lt;br /&gt;&lt;br /&gt;The only language you can use to write code for the iPhone currently is Objective-C. Now, there have been some open-source efforts made to bridge Objective-C with other languages (&lt;a href="http://pyobjc.sourceforge.net"&gt;PyObjC&lt;/a&gt; comes to mind), but as far as being able to directly develop for iPhone with another language within Xcode (whew, that was a mouthful!), sorry Charlie.&lt;br /&gt;&lt;br /&gt;For the code snippets, I believe you are referring to the web applications, correct? The backend code used is &lt;a href="http://www.php.net"&gt;PHP&lt;/a&gt; and the effects are the result of some crafty Javascript. For the slide effects, we've utilized the &lt;a href="http://code.google.com/p/iui/"&gt;IUI&lt;/a&gt; on several occasions, the wonderful &lt;a href="http://developer.yahoo.com/yui/"&gt;YUI&lt;/a&gt;, and have also taken from the &lt;a href="http://jquery.com"&gt;jQuery&lt;/a&gt; library. Also, have a look at a nice little &lt;a href="http://iphoneminds.com/2008/04/animation-on-iphone-you-know-you-missed.html"&gt;list of frameworks&lt;/a&gt; that we have previously written about.&lt;br /&gt;&lt;br /&gt;Keep those questions coming in! Until next time, stay classy iPhone-diego!&lt;br /&gt;&lt;br /&gt;// Albert</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/05/another-great-question-comes-in-today.html' title='iPhone SDK Development Programming Language'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=5146622609494753734' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/5146622609494753734'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/5146622609494753734'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-8369664114908980298</id><published>2008-04-30T16:42:00.006-04:00</published><updated>2008-04-30T17:04:53.080-04:00</updated><title type='text'>Optimizing iPhone Web Applications</title><content type='html'>We received a comment on &lt;a href="http://iphoneminds.com/2007/12/basic-ajax-scroll-animation-wyui.html" target="_blank"&gt;Basic AJAX Scroll Animation w/ YUI&lt;/a&gt; from &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Joel&lt;/span&gt; saying,&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;These javascript libraries will equal more than 80K. For an iPhone that's just way too much. Especially if it's EDGE.&lt;br /&gt;&lt;br /&gt;Any other suggestions for slide?&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I agree Joel, you have an excellent point, an iPhone loading a web page on EDGE is much slower than on 3G or WiFi. While I don't have any other suggestions for a slide technique, as a developer I do my best to keep the load times to a minimum, and in all reality the user should only have to load your site once. After the initial load, no more data should be transmitted.&lt;br /&gt;&lt;br /&gt;Let's keep this simple; an iPhone application should be "small, lightweight, and portable." Sound familiar? Yeah, that's exactly how &lt;a href="http://www.apple.com/" target="_blank"&gt;Apple&lt;/a&gt; describes the iPhone. So we're not stretching far away from the overall goal of the iPhone. "At the touch of a finger." I believe was one of the many slogans used during the initial iPhone ramp-up. We should develop our web applications with the same intent.&lt;br /&gt;&lt;br /&gt;While normally loading these AJAX libraries on mobile devices is tedious and increases the load time, I personally have no problem loading YUI libraries on our development iPhone. The way I see it, users of the iPhone expect a slight delay when loading a web page, much like I expected it on my old SideKick. However, when developing these iPhone applications, if you load all your content, whether visible or not to the user, then make AJAX animation calls to bring the content to the iPhone's screen when needed, the overall user model will not take a hit and it will be an experience of the lifetime.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;To summarize:&lt;/span&gt;&lt;br /&gt;&lt;li&gt;Keep AJAX Libraries to a minimum.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Limit the number of pages to load.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Define a user model that relates to the user.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;iPhone web applications rely on solid user models. Build a good one, and you won't have any issues with my methods.&lt;br /&gt;&lt;br /&gt;// Jay, aka &lt;a href="http://www.w3prodigy.com/" target="_blank"&gt;W3prodigy&lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/04/optimizing-iphone-web-applications.html' title='Optimizing iPhone Web Applications'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=8369664114908980298' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/8369664114908980298'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/8369664114908980298'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-8137652036609451819</id><published>2008-04-15T12:27:00.006-04:00</published><updated>2008-04-15T12:51:11.212-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='yui'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='uikit'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Animation on the iPhone, You know you missed me.</title><content type='html'>With the iPhone SDK out, and iPhone applications moving away from the web, I never thought I'd post here again. Lucky for you, we received an awesome question from Dan in the UK about Animation on the iPhone. Yay Dan!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Hey iPhonemind.com guys,&lt;br /&gt;&lt;br /&gt;I was wondering if you could help me with a quick question I have pondering about in my mind relating to the wonderful invention called iPhone. I'm a multimedia student at Stafford College in the UK and having learnt the "designer" side of computing fancied turning to the dark side and have a go at programming. I've done bits of programming here and there before and know Action-script pretty well etc, but since the iPhone currently doesn't support flash yet here is where my question lies. &lt;br /&gt;I want to create an interactive application where the user taps the screen and random squiggles or images will pop up to create a sort of abstract image animation, I've been looking on Apple's Developer website and had a look through most content on their but to no avail I'm still not sure on what the right sort of API's or frameworks to use. The UIKit would be a major player in the making of it but I'm not sure what else to read up on, just hoping someone out there might be able to point out roughly what I should be looking for?&lt;br /&gt;The application is going to include shapes, colours, images, video maybe, sound hopefully, vector graphics and maybe a bit of text, the whole thing is going to be totally random for a college project and have no real purpose other than being one of them cool things you show your mates.&lt;br /&gt;&lt;br /&gt;Your website is great by the way, loads of useful tips and tricks that I will be having a tinker with after I've figured all this out. &lt;br /&gt;&lt;br /&gt;Many Thanks,&lt;br /&gt;&lt;br /&gt;Dan&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Well Dan, That's an excellent question! Since we'll never truly know when Flash will become available on the iPhone, I'm very glad you asked. We've all seen ways to animate a web page through the use of AJAX [cough]dhtml[/cough], including my post on creating a &lt;a href="http://iphoneminds.com/2007/12/basic-ajax-scroll-animation-wyui.html" title="Basic AJAX Scroll Animation w/ YUI" target="_blank"&gt;Basic AJAX Scroll Animation w/ YUI&lt;/a&gt; that was featured on the YUI developers blog.&lt;br /&gt;&lt;br /&gt;As of right now, AJAX is the way to go for animation on the web. Here's a few of my favorites...&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://developer.yahoo.com/yui/animation/" title="Yahoo! UI Library: Animation" target="_blank"&gt;Yahoo! UI Library: Animation&lt;/a&gt; - A little more advanced, but one of my favorites.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://script.aculo.us/" title="Script.Aculo.Us" target="_blank"&gt;Script.Aculo.Us&lt;/a&gt; - Simple to implement, a little more restricted.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://jquery.com/" title="jQuery" target="_blank"&gt;jQuery&lt;/a&gt; - Takes time to learn, but definitely worth the effort.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://mootools.net/" title="MooTools" target="_blank"&gt;MooTools&lt;/a&gt; - This one seems to be a popular one, maybe not the best for the iPhone, but definitely fun to work with.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;What I suggest is that you sketch out your idea, step by step, then determine from the libraries listed above which would work best for you. JavaScript is relatively simple, and with your ActionScript experience it should be a quick run-through for you. Try to stick to one library to reduce load times. While the iPhone is an amazing device, the technology it runs on (EDGE) isn't completely up to speed for large applications.&lt;br /&gt;&lt;br /&gt;I hope this helps you out Dan, I look forward to answering more questions like this. If you have a question about iPhone development, hit us up at &lt;a href="mailto:ask@iphoneminds.com"&gt;ask [at] iphoneminds.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;// Jay, aka &lt;a href="http://www.w3prodigy.com/" title="W3prodigy, Web Developer" target="_blank"&gt;W3prodigy&lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/04/animation-on-iphone-you-know-you-missed.html' title='Animation on the iPhone, You know you missed me.'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=8137652036609451819' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/8137652036609451819'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/8137652036609451819'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-4879407718099544077</id><published>2008-03-07T19:03:00.002-05:00</published><updated>2008-03-07T19:07:29.205-05:00</updated><title type='text'>iPhone SDK = Happy Developer</title><content type='html'>All I can say is "holy shnikes!" If you missed yesterday's presentation, head over to &lt;a href="http://www.apple.com/" target="_blank"&gt;Apple's site&lt;/a&gt; and watch the &lt;a href="http://www.apple.com/quicktime/qtv/iphoneroadmap/" target="_blank"&gt;QuickTime stream&lt;/a&gt;. Especially if you're interested in iPhone game development. Check out the demos! The iPhone appears to be more impressive of a platform that I had originally thought.&lt;br /&gt;&lt;br /&gt;Apple revealed two things of importance to developers both big and small. First, despite earlier skeptisism over the immediate availability of the SDK... &lt;a href="http://developer.apple.com/iphone/program/" target="_blank"&gt;here it is&lt;/a&gt;, complete with a visual interface builder and snazzy iPhone emulation (for testing). Very cool. Second, they've already announced a distribution model that equals money for all developers. Even the lonely one's working from their basement (that's not a stab at you, that's a stab at me).&lt;br /&gt;&lt;br /&gt;I won't get into much of the details because &lt;a href="https://developer.apple.com/iphone/" target="_blank"&gt;Apple's iPhone Dev Center&lt;/a&gt; has absolutely everything you could possibly need. But I do want to comment on the revenue model since, from what I can gather, that's the only piece that some have reservations about.&lt;br /&gt;&lt;br /&gt;All apps will be sold through the iPhone's App Store. You set the price. Apple takes 30 percent. Is Apple's commission too great? That's what's up for debate. But let's look at this objectively. Apple is handling all credit card charges and hosting fees. Additionally, they're making it simple for developers to update their apps through software updates. Since each developer can name their own price, I personally don't see much wrong with this model and I'm more than happy to throw the burden of money transactions at Apple. Let me concentrate on developing, then cut me a check once a month. This all sounds good to me. But what do you think?&lt;br /&gt;&lt;br /&gt;Before I wrap today's post I figured I'd "touch" upon a comment we received yesterday.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Do you think having a native SDK will reduce the number of iPhone web apps currently being developed?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;jeffrey.t.lynch&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;My response was: "Not initially, since any app developed with the SDK will not publicly be distributed until June. Even after the mobile App Store is launched I find it hard to believe that Web Apps will become obsolete. After all, development for the SDK requires knowledge of a much more complex programming language (compared to HTML/CSS/Javascript) and developers will need to pay $99 in order to distribute their SDK-developed wares. I expect all of the bigger named properties and developers to move strictly to SDK development, but I still think there will be plenty of Web based apps for all."&lt;br /&gt;&lt;br /&gt;Yesterday I quickly mentioned that Cocoa development requires knowledge of Objective-C. The same holds true for Cocoa Touch (the programming interface for the iPhone and iPod Touch). So, although anyone with $99 can now develop applications for the iPhone and iPod Touch, their may be a steep learning curve for those only familiar with HTML/Javascript development.&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/03/iphone-sdk-happy-developer.html' title='iPhone SDK = Happy Developer'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=4879407718099544077' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/4879407718099544077'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/4879407718099544077'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-6850627164064823947</id><published>2008-03-05T18:23:00.000-05:00</published><updated>2008-03-05T18:24:15.740-05:00</updated><title type='text'>The Long Awaited iPhone SDK</title><content type='html'>Tomorrow's the day. The day that developers over at Apple finally unveil their plans for third-party iPhone application development. Press members were invited to "join [Apple] to learn about the iPhone software roadmap, including the iPhone SDK and some exciting new enterprise features."&lt;br /&gt;&lt;br /&gt;Words like "learn about" and "roadmap" don't quite encourage someone interested in having instant access to an SDK. Will tomorrow's event be filled with more talk, or actual tools? That's yet to be determined, but I have confidence that Apple will not disappoint. After all, they announced this event six months ago.&lt;br /&gt;&lt;br /&gt;More than anything, I'm interested in finding out which programming language will be used to develop apps. It's been clear for sometime that Flash is not going to be the answer. In fact, even today, sites like &lt;a href="http://www.appleinsider.com/articles/08/03/05/steve_jobs_pans_flash_on_the_iphone.html" target="_blank"&gt;AppleInsider&lt;/a&gt; posted interview snippets with Steve Jobs in which his stance on the plug-in is clear. The current desktop version of the Flash plug-in demands too much processing power to currently make sense on the iPhone and Flash Lite is a joke.&lt;br /&gt;&lt;br /&gt;The bottom line is that the iPhone's version of Safari is slow, so more robust applications (including games) will need to be developed using a language that can access the phone's guts more directly and intelligently.&lt;br /&gt;&lt;br /&gt;In answering a question about an iPhone blogging application, Jobs recommended that "if Apple does not address it" then the individual should learn Cocoa and write an iPhone blogger application himself.&lt;br /&gt;&lt;br /&gt;Cocoa is Apple's name for the collection of frameworks, APIs and accompanying runtimes that make up the development layer of Mac OS X. Therefore, it would make sense that Cocoa also be used to develop apps for the iPhone since it runs a mobile version of Mac OS X. But, again, specifics won't be clear until tomorrow. Which is exactly when we'll post again with our impressions of the news that is announced!&lt;br /&gt;&lt;br /&gt;P.S. Cocoa applications are mainly written in Objective-C.&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/03/long-awaited-iphone-sdk.html' title='The Long Awaited iPhone SDK'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=6850627164064823947' title='2 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/6850627164064823947'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/6850627164064823947'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-2912966915727894206</id><published>2008-02-25T11:43:00.012-05:00</published><updated>2008-02-27T13:05:27.850-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crossword'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Part 10: That's All Folks!</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_crossword-794013.gif" alt="iPhone Minds Developer's Journal - Crossword Puzzle" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;Well, our two week developer's feature has come to an end. I hope you all enjoyed the various discussions and behind-the-scene tips and tricks. Maybe we'll do this again in the future.&lt;br /&gt;&lt;br /&gt;Without further ado, here's a link to the final game:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-size:20px; font-weight:bold; text-align:center;"&gt;&lt;a href="http://www.iphoneminds.com/crossword"&gt;http://www.iphoneminds.com/crossword&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I've also embedded the game below (though it's more fun to play on the iPhone):&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.iphoneminds.com/crossword" width="320" height="416" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" style="margin:0 auto; display:block;"&gt;&lt;/iframe&gt;&lt;br /&gt;Here are some things to keep in mind while playing the game. If the page gets refreshed mid-game, you'll have to start over again. Try not to open new Safari windows when playing on an iPhone or iPod Touch. If you need to open other windows, return to the game window before exiting Safari or turning off your phone, otherwise the page will automatically refresh when you come back to the game after returning to Safari. Also, two clues are repeated in the puzzle. This is not a glitch. Get creative and think about what the two answers might be based on the size of the words you're working with.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE:&lt;/b&gt; It appears that the 1.1.4 iPhone and iPod Touch firmware update preserves the state of Safari "tabs/windows." Meaning, you can start the crossword game in one window and open another without having to worry about loosing your place in the game and starting all over again. I'd encourage everyone to download the 1.1.4 update.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/02/part-10-thats-all-folks.html' title='Part 10: That&apos;s All Folks!'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=2912966915727894206' title='5 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/2912966915727894206'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/2912966915727894206'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-9074284846511880492</id><published>2008-02-24T18:30:00.007-05:00</published><updated>2008-02-25T19:23:21.574-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='crossword'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Part 9: Gratuitous Eye-Candy</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_crossword-794013.gif" alt="iPhone Minds Developer's Journal - Crossword Puzzle" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;Games just aren't interesting without snazzy graphics. But graphics need to be downloaded, and you want to limit as many unnecessary downloads as possible when developing applications for the iPhone.&lt;br /&gt;&lt;br /&gt;Until now, our game required only two images. The background image, and the image border used for grid highlights. Together these assets weigh in at about 24.5K. We also &lt;a href="http://iphoneminds.com/2008/02/part-4-preloading-commonly-used-game.html"&gt;embedded a number of images&lt;/a&gt; in Javascript, which beefed up that file. All together the images, HTML file (which includes CSS) and Javascript file amount to 50K. That's really good for a complete game and means that the game will load quickly if you need to access it using EDGE.&lt;br /&gt;&lt;br /&gt;But of all the things that irk me in life, only one is intolerable. A shitty ending to a video game. I mean you spend 40+ hours of your life (many of which are extremely aggravating) glued to the game. Is it too much to ask for a slick 5+ minute movie ending? Something brilliant that wraps up everything at the end. It only seems appropriate. So, I think it's important to give the winner of our puzzle something nice to look at when they're done.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;End Screen:&lt;/b&gt;&lt;br /&gt;&lt;img src="http://iphoneminds.com/uploaded_images/crossword_curl-741978.gif" alt="" border="0" style="display:block; margin:0 auto;" /&gt;Okay, it's not much, but hey, this game is being developed for demonstration purposes. Still, I think it satisfies the "snazzy graphics" requirement. Keep in mind that by the time you see the curl, the grid will be filled with letters. I didn't want to give away all of the words so I left the grid empty.&lt;br /&gt;&lt;br /&gt;In my "Preloading Commonly Used Game Assets" post I mentioned that it would not make sense to embed all images in Javascript using URI Kitchen. The curl PNG weighs 69K. That's more than the entire game weighed up until this point. So, is it worth forcing the user to wait for this image to download when they won't even see it until the end of the game? Sure it is. Because we're not going to "force them to wait."&lt;br /&gt;&lt;br /&gt;Since this image isn't required until the very end of the game (and it would probably take anyone &lt;i&gt;at least&lt;/i&gt; 15 mins to solve the puzzle), we're going to load the image behind the scenes while the user is playing the game. Here's how we'll do it:&lt;br /&gt;&lt;br /&gt;First, we set the game up. This includes waiting for all of the assets (except the curl) to download. Once the HTML has been parsed, Javascript &lt;a href="http://iphoneminds.com/2008/01/hiding-address-bar-take-2.html"&gt;hides the iPhone address bar&lt;/a&gt;, reads the game's XML file and builds the game's grid. The game is now ready to be played.&lt;br /&gt;&lt;br /&gt;At this point we execute the following Javascript:&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;setTimeout(function() {&lt;br /&gt;    var curl = new Image();&lt;br /&gt;    curl.src = 'curl.png';&lt;br /&gt;    curl.onload = function() {&lt;br /&gt;        var img = document.createElement('img');&lt;br /&gt;        img.id = 'curl';&lt;br /&gt;        img.src = curl.src;&lt;br /&gt;        document.getElementById('body').appendChild(img);&lt;br /&gt;        img.onclick = function() { resetBoard(across, down); };&lt;br /&gt;    };&lt;br /&gt;}, 30000);&lt;/pre&gt;&lt;br /&gt;Again, the above script will not execute until the game has completely downloaded and is playable by the user. This script then waits 30 seconds before it downloads and sets up the curl image, giving the game more than enough time to prepare the asset before it's required.&lt;br /&gt;&lt;br /&gt;For dramatic effect, we're going to fade the curl in when the user has completed the puzzle. There are a number of Javascript resources you can utilize to create fades. MooTools is a great option. But since we're not relying on MooTools to manage the styles or effects of any of the other elements that make up the game, it doesn't make sense to include the MooTools Javascript library (an extra download) only to access it for one effect. There's a simpler way.&lt;br /&gt;&lt;br /&gt;The Mac software company &lt;a href="http://www.panic.com/" target="_blank"&gt;Panic&lt;/a&gt; has, for a long time, been a leader in creating compelling, and shockingly easy to use, Web applications (they of course make brilliant Mac applications as well). On their site I found a small snippet of math which we can use to fade the curl.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Javascript:&lt;/b&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;function cubicOut(t, b, c, d) { return c*((t = t/d-1)*t*t+1)+b; }&lt;/pre&gt;&lt;div style="font-style:italic; font-size:9px; text-align:center;"&gt;If you use this code within your projects, please give credit to Panic.&lt;/div&gt;&lt;br /&gt;Using the &lt;b&gt;cubicOut&lt;/b&gt; function, we can do the following:&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;var curlanim = { time:0, begin:0, change:0.0, duration:0.0, timer:null };&lt;br /&gt;&lt;br /&gt;function curlFade(start, end, duration) {&lt;br /&gt;    if (end == 1) document.getElementById('curl').style.visibility = 'visible';&lt;br /&gt;    if (curlanim.timer != null) { clearInterval(curlanim.timer); curlanim.timer = null; }&lt;br /&gt;    curlanim.time = 0;&lt;br /&gt;    curlanim.begin = start;&lt;br /&gt;    curlanim.change = end-start;&lt;br /&gt;    curlanim.duration = duration;&lt;br /&gt;    curlanim.timer = setInterval(function() { fadeAnimDo(end) }, 15);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function fadeAnimDo(e) {&lt;br /&gt;    if (curlanim.time &gt; curlanim.duration) {&lt;br /&gt;        clearInterval(curlanim.timer);&lt;br /&gt;        curlanim.timer = null;&lt;br /&gt;        if (e == 0) document.getElementById('curl').style.visibility = 'hidden';&lt;br /&gt;    } else {&lt;br /&gt;        var alpha = cubicOut(curlanim.time, curlanim.begin, curlanim.change, curlanim.duration);&lt;br /&gt;        document.getElementById('curl').style.opacity = alpha;&lt;br /&gt;        curlanim.time++;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;In the last post I mentioned that the &lt;b&gt;matrix&lt;/b&gt; array keeps track of whether or not correct letters have been added to the 225 different spaces that make up the puzzle. If it is determined that the puzzle is filled with correct letters (using the &lt;b&gt;matrix&lt;/b&gt; array), then the game has been won and we initiate the curl fade with the following code: &lt;b&gt;curlFade(0, 1, 50)&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;And that's it! The tutorial portion of this feature is complete. Although we didn't post every bit of the game's Javascript, I hope we've explained enough to provide a good sense as to how everything was developed. Come back tomorrow for a link to the working game!&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/02/part-9-gratuitous-eye-candy.html' title='Part 9: Gratuitous Eye-Candy'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=9074284846511880492' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/9074284846511880492'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/9074284846511880492'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-1748966930415967900</id><published>2008-02-22T17:24:00.010-05:00</published><updated>2008-02-24T17:56:37.561-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='crossword'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Part 8: Maximizing Screen Real Estate</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_crossword-794013.gif" alt="iPhone Minds Developer's Journal - Crossword Puzzle" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;In the previous post I included a new image of the game. Let me explain how the user is going to interact with the game grid.&lt;br /&gt;&lt;br /&gt;Pressing on any square will active a selection (see image below) focusing on whatever horizontal (across) word includes that square. The actual square pressed will turn blue. Pressing anywhere on the now visible selection will rotate it 90&amp;deg; (using the blue square as a control point) to focus on the vertical (down) word. Pressing the selection a second time will deactivate it. You can also deactivate the selection at any time by pressing outside of the selection.&lt;br /&gt;&lt;br /&gt;A clue will only be visible underneath the puzzle while a selection is activated. It will initially read something like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;b&gt;29 DOWN&lt;/b&gt; Starbucks order.&lt;br /&gt;&lt;span style="position:relative;"&gt;&lt;input type="text" onfocus="this.style.opacity = 1" onblur="this.style.opacity = 0" style="width:208px; border:none; height:20px; padding:0; cursor:pointer; margin:0; position:absolute; opacity:0; text-align:center; line-height:20px; margin-left:151px; font:bold 13px Georgia,serif;" value="" /&gt;&lt;span style="text-decoration:underline"&gt;Press here to answer.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;I decided early on that I didn't want to continually display an input field for answering. Rather, I only wanted to display it when the user was actually ready to answer.&lt;br /&gt;&lt;br /&gt;Since iPhone applications are dynamic, we can make smart use of the screen real estate and only display certain UI elements when necessary. Here's how I implemented the "now-you-see-it-now-you-don't" input field:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HTML:&lt;/b&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;&amp;lt;span id="outer-answer"&amp;gt;&amp;lt;input type="text" id="answer" value="" /&amp;gt;&amp;lt;span style="text-decoration:underline"&amp;gt;Press here to answer.&amp;lt;/span&amp;gt;&amp;lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CSS:&lt;/b&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;#outer-answer { position:relative; }&lt;br /&gt;#answer {&lt;br /&gt;    width: 208px;&lt;br /&gt;    height: 20px;&lt;br /&gt;    border: none;&lt;br /&gt;    padding: 0;&lt;br /&gt;    margin: 0;&lt;br /&gt;    position: absolute;&lt;br /&gt;    opacity: 0;&lt;br /&gt;    text-align: center;&lt;br /&gt;    line-height: 20px;&lt;br /&gt;    margin-left: 56px;&lt;br /&gt;    font: bold 13px Georgia,serif;&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Javascript:&lt;/b&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;document.getElementById('answer').onfocus = function() {&lt;br /&gt;    this.style.opacity = 1;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;document.getElementById('answer').onblur = function() {&lt;br /&gt;    if (this.value != '') {&lt;br /&gt;        var letters = this.value.split('');&lt;br /&gt;        var correct = xmlhttp.responseXML.getElementsByTagName(node)[0].getAttribute('a').split('');&lt;br /&gt;        var numCorrect = 0;&lt;br /&gt;        for (var i = 0; i &lt; selected.length; i++) {&lt;br /&gt;            if (letters[i]) {&lt;br /&gt;                if (letters[i].toUpperCase() == correct[i]) {&lt;br /&gt;                    eval('ctx.drawImage(i'+letters[i].toLowerCase()+'b, '+((selected[i].id%15)*18)+', '+(Math.floor(selected[i].id/15)*18)+')');&lt;br /&gt;                    matrix[selected[i].id] = 1;&lt;br /&gt;                    numCorrect++;&lt;br /&gt;                } else {&lt;br /&gt;                    matrix[selected[i].id] = 0;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }  &lt;br /&gt;        if (numCorrect == correct.length) {&lt;br /&gt;            alert('Correct!');&lt;br /&gt;            clearSelection();&lt;br /&gt;        } else if (numCorrect == 0) {&lt;br /&gt;            alert('Incorrect, try again.');&lt;br /&gt;            document.getElementById('answer').value = '';&lt;br /&gt;            document.getElementById('answer').focus();&lt;br /&gt;        } else if (numCorrect != correct.length) {&lt;br /&gt;            alert('Only some letters are correct.');&lt;br /&gt;            clearSelection();&lt;br /&gt;        }&lt;br /&gt;        checkForWin();  &lt;br /&gt;    }&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;The input field is actually always present (positioned on top of the "press here" text), but it starts off invisible. When you press to answer the field becomes active and the iPhone displays its keyboard. Press the keyboard "Done" button or anywhere on the grid to commit your answer.&lt;br /&gt;&lt;br /&gt;So, that's how it's done. Before I wrap up this post, I'll explain some of the other things that are happening in the Javascript above.&lt;br /&gt;&lt;br /&gt;Once the user clicks the iPhone's "Done" button we first check to make sure they have actually entered text. If they have, we create an array of the text and match it against an array of the letters that make up the correct answer to the clue. We check each letter one by one. If the letters match, we add the letter to the game grid. The &lt;b&gt;matrix&lt;/b&gt; array keeps track of whether or not correct letters have been added to the 225 different spaces that make up the puzzle. Ultimately if all letters are correct, you've won the game.&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/02/part-8-maximizing-screen-real-estate.html' title='Part 8: Maximizing Screen Real Estate'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=1748966930415967900' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/1748966930415967900'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/1748966930415967900'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-7725953492550268818</id><published>2008-02-21T02:53:00.017-05:00</published><updated>2008-02-24T14:25:04.670-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='crossword'/><category scheme='http://www.blogger.com/atom/ns#' term='iui'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='web kit'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Part 7: Taking Advantage of Web Kit CSS Styles</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_crossword-794013.gif" alt="iPhone Minds Developer's Journal - Crossword Puzzle" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;One of the biggest benefits of designing Web applications specifically for the iPhone is that you have access to many Web Kit CSS properties that have not yet been supported in today's other popular browsers, including Firefox.&lt;br /&gt;&lt;br /&gt;Things like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Borders with rounded corners&lt;/li&gt;&lt;li&gt;Image borders&lt;/li&gt;&lt;li&gt;Box shadows&lt;/li&gt;&lt;li&gt;Multiple background images&lt;/li&gt;&lt;/ul&gt;If you've ever used &lt;a href="http://code.google.com/p/iui/wiki/Introduction" target="_blank"&gt;Google's iUI&lt;/a&gt;, a user interface library for Safari development on the iPhone (originally developed by Joe Hewitt), you may be using image borders and not even be aware of it. In today's post I'll explain how we'll take advantage of image borders in our crossword puzzle game.&lt;br /&gt;&lt;br /&gt;The buttons used in iUI all rely on image borders. Image borders make it easy to create scalable image-based buttons (with rounded corners and all types of other snazzy eye candy). Accomplishing something like this previously required 4+ nested elements (plus 4+ images) each responsible for the rendering a specific corner of the button. Now you need only one element and one image and two CSS attributes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Here's the CSS:&lt;/b&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;.button {&lt;br /&gt;    border-width: 0 5px;&lt;br /&gt;    -webkit-border-image: url(toolButton.png) 0 5 0 5;&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://iphoneminds.com/uploaded_images/imageborder_illo-745671.gif" alt="" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" border="0"&gt;&lt;tr&gt;&lt;td width="100%"&gt;When using &lt;b&gt;-webkit-border-image&lt;/b&gt; you first specify the image to use, then set the areas that will act as your borders. In the example above, we're only going to scale the asset horizontally, so we'll only need a border of 5 pixels on the left and right. The top and bottom do not require a border.&lt;/td&gt;&lt;td&gt;&lt;div onclick="alert('Wow, you\'ll do anything you\'re asked, won\'t you? Can I have five dollars?')" style="border-width:0 5px; -webkit-border-image:url(http://iphoneminds.com/uploaded_images/toolButton-791569.png) 0 5 0 5; padding:10px 0; font: bold 12px Arial,sans-serif; color:#fff; width:auto; margin:0 0 0 15px; width:100px; text-align:center; cursor:pointer;"&gt;Click Me&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;For more information on image borders check out Apple's &lt;A href="http://developer.apple.com/documentation/AppleApplications/Reference/SafariCSSRef/Articles/StandardCSSProperties.html" target="_blank"&gt;Safari CSS Reference: Supported CSS Properties&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In the crossword puzzle game we'll use an image border to highlight the currently selected squares in the puzzle grid. Here's what it will look like:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://iphoneminds.com/uploaded_images/selection-703954.gif" alt="" style="display:block; margin:0 auto;" /&gt;Using an image border is convienent because we can scale the border horizontally and vertically based on the length of the word we're working with. After entering my answer, in this case "CAL," the letters would appear in the highlighted area on the grid.&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/02/part-7-taking-advantage-of-web-kit-css.html' title='Part 7: Taking Advantage of Web Kit CSS Styles'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=7725953492550268818' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/7725953492550268818'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/7725953492550268818'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-5821724899945107055</id><published>2008-02-19T20:09:00.008-05:00</published><updated>2008-02-24T14:21:04.382-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='crossword'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Part 6: Taming XML</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_crossword-794013.gif" alt="iPhone Minds Developer's Journal - Crossword Puzzle" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;Though it's easy to get Javascript to read from an XML file, pulling out the appropriate data can sometimes be tricky. Here are some tips to help you tame the XML beast.&lt;br /&gt;&lt;br /&gt;Refer to the code we posted yesterday. If the XMLHttpRequest loads without error, then we can use the &lt;b&gt;xmlhttp&lt;/b&gt; variable to access the contents of the loaded XML file. To understand how to work with &lt;b&gt;xmlhttp&lt;/b&gt; (or whatever you named the XMLHttpRequest instance), relate it to Javascript's &lt;b&gt;document&lt;/b&gt; variable.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;document.getElementsByName('menu')&lt;/b&gt; will return an array of the elements on your page that all share the name "menu."&lt;br /&gt;&lt;br /&gt;&lt;b&gt;xmlhttp.responseXML.getElementsByTagName('menu')&lt;/b&gt; will return an array of the "menu" XML nodes (tags).&lt;br /&gt;&lt;br /&gt;Now, nodes can have both attributes and values. In the following example, "Burns or Byron" is the &lt;b&gt;c&lt;/b&gt; attribute of the &lt;b&gt;a1&lt;/b&gt; node and "Timothy Parker" is the value of the &lt;b&gt;editor&lt;/b&gt; node.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;XML Example:&lt;/b&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;editor&amp;gt;Timothy Parker&amp;lt;/editor&amp;gt;&lt;br /&gt;&amp;lt;across&amp;gt;&lt;br /&gt; &amp;lt;a1 a="POET" c="Burns or Byron" n="1" cn="1" /&amp;gt;&lt;br /&gt;&amp;lt;/across&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;getElementsByTagName&lt;/b&gt; will always return an array. In the example above there is only one &lt;b&gt;a1&lt;/b&gt; node, therefore there's no reason to keep an &lt;i&gt;array&lt;/i&gt; of &lt;b&gt;a1&lt;/b&gt; nodes. Using the code below, we can save to variable only the first returned node (since that's all that exists).&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;var a1 = xmlhttp.responseXML.getElementsByTagName('a1')[0];&lt;/pre&gt;&lt;br /&gt;Now, access the &lt;b&gt;c&lt;/b&gt; attribute like this:&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;var c = a1.getAttribute('c');&lt;/pre&gt;&lt;br /&gt;Doing that is easy, but accessing node values is a little more confusing. Here's the code to access the &lt;b&gt;editor&lt;/b&gt; node's value:&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;var editor = xmlhttp.responseXML.getElementsByTagName('editor')[0];&lt;br /&gt;var editorValue = editor.firstChild.nodeValue;&lt;/pre&gt;&lt;br /&gt;The &lt;b&gt;firstChild&lt;/b&gt; method gives you access to a node's first child. But the &lt;b&gt;editor&lt;/b&gt; node does not appear to have any children. Well, it apparently (or not so apparently) does. When attempting to access the value of a node, imagine the value text as being a node itself... access the nodeValue of the "text node" and you'll get the result you're looking for. Or, in more simple terms, always use &lt;b&gt;.firstChild.nodeValue&lt;/b&gt; to access the value of a node.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Another XML Example:&lt;/b&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;across&amp;gt;&lt;br /&gt; &amp;lt;a1 a="POET" c="Burns or Byron" n="1" cn="1" /&amp;gt;&lt;br /&gt; &amp;lt;a2 a="BLAB" c="Give everything away" n="6" cn="5" /&amp;gt;&lt;br /&gt; &amp;lt;a3 a="TALKS" c="Gives everything away" n="11" cn="9" /&amp;gt;&lt;br /&gt; &amp;lt;a4 a="ALSO" c="Too" n="16" cn="14" /&amp;gt;&lt;br /&gt; &amp;lt;a5 a="YOHO" c="Exclamation by Captain Jack Sparrow" n="21" cn="15" /&amp;gt;&lt;br /&gt; &amp;lt;a6 a="ELIOT" c="''A Cooking Egg'' writer" n="26" cn="16" /&amp;gt;&lt;br /&gt; &amp;lt;a7 a="LIAR" c="Ananias, for one" n="31" cn="17" /&amp;gt;&lt;br /&gt; &amp;lt;a8 a="PREY" c="Target in the wild" n="36" cn="18" /&amp;gt;&lt;br /&gt; &amp;lt;a9 a="ALONE" c="In isolation" n="41" cn="19" /&amp;gt;&lt;br /&gt;&amp;lt;/across&amp;gt;&lt;/pre&gt;&lt;br /&gt;In the above example, all of the &lt;b&gt;across&lt;/b&gt; child nodes are named differently, so it would be cumbersome to "getElementsByTagName" each one separately. Instead, take advantage of the &lt;b&gt;childNodes&lt;/b&gt; collection to return an array of the nodes.&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;var across = xmlhttp.responseXML.getElementsByTagName('across')[0].childNodes;&lt;/pre&gt;&lt;br /&gt;There is more to learn about XMLHttpRequest, but by simply knowing how to use the &lt;b&gt;getElementsByTagName&lt;/b&gt;, &lt;b&gt;getAttribute&lt;/b&gt;, &lt;b&gt;firstChild&lt;/b&gt; and &lt;b&gt;nodeValue&lt;/b&gt; methods and the &lt;b&gt;childNodes&lt;/b&gt; collection, you'll have an easy time accessing all types of data from XML documents.&lt;br /&gt;&lt;br /&gt;Before I close this lengthy post, there is one more thing I'd like to mention with regards to accessing XML files. It appears that you can not use Javascript to access local XML files using XMLHttpRequest, you can only access files found on a domain. I am completely perplexed as to why this is and if anyone out there has knowledge of the reason, or knows a workaround, I'd love to hear from you.&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/02/part-6-taming-xml.html' title='Part 6: Taming XML'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=5821724899945107055' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/5821724899945107055'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/5821724899945107055'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-5661842742399137886</id><published>2008-02-19T01:16:00.005-05:00</published><updated>2008-02-24T14:29:26.827-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='crossword'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Part 5: Importing Data From an XML File</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_crossword-794013.gif" alt="iPhone Minds Developer's Journal - Crossword Puzzle" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;Most programs, including games, require data. More often than not this data must be updated regularly so as to sustain the usefulness of the application. This type of data is usually stored externally (out of the application's main code) since it makes very little sense to require the application's user to download a new version of the program every day in order to receive the latest and greatest data. Therefore, with respect to our game, it makes a great deal of sense to store the data for each crossword puzzle in an external XML file. This way puzzles can easily be loaded individually by referencing a different XML file.&lt;br /&gt;&lt;br /&gt;To import data from an XML file, we use the XMLHttpRequest Javascript object as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;var url = 'xml/070814.xml';&lt;br /&gt;var xmlhttp = new XMLHttpRequest();&lt;br /&gt;&lt;br /&gt;if (xmlhttp != null) {&lt;br /&gt;     xmlhttp.onreadystatechange = stateChange;&lt;br /&gt;     xmlhttp.open('GET', url, true);&lt;br /&gt;     xmlhttp.send(null);&lt;br /&gt;} else {&lt;br /&gt;     alert('Your browser does not support XMLHTTP.'); }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function stateChange() {&lt;br /&gt;     if (xmlhttp.readyState == 4) {&lt;br /&gt;          if (xmlhttp.status == 200) {&lt;br /&gt;               /*&lt;br /&gt;               A status of 200 means that the XML file was&lt;br /&gt;               loaded and parsed without error. At this point&lt;br /&gt;               you'll want to sort through all of the data so&lt;br /&gt;               that it can be used by your program. I'll give&lt;br /&gt;               you some tips on how to do this tomorrow.&lt;br /&gt;               */&lt;br /&gt;          } else {&lt;br /&gt;               alert('Problem retrieving XML data.');&lt;br /&gt;          }&lt;br /&gt;     }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;We'll talk a little more about reading from XML files tomorrow.&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/02/part-5-importing-data-from-xml-file.html' title='Part 5: Importing Data From an XML File'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=5661842742399137886' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/5661842742399137886'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/5661842742399137886'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-7280351419597437277</id><published>2008-02-14T20:15:00.013-05:00</published><updated>2008-02-24T14:29:02.154-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='crossword'/><category scheme='http://www.blogger.com/atom/ns#' term='URI Kitchen'/><category scheme='http://www.blogger.com/atom/ns#' term='preload'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Part 4: Preloading Commonly Used Game Assets</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_crossword-794013.gif" alt="iPhone Minds Developer's Journal - Crossword Puzzle" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;Imagine playing The Legend of Zelda on your iPhone. Awesome, right? Well now imagine opening a treasure chest and finding this inside: &lt;img src="http://iphoneminds.com/uploaded_images/question-786913.gif" border="0" alt="" /&gt;. What the hell? Looks like the image of your treasure hasn't loaded yet! (Okay, that's actually the icon to represent that an image can't be found, but play along with me.) Similar things could happen in your game if your assets are not downloaded by the time they need to be. Fortunately, there's a trick to prevent this from happening.&lt;br /&gt;&lt;br /&gt;If you've ever used Dreamweaver, you're probably familiar with the code that's used to preload images:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;&lt;p class="previouscode"&gt;function simplePreload() { &lt;br /&gt;  var args = simplePreload.arguments;&lt;br /&gt;  document.imageArray = new Array(args.length);&lt;br /&gt;  for (var i = 0; i &lt; args.length; i++) {&lt;/p&gt;&lt;br /&gt;    document.imageArray[i] = new Image;&lt;br /&gt;&lt;br /&gt;&lt;p class="previouscode"&gt;    document.imageArray[i].src = args[i];&lt;br /&gt;  }&lt;br /&gt;}&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;Look at the highlighted line. In Javascript you can create Image objects. By doing so, you can store images in the DOMs memory and quickly access them later. But preloading images in this fashion still requires an HTTP call out to the image so that it can be downloaded. When designing games for the iPhone, we want to limit the number of HTTP requests as much as possible. There's actually a way to embed some of your images in your Javascript file so that there's no need to download them.&lt;br /&gt;&lt;br /&gt;If you've ever tried to open a GIF or JPEG in a text editor you'll notice that the guts of the image are a bunch of letters, numbers and symbols. There's a free program online, called the URI Kitchen that will read an image and print out the letter/number/symbol/gremlin guts for you.&lt;br /&gt;&lt;br /&gt;To use the program, go to &lt;a href="http://software.hixie.ch/utilities/cgi/data/data"&gt;URI Kitchen&lt;/a&gt;, upload a file and then copy the resulting data from the address bar. Here's the data I got when feeding the program the above question mark image:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;data:image/gif,GIF89a%10%10%D5*%80%C1.%8A%C9%2C%86%C5!o%B4%2B%83%C3-%88%C7%2C%86%C6%2C%85%C5%90%AE%D3j%92%C3)%7F%C0%26y%BC%8E%BD%E0%8A%AA%D0%92%AF%D44%7F%BF%87%A7%CFm%94%C4%25v%BA%84%A5%CE%7D%A0%CB%80%A2%CC*%81%C2%8D%AC%D2(%7D%BE%D3%E3%F1z%9E%CAs%99%C7%23s%B7%D3%E4%F1p%96%C6)%7D%BF'%7C%BEv%9B%C8%E3%EF%F7.%89%C8%C6%DD%EE%8C%B8%DCS%95%CA%B9%D6%ECT%98%CCF%91%C8*%83%C2%8D%BB%DDR%95%CA%9B%C2%E16%86%C2)%80%C0F%92%CA%2B%84%C4%9C%C6%E3%F1%F7%FB%8D%BC%DE(%7D%BF%24t%B8%25w%BA%23r%B7'z%BD%2F%8C%CA%22p%B5%94%B1%D4h%90%C2%FF%FF%FF!%F9%04%2C%10%10%06%AE%40%9EpH%2C%F2%1C%BE%A4r%B9t%20%7C%BA%A8t%1A%F5!.%BE%80%D6%608x%0D%23%AD%EF%D2%F0%15%0A1%0B%83q%92%C1%2Cg_%03%E2%13%08T4%D1%2B%E5%13)%EC%3E%10%13%3E%04%04(%2B5.%3E3%18%85%3E%13%15%3E%0A%1F%1F%18-%24%269%94%3E%15%14%3E5%A35%20%2C%25%0B%0B%20%A3%3E%14%1A%3E9%B19%12%0F%0F%12%B29%3E%1A!%3E7%BE7%1C%1D%1D%1C%BF7%3E!%1B%3E6%CB6%3B%19%19%3B%CC6%3E%1B%1E%3E8%D88%03%DB%03%D98%3E%1E%11%3E%3B%E4%E5%E6%E4%3E%11%09L%ECJ%09%3D%F0%F1%F2%F3%3DA%3B&lt;/pre&gt;&lt;br /&gt;Pretty, huh? Now, take that data, and use it as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;var questionMark = new Image();&lt;br /&gt;questionMark.src = 'data:image/gif,GIF89a%10%10%D5*%80%C1.%8A%C9%2C%86%C5!o%B4%2B%83%C3-%88%C7%2C%86%C6%2C%85%C5%90%AE%D3j%92%C3)%7F%C0%26y%BC%8E%BD%E0%8A%AA%D0%92%AF%D44%7F%BF%87%A7%CFm%94%C4%25v%BA%84%A5%CE%7D%A0%CB%80%A2%CC*%81%C2%8D%AC%D2(%7D%BE%D3%E3%F1z%9E%CAs%99%C7%23s%B7%D3%E4%F1p%96%C6)%7D%BF'%7C%BEv%9B%C8%E3%EF%F7.%89%C8%C6%DD%EE%8C%B8%DCS%95%CA%B9%D6%ECT%98%CCF%91%C8*%83%C2%8D%BB%DDR%95%CA%9B%C2%E16%86%C2)%80%C0F%92%CA%2B%84%C4%9C%C6%E3%F1%F7%FB%8D%BC%DE(%7D%BF%24t%B8%25w%BA%23r%B7'z%BD%2F%8C%CA%22p%B5%94%B1%D4h%90%C2%FF%FF%FF!%F9%04%2C%10%10%06%AE%40%9EpH%2C%F2%1C%BE%A4r%B9t%20%7C%BA%A8t%1A%F5!.%BE%80%D6%608x%0D%23%AD%EF%D2%F0%15%0A1%0B%83q%92%C1%2Cg_%03%E2%13%08T4%D1%2B%E5%13)%EC%3E%10%13%3E%04%04(%2B5.%3E3%18%85%3E%13%15%3E%0A%1F%1F%18-%24%269%94%3E%15%14%3E5%A35%20%2C%25%0B%0B%20%A3%3E%14%1A%3E9%B19%12%0F%0F%12%B29%3E%1A!%3E7%BE7%1C%1D%1D%1C%BF7%3E!%1B%3E6%CB6%3B%19%19%3B%CC6%3E%1B%1E%3E8%D88%03%DB%03%D98%3E%1E%11%3E%3B%E4%E5%E6%E4%3E%11%09L%ECJ%09%3D%F0%F1%F2%F3%3DA%3B';&lt;/pre&gt;&lt;br /&gt;I can now access &lt;b&gt;questionMark&lt;/b&gt; anytime I want to load that image in my game. And I can draw the image to the canvas (at coordinate 100,50) like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;ctx.drawImage(questionMark, 100, 50);&lt;/pre&gt;&lt;br /&gt;Now, you won't want to use this approach for every image in your game. You'll still have to elegantly handle load times for large images. But this approach works great for smaller, commonly used images. What are the most commonly used assets in a crossword puzzle? The numbers used to label the grid, and the letters that will spell out each word. And those are the exact images that we'll "preload" into Javascript using this method.&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/02/part-4-preloading-commonly-used-game.html' title='Part 4: Preloading Commonly Used Game Assets'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=7280351419597437277' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/7280351419597437277'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/7280351419597437277'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-4508633067958359787</id><published>2008-02-13T12:50:00.020-05:00</published><updated>2008-02-24T14:28:40.817-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='crossword'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Part 3: Jumping Into Code</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_crossword-794013.gif" alt="iPhone Minds Developer's Journal - Crossword Puzzle" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;Okay, let's start programming this game. A couple of weeks ago... no wait, a little over a month ago... I posted about the &lt;a href="http://iphoneminds.com/2008/01/draw-vector-art-using-canvas.html"&gt;canvas&lt;/a&gt;. The canvas is a really great way to draw to (or animate) a Web page. So, since the iPhone &lt;a href="http://www.macrumors.com/2008/02/11/adobe-flash-support-for-iphone-coming-alongside-sdk/" target="_blank"&gt;does not yet support Flash&lt;/a&gt;, utilizing the canvas makes a lot of sense.&lt;br /&gt;&lt;br /&gt;&lt;div class="note"&gt;&lt;b&gt;Note:&lt;/b&gt; Yesterday's illustration stated that the grid takes up 271x271 pixels, yet here we say that the outer DIV that holds all of the inner squares is 270x270 pixels. This is because the inner squares do not include the outer stroke that surrounds the grid. The outer stroke (and all inner grid lines) are part of the background image. The inner squares have a 1px left margin to separate them from one another, so: (1+17)*15 = 270.&lt;/div&gt;Since more qualified people have already written great tutorials on &lt;a href="http://developer.mozilla.org/en/docs/Canvas_tutorial" target="_blank"&gt;how to use the canvas&lt;/a&gt;, it may behoove you to read up a bit if you become confused with what follows.&lt;br /&gt;&lt;br /&gt;Let's code the grid. There are two ways we can display it. We can use the canvas to draw the grid. Or we can create 225 17x17 pixel DIVs and float them all to the left within a 270x270 pixel parent DIV. The first option sounds easier, but we're actually going to do a little of both.&lt;br /&gt;&lt;br /&gt;First we'll use the canvas to draw the representation of the grid. Here is some simplified code:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HTML&lt;/b&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;&amp;lt;div id="squares"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;canvas id="crossword" width="269" height="269"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Javascript&lt;/b&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;var ctx = document.getElementById('crossword').getContext('2d');&lt;br /&gt;ctx.fillStyle = '#ffffff';&lt;br /&gt;for (var i = 0; i &lt; 225; i++) {&lt;br /&gt;     ctx.fillRect((i-Math.floor(i/15)*15)*18, Math.floor(i/15)*18, 17, 17);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;The code above will simply draw out 225 white squares, positioned exactly where we want them on the grid. It does not yet determine which squares should be black (the regions of the grid that are not part of the puzzle). We're ultimately going to read from an XML file to understand which squares are white and which are black. We'll get to that later.&lt;br /&gt;&lt;br /&gt;The user will be interacting with the grid in order to read and solve clues, so we also need a separate clickable region for each of the 225 inner squares. That's where the second option comes into play. Let's add that logic to the for loop:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Javascript&lt;/b&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;&lt;p class="previouscode"&gt;for (var i = 0; i &lt; 225; i++) {&lt;br /&gt;     ctx.fillRect((i-Math.floor(i/15)*15)*18, Math.floor(i/15)*18, 17, 17);&lt;/p&gt;&lt;br /&gt; &lt;br /&gt;     var newSquare = document.createElement('DIV');&lt;br /&gt;     document.getElementById('squares').appendChild(newSquare);&lt;br /&gt;     newSquare.className = 'square';&lt;br /&gt;     newSquare.id = i;&lt;br /&gt;     newSquare.name = i;&lt;br /&gt;     newSquare.onclick = function() {&lt;br /&gt;          // code to execute onclick&lt;br /&gt;     };&lt;br /&gt; &lt;br /&gt;&lt;p class="previouscode"&gt;}&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;We've given each "pressable" DIV an id and name so that "onclick" we can figure out which clues they belong to. We'll get to that later as well.&lt;br /&gt;&lt;br /&gt;For today, that is all. We're going to start slow and ramp up towards the end. Tomorrow I'll provide a neat trick for embedding images into Javascript so that you don't have to wait for them to individually download. A great way to preload images. It's very cool.&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/02/part-3-jumping-into-code.html' title='Part 3: Jumping Into Code'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=4508633067958359787' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/4508633067958359787'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/4508633067958359787'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-2337945344658796702</id><published>2008-02-13T02:08:00.007-05:00</published><updated>2008-02-24T14:28:18.366-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crossword'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Part 2: Design Considerations</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_crossword-794013.gif" alt="iPhone Minds Developer's Journal - Crossword Puzzle" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;Earlier today news of an imminent Flash upgrade from the iPhone was flooding the Internet, though no concrete dates were specified. When a Flash plug-in is released it will open the doors for a lot of game programmers who are unfamiliar with coding using Javascript and the HTML DOM. But for now, this is all that's available. So, let's continue with our tutorial...&lt;br /&gt;&lt;br /&gt;When designing games for the iPhone keep in mind that although the screen's resolution is 320x480 pixels, some of the vertical pixels are lost to the status bar, address bar and lower toolbar... 64 pixels are lost, to be exact. So, if you want your entire game to display "above the fold," design it to be 320x416 pixels. (Above the fold is a reference web designers throw around a lot to appear cool. It refers to the topmost part of a Web page -- the area that is initially viewable. The content that shows up as you scroll down the page is "below the fold.")&lt;br /&gt;&lt;br /&gt;&lt;img src="http://iphoneminds.com/uploaded_images/crossword_grid-787887.gif" alt="iPhone Minds Developer's Journal - Crossword Puzzle" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;If you look at a printed crossword puzzle you'll notice that the game consists of two main parts: 1) the grid, and 2) the "across" and "down" clues. Both take up a lot of real estate. So how do we fit everything onto the iPhone screen?&lt;br /&gt;&lt;br /&gt;First let's discuss the grid (or board, whatever you'd like to call it). The squares that make up the grid need to be small enough so that a 15x15 matrix will fit within the design. They also need to be large enough so that even a person with fat fingers -- *cough* Scott *cough -- can press a single square. After mocking up a number of grid sizes I realized that although I could theoretically size each individual square at 19x19 pixels and still fit all 225 (15 rows x 15 columns) on the screen, I didn't have much room for anything else. So I settled on 17x17. This means that we loose 271x271 pixels to the grid.&lt;br /&gt;&lt;br /&gt;Since a title is required for each puzzle, very little room is left for the clues. It will be impossible to display them all at once, so instead let's display relevant clues when the user clicks on a particular row/column. We'll talk about how this is going to work later.&lt;br /&gt;&lt;br /&gt;That's all for today. Coding goodies will come tomorrow.&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/02/part-2-design-considerations.html' title='Part 2: Design Considerations'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=2337945344658796702' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/2337945344658796702'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/2337945344658796702'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-5677067362566343260</id><published>2008-02-11T15:47:00.006-05:00</published><updated>2008-02-24T14:27:53.798-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crossword'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>iPhone Minds Developer's Journal</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_crossword-794013.gif" alt="iPhone Minds Developer's Journal - Crossword Puzzle" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;Though I don't frequent other iPhone development type blogs much, I will say that the ones I have checked out skimp on the information you really want. They'll cover mundane issues like how to hide Safari's address bar, or how to change your wallpaper, or how to create a web clip bookmark... you know... beginner's stuff. What? That's all that we've been posting? Uhhh... ummmm... well, I guess it's time to up the education.&lt;br /&gt;&lt;br /&gt;Over the next two weeks we're going to walk you through the development of a complete and working game for the iPhone. Not a stupid "move-around-the-pieces-of-this-image-and-try-to-put-them-in-order" game. We're going to build a fully functional crossword puzzle game. We'll discuss the best way to approach design and usability, provide coding tips (as well as some source code), and suggest solutions to many of the obstacles you will face along the way. So, without further ado, here is Part 1 of our ten part series.&lt;br /&gt;&lt;br /&gt;&lt;h2 style="font-size:20px; color:#fff;"&gt;Part 1: Things to Keep In Mind&lt;/h2&gt;&lt;br /&gt;There are a couple of things to keep in mind when considering iPhone game development. The most important is that iPhone developers currently do not have access to many of the usability features that make the iPhone great -- things like pinch, expand, slide, drag, drop, etc. That may change when the SDK is announced later this month, but for now all we have is press (click).&lt;br /&gt;&lt;br /&gt;Additionally, all of the applications must be built in Safari. Don't get me wrong, I for one am more than happy to use Safari as my development environment. After all, HTML/Javascript development is what I know. It's what I've spent the last 10 years working with. So I know how to do really amazing things with that medium. Still, Safari on the iPhone is less responsive than it is on your Mac or PC. For instance, there is a lag between when you press something on the page and when you can press something else on the page. The lag is only about a second, but it should be kept in mind when you begin thinking about the type of game that you want to create. Because of the lag, slower-paced games make more sense on the iPhone. Therefore developing a puzzle game for this tutorial was a no brainer. After all, there's not much need to race your way through a crossword puzzle.&lt;br /&gt;&lt;br /&gt;Besides the fact that a crossword puzzle was a slower-paced game, this type of game also provided some interesting usability dilemmas, but we'll get into those tomorrow. We'll also discuss design considerations tomorrow. For now, take a look at the near-finished design below. Though I've started some of the development of this game, there is much yet to still do so things may change over the next two weeks.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://iphoneminds.com/uploaded_images/crossword_img-725337.gif" alt="" border="0" style="display:block; margin:0 auto;" /&gt;&lt;br /&gt;I originally got the idea for this game after seeing the daily puzzle on USA Today's site, so it made sense to try and repurpose the online version of their game in an iPhone format. DO NOT get all of your game ideas from copyright sources. I'm simply doing this because though I want to code and design the game, I don't want to create each puzzle myself, so I'm going to use the XML feed that their Flash game uses in order to pull individual puzzles.&lt;br /&gt;&lt;br /&gt;That's all for today. Feel free to email us at &lt;a href="mailto:ask@iphoneminds.com"&gt;ask@iphoneminds.com&lt;/a&gt; with questions or comments regarding game development. Come back tomorrow when we'll discuss design considerations.&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/02/iphone-minds-developers-journal.html' title='iPhone Minds Developer&apos;s Journal'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=5677067362566343260' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/5677067362566343260'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/5677067362566343260'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-2437873335235006273</id><published>2008-02-05T17:51:00.003-05:00</published><updated>2008-02-24T14:27:22.896-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='webclip'/><title type='text'>iPhone Web Clip Bookmark Icons</title><content type='html'>&lt;a href="http://internetmarketingvoodoo.com/downloads/webclip_template.psd.zip"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/topstory_webclip-715569.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Since Apple announced custom Web Clips for your website everyone has been scrambling to write articles on how to do it even though almost everything you need to know is on Apple's own &lt;a href="http://developer.apple.com/iphone/devcenter/designingcontent.html" target="_new"&gt;iPhone Dev Center&lt;/a&gt; site.&lt;br /&gt;&lt;br /&gt;If you were paying attention, you noticed I said "almost". What no one has managed to do yet is tell you why your icon looks chopped and funky.&lt;br /&gt;&lt;br /&gt;Well, after exhaustive testing, we've figured it out. The iPhone cuts off 1 pixel on the left and right and 3 pixels at the bottom of your icon.  It also rounds the corners and overlays a "glossy" appearance that makes it difficult for you to truly showcase your amazing design skillz in Corel Draw. Many people have posted that they created icons with larger dimensions (128x128 or 158x158) to solve the problem. Don't bother. It's a larger download for users and now more difficult for you to figure out how your graphic will render.  Apple says build them 57x57. So our advice is to build them 57x57 - or keep reading...&lt;br /&gt;&lt;br /&gt;We've created a &lt;a href="http://internetmarketingvoodoo.com/downloads/webclip_template.psd.zip"&gt;Web Clip Photoshop template&lt;/a&gt; for you to utilize to create your own Web Clip Bookmark Icon masterpiece.  The graphic below shows you the opened file.  We've included the overlay, rounded corners and guides to help you find the exact center of your icon.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://iphoneminds.com/uploaded_images/webclip_example-718934.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://internetmarketingvoodoo.com/downloads/webclip_template.psd.zip"&gt;Click here to download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In order to use the template, you'll need to be familiar with Photoshop layers.  Make sure you turn off the "overlay" layer before exporting as a PNG.  The corners of your icon should NOT be rounded.  The iPhone takes care of that.&lt;br /&gt;&lt;br /&gt;I realize you may have stumbled across this post trying to figure out how to actually get a web clip icon on your site, so let use save you an extra click and just post Apple's instructions here:&lt;br /&gt;&lt;br /&gt;&lt;div class="sourcecodebox"&gt;&lt;br /&gt;&lt;b&gt;Create A Web Clip Bookmark Icon&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;iPhone and iPod touch allow a user to save a Web Clip bookmark to your site on their Home Screen.&lt;br /&gt;&lt;br /&gt;To specify a bookmark icon for all pages of a web site, place a PNG image named "apple-touch-icon.png" at the root directory of your web server - similar to the "favicon.ico" for site icons.&lt;br /&gt;&lt;br /&gt;To override the site bookmark icon on a specific web page, insert a &amp;lt;link&amp;gt; element similar to &amp;lt;link rel="apple-touch-icon" href="/customIcon.png"&amp;gt; within the  element of the page.&lt;br /&gt;&lt;br /&gt;The bookmark icon dimensions should be 57x57 pixels.  If the icon is a different size it will be scaled and cropped to fit.&lt;br /&gt;&lt;br /&gt;Safari will automatically composite the icon with the standard "glassy" overlay so it looks like a built-in iPhone or iPod application.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;BTW... as of the writing of this post, we have not put up a decent web clip for this site.  Cut us a little slack, we've been busy.&lt;br /&gt;&lt;br /&gt;//scott</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/02/iphone-web-clip-bookmark-icons.html' title='iPhone Web Clip Bookmark Icons'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=2437873335235006273' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/2437873335235006273'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/2437873335235006273'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-5551699095046535617</id><published>2008-01-16T11:28:00.003-05:00</published><updated>2008-02-24T14:27:00.910-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod touch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><title type='text'>Hiding the Address Bar: Take 2</title><content type='html'>We've been receiving some feedback that the following code (responsible for hiding Safari's address bar) does not work on iPod Touch:&lt;br /&gt;&lt;br /&gt;&lt;div class="sourcecodebox"&gt;function hideAddressBar() { window.scrollTo(0, 1); }&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;No one on this end has an iPod Touch, so we can't test to see if that's true or not, but I've had my own problems with this code in the past, so here are some additional things to try and keep in mind.&lt;br /&gt;&lt;br /&gt;Try using the following code instead. It doesn't require you to add &lt;b&gt;onload="hideAddressBar()"&lt;/b&gt; to your body tag and has proved more reliable in the past.&lt;br /&gt;&lt;br /&gt;&lt;div class="sourcecodebox"&gt;addEventListener('load', function() { setTimeout(hideAddressBar, 0); }, false);&lt;br /&gt;function hideAddressBar() { window.scrollTo(0, 1); }&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Additionally, &lt;b&gt;window.scrollTo(0, 1)&lt;/b&gt; does NOT seem to work if you include external CSS files using the following method:&lt;br /&gt;&lt;br /&gt;&lt;div class="sourcecodebox"&gt;&amp;lt;link rel="stylesheet" type="text/css" href="_assets/css/styles.css" /&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Instead, do this:&lt;br /&gt;&lt;br /&gt;&lt;div class="sourcecodebox"&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt; @import "_assets/css/styles.css";&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Hope this helps!&lt;br /&gt;&lt;br /&gt;//Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/01/hiding-address-bar-take-2.html' title='Hiding the Address Bar: Take 2'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=5551699095046535617' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/5551699095046535617'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/5551699095046535617'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-6077891621069929818</id><published>2008-01-09T18:59:00.003-05:00</published><updated>2008-02-24T14:26:19.413-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='safari'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='question and answer'/><title type='text'>Q&amp;A: Can you hide Safari's lower navigation bar?</title><content type='html'>We have our very first reader-submitted question. Here goes:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Hi,&lt;br /&gt;&lt;br /&gt;Read your website with interest and wondered if you can help. ... My question is through additional code, how do you make the bottom 32px bar disappear please! I only want to ... utilize the absolute full screen as if in movie mode. ... Your help would be very much appreciated.&lt;br /&gt;&lt;br /&gt;Thanks,&lt;br /&gt;Chris&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, I have bad news for you. It's currently not possible to hide that bar. I'm hoping that Apple will make some changes to how Safari on the iPhone operates in the near future. Perhaps they could tweak the browser so that the lower navigation bar only displays when the user is scrolling, and then slide back down and out of the way a second or two after the user stops scrolling or when the user starts clicking around the site. Additionally, it'd be nice if you could lock the page so that it doesn't move at all (if a page was designed to fit the screen exactly -- currently you can only prohibit horizontal scrolling, not vertical). Although, if scrolling was disabled... you'd never get back to the address bar (let alone a hiding lower navigation bar). Maybe instead of hiding the address bar completely, they can leave a sliver of it to display the page title. Clicking the title would slide back in the full address bar and navigation bar. I dunno. Apple, figure it out. Sorry I couldn't be of more help Chris.&lt;br /&gt;&lt;br /&gt;If there are more of you out there with questions, feel free to email us at &lt;a href="mailto:ask@iphoneminds.com"&gt;ask@iphoneminds.com&lt;/a&gt;. We look forward to hearing from you!&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/01/q-can-you-hide-safaris-lower-navigation.html' title='Q&amp;A: Can you hide Safari&apos;s lower navigation bar?'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=6077891621069929818' title='3 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/6077891621069929818'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/6077891621069929818'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-7271975539620076752</id><published>2008-01-07T23:28:00.003-05:00</published><updated>2008-02-24T14:25:52.646-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='canvas'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Draw vector art using the canvas</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_canvas-760001.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;We all know that the iPhone is incapable of displaying Flash content. But there are still two Flash-like benefits that we can take advantage of on the iPhone: vector art and animation. When Mac OS X 10.4 was released, Safari supported a new feature called the canvas. Safari, Firefox, Dashboard, and any Web Kit-based application (including the iPhone) can do arbitrary drawing of content using the canvas tag. This extension lets you reserve an area of your web page or widget and use rendering calls like those found in Quartz to paint complex paths and shapes in that area. The canvas tag was heavily utilized by the initial offering of Dashboard widgets released by Apple. Now you can use it to draw shapes to your iPhone webpages.&lt;br /&gt;&lt;br /&gt;Don't get me wrong, this technique is not for amateurs. But if you're already familiar with using the Flash MX Drawing API, drawing using the canvas should be pretty easy. Additionally you can then use Javascript to continually redraw the canvas and animate your art.&lt;br /&gt;&lt;br /&gt;Following is a silly example of what the canvas can do. Not very practicle, but go ahead and give it a whirl to see what it produces.&lt;br /&gt;&lt;br /&gt;&lt;div class="sourcecodebox"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Example&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="application/x-javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;function draw() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;var ctx = document.getElementById('canvas').getContext('2d');&lt;br /&gt;&amp;nbsp;&amp;nbsp;for (i = 0; i &amp;lt; 6; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (j = 0; j &amp;lt; 6; j++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.fillStyle = 'rgb('+Math.floor(255-42.5*i)+','+Math.floor(255-42.5*j)+',0)';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.fillRect(j*25,i*25,25,25);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;body onload="draw()"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;canvas id="canvas"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For more information on how to use the canvas, check out Mozilla's canvas tutorial. It's filled with static and animated examples. Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.mozilla.org/en/docs/Canvas_tutorial" target="_blank"&gt;http://developer.mozilla.org/en/docs/Canvas_tutorial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;// Ryan Jennings</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2008/01/draw-vector-art-using-canvas.html' title='Draw vector art using the canvas'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=7271975539620076752' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/7271975539620076752'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/7271975539620076752'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-995620694527641409</id><published>2007-12-18T17:43:00.000-05:00</published><updated>2007-12-18T17:59:44.226-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wallpapers'/><title type='text'>More Wallpapers...</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_holiday2-714933.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;The MindComet creative team has been hard at work bringing you more wallpapers for your iPhone or iPod Touch.  Okay... they haven't really been hard at work putting these together for you specifically, but it sounds nicer when we say it that way.&lt;br /&gt;&lt;br /&gt;Some of these wallpapers are holiday in nature and some are to showcase a couple of our clients.  In once instance we even combined "holiday" and "clients" and brought you a third freakish kind of wallpaper.  I know... the humanity of it all!  As previously mentioned, if you need help downloading and installing the wallpaper, check the iPhoneMinds archives to see a how-to post on just such a topic.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" border="0" cellpadding="5" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/xMas_iPhoneBg_v1-772086.jpg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/xMas_iPhoneBg_v1-772079.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/xMas_iPhoneBg_v2-772117.jpg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/xMas_iPhoneBg_v2-772113.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/iphone_winter-704449.jpeg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/iphone_winter-704441.jpeg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/iphone_holiday3-704499.jpeg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/iphone_holiday3-704491.jpeg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/iphone_hobey-725923.jpeg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/iphone_hobey-725919.jpeg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/SPEED_Xmas-725961.jpg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/SPEED_Xmas-725958.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/sgw_iphone_1-702126.jpg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/sgw_iphone_1-702119.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/sgw_iphone_2-702160.jpg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/sgw_iphone_2-702151.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;// MC Creative Team</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2007/12/more-wallpapers.html' title='More Wallpapers...'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=995620694527641409' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/995620694527641409'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/995620694527641409'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-7454183914607627700</id><published>2007-12-17T17:19:00.004-05:00</published><updated>2008-04-15T12:47:28.142-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='yui'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone development'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><title type='text'>Basic AJAX Scroll Animation w/YUI</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_dev3-746759.jpg" border="0" alt="Basic AJAX Scroll Animation" /&gt;&lt;br /&gt;&lt;br /&gt;Going through someone else's code is an art, you have to get into the developers mind and discover what he or she was thinking when writing the piece. While scavenging the Internet for an AJAX scroll animation, similar to that of the iPhone, I was so disgusted by the code I saw that I just wrote my own.&lt;br /&gt;&lt;br /&gt;Some key things I had to keep in mind while writing this javascript code were, "How can I dynamically make one object slide off the screen while a second object slides onto the screen?" And "How can I keep users from going psychotic with my slider?"&lt;br /&gt;&lt;br /&gt;To make the code dynamic, that was the easy part, I created a function calling out to the Yahoo UI Library (an AJAX source library). But to restrict when they user could slide the objects, that was the tricky part.&lt;br /&gt;&lt;br /&gt;The YUI Library has three animation events that would allow me to limit when the slider would, well, slide...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;onComplete&lt;/li&gt;&lt;br /&gt;&lt;li&gt;onStart&lt;/li&gt;&lt;br /&gt;&lt;li&gt;onTween&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;It was actually rather interesting how these three events functioned together. Checking if the animation is active (ie. isAnimated();) proved to be a thought provoking process. The onStart function would always return false while checking isAnimated, because onStart does a check right when you start the animation, not yet animated but almost animated. The onComplete function did exactly the same thing while checking isAnimated, it's done being animated. While the onTween function checks for every single tween or frame, it always returns true.&lt;br /&gt;&lt;br /&gt;You can download the following YUI files from the Yahoo Developer Site (&lt;a href="http://developer.yahoo.com/yui/"&gt;http://developer.yahoo.com/yui/&lt;/a&gt;):&lt;br /&gt;&lt;br /&gt;yui/build/yahoo/yahoo.js&lt;br /&gt;yui/build/event/event.js&lt;br /&gt;yui/build/dom/dom.js&lt;br /&gt;yui/build/animation/animation-min.js&lt;br /&gt;&lt;br /&gt;&lt;div class="sourcecodebox"&gt;&lt;pre&gt;&amp;lt;script type="JavaScript"&amp;gt;&lt;br /&gt;var movethis,target,x,y,goodToGo=true;&lt;br /&gt;&lt;br /&gt;var waitForIt = function() {&lt;br /&gt; var onTheMove = this.isAnimated();&lt;br /&gt; if (onTheMove == true) {&lt;br /&gt;  goodToGo=false;&lt;br /&gt; } else {&lt;br /&gt;  goodToGo=true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function slide(moveThis, x, y) {&lt;br /&gt; if (goodToGo == true) {&lt;br /&gt;  moveThis = document.getElementById(moveThis);&lt;br /&gt;  if (x != null &amp;&amp; y != null) {&lt;br /&gt;   var anim = new YAHOO.util.Motion(moveThis, { &lt;br /&gt;points: { by: [x, y] } });&lt;br /&gt;  }&lt;br /&gt;  anim.onTween.subscribe(waitForIt);&lt;br /&gt;  anim.onComplete.subscribe(waitForIt);&lt;br /&gt;  anim.animate();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;// Jay, aka &lt;a href="http://www.w3prodigy.com/" title="W3prodigy, Web Developer" target="_blank"&gt;W3prodigy&lt;/a&gt;</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2007/12/basic-ajax-scroll-animation-wyui.html' title='Basic AJAX Scroll Animation w/YUI'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=7454183914607627700' title='1 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/7454183914607627700'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/7454183914607627700'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry><entry><id>tag:blogger.com,1999:blog-2777379019967928702.post-3178868120396789933</id><published>2007-12-07T16:32:00.001-05:00</published><updated>2007-12-07T16:52:47.854-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wallpapers'/><title type='text'>Happy Christmannuza!</title><content type='html'>&lt;img src="http://iphoneminds.com/uploaded_images/topimage_holiday-767293.jpg" border="0" alt="free iphone wallpapers" /&gt;&lt;br /&gt;&lt;br /&gt;It's that time of year again!  Time to pack up everything you spent your annual savings on and head to someone else's uncomfortable futon for a holiday of overeating and oddly shaped sweaters.&lt;br /&gt;&lt;br /&gt;To cushion the blow, we've put together a few quick and free iPhone wallpapers.  We'll try to create more before we all leave for our own holiday adventures, so stay tuned!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;note:&lt;/b&gt; if you need help downloading and using the wallpapers - &lt;a href="http://iphoneminds.com/2007/11/iphone-wallpapers.html"&gt;check out our "how-to" post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" border="0" cellpadding="5" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/wallpaper_pwned-799031.jpg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/wallpaper_pwned-799024.jpg" alt="pwned free iPhone wallpaper" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/wallpaper_fire-scroll-holiday-version-799065.jpg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/wallpaper_fire-scroll-holiday-version-799059.jpg" alt="abstract free iPhone wallpaper" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/wallpaper_hanukka-719271.jpg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/wallpaper_hanukka-719264.jpg" alt="hanukka free iPhone wallpaper" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://iphoneminds.com/uploaded_images/wallpaper_step1-719330.jpg"&gt;&lt;img src="http://iphoneminds.com/uploaded_images/wallpaper_step1-719325.jpg" alt="in a box iphone wallpaper" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Happy Christmannuza!&lt;br /&gt;&lt;br /&gt;//scott</content><link rel='alternate' type='text/html' href='http://iphoneminds.com/2007/12/happy-christmannuza.html' title='Happy Christmannuza!'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2777379019967928702&amp;postID=3178868120396789933' title='0 Comments'/><link rel='replies' type='application/atom+xml' href='http://iphoneminds.com/atom.xml' title='Post Comments'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/3178868120396789933'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2777379019967928702/posts/default/3178868120396789933'/><author><name>MindComet</name><email>noreply@blogger.com</email></author></entry></feed>