├── README.md ├── app ├── app-build.js ├── app.js ├── libs │ ├── AMDbackbone-0.5.3.js │ ├── jQuery.ui.datepicker.js │ ├── jquery-1.7.1.js │ ├── jquery.mobile-1.0.js │ ├── jquery.ui.datepicker.mobile.js │ ├── json2.js │ ├── require │ │ ├── require-1.0.2.min.js │ │ └── text.js │ └── underscore-1.2.2.js ├── main.js ├── models │ ├── PhotoCollection.js │ ├── ResultCollection.js │ └── ResultEntry.js ├── routers │ └── workspace.js ├── templates │ ├── listview.html │ └── photoview.html ├── ui.js ├── utils.js └── views │ ├── appview.js │ ├── photoList.js │ └── resultList.js ├── css ├── custom_mobile_theme.css ├── jquery.ui.datepicker.css ├── style.css └── theme.css ├── img ├── bg_header.png ├── flickly.jpg ├── icons │ ├── 01-refresh.png │ ├── 02-redo.png │ ├── 03-loopback.png │ ├── 04-squiggle.png │ ├── 05-shuffle.png │ ├── 06-magnify.png │ ├── 07-map-marker.png │ ├── 08-chat.png │ ├── 09-chat-2.png │ ├── 10-medical.png │ ├── 100-coffee.png │ ├── 101-gameplan.png │ ├── 102-walk.png │ ├── 103-map.png │ ├── 104-index-cards.png │ ├── 105-piano.png │ ├── 106-sliders.png │ ├── 107-widescreen.png │ ├── 108-badge.png │ ├── 109-chicken.png │ ├── 11-clock.png │ ├── 110-bug.png │ ├── 111-user.png │ ├── 112-group.png │ ├── 113-navigation.png │ ├── 114-balloon.png │ ├── 115-bow-and-arrow.png │ ├── 116-controller.png │ ├── 117-todo.png │ ├── 118-coat-hanger.png │ ├── 119-piggy-bank.png │ ├── 12-eye.png │ ├── 120-headphones.png │ ├── 121-landscape.png │ ├── 122-stats.png │ ├── 123-id-card.png │ ├── 124-bullhorn.png │ ├── 125-food.png │ ├── 126-moon.png │ ├── 127-sock.png │ ├── 128-bone.png │ ├── 129-golf.png │ ├── 13-target.png │ ├── 130-dice.png │ ├── 131-tower.png │ ├── 132-ghost.png │ ├── 133-ufo.png │ ├── 134-viking.png │ ├── 135-hockeymask.png │ ├── 136-tractor.png │ ├── 137-presentation.png │ ├── 138-scales.png │ ├── 139-flags.png │ ├── 14-tag.png │ ├── 140-gradhat.png │ ├── 141-lamp.png │ ├── 142-wine-bottle.png │ ├── 143-liquor-bottle.png │ ├── 144-martini.png │ ├── 145-persondot.png │ ├── 146-gavel.png │ ├── 147-popsicle.png │ ├── 148-doghouse.png │ ├── 149-windmill.png │ ├── 15-tags.png │ ├── 150-sailboat.png │ ├── 151-telescope.png │ ├── 152-rolodex.png │ ├── 153-guitar.png │ ├── 154-necktie.png │ ├── 155-bowtie.png │ ├── 156-controlpad.png │ ├── 157-wrench.png │ ├── 158-wrench-2.png │ ├── 159-voicemail.png │ ├── 16-line-chart.png │ ├── 160-voicemail-2.png │ ├── 161-calculator.png │ ├── 162-receipt.png │ ├── 163-glasses-1.png │ ├── 164-glasses-2.png │ ├── 165-glasses-3.png │ ├── 166-newspaper.png │ ├── 167-upload-photo.png │ ├── 168-upload-photo-2.png │ ├── 169-8ball.png │ ├── 17-bar-chart.png │ ├── 170-butterfly.png │ ├── 171-sun.png │ ├── 172-pricetag.png │ ├── 173-eyedropper.png │ ├── 174-imac.png │ ├── 175-macbook.png │ ├── 176-ipad.png │ ├── 177-building.png │ ├── 178-city.png │ ├── 179-notepad.png │ ├── 18-envelope.png │ ├── 180-stickynote.png │ ├── 181-hammer.png │ ├── 182-messenger-bag.png │ ├── 183-genie-lamp.png │ ├── 184-warning.png │ ├── 185-printer.png │ ├── 186-ruler.png │ ├── 187-pencil.png │ ├── 188-paint-roller.png │ ├── 189-plant.png │ ├── 19-gear.png │ ├── 190-bank.png │ ├── 191-collection.png │ ├── 192-credit-card.png │ ├── 193-location-arrow.png │ ├── 194-note-2.png │ ├── 195-barcode.png │ ├── 196-radiation.png │ ├── 197-card-diamonds.png │ ├── 198-card-spades.png │ ├── 199-card-hearts.png │ ├── 20-gear2.png │ ├── 200-card-clubs.png │ ├── 21-skull.png │ ├── 22-skull-n-bones.png │ ├── 23-bird.png │ ├── 24-gift.png │ ├── 25-weather.png │ ├── 26-bandaid.png │ ├── 27-planet.png │ ├── 28-star.png │ ├── 29-heart.png │ ├── 30-key.png │ ├── 31-ipod.png │ ├── 32-iphone.png │ ├── 33-cabinet.png │ ├── 34-coffee.png │ ├── 35-shopping.png │ ├── 36-toolbox.png │ ├── 37-suitcase.png │ ├── 38-airplane.png │ ├── 39-spraycan.png │ ├── 40-inbox.png │ ├── 41-picture-frame.png │ ├── 42-photos.png │ ├── 43-film-roll.png │ ├── 44-shoebox.png │ ├── 45-movie-1.png │ ├── 46-movie-2.png │ ├── 47-fuel.png │ ├── 48-fork-and-knife.png │ ├── 49-battery.png │ ├── 50-beaker.png │ ├── 51-outlet.png │ ├── 52-pine-tree.png │ ├── 53-house.png │ ├── 54-lock.png │ ├── 55-network.png │ ├── 56-cloud.png │ ├── 57-download.png │ ├── 58-bookmark.png │ ├── 59-flag.png │ ├── 60-signpost.png │ ├── 61-brightness.png │ ├── 62-contrast.png │ ├── 63-runner.png │ ├── 64-zap.png │ ├── 65-note.png │ ├── 66-microphone.png │ ├── 67-tshirt.png │ ├── 68-paperclip.png │ ├── 69-display.png │ ├── 70-tv.png │ ├── 71-compass.png │ ├── 72-pin.png │ ├── 73-radar.png │ ├── 74-location.png │ ├── 75-phone.png │ ├── 76-baby.png │ ├── 77-ekg.png │ ├── 78-stopwatch.png │ ├── 79-medical-bag.png │ ├── 80-shopping-cart.png │ ├── 81-dashboard.png │ ├── 82-dog-paw.png │ ├── 83-calendar.png │ ├── 84-lightbulb.png │ ├── 85-trophy.png │ ├── 86-camera.png │ ├── 87-wine-glass.png │ ├── 88-beer-mug.png │ ├── 89-dumbell.png │ ├── 90-life-buoy.png │ ├── 91-beaker-2.png │ ├── 92-test-tube.png │ ├── 93-thermometer.png │ ├── 94-pill.png │ ├── 95-equalizer.png │ ├── 96-book.png │ ├── 97-puzzle.png │ ├── 98-palette.png │ ├── 99-umbrella.png │ ├── demo.png │ ├── facebook.png │ ├── github.png │ └── twitter.png ├── loader.gif └── ribbon.png └── index.html /README.md: -------------------------------------------------------------------------------- 1 | #Flickly Mobile 2 | 3 | *This app was further refactored 21/12 4 | 5 | A complete Backbone.js + jQuery Mobile sample app using AMD for separation of modules, Require.js for dependency management + template externalisation and Underscore for templating. 6 | 7 | The app allows you to search for images using the Flickr API, lookup individual photos in more detail, bookmark any state for results or photos, supports pagination and more. 8 | 9 | ##Uses: 10 | 18 | 19 | 20 | Note: This application needs to be run on a HTTP server, local or otherwise. To remove this requirement, simply switch from using external templates via Require.js/the text plugin to inline ones. 21 | 22 | ##Snippets from the upcoming tutorial for this app: Writing Modular Desktop & Mobile Applications With Backbone.js 23 | 24 | (in no particular order) 25 | 26 | ###Why use Require.js with Backbone? 27 | 28 | In case you haven't used it before, Require.js is a popular script loader written by James Burke - a developer who has been quite instrumental in helping shape the AMD module format, which we'll discuss more shortly. Some of Require.js's capabilities include helping to load multiple script files, helping define modules with or without dependencies and loading in non-script dependencies such as text files. 29 | 30 | So, why use Require.js with Backbone?. Although Backbone is excellent when it comes to providing a sanitary structure to your applications, there are a few key areas where some additional help could be used: 31 | 32 | 1) Backbone doesn't endorse a particular approach to modular-development. Although this means it's quite open-ended for developers to opt for classical patterns like the module-pattern or object literals for structuring their apps (which both work fine), it also means developers aren't sure of what works best when other concerns come into play, such as dependency management. 33 | 34 | Require.js is compatible with the AMD (Asynchronous Module Definition) format, a format which was born from a desire to write something better than the 'write lots of script tags with implicit dependencies and manage them manually' approach to development. In addition to allowing you to clearly declare dependencies, AMD works well in the browser, supports string IDs for dependencies, declaring multiple modules in the same file and gives you easy-to-use tools to avoid polluting the global namespace. 35 | 36 | 2) Let's discuss dependency management a little more as it can actually be quite challenging to get right if you're doing it by hand. When we write modules in JavaScript, we ideally want to be able to handle the reuse of code units intelligently and sometimes this will mean pulling in other modules at run-time whilst at other times you may want to do this dynamically to avoid a large pay-load when the user first hits your application. 37 | 38 | Think about the GMail web-client for a moment. When users initially load up the page on their first visit, Google can simply hide widgets such as the chat module until a user has indicated (by clicking 'expand') that they wish to use it. Through dynamic dependency loading, Google could load up the chat module only then, rather than forcing all users to load it when the page first initializes. This can improve performance and load times and can definitely prove useful when building larger applications. 39 | 40 | I've previously written a detailed article covering both AMD and other module formats and script loaders here (http://addyosmani.com/writing-modular-js) in case you'd like to explore this topic further. The takeaway is that although it's perfectly fine to develop applications without a script loader or clean module format in place, it can be of significant benefit to consider using these tools in your application development. 41 | 42 | ###A brief tutorial on writing AMD modules with Require.js 43 | 44 | As discussed above, the overall goal for the AMD format is to provide a solution for modular JavaScript that developers can use today. The two key concepts you need to be aware of when using it with a script-loader are a define() method for facilitating module definition and a require() method for handling dependency loading. define() is used to define named or unnamed modules based on the proposal using the following signature:

45 | 46 |
 47 | define(
 48 |     module_id /*optional*/, 
 49 |     [dependencies] /*optional*/, 
 50 |     definition function /*function for instantiating the module or object*/
 51 | );
 52 | 
53 | 54 | As you can tell by the inline comments, the module_id is an optional argument which is typically only required when non-AMD concatenation tools are being used (there may be some other edge cases where it's useful too). When this argument is left out, we call the module 'anonymous'. When working with anonymous modules, the idea of a module's identity is DRY, making it trivial to avoid duplication of filenames and code. 55 | 56 | Back to the define signature, the dependencies argument represents an array of dependencies which are required by the module you are defining and the third argument ('definition function') is a function that's executed to instantiate your module. A barebone module (compatible with Require.js) could be defined using define() as follows:

57 | 58 |
 59 | // A module ID has been omitted here to make the module anonymous
 60 | 
 61 | define(['foo', 'bar'], 
 62 |     // module definition function
 63 |     // dependencies (foo and bar) are mapped to function parameters
 64 |     function ( foo, bar ) {
 65 |         // return a value that defines the module export
 66 |         // (i.e the functionality we want to expose for consumption)
 67 |     
 68 |         // create your module here
 69 |         var myModule = {
 70 |             doStuff:function(){
 71 |                 console.log('Yay! Stuff');
 72 |             }
 73 |         }
 74 | 
 75 |         return myModule;
 76 | });
 77 | 
78 | 79 | 80 | require() on the other hand is typically used to load code in a top-level JavaScript file or within a module should you wish to dynamically fetch dependencies. An example of its usage is:

81 | 82 |
 83 | // Consider 'foo' and 'bar' are two external modules
 84 | // In this example, the 'exports' from the two modules loaded are passed as
 85 | // function arguments to the callback (foo and bar)
 86 | // so that they can similarly be accessed
 87 | 
 88 | require(['foo', 'bar'], function ( foo, bar ) {
 89 |         // rest of your code here
 90 |         foo.doSomething();
 91 | });
 92 | 
93 | 94 | 95 | Defining AMD Modules Using Require.js 96 | 97 | //Todo: explain and demonstrate how to wrap views etc. inside AMD modules and how that all works. 98 | 99 |
100 | require(['app/myModule'], 
101 |     function( myModule ){
102 |         // start the main module which in-turn
103 |         // loads other modules
104 |         var module = new myModule();
105 |         module.doStuff();
106 | });
107 | 
108 | 109 | 110 | ### Modular desktop applications with Require.js and Backbone 111 | 112 | My side-project TodoMVC now includes a modular Backbone example using AMD and Require.js (thanks to Thomas Davis) for anyone wishing to look at a sample without any of the jQuery Mobile code included: 113 | 114 | https://github.com/addyosmani/todomvc/tree/master/todo-example/backbone+require 115 | 116 | This covers how to wrap your views, models, modules etc. using AMD and also cleanly demonstrates handling dependency management as well as Flickly does. 117 | 118 | 119 | ###External [Underscore/Handlebars/Mustache] templates using Require.js 120 | 121 | Moving your [Underscore/Mustache/Handlebars] templates to external files is actually quite straight-forward. As this application makes use of Require.js, I'll discuss how to implement external templates using this specific script loader. 122 | 123 | RequireJS has a special plugin called text.js which is used to load in text file dependencies. To use the text plugin, simply follow these simple steps: 124 | 125 | 1. Download the plugin from http://requirejs.org/docs/download.html#text and place it in either the same directory as your application's main JS file or a suitable sub-directory. 126 | 127 | 2. Next, include the text.js plugin in your initial Require.js configuration options. In the code snippet below, we assume that require.js is being included in our page prior to this code snippet being executed. Any of the other scripts being loaded are just there for the sake of example. 128 | 129 |
130 | require.config( {
131 |     paths: {
132 |         'backbone':         'libs/AMDbackbone-0.5.3',
133 |         'underscore':       'libs/underscore-1.2.2',
134 |         'text':             'libs/require/text',
135 |         'jquery':           'libs/jQuery-1.7.1',
136 |         'json2':            'libs/json2',
137 |         'datepicker':       'libs/jQuery.ui.datepicker',
138 |         'datepickermobile': 'libs/jquery.ui.datepicker.mobile',
139 |         'jquerymobile':     'libs/jquery.mobile-1.0'
140 |     },
141 |     baseUrl: 'app'
142 | } );
143 | 
144 | 145 | 3. When the text! prefix is used for a dependency, Require.js will automatically load the text plugin and treat the dependency as a text resource. A typical example of this in action may look like.. 146 | 147 |
148 | require(['js/app', 'text!templates/mainView.html'],
149 | 	function(app, mainView){
150 | 		// the contents of the mainView file will be
151 | 		// loaded into mainView for usage.
152 | 	}
153 | );
154 | 
155 | 156 | 4. Finally we can use the text resource that's been loaded for templating purposes. You're probably used to storing your HTML templates inline using a script with a specific identifier. 157 | 158 | With Underscore.js's micro-templating (and jQuery) this would typically be: 159 | 160 | HTML: 161 |
162 | <script type="text/template" id="mainViewTemplate">
163 | 	<% _.each( person, function( person_item ){ %>
164 |                 <li><%= person_item.get("name") %></li>  
165 |      <% }); %>
166 | </script>
167 | 
168 | 169 | JS: 170 |
171 | var compiled_template = _.template( $('#mainViewTemplate').html() );
172 | 
173 | 174 | With Require.js and the text plugin however, it's as simple as saving your template into an external text file (say, mainView.html) and doing the following: 175 | 176 |
177 | require(['js/app', 'text!templates/mainView.html'],
178 | 	function(app, mainView){
179 | 		
180 | 		var compiled_template = _.template( mainView );
181 | 	}
182 | );
183 | 
184 | 185 | That's it!. You can then go applying your template to a view in Backbone doing something like: 186 | 187 |
188 | collection.someview.el.html( compiled_template( { results: collection.models } ) );
189 | 
190 | 191 | 192 | All templating solutions will have their own custom methods for handling template compilation, but if you understand the above, substituting Underscore's micro-templating for any other solution should be fairly trivial. 193 | 194 | Note: You may also be interested in looking at https://github.com/ZeeAgency/requirejs-tpl. It's an AMD-compatible version of the Underscore templating system that also includes support for optimization (pre-compiled templates) which can lead to better performance and no evals. I have yet to use it myself, but it comes as a recommended resource. 195 | 196 | 197 | 198 | ###Backbone and jQuery Mobile: Resolving the routing conflicts 199 | 200 | The first major hurdle developers typically run into when building Backbone applications with jQuery Mobile is that both frameworks have their own opinions about how to handle application navigation. 201 | 202 | Backbone's routers offer an explicit way to define custom navigation routes through Backbone.Router, whilst jQuery Mobile encourages the use of URL hash fragments to reference separate 'pages' or views in the same document. jQuery Mobile also supports automatically pulling in external content for links through XHR calls meaning that there can be quite a lot of inter-framework confusion about what a link pointing at '#/photo/id' should actually be doing. 203 | 204 | Some of the solutions that have been previously proposed to work-around this problem included manually patching Backbone or jQuery Mobile. I discourage opting for these techniques as it becomes necessary to manually patch your framework builds when new releases get made upstream. 205 | 206 | There's also https://github.com/azicchetti/jquerymobile-router, which tries to solve this problem differently, however I think my proposed solution is both simpler and allows both frameworks to cohabit quite peacefully without the need to extend either. What we're after is a way to prevent one framework from listening to hash changes so that we can fully rely on the other (e.g. Backbone.Router) to handle this for us exclusively. 207 | 208 | Using jQuery Mobile this can be done by setting: 209 | 210 |
211 | $.mobile.hashListeningEnabled = false;
212 | 
213 | 214 | prior to initializing any of your other code. 215 | 216 | I discovered this method looking through some jQuery Mobile commits that didn't make their way into the official docs, but am happy to see that they are now covered here http://jquerymobile.com/test/docs/api/globalconfig.html in more detail. 217 | 218 | The next question that arises is, if we're preventing jQuery Mobile from listening to URL hash changes, how can we still get the benefit of being able to navigate to other sections in a document using the built-in transitions and effects supported?. Good question. This can now be solve by simply calling $.mobile.changePage() as follows: 219 | 220 |
221 | var url = '#about',
222 |     effect = 'slideup',
223 |     reverse = false,
224 |     changeHash = false;
225 | 
226 | $.mobile.changePage( url , { transition: effect}, reverse, changeHash );
227 | 
228 | 229 | In the above sample, url can refer to a URL or a hash identifier to navigate to, effect is simply the transition effect to animate the page in with and the final two parameters decide the direction for the transition (reverse) and whether or not the hash in the address bar should be updated (changeHash). With respect to the latter, I typically set this to false to avoid managing two sources for hash updates, but feel free to set this to true if you're comfortable doing so. 230 | 231 | Note: For some parallel work being done to explore how well the jQuery Mobile Router plugin works with Backbone, you may be interested in checking out https://github.com/Filirom1/jquery-mobile-backbone-requirejs. 232 | 233 | 234 | 235 | ###Getting started 236 | 237 | Once you feel comfortable with the Backbone fundamentals (http://msdn.microsoft.com/en-us/scriptjunkie/hh377172.aspx) and you've put together a rough wireframe of the app you may wish to build, start to think about your application architecture. Ideally, you'll want to logically separate concerns so that it's as easy as possible to maintain the app in the future. 238 | 239 | Namespacing 240 | 241 | For this application, I opted for the nested namespacing pattern. Implemented correctly, this enables you to clearly identify if items being referenced in your app are views, other modules and so on. This initial structure is a sane place to also include application defaults (unless you prefer maintaining those in a separate file). 242 | 243 |
244 | window.mobileSearch = window.mobileSearch || {
245 |     views: {
246 |         appview: new AppView
247 |     },
248 |     routers:{
249 |         workspace:new Workspace()
250 |     },
251 |     utils: utils,
252 |     defaults:{
253 |         resultsPerPage: 16,
254 |         safeSearch: 2,
255 |         maxDate:'',
256 |         minDate:'01/01/1970'
257 |     }
258 | }
259 | 
260 | 261 | Models 262 | 263 | In the Flickly application, there are at least two unique types of data that need to be modelled - search results and individual photos, both of which contain additional meta-data like photo titles. If you simplify this down, search results are actually groups of photos in their own right, so the application only requires: 264 | 265 | * A single model (a photo or 'result' entry) 266 | * A result collection (containing a group of result entries) for search results 267 | * A photo collection (containing one or more result entries) for individual photos or photos with more than one image 268 | 269 | Views 270 | 271 | The views we'll need include an application view, a search results view and a photo view. Static views or pages of the single-page application which do not require a dynamic element to them (e.g an 'about' page) can be easily coded up in your document's markup, independant of Backbone. 272 | 273 | Routers 274 | 275 | A number of possible routes need to be taken into consideration: 276 | 277 | * Basic search queries #search/kiwis 278 | * Search queries with additional parameters (e.g sort, pagination) #search/kiwis/srelevance/p7 279 | * Queries for specific photos #photo/93839 280 | * A default route (no parameters passed) 281 | 282 | 283 | ###jQuery Mobile: Going beyond mobile application development 284 | 285 | The majority of jQM apps I've seen in production have been developed for the purpose of providing an optimal experience to users on mobile devices. Given that the framework was developed for this purpose, there's nothing fundamentally wrong with this, but many developers forget that jQM is a UI framework not dissimilar to jQuery UI. It's using the widget factory and is capable of being used for a lot more than we give it credit for. 286 | 287 | If you open up Flickly in a desktop browser, you'll get an image search UI that's modelled on Google.com, however, review the components (buttons, text inputs, tabs) on the page for a moment. The desktop UI doesn't look anything like a mobile application yet I'm still using jQM for theming mobile components; the tabs, date-picker, sliders - everything in the desktop UI is re-using what jQM would be providing users on mobile devices. Thanks to some media queries, the desktop UI can make optimal use of whitespace, expanding component blocks out and providing alternative layouts whilst still making use of jQM as a component framework. 288 | 289 | The benefit of this is that I don't need to go pulling in jQuery UI separately to be able to take advantage of these features. Thanks to the recent ThemeRoller my components can look pretty much exactly how I would like them to and users of the app can get a jQM UI for lower-resolutions and a jQM-ish UI for everything else. 290 | 291 | The takeaway here is just to remember that if you're not (already) going through the hassle of conditional script/style loading based on screen-resolution (using matchMedia.js etc), there are simpler approaches that can be taken to cross-device component theming. 292 | 293 | 294 | 295 | -------------------------------------------------------------------------------- /app/app-build.js: -------------------------------------------------------------------------------- 1 | ({ 2 | appDir: "./", 3 | baseUrl: "./", 4 | dir: "../release", 5 | paths: { 6 | 'backbone': 'libs/AMDbackbone-0.5.3', 7 | 'underscore': 'libs/underscore-1.2.2', 8 | 'jquery': 'libs/jQuery-1.7.1', 9 | 'json2': 'libs/json2', 10 | 'datepicker': 'libs/jQuery.ui.datepicker', 11 | 'datepickermobile': 'libs/jquery.ui.datepicker.mobile', 12 | 'jquerymobile': 'libs/jquery.mobile-1.0' 13 | }, 14 | optimize: "uglify", 15 | modules: [ 16 | { 17 | name: "app", 18 | exclude: [ 19 | // If you prefer not to include certain libs exclude them here 20 | ] 21 | } 22 | ] 23 | }) 24 | -------------------------------------------------------------------------------- /app/app.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Flickly - Backbone jQuery Mobile demo 3 | * http://addyosmani.com 4 | * Copyright (c) 2012 Addy Osmani 5 | * Dual licensed under the MIT and GPL licenses. 6 | * 7 | */ 8 | define( ['backbone', 'views/appview', 'routers/workspace', 'utils', 'ui'], 9 | function( Backbone, AppView, Workspace, utils, ui ) { 10 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 11 | "use strict"; 12 | 13 | $(function(){ 14 | 15 | window.mobileSearch = window.mobileSearch || { 16 | views: { 17 | appview: new AppView 18 | }, 19 | routers:{ 20 | workspace:new Workspace() 21 | }, 22 | utils: utils, 23 | ui: ui, 24 | defaults:{ 25 | resultsPerPage: 16, 26 | safeSearch: 2, 27 | maxDate:'', 28 | minDate:'01/01/1970' 29 | } 30 | } 31 | 32 | 33 | window.mobileSearch.utils.toggleNavigation( false ); 34 | 35 | Backbone.history.start(); 36 | }); 37 | 38 | } ); 39 | -------------------------------------------------------------------------------- /app/libs/jQuery.ui.datepicker.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI 1.8.5 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI 9 | */ 10 | (function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.5",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106, 11 | NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this, 12 | "position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position"); 13 | if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind("mousedown.ui-disableSelection selectstart.ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f, 14 | "border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c.style(this,h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c.style(this, 15 | h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}}); 16 | c(function(){var a=document.createElement("div"),b=document.body;c.extend(a.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.appendChild(a).offsetHeight===100;b.removeChild(a).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a')}function E(a,b){d.extend(a, 34 | b);for(var c in b)if(b[c]==null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.5"}});var y=(new Date).getTime();d.extend(L.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]= 35 | f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('
')}}, 36 | _connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& 37 | b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f== 38 | ""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, 39 | c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), 40 | true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor== 41 | Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]); 42 | d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}}, 43 | _enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b= 44 | d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; 45 | for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target|| 52 | a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a); 53 | d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&& 54 | d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f, 55 | h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover"); 56 | this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover"); 57 | this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); 58 | a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(), 59 | k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"]; 60 | a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val(): 61 | "",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&& 62 | !a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth; 63 | b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b= 64 | this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a= 65 | d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a, 66 | "altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b== 67 | "object"?b.toString():b+"";if(b=="")return null;for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1 70 | -1){k=1;l=u;do{e=this._getDaysInMonth(c,k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24* 71 | 60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e? 78 | "":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k= 79 | this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a, 80 | "prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+ 81 | n+"";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+r+"":f?"":''+r+"";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
'+(c?h:"")+(this._isInRange(a,r)?'":"")+(c?"":h)+"
":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var M=this._getDefaultDate(a),I="",C=0;C1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='
'+(/all|left/.test(t)&&C==0?c? 85 | f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'
';var A=k?'":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="=5?' class="ui-datepicker-week-end"':"")+'>'+s[q]+""}x+=A+"";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, 86 | A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O";var P=!k?"":'";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,K=B&&!H||!F[0]||j&&qo;P+='";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=P+""}g++;if(g>11){g=0;m++}x+="
'+this._get(a,"weekHeader")+"
'+this._get(a,"calculateWeek")(q)+""+(B&&!w?" ":K?''+q.getDate()+ 88 | "":''+q.getDate()+"")+"
"+(l?""+(i[0]>0&&D==i[1]-1?'
':""):"");N+=x}I+=N}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': 89 | "");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='
',o="";if(h||!k)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(j+=o+(h||!(k&&l)?" ":""));if(h||!l)j+=''+c+"";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b, 91 | i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?" ":"")+o;j+="
";return j},_adjustInstDate:function(a,b,c){var e= 92 | a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a, 93 | "onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); 94 | c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, 95 | "dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= 96 | function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b)); 97 | return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new L;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.5";window["DP_jQuery_"+y]=d})(jQuery); 98 | ; -------------------------------------------------------------------------------- /app/libs/jquery.ui.datepicker.mobile.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery Mobile Framework : temporary extension to port jQuery UI's datepicker for mobile 3 | * Copyright (c) jQuery Project 4 | * Dual licensed under the MIT or GPL Version 2 licenses. 5 | * http://jquery.org/license 6 | */ 7 | (function($, undefined ) { 8 | 9 | //cache previous datepicker ui method 10 | var prevDp = $.fn.datepicker; 11 | 12 | //rewrite datepicker 13 | //$.fn.datepicker = function( options ){ 14 | $.fn.datepicker = function( option1 ,option2){ 15 | 16 | var dp = this; 17 | 18 | //call cached datepicker plugin 19 | //prevDp.call( this, options ); 20 | //prevDp.apply( this, arguments ); 21 | prevDp.call( this, option1, option2 ); 22 | 23 | //extend with some dom manipulation to update the markup for jQM 24 | //call immediately 25 | function updateDatepicker(){ 26 | $( ".ui-datepicker-header", dp ).addClass("ui-body-c ui-corner-top").removeClass("ui-corner-all"); 27 | $( ".ui-datepicker-prev, .ui-datepicker-next", dp ).attr("href", "#"); 28 | $( ".ui-datepicker-prev", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-l", shadow: true, corners: true}); 29 | $( ".ui-datepicker-next", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-r", shadow: true, corners: true}); 30 | $( ".ui-datepicker-calendar th", dp ).addClass("ui-bar-c"); 31 | $( ".ui-datepicker-calendar td", dp ).addClass("ui-body-c"); 32 | $( ".ui-datepicker-calendar a", dp ).buttonMarkup({corners: false, shadow: false}); 33 | $( ".ui-datepicker-calendar a.ui-state-active", dp ).addClass("ui-btn-active"); // selected date 34 | $( ".ui-datepicker-calendar a.ui-state-highlight", dp ).addClass("ui-btn-up-e"); // today"s date 35 | $( ".ui-datepicker-calendar .ui-btn", dp ).each(function(){ 36 | var el = $(this); 37 | // remove extra button markup - necessary for date value to be interpreted correctly 38 | el.html( el.find( ".ui-btn-text" ).text() ); 39 | }); 40 | }; 41 | 42 | //update now 43 | updateDatepicker(); 44 | 45 | // and on click 46 | $( dp ).click( updateDatepicker ); 47 | 48 | //return jqm obj 49 | return this; 50 | }; 51 | 52 | //bind to pagecreate to automatically enhance date inputs 53 | /*Note, this is a custom fix to workaround the issue of the datepicker being erroneously called multiple times*/ 54 | $( ".ui-page" ).live( "pagecreate", function(){ 55 | $( "input[type='date'], input:jqmData(type='date')" ).each(function(){ 56 | if($(this).hasClass('test')){ 57 | }else{ 58 | $(this).after( $( "
" ).datepicker({ altField: "#" + $(this).attr( "id" ), showOtherMonths: true }) ); 59 | $(this).addClass('test'); 60 | } 61 | }); 62 | }); 63 | })( jQuery ); -------------------------------------------------------------------------------- /app/libs/json2.js: -------------------------------------------------------------------------------- 1 | /* 2 | http://www.JSON.org/json2.js 3 | 2011-02-23 4 | 5 | Public Domain. 6 | 7 | NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. 8 | 9 | See http://www.JSON.org/js.html 10 | 11 | 12 | This code should be minified before deployment. 13 | See http://javascript.crockford.com/jsmin.html 14 | 15 | USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO 16 | NOT CONTROL. 17 | 18 | 19 | This file creates a global JSON object containing two methods: stringify 20 | and parse. 21 | 22 | JSON.stringify(value, replacer, space) 23 | value any JavaScript value, usually an object or array. 24 | 25 | replacer an optional parameter that determines how object 26 | values are stringified for objects. It can be a 27 | function or an array of strings. 28 | 29 | space an optional parameter that specifies the indentation 30 | of nested structures. If it is omitted, the text will 31 | be packed without extra whitespace. If it is a number, 32 | it will specify the number of spaces to indent at each 33 | level. If it is a string (such as '\t' or ' '), 34 | it contains the characters used to indent at each level. 35 | 36 | This method produces a JSON text from a JavaScript value. 37 | 38 | When an object value is found, if the object contains a toJSON 39 | method, its toJSON method will be called and the result will be 40 | stringified. A toJSON method does not serialize: it returns the 41 | value represented by the name/value pair that should be serialized, 42 | or undefined if nothing should be serialized. The toJSON method 43 | will be passed the key associated with the value, and this will be 44 | bound to the value 45 | 46 | For example, this would serialize Dates as ISO strings. 47 | 48 | Date.prototype.toJSON = function (key) { 49 | function f(n) { 50 | // Format integers to have at least two digits. 51 | return n < 10 ? '0' + n : n; 52 | } 53 | 54 | return this.getUTCFullYear() + '-' + 55 | f(this.getUTCMonth() + 1) + '-' + 56 | f(this.getUTCDate()) + 'T' + 57 | f(this.getUTCHours()) + ':' + 58 | f(this.getUTCMinutes()) + ':' + 59 | f(this.getUTCSeconds()) + 'Z'; 60 | }; 61 | 62 | You can provide an optional replacer method. It will be passed the 63 | key and value of each member, with this bound to the containing 64 | object. The value that is returned from your method will be 65 | serialized. If your method returns undefined, then the member will 66 | be excluded from the serialization. 67 | 68 | If the replacer parameter is an array of strings, then it will be 69 | used to select the members to be serialized. It filters the results 70 | such that only members with keys listed in the replacer array are 71 | stringified. 72 | 73 | Values that do not have JSON representations, such as undefined or 74 | functions, will not be serialized. Such values in objects will be 75 | dropped; in arrays they will be replaced with null. You can use 76 | a replacer function to replace those with JSON values. 77 | JSON.stringify(undefined) returns undefined. 78 | 79 | The optional space parameter produces a stringification of the 80 | value that is filled with line breaks and indentation to make it 81 | easier to read. 82 | 83 | If the space parameter is a non-empty string, then that string will 84 | be used for indentation. If the space parameter is a number, then 85 | the indentation will be that many spaces. 86 | 87 | Example: 88 | 89 | text = JSON.stringify(['e', {pluribus: 'unum'}]); 90 | // text is '["e",{"pluribus":"unum"}]' 91 | 92 | 93 | text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); 94 | // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' 95 | 96 | text = JSON.stringify([new Date()], function (key, value) { 97 | return this[key] instanceof Date ? 98 | 'Date(' + this[key] + ')' : value; 99 | }); 100 | // text is '["Date(---current time---)"]' 101 | 102 | 103 | JSON.parse(text, reviver) 104 | This method parses a JSON text to produce an object or array. 105 | It can throw a SyntaxError exception. 106 | 107 | The optional reviver parameter is a function that can filter and 108 | transform the results. It receives each of the keys and values, 109 | and its return value is used instead of the original value. 110 | If it returns what it received, then the structure is not modified. 111 | If it returns undefined then the member is deleted. 112 | 113 | Example: 114 | 115 | // Parse the text. Values that look like ISO date strings will 116 | // be converted to Date objects. 117 | 118 | myData = JSON.parse(text, function (key, value) { 119 | var a; 120 | if (typeof value === 'string') { 121 | a = 122 | /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); 123 | if (a) { 124 | return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], 125 | +a[5], +a[6])); 126 | } 127 | } 128 | return value; 129 | }); 130 | 131 | myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { 132 | var d; 133 | if (typeof value === 'string' && 134 | value.slice(0, 5) === 'Date(' && 135 | value.slice(-1) === ')') { 136 | d = new Date(value.slice(5, -1)); 137 | if (d) { 138 | return d; 139 | } 140 | } 141 | return value; 142 | }); 143 | 144 | 145 | This is a reference implementation. You are free to copy, modify, or 146 | redistribute. 147 | */ 148 | 149 | /*jslint evil: true, strict: false, regexp: false */ 150 | 151 | /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, 152 | call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, 153 | getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, 154 | lastIndex, length, parse, prototype, push, replace, slice, stringify, 155 | test, toJSON, toString, valueOf 156 | */ 157 | 158 | 159 | // Create a JSON object only if one does not already exist. We create the 160 | // methods in a closure to avoid creating global variables. 161 | 162 | var JSON; 163 | if (!JSON) { 164 | JSON = {}; 165 | } 166 | 167 | (function () { 168 | "use strict"; 169 | 170 | function f(n) { 171 | // Format integers to have at least two digits. 172 | return n < 10 ? '0' + n : n; 173 | } 174 | 175 | if (typeof Date.prototype.toJSON !== 'function') { 176 | 177 | Date.prototype.toJSON = function (key) { 178 | 179 | return isFinite(this.valueOf()) ? 180 | this.getUTCFullYear() + '-' + 181 | f(this.getUTCMonth() + 1) + '-' + 182 | f(this.getUTCDate()) + 'T' + 183 | f(this.getUTCHours()) + ':' + 184 | f(this.getUTCMinutes()) + ':' + 185 | f(this.getUTCSeconds()) + 'Z' : null; 186 | }; 187 | 188 | String.prototype.toJSON = 189 | Number.prototype.toJSON = 190 | Boolean.prototype.toJSON = function (key) { 191 | return this.valueOf(); 192 | }; 193 | } 194 | 195 | var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, 196 | escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, 197 | gap, 198 | indent, 199 | meta = { // table of character substitutions 200 | '\b': '\\b', 201 | '\t': '\\t', 202 | '\n': '\\n', 203 | '\f': '\\f', 204 | '\r': '\\r', 205 | '"' : '\\"', 206 | '\\': '\\\\' 207 | }, 208 | rep; 209 | 210 | 211 | function quote(string) { 212 | 213 | // If the string contains no control characters, no quote characters, and no 214 | // backslash characters, then we can safely slap some quotes around it. 215 | // Otherwise we must also replace the offending characters with safe escape 216 | // sequences. 217 | 218 | escapable.lastIndex = 0; 219 | return escapable.test(string) ? '"' + string.replace(escapable, function (a) { 220 | var c = meta[a]; 221 | return typeof c === 'string' ? c : 222 | '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); 223 | }) + '"' : '"' + string + '"'; 224 | } 225 | 226 | 227 | function str(key, holder) { 228 | 229 | // Produce a string from holder[key]. 230 | 231 | var i, // The loop counter. 232 | k, // The member key. 233 | v, // The member value. 234 | length, 235 | mind = gap, 236 | partial, 237 | value = holder[key]; 238 | 239 | // If the value has a toJSON method, call it to obtain a replacement value. 240 | 241 | if (value && typeof value === 'object' && 242 | typeof value.toJSON === 'function') { 243 | value = value.toJSON(key); 244 | } 245 | 246 | // If we were called with a replacer function, then call the replacer to 247 | // obtain a replacement value. 248 | 249 | if (typeof rep === 'function') { 250 | value = rep.call(holder, key, value); 251 | } 252 | 253 | // What happens next depends on the value's type. 254 | 255 | switch (typeof value) { 256 | case 'string': 257 | return quote(value); 258 | 259 | case 'number': 260 | 261 | // JSON numbers must be finite. Encode non-finite numbers as null. 262 | 263 | return isFinite(value) ? String(value) : 'null'; 264 | 265 | case 'boolean': 266 | case 'null': 267 | 268 | // If the value is a boolean or null, convert it to a string. Note: 269 | // typeof null does not produce 'null'. The case is included here in 270 | // the remote chance that this gets fixed someday. 271 | 272 | return String(value); 273 | 274 | // If the type is 'object', we might be dealing with an object or an array or 275 | // null. 276 | 277 | case 'object': 278 | 279 | // Due to a specification blunder in ECMAScript, typeof null is 'object', 280 | // so watch out for that case. 281 | 282 | if (!value) { 283 | return 'null'; 284 | } 285 | 286 | // Make an array to hold the partial results of stringifying this object value. 287 | 288 | gap += indent; 289 | partial = []; 290 | 291 | // Is the value an array? 292 | 293 | if (Object.prototype.toString.apply(value) === '[object Array]') { 294 | 295 | // The value is an array. Stringify every element. Use null as a placeholder 296 | // for non-JSON values. 297 | 298 | length = value.length; 299 | for (i = 0; i < length; i += 1) { 300 | partial[i] = str(i, value) || 'null'; 301 | } 302 | 303 | // Join all of the elements together, separated with commas, and wrap them in 304 | // brackets. 305 | 306 | v = partial.length === 0 ? '[]' : gap ? 307 | '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : 308 | '[' + partial.join(',') + ']'; 309 | gap = mind; 310 | return v; 311 | } 312 | 313 | // If the replacer is an array, use it to select the members to be stringified. 314 | 315 | if (rep && typeof rep === 'object') { 316 | length = rep.length; 317 | for (i = 0; i < length; i += 1) { 318 | if (typeof rep[i] === 'string') { 319 | k = rep[i]; 320 | v = str(k, value); 321 | if (v) { 322 | partial.push(quote(k) + (gap ? ': ' : ':') + v); 323 | } 324 | } 325 | } 326 | } else { 327 | 328 | // Otherwise, iterate through all of the keys in the object. 329 | 330 | for (k in value) { 331 | if (Object.prototype.hasOwnProperty.call(value, k)) { 332 | v = str(k, value); 333 | if (v) { 334 | partial.push(quote(k) + (gap ? ': ' : ':') + v); 335 | } 336 | } 337 | } 338 | } 339 | 340 | // Join all of the member texts together, separated with commas, 341 | // and wrap them in braces. 342 | 343 | v = partial.length === 0 ? '{}' : gap ? 344 | '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : 345 | '{' + partial.join(',') + '}'; 346 | gap = mind; 347 | return v; 348 | } 349 | } 350 | 351 | // If the JSON object does not yet have a stringify method, give it one. 352 | 353 | if (typeof JSON.stringify !== 'function') { 354 | JSON.stringify = function (value, replacer, space) { 355 | 356 | // The stringify method takes a value and an optional replacer, and an optional 357 | // space parameter, and returns a JSON text. The replacer can be a function 358 | // that can replace values, or an array of strings that will select the keys. 359 | // A default replacer method can be provided. Use of the space parameter can 360 | // produce text that is more easily readable. 361 | 362 | var i; 363 | gap = ''; 364 | indent = ''; 365 | 366 | // If the space parameter is a number, make an indent string containing that 367 | // many spaces. 368 | 369 | if (typeof space === 'number') { 370 | for (i = 0; i < space; i += 1) { 371 | indent += ' '; 372 | } 373 | 374 | // If the space parameter is a string, it will be used as the indent string. 375 | 376 | } else if (typeof space === 'string') { 377 | indent = space; 378 | } 379 | 380 | // If there is a replacer, it must be a function or an array. 381 | // Otherwise, throw an error. 382 | 383 | rep = replacer; 384 | if (replacer && typeof replacer !== 'function' && 385 | (typeof replacer !== 'object' || 386 | typeof replacer.length !== 'number')) { 387 | throw new Error('JSON.stringify'); 388 | } 389 | 390 | // Make a fake root object containing our value under the key of ''. 391 | // Return the result of stringifying the value. 392 | 393 | return str('', {'': value}); 394 | }; 395 | } 396 | 397 | 398 | // If the JSON object does not yet have a parse method, give it one. 399 | 400 | if (typeof JSON.parse !== 'function') { 401 | JSON.parse = function (text, reviver) { 402 | 403 | // The parse method takes a text and an optional reviver function, and returns 404 | // a JavaScript value if the text is a valid JSON text. 405 | 406 | var j; 407 | 408 | function walk(holder, key) { 409 | 410 | // The walk method is used to recursively walk the resulting structure so 411 | // that modifications can be made. 412 | 413 | var k, v, value = holder[key]; 414 | if (value && typeof value === 'object') { 415 | for (k in value) { 416 | if (Object.prototype.hasOwnProperty.call(value, k)) { 417 | v = walk(value, k); 418 | if (v !== undefined) { 419 | value[k] = v; 420 | } else { 421 | delete value[k]; 422 | } 423 | } 424 | } 425 | } 426 | return reviver.call(holder, key, value); 427 | } 428 | 429 | 430 | // Parsing happens in four stages. In the first stage, we replace certain 431 | // Unicode characters with escape sequences. JavaScript handles many characters 432 | // incorrectly, either silently deleting them, or treating them as line endings. 433 | 434 | text = String(text); 435 | cx.lastIndex = 0; 436 | if (cx.test(text)) { 437 | text = text.replace(cx, function (a) { 438 | return '\\u' + 439 | ('0000' + a.charCodeAt(0).toString(16)).slice(-4); 440 | }); 441 | } 442 | 443 | // In the second stage, we run the text against regular expressions that look 444 | // for non-JSON patterns. We are especially concerned with '()' and 'new' 445 | // because they can cause invocation, and '=' because it can cause mutation. 446 | // But just to be safe, we want to reject all unexpected forms. 447 | 448 | // We split the second stage into 4 regexp operations in order to work around 449 | // crippling inefficiencies in IE's and Safari's regexp engines. First we 450 | // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we 451 | // replace all simple value tokens with ']' characters. Third, we delete all 452 | // open brackets that follow a colon or comma or that begin the text. Finally, 453 | // we look to see that the remaining characters are only whitespace or ']' or 454 | // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. 455 | 456 | if (/^[\],:{}\s]*$/ 457 | .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') 458 | .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') 459 | .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { 460 | 461 | // In the third stage we use the eval function to compile the text into a 462 | // JavaScript structure. The '{' operator is subject to a syntactic ambiguity 463 | // in JavaScript: it can begin a block or an object literal. We wrap the text 464 | // in parens to eliminate the ambiguity. 465 | 466 | j = eval('(' + text + ')'); 467 | 468 | // In the optional fourth stage, we recursively walk the new structure, passing 469 | // each name/value pair to a reviver function for possible transformation. 470 | 471 | return typeof reviver === 'function' ? 472 | walk({'': j}, '') : j; 473 | } 474 | 475 | // If the text is not JSON parseable, then a SyntaxError is thrown. 476 | 477 | throw new SyntaxError('JSON.parse'); 478 | }; 479 | } 480 | }()); 481 | -------------------------------------------------------------------------------- /app/libs/require/require-1.0.2.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | RequireJS 1.0.2 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved. 3 | Available via the MIT or new BSD license. 4 | see: http://github.com/jrburke/requirejs for details 5 | */ 6 | var requirejs,require,define; 7 | (function(){function J(a){return M.call(a)==="[object Function]"}function E(a){return M.call(a)==="[object Array]"}function Z(a,c,h){for(var k in c)if(!(k in K)&&(!(k in a)||h))a[k]=c[k];return d}function N(a,c,d){a=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+a);if(d)a.originalError=d;return a}function $(a,c,d){var k,j,q;for(k=0;q=c[k];k++){q=typeof q==="string"?{name:q}:q;j=q.location;if(d&&(!j||j.indexOf("/")!==0&&j.indexOf(":")===-1))j=d+"/"+(j||q.name);a[q.name]={name:q.name,location:j|| 8 | q.name,main:(q.main||"main").replace(ea,"").replace(aa,"")}}}function V(a,c){a.holdReady?a.holdReady(c):c?a.readyWait+=1:a.ready(!0)}function fa(a){function c(b,l){var f,a;if(b&&b.charAt(0)===".")if(l){p.pkgs[l]?l=[l]:(l=l.split("/"),l=l.slice(0,l.length-1));f=b=l.concat(b.split("/"));var c;for(a=0;c=f[a];a++)if(c===".")f.splice(a,1),a-=1;else if(c==="..")if(a===1&&(f[2]===".."||f[0]===".."))break;else a>0&&(f.splice(a-1,2),a-=2);a=p.pkgs[f=b[0]];b=b.join("/");a&&b===f+"/"+a.main&&(b=f)}else b.indexOf("./")=== 9 | 0&&(b=b.substring(2));return b}function h(b,l){var f=b?b.indexOf("!"):-1,a=null,d=l?l.name:null,i=b,e,h;f!==-1&&(a=b.substring(0,f),b=b.substring(f+1,b.length));a&&(a=c(a,d));b&&(a?e=(f=m[a])&&f.normalize?f.normalize(b,function(b){return c(b,d)}):c(b,d):(e=c(b,d),h=E[e],h||(h=g.nameToUrl(e,null,l),E[e]=h)));return{prefix:a,name:e,parentMap:l,url:h,originalName:i,fullName:a?a+"!"+(e||""):e}}function k(){var b=!0,l=p.priorityWait,f,a;if(l){for(a=0;f=l[a];a++)if(!s[f]){b=!1;break}b&&delete p.priorityWait}return b} 10 | function j(b,l,f){return function(){var a=ga.call(arguments,0),c;if(f&&J(c=a[a.length-1]))c.__requireJsBuild=!0;a.push(l);return b.apply(null,a)}}function q(b,l){var a=j(g.require,b,l);Z(a,{nameToUrl:j(g.nameToUrl,b),toUrl:j(g.toUrl,b),defined:j(g.requireDefined,b),specified:j(g.requireSpecified,b),isBrowser:d.isBrowser});return a}function o(b){var l,a,c,C=b.callback,i=b.map,e=i.fullName,ba=b.deps;c=b.listeners;if(C&&J(C)){if(p.catchError.define)try{a=d.execCb(e,b.callback,ba,m[e])}catch(k){l=k}else a= 11 | d.execCb(e,b.callback,ba,m[e]);if(e)(C=b.cjsModule)&&C.exports!==void 0&&C.exports!==m[e]?a=m[e]=b.cjsModule.exports:a===void 0&&b.usingExports?a=m[e]:(m[e]=a,F[e]&&(Q[e]=!0))}else e&&(a=m[e]=C,F[e]&&(Q[e]=!0));if(D[b.id])delete D[b.id],b.isDone=!0,g.waitCount-=1,g.waitCount===0&&(I=[]);delete R[e];if(d.onResourceLoad&&!b.placeholder)d.onResourceLoad(g,i,b.depArray);if(l)return a=(e?h(e).url:"")||l.fileName||l.sourceURL,c=l.moduleTree,l=N("defineerror",'Error evaluating module "'+e+'" at location "'+ 12 | a+'":\n'+l+"\nfileName:"+a+"\nlineNumber: "+(l.lineNumber||l.line),l),l.moduleName=e,l.moduleTree=c,d.onError(l);for(l=0;C=c[l];l++)C(a)}function r(b,a){return function(f){b.depDone[a]||(b.depDone[a]=!0,b.deps[a]=f,b.depCount-=1,b.depCount||o(b))}}function u(b,a){var f=a.map,c=f.fullName,h=f.name,i=L[b]||(L[b]=m[b]),e;if(!a.loading)a.loading=!0,e=function(b){a.callback=function(){return b};o(a);s[a.id]=!0;w()},e.fromText=function(b,a){var l=O;s[b]=!1;g.scriptCount+=1;g.fake[b]=!0;l&&(O=!1);d.exec(a); 13 | l&&(O=!0);g.completeLoad(b)},c in m?e(m[c]):i.load(h,q(f.parentMap,!0),e,p)}function v(b){D[b.id]||(D[b.id]=b,I.push(b),g.waitCount+=1)}function B(b){this.listeners.push(b)}function t(b,a){var f=b.fullName,c=b.prefix,d=c?L[c]||(L[c]=m[c]):null,i,e;f&&(i=R[f]);if(!i&&(e=!0,i={id:(c&&!d?M++ +"__p@:":"")+(f||"__r@"+M++),map:b,depCount:0,depDone:[],depCallbacks:[],deps:[],listeners:[],add:B},y[i.id]=!0,f&&(!c||L[c])))R[f]=i;c&&!d?(f=t(h(c),!0),f.add(function(){var a=h(b.originalName,b.parentMap),a=t(a, 14 | !0);i.placeholder=!0;a.add(function(b){i.callback=function(){return b};o(i)})})):e&&a&&(s[i.id]=!1,g.paused.push(i),v(i));return i}function x(b,a,f,c){var b=h(b,c),d=b.name,i=b.fullName,e=t(b),k=e.id,j=e.deps,n;if(i){if(i in m||s[k]===!0||i==="jquery"&&p.jQuery&&p.jQuery!==f().fn.jquery)return;y[k]=!0;s[k]=!0;i==="jquery"&&f&&S(f())}e.depArray=a;e.callback=f;for(f=0;f0)){if(p.priorityWait)if(k())w();else return;for(j in s)if(!(j in K)&&(c=!0,!s[j]))if(a)b+=j+" ";else{h=!0;break}if(c||g.waitCount){if(a&&b)return j=N("timeout","Load timeout for modules: "+b),j.requireType="timeout",j.requireModules=b,d.onError(j);if(h||g.scriptCount){if((G||ca)&&!W)W=setTimeout(function(){W=0;A()},50)}else{if(g.waitCount){for(H= 17 | 0;b=I[H];H++)z(b,{});g.paused.length&&w();X<5&&(X+=1,A())}X=0;d.checkReadyState()}}}}var g,w,p={waitSeconds:7,baseUrl:"./",paths:{},pkgs:{},catchError:{}},P=[],y={require:!0,exports:!0,module:!0},E={},m={},s={},D={},I=[],T={},M=0,R={},L={},F={},Q={},Y=0;S=function(b){if(!g.jQuery&&(b=b||(typeof jQuery!=="undefined"?jQuery:null))&&!(p.jQuery&&b.fn.jquery!==p.jQuery)&&("holdReady"in b||"readyWait"in b))if(g.jQuery=b,n(["jquery",[],function(){return jQuery}]),g.scriptCount)V(b,!0),g.jQueryIncremented= 18 | !0};w=function(){var b,a,c,h,j,i;Y+=1;if(g.scriptCount<=0)g.scriptCount=0;for(;P.length;)if(b=P.shift(),b[0]===null)return d.onError(N("mismatch","Mismatched anonymous define() module: "+b[b.length-1]));else n(b);if(!p.priorityWait||k())for(;g.paused.length;){j=g.paused;g.pausedCount+=j.length;g.paused=[];for(h=0;b=j[h];h++)a=b.map,c=a.url,i=a.fullName,a.prefix?u(a.prefix,b):!T[c]&&!s[i]&&(d.load(g,i,c),c.indexOf("empty:")!==0&&(T[c]=!0));g.startTime=(new Date).getTime();g.pausedCount-=j.length}Y=== 19 | 1&&A();Y-=1};g={contextName:a,config:p,defQueue:P,waiting:D,waitCount:0,specified:y,loaded:s,urlMap:E,urlFetched:T,scriptCount:0,defined:m,paused:[],pausedCount:0,plugins:L,needFullExec:F,fake:{},fullExec:Q,managerCallbacks:R,makeModuleMap:h,normalize:c,configure:function(b){var a,c,d;b.baseUrl&&b.baseUrl.charAt(b.baseUrl.length-1)!=="/"&&(b.baseUrl+="/");a=p.paths;d=p.pkgs;Z(p,b,!0);if(b.paths){for(c in b.paths)c in K||(a[c]=b.paths[c]);p.paths=a}if((a=b.packagePaths)||b.packages){if(a)for(c in a)c in 20 | K||$(d,a[c],c);b.packages&&$(d,b.packages);p.pkgs=d}if(b.priority)c=g.requireWait,g.requireWait=!1,g.takeGlobalQueue(),w(),g.require(b.priority),w(),g.requireWait=c,p.priorityWait=b.priority;if(b.deps||b.callback)g.require(b.deps||[],b.callback)},requireDefined:function(b,a){return h(b,a).fullName in m},requireSpecified:function(b,a){return h(b,a).fullName in y},require:function(b,c,f){if(typeof b==="string"){if(J(c))return d.onError(N("requireargs","Invalid require call"));if(d.get)return d.get(g, 21 | b,c);c=h(b,c);b=c.fullName;return!(b in m)?d.onError(N("notloaded","Module name '"+c.fullName+"' has not been loaded yet for context: "+a)):m[b]}(b&&b.length||c)&&x(null,b,c,f);if(!g.requireWait)for(;!g.scriptCount&&g.paused.length;)g.takeGlobalQueue(),w();return g.require},takeGlobalQueue:function(){U.length&&(ha.apply(g.defQueue,[g.defQueue.length-1,0].concat(U)),U=[])},completeLoad:function(b){var a;for(g.takeGlobalQueue();P.length;)if(a=P.shift(),a[0]===null){a[0]=b;break}else if(a[0]===b)break; 22 | else n(a),a=null;a?n(a):n([b,[],b==="jquery"&&typeof jQuery!=="undefined"?function(){return jQuery}:null]);S();d.isAsync&&(g.scriptCount-=1);w();d.isAsync||(g.scriptCount-=1)},toUrl:function(a,c){var d=a.lastIndexOf("."),h=null;d!==-1&&(h=a.substring(d,a.length),a=a.substring(0,d));return g.nameToUrl(a,h,c)},nameToUrl:function(a,h,f){var j,k,i,e,m=g.config,a=c(a,f&&f.fullName);if(d.jsExtRegExp.test(a))h=a+(h?h:"");else{j=m.paths;k=m.pkgs;f=a.split("/");for(e=f.length;e>0;e--)if(i=f.slice(0,e).join("/"), 23 | j[i]){f.splice(0,e,j[i]);break}else if(i=k[i]){a=a===i.name?i.location+"/"+i.main:i.location;f.splice(0,e,a);break}h=f.join("/")+(h||".js");h=(h.charAt(0)==="/"||h.match(/^\w+:/)?"":m.baseUrl)+h}return m.urlArgs?h+((h.indexOf("?")===-1?"?":"&")+m.urlArgs):h}};g.jQueryCheck=S;g.resume=w;return g}function ia(){var a,c,d;if(n&&n.readyState==="interactive")return n;a=document.getElementsByTagName("script");for(c=a.length-1;c>-1&&(d=a[c]);c--)if(d.readyState==="interactive")return n=d;return null}var ja= 24 | /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,ka=/require\(\s*["']([^'"\s]+)["']\s*\)/g,ea=/^\.\//,aa=/\.js$/,M=Object.prototype.toString,r=Array.prototype,ga=r.slice,ha=r.splice,G=!!(typeof window!=="undefined"&&navigator&&document),ca=!G&&typeof importScripts!=="undefined",la=G&&navigator.platform==="PLAYSTATION 3"?/^complete$/:/^(complete|loaded)$/,da=typeof opera!=="undefined"&&opera.toString()==="[object Opera]",K={},t={},U=[],n=null,X=0,O=!1,d,r={},I,v,x,y,u,z,A,H,B,S,W;if(typeof define==="undefined"){if(typeof requirejs!== 25 | "undefined")if(J(requirejs))return;else r=requirejs,requirejs=void 0;typeof require!=="undefined"&&!J(require)&&(r=require,require=void 0);d=requirejs=function(a,c,d){var k="_",j;!E(a)&&typeof a!=="string"&&(j=a,E(c)?(a=c,c=d):a=[]);if(j&&j.context)k=j.context;d=t[k]||(t[k]=fa(k));j&&d.configure(j);return d.require(a,c)};d.config=function(a){return d(a)};require||(require=d);d.toUrl=function(a){return t._.toUrl(a)};d.version="1.0.2";d.jsExtRegExp=/^\/|:|\?|\.js$/;v=d.s={contexts:t,skipAsync:{}};if(d.isAsync= 26 | d.isBrowser=G)if(x=v.head=document.getElementsByTagName("head")[0],y=document.getElementsByTagName("base")[0])x=v.head=y.parentNode;d.onError=function(a){throw a;};d.load=function(a,c,h){d.resourcesReady(!1);a.scriptCount+=1;d.attach(h,a,c);if(a.jQuery&&!a.jQueryIncremented)V(a.jQuery,!0),a.jQueryIncremented=!0};define=function(a,c,d){var k,j;typeof a!=="string"&&(d=c,c=a,a=null);E(c)||(d=c,c=[]);!c.length&&J(d)&&d.length&&(d.toString().replace(ja,"").replace(ka,function(a,d){c.push(d)}),c=(d.length=== 27 | 1?["require"]:["require","exports","module"]).concat(c));if(O&&(k=I||ia()))a||(a=k.getAttribute("data-requiremodule")),j=t[k.getAttribute("data-requirecontext")];(j?j.defQueue:U).push([a,c,d])};define.amd={multiversion:!0,plugins:!0,jQuery:!0};d.exec=function(a){return eval(a)};d.execCb=function(a,c,d,k){return c.apply(k,d)};d.addScriptToDom=function(a){I=a;y?x.insertBefore(a,y):x.appendChild(a);I=null};d.onScriptLoad=function(a){var c=a.currentTarget||a.srcElement,h;if(a.type==="load"||c&&la.test(c.readyState))n= 28 | null,a=c.getAttribute("data-requirecontext"),h=c.getAttribute("data-requiremodule"),t[a].completeLoad(h),c.detachEvent&&!da?c.detachEvent("onreadystatechange",d.onScriptLoad):c.removeEventListener("load",d.onScriptLoad,!1)};d.attach=function(a,c,h,k,j,n){var o;if(G)return k=k||d.onScriptLoad,o=c&&c.config&&c.config.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script"),o.type=j||"text/javascript",o.charset="utf-8",o.async=!v.skipAsync[a],c&&o.setAttribute("data-requirecontext", 29 | c.contextName),o.setAttribute("data-requiremodule",h),o.attachEvent&&!da?(O=!0,n?o.onreadystatechange=function(){if(o.readyState==="loaded")o.onreadystatechange=null,o.attachEvent("onreadystatechange",k),n(o)}:o.attachEvent("onreadystatechange",k)):o.addEventListener("load",k,!1),o.src=a,n||d.addScriptToDom(o),o;else ca&&(importScripts(a),c.completeLoad(h));return null};if(G){u=document.getElementsByTagName("script");for(H=u.length-1;H>-1&&(z=u[H]);H--){if(!x)x=z.parentNode;if(A=z.getAttribute("data-main")){if(!r.baseUrl)u= 30 | A.split("/"),z=u.pop(),u=u.length?u.join("/")+"/":"./",r.baseUrl=u,A=z.replace(aa,"");r.deps=r.deps?r.deps.concat(A):[A];break}}}d.checkReadyState=function(){var a=v.contexts,c;for(c in a)if(!(c in K)&&a[c].waitCount)return;d.resourcesReady(!0)};d.resourcesReady=function(a){var c,h;d.resourcesDone=a;if(d.resourcesDone)for(h in a=v.contexts,a)if(!(h in K)&&(c=a[h],c.jQueryIncremented))V(c.jQuery,!1),c.jQueryIncremented=!1};d.pageLoaded=function(){if(document.readyState!=="complete")document.readyState= 31 | "complete"};if(G&&document.addEventListener&&!document.readyState)document.readyState="loading",window.addEventListener("load",d.pageLoaded,!1);d(r);if(d.isAsync&&typeof setTimeout!=="undefined")B=v.contexts[r.context||"_"],B.requireWait=!0,setTimeout(function(){B.requireWait=!1;B.takeGlobalQueue();B.jQueryCheck();B.scriptCount||B.resume();d.checkReadyState()},0)}})(); 32 | -------------------------------------------------------------------------------- /app/libs/require/text.js: -------------------------------------------------------------------------------- 1 | /* 2 | RequireJS text 0.27.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved. 3 | Available via the MIT or new BSD license. 4 | see: http://github.com/jrburke/requirejs for details 5 | */ 6 | (function(){var k=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],n=/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,o=/]*>\s*([\s\S]+)\s*<\/body>/im,i=typeof location!=="undefined"&&location.href,p=i&&location.protocol&&location.protocol.replace(/\:/,""),q=i&&location.hostname,r=i&&(location.port||void 0),j=[];define(function(){var g,h,l;typeof window!=="undefined"&&window.navigator&&window.document?h=function(a,b){var c=g.createXhr();c.open("GET",a,!0);c.onreadystatechange= 7 | function(){c.readyState===4&&b(c.responseText)};c.send(null)}:typeof process!=="undefined"&&process.versions&&process.versions.node?(l=require.nodeRequire("fs"),h=function(a,b){b(l.readFileSync(a,"utf8"))}):typeof Packages!=="undefined"&&(h=function(a,b){var c=new java.io.File(a),e=java.lang.System.getProperty("line.separator"),c=new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(c),"utf-8")),d,f,g="";try{d=new java.lang.StringBuffer;(f=c.readLine())&&f.length()&& 8 | f.charAt(0)===65279&&(f=f.substring(1));for(d.append(f);(f=c.readLine())!==null;)d.append(e),d.append(f);g=String(d.toString())}finally{c.close()}b(g)});return g={version:"0.27.0",strip:function(a){if(a){var a=a.replace(n,""),b=a.match(o);b&&(a=b[1])}else a="";return a},jsEscape:function(a){return a.replace(/(['\\])/g,"\\$1").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r")},createXhr:function(){var a,b,c;if(typeof XMLHttpRequest!== 9 | "undefined")return new XMLHttpRequest;else for(b=0;b<3;b++){c=k[b];try{a=new ActiveXObject(c)}catch(e){}if(a){k=[c];break}}if(!a)throw Error("createXhr(): XMLHttpRequest not available");return a},get:h,parseName:function(a){var b=!1,c=a.indexOf("."),e=a.substring(0,c),a=a.substring(c+1,a.length),c=a.indexOf("!");c!==-1&&(b=a.substring(c+1,a.length),b=b==="strip",a=a.substring(0,c));return{moduleName:e,ext:a,strip:b}},xdRegExp:/^((\w+)\:)?\/\/([^\/\\]+)/,useXhr:function(a,b,c,e){var d=g.xdRegExp.exec(a), 10 | f;if(!d)return!0;a=d[2];d=d[3];d=d.split(":");f=d[1];d=d[0];return(!a||a===b)&&(!d||d===c)&&(!f&&!d||f===e)},finishLoad:function(a,b,c,e,d){c=b?g.strip(c):c;d.isBuild&&d.inlineText&&(j[a]=c);e(c)},load:function(a,b,c,e){var d=g.parseName(a),f=d.moduleName+"."+d.ext,m=b.toUrl(f),h=e&&e.text&&e.text.useXhr||g.useXhr;!i||h(m,p,q,r)?g.get(m,function(b){g.finishLoad(a,d.strip,b,c,e)}):b([f],function(a){g.finishLoad(d.moduleName+"."+d.ext,d.strip,a,c,e)})},write:function(a,b,c){if(b in j){var e=g.jsEscape(j[b]); 11 | c.asModule(a+"!"+b,"define(function () { return '"+e+"';});\n")}},writeFile:function(a,b,c,e,d){var b=g.parseName(b),f=b.moduleName+"."+b.ext,h=c.toUrl(b.moduleName+"."+b.ext)+".js";g.load(f,c,function(){var b=function(a){return e(h,a)};b.asModule=function(a,b){return e.asModule(a,h,b)};g.write(a,f,b,d)},d)}}})})(); -------------------------------------------------------------------------------- /app/main.js: -------------------------------------------------------------------------------- 1 | require.config( { 2 | paths: { 3 | 'backbone': 'libs/AMDbackbone-0.5.3', 4 | 'underscore': 'libs/underscore-1.2.2', 5 | 'text': 'libs/require/text', 6 | 'jquery': 'libs/jquery-1.7.1', 7 | 'json2': 'libs/json2', 8 | 'datepicker': 'libs/jQuery.ui.datepicker', 9 | 'datepickermobile': 'libs/jquery.ui.datepicker.mobile', 10 | 'jquerymobile': 'libs/jquery.mobile-1.0' 11 | }, 12 | baseUrl: 'app' 13 | } ); 14 | 15 | require( 16 | ['require', 'backbone', 'jquery', 'underscore' ], 17 | function( require, Backbone, $, _ ) { 18 | // framework loaded 19 | require( 20 | ['require', 'jquerymobile', 'json2', 'datepicker', 'datepickermobile', 21 | 'app'], 22 | function( require ) { 23 | 24 | // Global overrides to disable hashchange listening 25 | // (as opposed to using urlHistory.listeningEnabled) 26 | // This makes it easier to focus on using Backbone's own 27 | // routing: 28 | 29 | $.mobile.hashListeningEnabled = false; 30 | $.mobile.pushStateEnabled = false; 31 | $.mobile.page.prototype.options.degradeInputs.date = true; 32 | $( '#date-min, #date-max' ).datepicker(); 33 | 34 | } ); 35 | } ); 36 | -------------------------------------------------------------------------------- /app/models/PhotoCollection.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone', 'models/ResultEntry'], 2 | function( $, Backbone, ResultEntry ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var PhotoCollection = Backbone.Collection.extend( { 7 | model: ResultEntry 8 | } ); 9 | 10 | return PhotoCollection; 11 | } ); 12 | -------------------------------------------------------------------------------- /app/models/ResultCollection.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone', 'models/ResultEntry'], 2 | function( $, Backbone, ResultEntry ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var ResultCollection = Backbone.Collection.extend( { 7 | model: ResultEntry, 8 | parse: function( response ) { 9 | return response; 10 | } 11 | } ); 12 | 13 | return ResultCollection; 14 | } ); 15 | 16 | -------------------------------------------------------------------------------- /app/models/ResultEntry.js: -------------------------------------------------------------------------------- 1 | define( ['backbone'], 2 | function( Backbone ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var ResultEntry = Backbone.Model.extend( { 7 | } ); 8 | 9 | return ResultEntry; 10 | } ); 11 | -------------------------------------------------------------------------------- /app/routers/workspace.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone'], 2 | function( $, Backbone ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var Workspace = Backbone.Router.extend( { 7 | q:'', 8 | p:1, 9 | s:'relevance', 10 | bookmarkMode:false, 11 | routes: { 12 | "search/:query": "search", // #search/kiwis 13 | "search/:query/s:sort/p:page": "search", // #search/kiwis/srelevance/p7 14 | "photo/:id": "photo", // #photo/93839 15 | "" : "root" // 16 | }, 17 | search: function( query, sort, page ) { 18 | mobileSearch.utils.dfdQuery( 'search', mobileSearch.views.appview, query, sort, page ); 19 | }, 20 | photo: function ( id ) { 21 | mobileSearch.utils.dfdQuery( 'photo', mobileSearch.views.appview, id ); 22 | }, 23 | root: function() { 24 | this.bookmarkMode = true; 25 | mobileSearch.utils.changePage( "#index", "slide", false, false ); 26 | } 27 | } ); 28 | 29 | return Workspace; 30 | } ); 31 | -------------------------------------------------------------------------------- /app/templates/listview.html: -------------------------------------------------------------------------------- 1 | <% _.each( results, function( item, i ){ %> 2 |
  • 3 | "> 4 | " src="<%= 'http://farm' + item.get("farm") + '.static.flickr.com/' + item.get("server") + '/' + item.get("id") + '_' + item.get("secret") + '_s.jpg' %>"/> 5 |

    <%= item.get("title") %>

    6 |
    7 |
  • 8 | <% }); %> -------------------------------------------------------------------------------- /app/templates/photoview.html: -------------------------------------------------------------------------------- 1 | <% _.each( results, function( item, i ){ %> 2 | 3 | <%= item.get(" title="<%= item.get("title")._content %>" src="<%= 'http://farm' + item.get("farm") + '.static.flickr.com/' + item.get("server") + '/' + item.get("id") + '_' + item.get("secret") + '_m.jpg' %>"/> 4 | 5 |
      6 |
    • Title: <%= item.get("title")._content %>
    • 7 |
    • Description: <%= item.get("description")._content %>
    • 8 |
    • Views: <%= item.get("views") %>
    • 9 |
    • Location: <%= item.get("owner").location %>
    • 10 |
    • Taken by: <%= item.get("owner").realname %>
    • 11 |
    • Date taken: <%= item.get("dates").taken %>
    • 12 |
    • Date uploaded: <%= new Date( item.get("dateuploaded") * 1000).toDateString() %>
    • 13 |
    • 14 |
    • ">View Original On Flickr.com
    • 15 | 16 | 17 |
    18 | 19 | <% }); %> -------------------------------------------------------------------------------- /app/ui.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'utils' ], 2 | function( $, utils ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var ui = {}; 7 | ui.nextOption = $( '#nextSet' ); 8 | ui.prevOption = $( '#prevSet' ); 9 | 10 | ui.nextOption.on( 'click', function( e ) { 11 | e.preventDefault(); 12 | utils.historySwitch( 'next' ); 13 | } ); 14 | 15 | ui.prevOption.on( 'click', function( e ) { 16 | e.preventDefault(); 17 | utils.historySwitch( 'prev' ); 18 | } ); 19 | 20 | return ui; 21 | } ); -------------------------------------------------------------------------------- /app/utils.js: -------------------------------------------------------------------------------- 1 | define( ['jquery' ], 2 | function( $ ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | //"use strict"; 5 | var utils = {}; 6 | 7 | 8 | // summary: 9 | // Manage passing search queries to the necessary handlers and the UI 10 | // changes that are required based on query-type. 11 | // searchType: String 12 | // The type of search to conduct. Supports 'search' for results or 13 | // 'photo' for individual photo entries 14 | // ctx: String 15 | // The context (view) for which the requests are being made 16 | // query: String 17 | // The query-string to lookup. For search this is a keyword or set of 18 | // keywords in string form, for photos this refers to the photo ID 19 | // sort: String 20 | // How the results returned should be sorted. All of the Flickr API sort 21 | // modes are supported here 22 | // page: Integer 23 | // The pagination index currently being queried. e.g 2 refers to page 2. 24 | 25 | utils.dfdQuery = function( searchType, ctx, query, sort, page ) { 26 | 27 | if(!(query == undefined || query == "" )){ 28 | 29 | var entries = null; 30 | 31 | page = (page == undefined) ? 1 : page; 32 | 33 | utils.loadPrompt( 'Querying Flickr API...' ); 34 | 35 | $.when( utils.fetchResults( searchType, query, sort, page ) ) 36 | .then( $.proxy( function( response ) { 37 | 38 | ctx.setView( searchType ); 39 | 40 | // The application can handle routes that come in 41 | // through a bookmarked URL differently if needed 42 | // simply check against workspace.bookmarkMode 43 | // e.g if(!mobileSearch.routers.workspace.bookmarkMode) etc. 44 | 45 | if ( searchType == 'search' || searchType == undefined ) { 46 | 47 | entries = response.photos.photo; 48 | 49 | mobileSearch.routers.workspace.q = query; 50 | mobileSearch.routers.workspace.p = page; 51 | mobileSearch.routers.workspace.s = sort; 52 | 53 | $( '.search-meta p' ).html( 'Page: ' + response.photos.page + ' / ' + response.photos.pages ); 54 | 55 | ctx.result_view.collection.reset( entries ); 56 | 57 | // switch to search results view 58 | utils.changePage( "#search", "slide", false, false ); 59 | 60 | // update title 61 | utils.switchTitle( query + ' (Page ' + page + ' of ' + response.photos.total + ')' ); 62 | 63 | } 64 | else { 65 | 66 | entries = response.photo; 67 | ctx.photo_view.collection.reset( entries ); 68 | 69 | // switch to the individual photo viewer 70 | utils.changePage( "#photo", "slide", false, false ); 71 | 72 | } 73 | 74 | }, ctx ) ); 75 | }else{ 76 | utils.loadPrompt( 'Please enter a valid search query.' ); 77 | } 78 | }; 79 | 80 | 81 | // summary: 82 | // A convenience method for accessing $mobile.changePage(), included 83 | // in case any other actions are required in the same step. 84 | // changeTo: String 85 | // Absolute or relative URL. In this app references to '#index', '#search' etc. 86 | // effect: String 87 | // One of the supported jQuery mobile transition effects 88 | // direction: Boolean 89 | // Decides the direction the transition will run when showing the page 90 | // updateHash: Boolean 91 | // Decides if the hash in the location bar should be updated 92 | 93 | utils.changePage = function( viewID, effect, direction, updateHash ) { 94 | $.mobile.changePage( viewID, { transition: effect, reverse:direction, changeHash: updateHash} ); 95 | }; 96 | 97 | 98 | // summary: 99 | // Query for search results or individual photos from the Flickr API 100 | // searchType: String 101 | // The type of search to conduct. Supports 'search' for results or 102 | // 'photo' for individual photo entries 103 | // query: String 104 | // The query-string to lookup. For search this is a keyword or set of 105 | // keywords in string form, for photos this refers to the photo ID 106 | // sort: String 107 | // How the results returned should be sorted. All of the Flickr API sort 108 | // modes are supported here 109 | // page: Integer 110 | // The pagination index currently being queried. e.g 2 refers to page 2. 111 | // returns: 112 | // A promise for the ajax call to be completed 113 | 114 | utils.fetchResults = function( searchType, query, sort, page ) { 115 | 116 | var serviceUrl = "http://api.flickr.com/services/rest/", 117 | apiKey = "8662e376985445d92a07c79ff7d12ff8", 118 | geoTagged = null, 119 | quantity = 0, 120 | safeSearch = '', 121 | minDate = "", 122 | maxDate = "", 123 | data = {}; 124 | 125 | 126 | if ( searchType == 'search' || searchType == undefined ) { 127 | 128 | quantity = $( '#slider' ).val() || mobileSearch.defaults.resultsPerPage; 129 | 130 | maxDate = utils.dateFormatter( $( '#date-max' ).val() ) || ""; 131 | minDate = utils.dateFormatter( $( '#date-min' ).val() ) || ""; 132 | 133 | minDate = "",maxDate = ""; 134 | 135 | ($( '#geo-choice-z1' ).prop( 'checked' ) || mobileSearch.defaults.geoTagged) ? geoTagged = 0 : geoTagged = 1; 136 | page = (page == undefined) ? 0 : page; 137 | sort = (sort == undefined) ? ($( '#sortBy' ).val()) : sort; 138 | 139 | data = { 140 | format: 'json', 141 | nojsoncallback: '1', 142 | method: 'flickr.photos.search', 143 | per_page: quantity, 144 | page: page, 145 | is_geo: geoTagged, 146 | safe_search: safeSearch, 147 | sort: sort, 148 | min_taken_date: minDate, 149 | max_taken_date: maxDate, 150 | text: encodeURIComponent(query), 151 | api_key: apiKey 152 | }; 153 | 154 | } else if ( searchType == 'photo' ) { 155 | 156 | data = { 157 | format: 'json', 158 | nojsoncallback: '1', 159 | method: 'flickr.photos.getInfo', 160 | photo_id: encodeURIComponent(query), 161 | api_key: apiKey 162 | }; 163 | } 164 | 165 | return $.ajax({ url: serviceUrl, dataType: "json", data: data } ); 166 | }; 167 | 168 | 169 | // summary: 170 | // Format dates so that they're compatible with input passed through 171 | // the datepicker component 172 | // date: String 173 | // The date string to be formatted 174 | // returns: 175 | // A formatted date 176 | utils.dateFormatter = function ( dateStr ) { 177 | return (dateStr == undefined)? '' : $.datepicker.formatDate( '@', new Date( dateStr ) ); 178 | }; 179 | 180 | 181 | // summary: 182 | // Manage the URL construction and navigation for pagination 183 | // (e.g next/prev) 184 | // 185 | // state: String 186 | // The direction in which to navigate (either 'next' or 'prev') 187 | 188 | utils.historySwitch = function( state ) { 189 | var sortQuery, 190 | hashQuery = "", pageQuery = 0, increment = 0; 191 | 192 | (mobileSearch.routers.workspace.q === undefined) ? hashQuery = '' : hashQuery = mobileSearch.routers.workspace.q; 193 | (mobileSearch.routers.workspace.p === undefined) ? pageQuery = 1 : pageQuery = mobileSearch.routers.workspace.p; 194 | (mobileSearch.routers.workspace.s === undefined) ? sortQuery = 'relevance' : sortQuery = mobileSearch.routers.workspace.s; 195 | 196 | pageQuery = parseInt( pageQuery ); 197 | (state == 'next') ? pageQuery += 1 : pageQuery -= 1; 198 | 199 | (pageQuery < 1) ? utils.changePage( "/", "slide" ) : location.hash = utils.queryConstructor( hashQuery, sortQuery, pageQuery ); 200 | 201 | }; 202 | 203 | 204 | // summary: 205 | // Display a custom notification using the loader extracted from jQuery mobile. 206 | // The only reason this is here is for further customization. 207 | // 208 | // message: String 209 | // The message to display in the notification dialog 210 | 211 | utils.loadPrompt = function( message ) { 212 | message = (message == undefined) ? "" : message; 213 | 214 | $( "

    " + message + "

    " ) 215 | .css( { "display": "block", "opacity": 0.96, "top": $( window ).scrollTop() + 100 } ) 216 | .appendTo( $.mobile.pageContainer ) 217 | .delay( 800 ) 218 | .fadeOut( 400, function() { 219 | $( this ).remove(); 220 | } ); 221 | 222 | }; 223 | 224 | 225 | // summary: 226 | // Adjust the title of the current view 227 | // 228 | // title: String 229 | // The title to update the view with 230 | utils.switchTitle = function( title ) { 231 | $( '.ui-title' ).text( title || "" ); 232 | }; 233 | 234 | 235 | // summary: 236 | // Construct a search query for processing 237 | // 238 | // query: String 239 | // The query-string to lookup. For search this is a keyword or set of 240 | // keywords in string form, for photos this refers to the photo ID 241 | // sortType: String 242 | // How the results returned should be sorted. All of the Flickr API sort 243 | // modes are supported here 244 | // page: Integer 245 | // The pagination index currently being queried. e.g 2 refers to page 2 246 | 247 | utils.queryConstructor = function( query, sortType, page ) { 248 | return 'search/' + query + '/s' + sortType + '/p' + page; 249 | }; 250 | 251 | 252 | // summary: 253 | // Toggle whether the navigation is displayed or hidden 254 | // 255 | // toggleState: Boolean 256 | // A boolean that decides whether the navigation should be toggled on or off. 257 | 258 | utils.toggleNavigation = function( toggleState ) { 259 | mobileSearch.ui.nextOption.toggle( toggleState ); 260 | mobileSearch.ui.prevOption.toggle( toggleState ); 261 | }; 262 | 263 | return utils; 264 | } ); 265 | 266 | 267 | 268 | 269 | -------------------------------------------------------------------------------- /app/views/appview.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone', 'utils', 'views/resultList', 'views/photoList'], 2 | function( $, Backbone, utils, ResultList, PhotoList ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | 7 | var AppView = Backbone.View.extend( { 8 | el: $( "#appview" ), 9 | 10 | events: { 11 | "submit #queryForm" : "keyLoadResults", 12 | "change #sortBy": "keyLoadResults", 13 | "keydown #searchbox" : "handleKey" 14 | }, 15 | 16 | setView: function( option ) { 17 | if ( option == 'search' ) { 18 | this.result_view = new ResultList; 19 | } 20 | else { 21 | this.photo_view = new PhotoList; 22 | } 23 | }, 24 | 25 | handleKey : function( event ) { 26 | }, 27 | 28 | keyLoadResults: function( event ) { 29 | var query = $( '#searchbox' ).val(); 30 | 31 | if ( query ) { 32 | 33 | var sort = $( '#sortBy' ).val(), 34 | endpoint = mobileSearch.utils.queryConstructor( query, sort, 1 ); 35 | location.hash = endpoint; 36 | 37 | } 38 | else { 39 | mobileSearch.utils.loadPrompt( 'Please enter a search query to continue' ); 40 | } 41 | return false; 42 | } 43 | } ); 44 | 45 | return AppView; 46 | } ); 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /app/views/photoList.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone', 'underscore', 'models/PhotoCollection', 'text!templates/photoview.html'], 2 | function( $, Backbone, _ , PhotoCollection, photoTemplate) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var PhotoList = Backbone.View.extend( { 7 | el: $( "#photoviewholder" ), 8 | 9 | initialize: function() { 10 | this.collection = new PhotoCollection; 11 | _.bindAll(this, "renderList"); 12 | this.collection.bind( "reset", this.renderList ); 13 | }, 14 | 15 | renderList: function( collection ) { 16 | 17 | var compiled_template = _.template(photoTemplate), 18 | collection = this.collection, 19 | $el = $(this.el); 20 | 21 | mobileSearch.utils.loadPrompt( "Loading photo..." ); 22 | $( '#photo .ui-title' ).html( 'Photo view' ); 23 | $el.html( compiled_template( { results: collection.models } ) ); 24 | 25 | setTimeout( function() { 26 | $el.listview('refresh'); 27 | }, 0 ); 28 | 29 | } 30 | } ); 31 | 32 | return PhotoList; 33 | } ); 34 | -------------------------------------------------------------------------------- /app/views/resultList.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone', 'underscore', 'models/ResultCollection', 'text!templates/listview.html'], 2 | function( $, Backbone, _, ResultCollection, listTemplate ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var ResultList = Backbone.View.extend( { 7 | el: $( "#listviewholder" ), 8 | 9 | initialize: function() { 10 | this.collection = new ResultCollection; 11 | _.bindAll(this, "renderList"); 12 | this.collection.bind( "reset", this.renderList ); 13 | }, 14 | 15 | renderList: function() { 16 | 17 | var compiled_template = _.template( listTemplate ), 18 | collection = this.collection, 19 | $el = $(this.el); 20 | 21 | mobileSearch.utils.loadPrompt( "Loading results..." ); 22 | mobileSearch.utils.toggleNavigation( true ); 23 | $el.html( compiled_template( { results: collection.models } ) ); 24 | 25 | setTimeout( function() { 26 | $el.listview('refresh'); 27 | }, 0 ); 28 | 29 | } 30 | } ); 31 | 32 | return ResultList; 33 | }); 34 | -------------------------------------------------------------------------------- /css/custom_mobile_theme.css: -------------------------------------------------------------------------------- 1 | /*This theme was part-customized using the mobile theme builder from productscape.com, which predated 2 | the Adobe/official jQuery Mobile themeroller*/ 3 | 4 | /* z 5 | -----------------------------------------------------------------------------------------------------------*/ 6 | .ui-mobile-viewport{ 7 | background:#234986; 8 | background-image: -webkit-linear-gradient(top, #234986, #173159); /* Chrome 10+, Saf5.1+ */ 9 | background-image: -moz-linear-gradient(top, #234986, #173159); /* FF3.6 */ 10 | background-image: -ms-linear-gradient(top, #234986, #173159); /* IE10 */ 11 | background-image: -o-linear-gradient(top, #234986, #173159); /* Opera 11.10+ */ 12 | background-image: linear-gradient(top, #234986, #173159);} 13 | } 14 | .ui-bar-z { 15 | border: 1px solid #0C182C; 16 | background: #173159; 17 | color: #ffffff; 18 | font-weight: bold;text-shadow: 0 -1px 1px #000000; 19 | 20 | background-image: -webkit-gradient(linear, left top, left bottom, from(#234986), to(#173159)); /* Saf4+, Chrome */ 21 | background-image: -webkit-linear-gradient(top, #234986, #173159); /* Chrome 10+, Saf5.1+ */ 22 | background-image: -moz-linear-gradient(top, #234986, #173159); /* FF3.6 */ 23 | background-image: -ms-linear-gradient(top, #234986, #173159); /* IE10 */ 24 | background-image: -o-linear-gradient(top, #234986, #173159); /* Opera 11.10+ */ 25 | background-image: linear-gradient(top, #234986, #173159); 26 | 27 | } 28 | 29 | .ui-bar-z, .ui-bar-z input, .ui-bar-z select, .ui-bar-z textarea,.ui-bar-z button {font-family: Helvetica, Arial, sans-serif;}.ui-bar-z .ui-link-inherit {color: #ffffff;}.ui-bar-z .ui-link {color: #0C182C;font-weight: bold;}.ui-body-z {border: 1px solid #0C182C;background: #173159;color: #ffffff; text-shadow: 0 1px 0 #000;font-weight: normal; 30 | background-image: -webkit-gradient(linear, left top, left bottom, from(#A7B6CF), to(#173159)); /* Saf4+, Chrome */ 31 | background-image: -webkit-linear-gradient(top, #A7B6CF, #173159); /* Chrome 10+, Saf5.1+ */ 32 | background-image: -moz-linear-gradient(top, #A7B6CF, #173159); /* FF3.6 */ 33 | background-image: -ms-linear-gradient(top, #A7B6CF, #173159); /* IE10 */ 34 | background-image: -o-linear-gradient(top, #A7B6CF, #173159); /* Opera 11.10+ */ 35 | background-image: linear-gradient(top, #A7B6CF, #173159);}.ui-body-z,.ui-body-z input,.ui-body-z select,.ui-body-z textarea,.ui-body-z button {font-family: Helvetica, Arial, sans-serif;}.ui-body-z .ui-link-inherit {color: #ffffff;}.ui-body-z .ui-link {color: #ffffff;font-weight: bold;}.ui-br {border-bottom: rgb(130,130,130);border-bottom: rgba(130,130,130,.3);border-bottom-width: 1px;border-bottom-style: solid;}.ui-btn-up-z {border: 1px solid #222;background: #234986;font-weight: bold;color: #ffffff;text-shadow: 0 -1px 1px #000;background-image: -webkit-gradient(linear, left top, left bottom, from(#5A77A4), to(#234986)); /* Saf4+, Chrome */ 36 | background-image: -webkit-linear-gradient(top, #5A77A4, #234986); /* Chrome 10+, Saf5.1+ */ 37 | background-image: -moz-linear-gradient(top, #5A77A4, #234986); /* FF3.6 */ 38 | background-image: -ms-linear-gradient(top, #5A77A4, #234986); /* IE10 */ 39 | background-image: -o-linear-gradient(top, #5A77A4, #234986); /* Opera 11.10+ */ 40 | background-image: linear-gradient(top, #5A77A4, #234986);}.ui-btn-up-z a.ui-link-inherit {color: #ffffff;}.ui-btn-hover-z {border: 1px solid #000;background: #5A77A4;font-weight: bold;color: #ffffff;text-shadow: 0 -1px 1px #000;background-image: -webkit-gradient(linear, left top, left bottom, from(#A7B6CF), to(#5A77A4)); /* Saf4+, Chrome */ 41 | background-image: -webkit-linear-gradient(top, #A7B6CF, #5A77A4); /* Chrome 10+, Saf5.1+ */ 42 | background-image: -moz-linear-gradient(top, #A7B6CF, #5A77A4); /* FF3.6 */ 43 | background-image: -ms-linear-gradient(top, #A7B6CF, #5A77A4); /* IE10 */ 44 | background-image: -o-linear-gradient(top, #A7B6CF, #5A77A4); /* Opera 11.10+ */ 45 | background-image: linear-gradient(top, #A7B6CF, #5A77A4);}.ui-btn-hover-a a.ui-link-inherit {color: #ffffff;}.ui-btn-down-z {border: 1px solid #000;background: #5A77A4;font-weight: bold;color: #ffffff;text-shadow: 0 -1px 1px #000;background-image: -webkit-gradient(linear, left top, left bottom, from(#234986), to(#5A77A4)); /* Saf4+, Chrome */ 46 | background-image: -webkit-linear-gradient(top, #234986, #173159); /* Chrome 10+, Saf5.1+ */ 47 | background-image: -moz-linear-gradient(top, #234986, #5A77A4); /* FF3.6 */ 48 | background-image: -ms-linear-gradient(top, #234986, #5A77A4); /* IE10 */ 49 | background-image: -o-linear-gradient(top, #234986, #5A77A4); /* Opera 11.10+ */ 50 | background-image: linear-gradient(top, #234986, #5A77A4);}.ui-btn-down-z a.ui-link-inherit {color: #ffffff;}.ui-btn-up-z,.ui-btn-hover-z,.ui-btn-down-z {font-family: Helvetica, Arial, sans-serif;text-decoration: none;} 51 | 52 | 53 | .ui-page .ui-header{ 54 | background-image:url('../img/bg_header.png'); 55 | } 56 | -------------------------------------------------------------------------------- /css/jquery.ui.datepicker.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Datepicker @VERSION 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Datepicker#theming 9 | */ 10 | div.hasDatepicker{ display: block; padding: 0; overflow: visible; margin: 8px 0; } 11 | .ui-datepicker { overflow: visible; margin: 0; max-width: 500px; } 12 | .ui-datepicker .ui-datepicker-header { position:relative; padding:.4em 0; border-bottom: 0; font-weight: bold; } 13 | .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { padding: 1px 0 1px 2px; position:absolute; top: .5em; margin-top: 0; text-indent: -9999px; } 14 | 15 | .ui-datepicker .ui-datepicker-prev { left:6px; } 16 | .ui-datepicker .ui-datepicker-next { right:6px; } 17 | .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } 18 | .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } 19 | .ui-datepicker select.ui-datepicker-month-year {width: 100%;} 20 | .ui-datepicker select.ui-datepicker-month, 21 | .ui-datepicker select.ui-datepicker-year { width: 49%;} 22 | .ui-datepicker table {width: 100%; border-collapse: collapse; margin:0; } 23 | .ui-datepicker td { border-width: 1px; padding: 0; text-align: center; } 24 | .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em 0; font-weight: bold; margin: 0; border-width: 0; text-align: center; text-decoration: none; } 25 | 26 | .ui-datepicker-calendar th { padding-top: .3em; padding-bottom: .3em; } 27 | .ui-datepicker-calendar th span, .ui-datepicker-calendar span.ui-state-default { opacity: .3; } 28 | .ui-datepicker-calendar td a { padding-top: .5em; padding-bottom: .5em; } 29 | 30 | .min-width-480px div.hasDatepicker { width: 63%; display: inline-block; margin: 0; } -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: #ccc; 3 | margin: 0 auto; 4 | } 5 | 6 | #appview { 7 | margin: 0 auto; 8 | text-align: center; 9 | } 10 | 11 | #resultlist ul { 12 | list-style-type: none; 13 | margin-left: -25px; 14 | } 15 | 16 | #resultlist ul li { 17 | float: left; 18 | padding: 2px; 19 | width: 80px; 20 | height: 80px; 21 | overflow: hidden; 22 | margin: 2px; 23 | border-radius: 5px; 24 | } 25 | 26 | #resultlist ul li span { 27 | clear: both; 28 | } 29 | 30 | #resultlist ul li img { 31 | border-radius: 5px; 32 | -moz-box-shadow: 0px 2px 4px #000; 33 | -webkit-box-shadow: 0px 2px 4px #000; 34 | box-shadow: 0px 2px 4px #000; 35 | border-top: 1px solid rgb(255, 255, 255); 36 | border-top: 1px solid rgba(255, 255, 255, .5); 37 | width: 80px; 38 | height: 80px; 39 | display: none; 40 | } 41 | 42 | #resultlist ul li img:hover { 43 | -moz-box-shadow: 0px 2px 4px #fff; 44 | -webkit-box-shadow: 0px 2px 4px #fff; 45 | box-shadow: 0px 2px 4px #fff; 46 | } 47 | 48 | .loader { 49 | background: url(img/loader.gif) no-repeat center center; 50 | width: 110px; 51 | height: 110px; 52 | } 53 | 54 | .search-meta { 55 | text-align: center; 56 | } 57 | 58 | .ui-lightbox { 59 | width: 90%; 60 | height: 90%; 61 | background: transparent; 62 | position: absolute; 63 | z-index: 50; 64 | display: none; 65 | margin: 0 auto; 66 | } 67 | 68 | 69 | 70 | #logo { 71 | font-family: Helvetica, Arial, sans-serif; 72 | font-size: 1.5em; 73 | letter-spacing: -1px; 74 | 75 | } 76 | 77 | #logo img { 78 | text-align: center; 79 | margin: 0 auto; 80 | width: 30px; 81 | margin-top: -5px; 82 | } 83 | 84 | #logo .pink { 85 | color: #D8227F; 86 | float: left; 87 | } 88 | 89 | #logo .blue { 90 | color: #197DEB; 91 | float: left; 92 | } 93 | 94 | #sub-header { 95 | width: 120px; 96 | height: 40px; 97 | text-align: center; 98 | margin: 0 auto; 99 | } 100 | 101 | .nav-glyphish-example .ui-btn .ui-btn-inner { 102 | padding-top: 40px !important; 103 | } 104 | 105 | .nav-glyphish-example .ui-btn .ui-icon { 106 | width: 30px!important; 107 | height: 30px!important; 108 | margin-left: -15px !important; 109 | box-shadow: none!important; 110 | -moz-box-shadow: none!important; 111 | -webkit-box-shadow: none!important; 112 | -webkit-border-radius: none !important; 113 | border-radius: none !important; 114 | } 115 | 116 | #search-icon .ui-icon { 117 | background: url(../img/icons/06-magnify.png) 50% 50% no-repeat; 118 | background-size: 24px 22px; 119 | } 120 | 121 | #options-icon .ui-icon { 122 | background: url(../img/icons/36-toolbox.png) 50% 50% no-repeat; 123 | background-size: 24px 16px; 124 | } 125 | 126 | #instructions-icon .ui-icon { 127 | background: url(../img/icons/179-notepad.png) 50% 50% no-repeat; 128 | background-size: 12px 26px; 129 | } 130 | 131 | #source-icon .ui-icon { 132 | background: url(../img/icons/157-wrench.png) 50% 50% no-repeat; 133 | background-size: 22px 27px; 134 | } 135 | 136 | #about-icon .ui-icon { 137 | background: url(../img/icons/111-user.png) 50% 50% no-repeat; 138 | background-size: 20px 24px; 139 | } 140 | 141 | .ui-page .ui-header, .ui-page .ui-footer { 142 | text-align: center; 143 | } 144 | 145 | .app-message { 146 | background: #fff; 147 | padding: 7px; 148 | width: 100%; 149 | text-align: center; 150 | } 151 | 152 | .app-message p { 153 | width: 90%; 154 | margin: 0 auto; 155 | padding: 4px; 156 | color: #333333; 157 | text-shadow: 0 1px 0 #FFFFFF; 158 | } 159 | 160 | .app-logo-cont { 161 | margin: 0 auto; 162 | width: 100%; 163 | text-align: center; 164 | } 165 | 166 | .app-logo { 167 | width: 250px; 168 | } 169 | 170 | /*iphone/smaller-size screens*/ 171 | 172 | @media only screen 173 | and (max-width : 500px) { 174 | 175 | .app-nav { 176 | top: 300px; 177 | } 178 | 179 | .app-logo { 180 | display: none; 181 | } 182 | 183 | } 184 | 185 | /*ipad/tablet*/ 186 | 187 | @media only screen and (max-width : 768px) { 188 | 189 | .app-nav { 190 | top: 300px; 191 | } 192 | 193 | .app-logo { 194 | width: 200px; 195 | } 196 | 197 | } 198 | 199 | /*desktop/larger screens*/ 200 | 201 | @media only screen and (min-width : 900px) { 202 | 203 | .app-nav { 204 | top: 0px; 205 | } 206 | 207 | .nav-glyphish-example .ui-btn .ui-btn-inner { 208 | padding-top: 10px !important; 209 | } 210 | 211 | .ui-navbar li .ui-btn { 212 | border: 0px; 213 | color: #0063DC; 214 | } 215 | 216 | .app-nav .ui-btn-inner .ui-icon { 217 | display: none; 218 | } 219 | 220 | #content-main { 221 | width: 80%; 222 | margin: 0 auto; 223 | } 224 | 225 | .app-message { 226 | font-size: 13px; 227 | } 228 | 229 | .app-header { 230 | display: none; 231 | } 232 | 233 | .app-nav { 234 | width: 60%; 235 | margin: 0 auto; 236 | } 237 | 238 | .ui-listview-inset .ui-li{ 239 | width: 150px; 240 | height:150px; 241 | float: left; 242 | margin: 20px; 243 | border-radius:2px; 244 | } 245 | 246 | .ui-listview-inset img{ 247 | border-radius:0px; 248 | width:100px; 249 | 250 | } 251 | .ui-btn-icon-right{ 252 | border-bottom:1px solid #CCC; 253 | } 254 | 255 | .ui-li-heading { 256 | font-size: 14px; 257 | font-weight: bold; 258 | display: block; 259 | margin: .6em 0; 260 | overflow: hidden; 261 | /*white-space: normal;*/ 262 | max-height: 16px; /*45px;*/ 263 | clear:both; 264 | padding-top:4px; 265 | max-width: 120px; 266 | text-overflow: ellipsis; 267 | } 268 | 269 | 270 | .ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-thumb{ 271 | padding-left:0px; 272 | } 273 | 274 | .ui-li-thumb, .ui-listview .ui-li-icon { 275 | position:relative; 276 | max-height:140px; 277 | max-width:140px; 278 | } 279 | 280 | .ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li{ 281 | padding: 0px; 282 | } 283 | 284 | #photoviewholder img{ 285 | width:300px; 286 | min-width:300px; 287 | float:left; 288 | } 289 | 290 | #photoviewholder ul{ 291 | float:left; 292 | width:500px; 293 | margin: 0px 0px 0px 15px; 294 | } 295 | 296 | #photoviewholder ul li{ 297 | width:100%; 298 | height:auto; 299 | margin:0px; 300 | border-radius:0px; 301 | padding:5px; 302 | overflow:hidden; 303 | } 304 | 305 | #photoviewholder ul li .key{ 306 | color:#ccc; 307 | } 308 | 309 | #photoviewholder .ext{ 310 | height:65px; 311 | } 312 | 313 | #photoviewholder .ext .ui-btn-inner{ 314 | height:50px; 315 | width:300px; 316 | } 317 | 318 | #photoviewholder .ext .ui-icon{ 319 | display:none; 320 | } 321 | #photoviewholder ul .external_link{ 322 | width:300px; 323 | height:auto; 324 | margin:auto; 325 | } 326 | 327 | } -------------------------------------------------------------------------------- /img/bg_header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/bg_header.png -------------------------------------------------------------------------------- /img/flickly.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/flickly.jpg -------------------------------------------------------------------------------- /img/icons/01-refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/01-refresh.png -------------------------------------------------------------------------------- /img/icons/02-redo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/02-redo.png -------------------------------------------------------------------------------- /img/icons/03-loopback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/03-loopback.png -------------------------------------------------------------------------------- /img/icons/04-squiggle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/04-squiggle.png -------------------------------------------------------------------------------- /img/icons/05-shuffle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/05-shuffle.png -------------------------------------------------------------------------------- /img/icons/06-magnify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/06-magnify.png -------------------------------------------------------------------------------- /img/icons/07-map-marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/07-map-marker.png -------------------------------------------------------------------------------- /img/icons/08-chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/08-chat.png -------------------------------------------------------------------------------- /img/icons/09-chat-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/09-chat-2.png -------------------------------------------------------------------------------- /img/icons/10-medical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/10-medical.png -------------------------------------------------------------------------------- /img/icons/100-coffee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/100-coffee.png -------------------------------------------------------------------------------- /img/icons/101-gameplan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/101-gameplan.png -------------------------------------------------------------------------------- /img/icons/102-walk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/102-walk.png -------------------------------------------------------------------------------- /img/icons/103-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/103-map.png -------------------------------------------------------------------------------- /img/icons/104-index-cards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/104-index-cards.png -------------------------------------------------------------------------------- /img/icons/105-piano.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/105-piano.png -------------------------------------------------------------------------------- /img/icons/106-sliders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/106-sliders.png -------------------------------------------------------------------------------- /img/icons/107-widescreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/107-widescreen.png -------------------------------------------------------------------------------- /img/icons/108-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/108-badge.png -------------------------------------------------------------------------------- /img/icons/109-chicken.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/109-chicken.png -------------------------------------------------------------------------------- /img/icons/11-clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/11-clock.png -------------------------------------------------------------------------------- /img/icons/110-bug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/110-bug.png -------------------------------------------------------------------------------- /img/icons/111-user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/111-user.png -------------------------------------------------------------------------------- /img/icons/112-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/112-group.png -------------------------------------------------------------------------------- /img/icons/113-navigation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/113-navigation.png -------------------------------------------------------------------------------- /img/icons/114-balloon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/114-balloon.png -------------------------------------------------------------------------------- /img/icons/115-bow-and-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/115-bow-and-arrow.png -------------------------------------------------------------------------------- /img/icons/116-controller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/116-controller.png -------------------------------------------------------------------------------- /img/icons/117-todo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/117-todo.png -------------------------------------------------------------------------------- /img/icons/118-coat-hanger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/118-coat-hanger.png -------------------------------------------------------------------------------- /img/icons/119-piggy-bank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/119-piggy-bank.png -------------------------------------------------------------------------------- /img/icons/12-eye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/12-eye.png -------------------------------------------------------------------------------- /img/icons/120-headphones.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/120-headphones.png -------------------------------------------------------------------------------- /img/icons/121-landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/121-landscape.png -------------------------------------------------------------------------------- /img/icons/122-stats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/122-stats.png -------------------------------------------------------------------------------- /img/icons/123-id-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/123-id-card.png -------------------------------------------------------------------------------- /img/icons/124-bullhorn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/124-bullhorn.png -------------------------------------------------------------------------------- /img/icons/125-food.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/125-food.png -------------------------------------------------------------------------------- /img/icons/126-moon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/126-moon.png -------------------------------------------------------------------------------- /img/icons/127-sock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/127-sock.png -------------------------------------------------------------------------------- /img/icons/128-bone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/128-bone.png -------------------------------------------------------------------------------- /img/icons/129-golf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/129-golf.png -------------------------------------------------------------------------------- /img/icons/13-target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/13-target.png -------------------------------------------------------------------------------- /img/icons/130-dice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/130-dice.png -------------------------------------------------------------------------------- /img/icons/131-tower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/131-tower.png -------------------------------------------------------------------------------- /img/icons/132-ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/132-ghost.png -------------------------------------------------------------------------------- /img/icons/133-ufo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/133-ufo.png -------------------------------------------------------------------------------- /img/icons/134-viking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/134-viking.png -------------------------------------------------------------------------------- /img/icons/135-hockeymask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/135-hockeymask.png -------------------------------------------------------------------------------- /img/icons/136-tractor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/136-tractor.png -------------------------------------------------------------------------------- /img/icons/137-presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/137-presentation.png -------------------------------------------------------------------------------- /img/icons/138-scales.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/138-scales.png -------------------------------------------------------------------------------- /img/icons/139-flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/139-flags.png -------------------------------------------------------------------------------- /img/icons/14-tag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/14-tag.png -------------------------------------------------------------------------------- /img/icons/140-gradhat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/140-gradhat.png -------------------------------------------------------------------------------- /img/icons/141-lamp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/141-lamp.png -------------------------------------------------------------------------------- /img/icons/142-wine-bottle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/142-wine-bottle.png -------------------------------------------------------------------------------- /img/icons/143-liquor-bottle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/143-liquor-bottle.png -------------------------------------------------------------------------------- /img/icons/144-martini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/144-martini.png -------------------------------------------------------------------------------- /img/icons/145-persondot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/145-persondot.png -------------------------------------------------------------------------------- /img/icons/146-gavel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/146-gavel.png -------------------------------------------------------------------------------- /img/icons/147-popsicle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/147-popsicle.png -------------------------------------------------------------------------------- /img/icons/148-doghouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/148-doghouse.png -------------------------------------------------------------------------------- /img/icons/149-windmill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/149-windmill.png -------------------------------------------------------------------------------- /img/icons/15-tags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/15-tags.png -------------------------------------------------------------------------------- /img/icons/150-sailboat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/150-sailboat.png -------------------------------------------------------------------------------- /img/icons/151-telescope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/151-telescope.png -------------------------------------------------------------------------------- /img/icons/152-rolodex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/152-rolodex.png -------------------------------------------------------------------------------- /img/icons/153-guitar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/153-guitar.png -------------------------------------------------------------------------------- /img/icons/154-necktie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/154-necktie.png -------------------------------------------------------------------------------- /img/icons/155-bowtie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/155-bowtie.png -------------------------------------------------------------------------------- /img/icons/156-controlpad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/156-controlpad.png -------------------------------------------------------------------------------- /img/icons/157-wrench.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/157-wrench.png -------------------------------------------------------------------------------- /img/icons/158-wrench-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/158-wrench-2.png -------------------------------------------------------------------------------- /img/icons/159-voicemail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/159-voicemail.png -------------------------------------------------------------------------------- /img/icons/16-line-chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/16-line-chart.png -------------------------------------------------------------------------------- /img/icons/160-voicemail-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/160-voicemail-2.png -------------------------------------------------------------------------------- /img/icons/161-calculator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/161-calculator.png -------------------------------------------------------------------------------- /img/icons/162-receipt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/162-receipt.png -------------------------------------------------------------------------------- /img/icons/163-glasses-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/163-glasses-1.png -------------------------------------------------------------------------------- /img/icons/164-glasses-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/164-glasses-2.png -------------------------------------------------------------------------------- /img/icons/165-glasses-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/165-glasses-3.png -------------------------------------------------------------------------------- /img/icons/166-newspaper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/166-newspaper.png -------------------------------------------------------------------------------- /img/icons/167-upload-photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/167-upload-photo.png -------------------------------------------------------------------------------- /img/icons/168-upload-photo-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/168-upload-photo-2.png -------------------------------------------------------------------------------- /img/icons/169-8ball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/169-8ball.png -------------------------------------------------------------------------------- /img/icons/17-bar-chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/17-bar-chart.png -------------------------------------------------------------------------------- /img/icons/170-butterfly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/170-butterfly.png -------------------------------------------------------------------------------- /img/icons/171-sun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/171-sun.png -------------------------------------------------------------------------------- /img/icons/172-pricetag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/172-pricetag.png -------------------------------------------------------------------------------- /img/icons/173-eyedropper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/173-eyedropper.png -------------------------------------------------------------------------------- /img/icons/174-imac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/174-imac.png -------------------------------------------------------------------------------- /img/icons/175-macbook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/175-macbook.png -------------------------------------------------------------------------------- /img/icons/176-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/176-ipad.png -------------------------------------------------------------------------------- /img/icons/177-building.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/177-building.png -------------------------------------------------------------------------------- /img/icons/178-city.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/178-city.png -------------------------------------------------------------------------------- /img/icons/179-notepad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/179-notepad.png -------------------------------------------------------------------------------- /img/icons/18-envelope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/18-envelope.png -------------------------------------------------------------------------------- /img/icons/180-stickynote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/180-stickynote.png -------------------------------------------------------------------------------- /img/icons/181-hammer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/181-hammer.png -------------------------------------------------------------------------------- /img/icons/182-messenger-bag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/182-messenger-bag.png -------------------------------------------------------------------------------- /img/icons/183-genie-lamp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/183-genie-lamp.png -------------------------------------------------------------------------------- /img/icons/184-warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/184-warning.png -------------------------------------------------------------------------------- /img/icons/185-printer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/185-printer.png -------------------------------------------------------------------------------- /img/icons/186-ruler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/186-ruler.png -------------------------------------------------------------------------------- /img/icons/187-pencil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/187-pencil.png -------------------------------------------------------------------------------- /img/icons/188-paint-roller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/188-paint-roller.png -------------------------------------------------------------------------------- /img/icons/189-plant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/189-plant.png -------------------------------------------------------------------------------- /img/icons/19-gear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/19-gear.png -------------------------------------------------------------------------------- /img/icons/190-bank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/190-bank.png -------------------------------------------------------------------------------- /img/icons/191-collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/191-collection.png -------------------------------------------------------------------------------- /img/icons/192-credit-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/192-credit-card.png -------------------------------------------------------------------------------- /img/icons/193-location-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/193-location-arrow.png -------------------------------------------------------------------------------- /img/icons/194-note-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/194-note-2.png -------------------------------------------------------------------------------- /img/icons/195-barcode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/195-barcode.png -------------------------------------------------------------------------------- /img/icons/196-radiation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/196-radiation.png -------------------------------------------------------------------------------- /img/icons/197-card-diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/197-card-diamonds.png -------------------------------------------------------------------------------- /img/icons/198-card-spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/198-card-spades.png -------------------------------------------------------------------------------- /img/icons/199-card-hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/199-card-hearts.png -------------------------------------------------------------------------------- /img/icons/20-gear2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/20-gear2.png -------------------------------------------------------------------------------- /img/icons/200-card-clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/200-card-clubs.png -------------------------------------------------------------------------------- /img/icons/21-skull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/21-skull.png -------------------------------------------------------------------------------- /img/icons/22-skull-n-bones.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/22-skull-n-bones.png -------------------------------------------------------------------------------- /img/icons/23-bird.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/23-bird.png -------------------------------------------------------------------------------- /img/icons/24-gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/24-gift.png -------------------------------------------------------------------------------- /img/icons/25-weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/25-weather.png -------------------------------------------------------------------------------- /img/icons/26-bandaid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/26-bandaid.png -------------------------------------------------------------------------------- /img/icons/27-planet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/27-planet.png -------------------------------------------------------------------------------- /img/icons/28-star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/28-star.png -------------------------------------------------------------------------------- /img/icons/29-heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/29-heart.png -------------------------------------------------------------------------------- /img/icons/30-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/30-key.png -------------------------------------------------------------------------------- /img/icons/31-ipod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/31-ipod.png -------------------------------------------------------------------------------- /img/icons/32-iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/32-iphone.png -------------------------------------------------------------------------------- /img/icons/33-cabinet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/33-cabinet.png -------------------------------------------------------------------------------- /img/icons/34-coffee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/34-coffee.png -------------------------------------------------------------------------------- /img/icons/35-shopping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/35-shopping.png -------------------------------------------------------------------------------- /img/icons/36-toolbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/36-toolbox.png -------------------------------------------------------------------------------- /img/icons/37-suitcase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/37-suitcase.png -------------------------------------------------------------------------------- /img/icons/38-airplane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/38-airplane.png -------------------------------------------------------------------------------- /img/icons/39-spraycan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/39-spraycan.png -------------------------------------------------------------------------------- /img/icons/40-inbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/40-inbox.png -------------------------------------------------------------------------------- /img/icons/41-picture-frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/41-picture-frame.png -------------------------------------------------------------------------------- /img/icons/42-photos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/42-photos.png -------------------------------------------------------------------------------- /img/icons/43-film-roll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/43-film-roll.png -------------------------------------------------------------------------------- /img/icons/44-shoebox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/44-shoebox.png -------------------------------------------------------------------------------- /img/icons/45-movie-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/45-movie-1.png -------------------------------------------------------------------------------- /img/icons/46-movie-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/46-movie-2.png -------------------------------------------------------------------------------- /img/icons/47-fuel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/47-fuel.png -------------------------------------------------------------------------------- /img/icons/48-fork-and-knife.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/48-fork-and-knife.png -------------------------------------------------------------------------------- /img/icons/49-battery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/49-battery.png -------------------------------------------------------------------------------- /img/icons/50-beaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/50-beaker.png -------------------------------------------------------------------------------- /img/icons/51-outlet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/51-outlet.png -------------------------------------------------------------------------------- /img/icons/52-pine-tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/52-pine-tree.png -------------------------------------------------------------------------------- /img/icons/53-house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/53-house.png -------------------------------------------------------------------------------- /img/icons/54-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/54-lock.png -------------------------------------------------------------------------------- /img/icons/55-network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/55-network.png -------------------------------------------------------------------------------- /img/icons/56-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/56-cloud.png -------------------------------------------------------------------------------- /img/icons/57-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/57-download.png -------------------------------------------------------------------------------- /img/icons/58-bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/58-bookmark.png -------------------------------------------------------------------------------- /img/icons/59-flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/59-flag.png -------------------------------------------------------------------------------- /img/icons/60-signpost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/60-signpost.png -------------------------------------------------------------------------------- /img/icons/61-brightness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/61-brightness.png -------------------------------------------------------------------------------- /img/icons/62-contrast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/62-contrast.png -------------------------------------------------------------------------------- /img/icons/63-runner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/63-runner.png -------------------------------------------------------------------------------- /img/icons/64-zap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/64-zap.png -------------------------------------------------------------------------------- /img/icons/65-note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/65-note.png -------------------------------------------------------------------------------- /img/icons/66-microphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/66-microphone.png -------------------------------------------------------------------------------- /img/icons/67-tshirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/67-tshirt.png -------------------------------------------------------------------------------- /img/icons/68-paperclip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/68-paperclip.png -------------------------------------------------------------------------------- /img/icons/69-display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/69-display.png -------------------------------------------------------------------------------- /img/icons/70-tv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/70-tv.png -------------------------------------------------------------------------------- /img/icons/71-compass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/71-compass.png -------------------------------------------------------------------------------- /img/icons/72-pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/72-pin.png -------------------------------------------------------------------------------- /img/icons/73-radar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/73-radar.png -------------------------------------------------------------------------------- /img/icons/74-location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/74-location.png -------------------------------------------------------------------------------- /img/icons/75-phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/75-phone.png -------------------------------------------------------------------------------- /img/icons/76-baby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/76-baby.png -------------------------------------------------------------------------------- /img/icons/77-ekg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/77-ekg.png -------------------------------------------------------------------------------- /img/icons/78-stopwatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/78-stopwatch.png -------------------------------------------------------------------------------- /img/icons/79-medical-bag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/79-medical-bag.png -------------------------------------------------------------------------------- /img/icons/80-shopping-cart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/80-shopping-cart.png -------------------------------------------------------------------------------- /img/icons/81-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/81-dashboard.png -------------------------------------------------------------------------------- /img/icons/82-dog-paw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/82-dog-paw.png -------------------------------------------------------------------------------- /img/icons/83-calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/83-calendar.png -------------------------------------------------------------------------------- /img/icons/84-lightbulb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/84-lightbulb.png -------------------------------------------------------------------------------- /img/icons/85-trophy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/85-trophy.png -------------------------------------------------------------------------------- /img/icons/86-camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/86-camera.png -------------------------------------------------------------------------------- /img/icons/87-wine-glass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/87-wine-glass.png -------------------------------------------------------------------------------- /img/icons/88-beer-mug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/88-beer-mug.png -------------------------------------------------------------------------------- /img/icons/89-dumbell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/89-dumbell.png -------------------------------------------------------------------------------- /img/icons/90-life-buoy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/90-life-buoy.png -------------------------------------------------------------------------------- /img/icons/91-beaker-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/91-beaker-2.png -------------------------------------------------------------------------------- /img/icons/92-test-tube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/92-test-tube.png -------------------------------------------------------------------------------- /img/icons/93-thermometer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/93-thermometer.png -------------------------------------------------------------------------------- /img/icons/94-pill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/94-pill.png -------------------------------------------------------------------------------- /img/icons/95-equalizer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/95-equalizer.png -------------------------------------------------------------------------------- /img/icons/96-book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/96-book.png -------------------------------------------------------------------------------- /img/icons/97-puzzle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/97-puzzle.png -------------------------------------------------------------------------------- /img/icons/98-palette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/98-palette.png -------------------------------------------------------------------------------- /img/icons/99-umbrella.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/99-umbrella.png -------------------------------------------------------------------------------- /img/icons/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/demo.png -------------------------------------------------------------------------------- /img/icons/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/facebook.png -------------------------------------------------------------------------------- /img/icons/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/github.png -------------------------------------------------------------------------------- /img/icons/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/icons/twitter.png -------------------------------------------------------------------------------- /img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/loader.gif -------------------------------------------------------------------------------- /img/ribbon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-mobile-search/555bb02c665490e48bfc81984487b20ec437beb3/img/ribbon.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Flickly 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 24 | 25 |
    26 | 27 |
    28 |

    Flickly

    29 | Options 30 |
    31 | 32 | 33 | 34 | 45 | 46 | 47 | 48 |
    49 | 50 |
    51 | 52 | 53 |
    54 | 55 | 56 |
    57 | 58 |
    59 |
    60 | 61 | 62 |
    63 | 64 |
    65 | 66 | 67 | 68 | 74 | 75 | 76 | 77 |
    78 |
    79 | 80 | 81 | 82 | 83 |
    84 |
    85 | 86 | 87 |

    88 | Tip: For more search options, see the 'Options' tab below for advanced filters.

    89 |
    90 | 91 | 92 |
    93 | 94 | 95 | 100 | 101 | 102 |
    103 |
    104 |

    Options

    105 |
    106 |
    107 | 108 | 109 | 110 | 115 | 116 | 117 | 118 |
    119 | 120 | 121 |
    122 | 123 | 124 | 125 |
    126 | Geo-tagged? : 127 | 128 | 129 | 130 | 131 |
    132 | 133 | 134 | 135 |
    136 |

    Select date ranges

    137 | 138 |
    139 |
    140 | 141 | 142 |
    143 | 144 |
    145 | 146 | 147 |
    148 | 149 |
    150 |
    151 | 152 |
    153 | 154 | 155 |
    156 | 157 | 158 | 163 | 164 | 165 |
    166 |
    167 |

    Help

    168 |
    169 |
    170 |
      171 |
    • Quick guidelines to get started
    • 172 |
    • 173 |

      Searching

      174 | 175 |

      Looking up photos on Flickr is simple.

      176 | 177 |

      Enter a term and hit 'enter' or search

      178 | 179 |
    • 180 |
    • 181 |

      Options

      182 | 183 |

      Advanced search options are available.

      184 | 185 |

      Search by type, geo-location and more.

      186 |
    • 187 |
    188 |
    189 |
    190 | 191 | 192 | 197 | 198 | 199 |
    200 |
    201 |

    API Docs

    202 |
    203 |
    204 |

    For the complete Flickr API Documentation with references to the methods and formats supported, see here.

    205 |

    You can also sign-up for your own API keys.

    206 |
    207 |
    208 | 209 | 214 | 215 | 216 |
    217 |
    218 |

    About

    219 |
    220 |
    221 |

    Flickly is a demo application written using Backbone.js and jQuery Mobile. Require.js and the AMD module format are used for breaking components down into modules whilst Underscore.js is used for templating.

    222 |
    223 |
    224 | 225 | 230 | 231 | 232 |
    233 |
    234 |

    Viewing photo

    235 |
    236 |
    237 |
    238 |
      239 |
    240 |
    241 | 242 |
    243 | 244 | 249 | 250 | 273 | 274 | 275 | 276 |
    277 |
    278 | 279 | 280 | 281 | --------------------------------------------------------------------------------