From 2389d66da849798f8d4ec5f10e3b07c11da49185 Mon Sep 17 00:00:00 2001 From: Michael Francis Date: Sat, 28 May 2011 13:28:16 -0400 Subject: Initial Commit --- ACL.php | 319 ++++ CSRF | 67 + config/.DS_Store | Bin 0 -> 6148 bytes config/bootstrap.php | 86 + config/bootstrap/.DS_Store | Bin 0 -> 6148 bytes config/bootstrap/action.php | 55 + config/bootstrap/auth.php | 135 ++ config/bootstrap/cache.php | 62 + config/bootstrap/connections.php | 72 + config/bootstrap/console.php | 19 + config/bootstrap/error.php | 37 + config/bootstrap/errors.php | 28 + config/bootstrap/g11n.php | 149 ++ config/bootstrap/libraries.php | 127 ++ config/bootstrap/media.php | 63 + config/bootstrap/session.php | 49 + config/routes.php | 149 ++ controllers/AdminController.php | 100 ++ controllers/AnimelistController.php | 77 + controllers/ContentController.php | 62 + controllers/FeedsController.php | 79 + controllers/PagesController.php | 36 + controllers/PhotosController.php | 41 + controllers/ProfileController.php | 75 + controllers/ProfilesController.php | 41 + controllers/SearchController.php | 37 + controllers/TopicController.php | 25 + controllers/UsersController.php | 473 +++++ extensions/adapter/empty | 0 extensions/command/ImportUsers.php | 59 + extensions/command/empty | 0 extensions/data/source/empty | 0 extensions/helper/empty | 0 index.php | 11 + libraries/.DS_Store | Bin 0 -> 12292 bytes libraries/_source/empty | 0 libraries/li3_access | 1 + libraries/li3_flash_message | 1 + libraries/li3_paginate | 1 + libraries/openID/openid.php | 765 ++++++++ models/Anime.php | 8 + models/Entry.php | 9 + models/Photo.php | 62 + models/Post.php | 137 ++ models/Profile.php | 17 + models/ProfilePic.php | 28 + models/Topic.php | 13 + models/User.php | 347 ++++ models/confirmKey.php | 46 + models/contentList.php | 17 + models/untitled.php | 18 + resources/g11n/empty | 0 resources/tmp/logs/empty | 0 resources/tmp/tests/empty | 0 tests/cases/controllers/PhotosControllerTest.php | 19 + tests/cases/controllers/ProfilesControllerTest.php | 19 + tests/cases/controllers/empty | 0 tests/cases/extensions/adapter/empty | 0 tests/cases/extensions/command/empty | 0 tests/cases/extensions/data/source/empty | 1 + tests/cases/extensions/helper/empty | 0 tests/cases/models/PhotoTest.php | 16 + tests/cases/models/ProfileTest.php | 16 + tests/cases/models/empty | 0 tests/functional/empty | 0 tests/integration/empty | 0 tests/mocks/empty | 0 views/.DS_Store | Bin 0 -> 12292 bytes views/Admin/editUser.html.php | 11 + views/Admin/index.html.php | 99 ++ views/Admin/users.html.php | 103 ++ views/Anime_list/add.html.php | 33 + views/Anime_list/index.html | 3 + views/Anime_list/index.html.php | 74 + views/Anime_list/view.html.php | 84 + views/Content/anime.html.php | 68 + views/Content/index.html.php | 7 + views/Feeds/.DS_Store | Bin 0 -> 6148 bytes .../Feeds/Carbon_files/avatar_9318cab29a1a_96.png | Bin 0 -> 16616 bytes views/Feeds/Carbon_files/bg_caption.png | Bin 0 -> 4260 bytes views/Feeds/Carbon_files/bg_search.png | Bin 0 -> 7059 bytes views/Feeds/Carbon_files/bg_search_focus.png | Bin 0 -> 6875 bytes views/Feeds/Carbon_files/bg_sidebar.png | Bin 0 -> 3322 bytes views/Feeds/Carbon_files/bg_texture.png | Bin 0 -> 8399 bytes views/Feeds/Carbon_files/button_nav_left.png | Bin 0 -> 11210 bytes views/Feeds/Carbon_files/button_nav_right.png | Bin 0 -> 11093 bytes views/Feeds/Carbon_files/caption_bot.png | Bin 0 -> 3425 bytes views/Feeds/Carbon_files/caption_top.png | Bin 0 -> 3411 bytes views/Feeds/Carbon_files/count-1.js | 5 + views/Feeds/Carbon_files/count.js | Bin 0 -> 867 bytes views/Feeds/Carbon_files/divider.png | Bin 0 -> 3033 bytes views/Feeds/Carbon_files/icon_comment.png | Bin 0 -> 397 bytes views/Feeds/Carbon_files/icon_fav.png | Bin 0 -> 3326 bytes views/Feeds/Carbon_files/icon_link.png | Bin 0 -> 3347 bytes views/Feeds/Carbon_files/icon_rss.png | Bin 0 -> 3595 bytes views/Feeds/Carbon_files/icon_source.png | Bin 0 -> 1343 bytes views/Feeds/Carbon_files/icon_tag.png | Bin 0 -> 3055 bytes views/Feeds/Carbon_files/jquery.min.js | 166 ++ views/Feeds/Carbon_files/photo_corner.png | Bin 0 -> 6919 bytes views/Feeds/Carbon_files/portrait_frame.png | Bin 0 -> 1277 bytes views/Feeds/Carbon_files/postmarker.png | Bin 0 -> 5018 bytes views/Feeds/Carbon_files/postmarker_audio.png | Bin 0 -> 5748 bytes views/Feeds/Carbon_files/postmarker_chat.png | Bin 0 -> 5477 bytes views/Feeds/Carbon_files/postmarker_img.png | Bin 0 -> 5232 bytes views/Feeds/Carbon_files/postmarker_quote.png | Bin 0 -> 5333 bytes views/Feeds/Carbon_files/postmarker_text.png | Bin 0 -> 5253 bytes views/Feeds/Carbon_files/postmarker_url.png | Bin 0 -> 5644 bytes views/Feeds/Carbon_files/postmarker_video.png | Bin 0 -> 5263 bytes views/Feeds/Carbon_files/quant.js | 28 + views/Feeds/Carbon_files/sidebar_icon_sprite.png | Bin 0 -> 6424 bytes views/Feeds/Carbon_files/sidebar_top.png | Bin 0 -> 89740 bytes views/Feeds/Carbon_files/title_bottom.png | Bin 0 -> 1691 bytes views/Feeds/Carbon_files/title_slice.png | Bin 0 -> 1037 bytes views/Feeds/Carbon_files/title_top.png | Bin 0 -> 1727 bytes views/Feeds/Carbon_files/tumblelog.js | 1 + .../tumblr_lbn4lf36zN1qeglo0o1_500.jpg | Bin 0 -> 60612 bytes ...tumblr_lbn5nwjpXc1qeglo0o1_1289347008_cover.jpg | Bin 0 -> 88926 bytes views/Feeds/index.html.php | 634 +++++++ views/Feeds/index.html1.php | 1 + views/Photos/add.html.php | 5 + views/Photos/index.html.php | 7 + views/Photos/view.html.php | 1 + views/Profile/add.html.php | 4 + views/Profile/edit.html.php | 6 + views/Profile/view.html.php | 19 + views/Search/index.html.php | 7 + views/Users/Photos/index.html.php | 7 + views/Users/confirm.html.php | 1 + views/Users/feed.html.php | 45 + views/Users/index.html.php | 12 + views/Users/login.html.php | 7 + views/Users/logintest.html.php | 1 + views/Users/openid.html.php | 4 + views/Users/post.html.php | 3 + views/Users/profile.html.php | 9 + views/Users/signup.html.php | 17 + views/Users/step2.html.php | 12 + views/Users/test.html.php | 0 views/_errors/development.html.php | 108 ++ views/elements/empty | 0 views/layouts/.DS_Store | Bin 0 -> 12292 bytes views/layouts/admin.html.php | 91 + views/layouts/default.html copy.php | 52 + views/layouts/default.html.php | 129 ++ views/layouts/default.xml.php | 10 + views/layouts/error.html.php | 46 + views/layouts/form.html.php | 20 + views/layouts/index.php_files/accept.png | Bin 0 -> 781 bytes views/layouts/index.php_files/add_16.png | Bin 0 -> 3211 bytes views/layouts/index.php_files/alert-error-bg.png | Bin 0 -> 155 bytes views/layouts/index.php_files/alert-info-bg.png | Bin 0 -> 173 bytes views/layouts/index.php_files/alert-notice-bg.png | Bin 0 -> 2907 bytes views/layouts/index.php_files/alert-success-bg.png | Bin 0 -> 177 bytes views/layouts/index.php_files/basic.css | 198 +++ views/layouts/index.php_files/blank_cell.png | Bin 0 -> 252 bytes views/layouts/index.php_files/change_password.png | Bin 0 -> 3671 bytes views/layouts/index.php_files/delete.png | Bin 0 -> 3352 bytes views/layouts/index.php_files/editable.png | Bin 0 -> 736 bytes views/layouts/index.php_files/email_32.png | Bin 0 -> 4128 bytes views/layouts/index.php_files/exclamation.png | Bin 0 -> 701 bytes views/layouts/index.php_files/ie.css | 74 + views/layouts/index.php_files/info_bar_bg.png | Bin 0 -> 166 bytes views/layouts/index.php_files/information.png | Bin 0 -> 778 bytes views/layouts/index.php_files/inner-split-bg.png | Bin 0 -> 173 bytes views/layouts/index.php_files/jquery.ba-bbq.min.js | 9 + views/layouts/index.php_files/jquery.min.js | 152 ++ views/layouts/index.php_files/large-button-bg.png | Bin 0 -> 186 bytes views/layouts/index.php_files/light-bgs.png | Bin 0 -> 33710 bytes views/layouts/index.php_files/list_hover.png | Bin 0 -> 523 bytes views/layouts/index.php_files/list_row_bg.png | Bin 0 -> 113 bytes views/layouts/index.php_files/list_top_bg.png | Bin 0 -> 230 bytes views/layouts/index.php_files/main.js | 288 +++ views/layouts/index.php_files/messages.png | Bin 0 -> 3506 bytes views/layouts/index.php_files/nav.png | Bin 0 -> 2877 bytes views/layouts/index.php_files/nav_divider.png | Bin 0 -> 148 bytes views/layouts/index.php_files/new-message.png | Bin 0 -> 7875 bytes views/layouts/index.php_files/new_admin.png | Bin 0 -> 1247 bytes views/layouts/index.php_files/new_client.png | Bin 0 -> 3682 bytes views/layouts/index.php_files/new_invoice.png | Bin 0 -> 3502 bytes views/layouts/index.php_files/new_project.png | Bin 0 -> 3510 bytes views/layouts/index.php_files/progressbar.png | 9 + views/layouts/index.php_files/selected_bg.png | Bin 0 -> 137 bytes .../index.php_files/selected_side_highlight.png | Bin 0 -> 143 bytes views/layouts/index.php_files/small-button.png | Bin 0 -> 3469 bytes views/layouts/index.php_files/style.css | 1852 ++++++++++++++++++++ views/layouts/index.php_files/table-header-bg.png | Bin 0 -> 209 bytes views/layouts/index.php_files/tabs_bg.png | Bin 0 -> 358 bytes views/layouts/index.php_files/tabs_bg2.png | Bin 0 -> 372 bytes views/layouts/index.php_files/tabs_divider.png | Bin 0 -> 210 bytes .../layouts/index.php_files/unselected_tabs_bg.png | Bin 0 -> 175 bytes views/layouts/presentation_files/118.png | Bin 0 -> 3080 bytes views/layouts/presentation_files/123.png | Bin 0 -> 3616 bytes views/layouts/presentation_files/14.png | Bin 0 -> 7965 bytes views/layouts/presentation_files/18.png | Bin 0 -> 6353 bytes views/layouts/presentation_files/2.png | Bin 0 -> 6440 bytes views/layouts/presentation_files/21.png | Bin 0 -> 4975 bytes views/layouts/presentation_files/25.png | Bin 0 -> 6016 bytes views/layouts/presentation_files/27.png | Bin 0 -> 7147 bytes views/layouts/presentation_files/3.png | Bin 0 -> 4209 bytes views/layouts/presentation_files/36.png | Bin 0 -> 6603 bytes views/layouts/presentation_files/42.png | Bin 0 -> 6791 bytes views/layouts/presentation_files/54.png | Bin 0 -> 4316 bytes views/layouts/presentation_files/75.png | Bin 0 -> 1800 bytes views/layouts/presentation_files/80.png | Bin 0 -> 4074 bytes views/layouts/presentation_files/81.png | Bin 0 -> 3476 bytes .../presentation_files/ColaborateLight_400.font.js | 19 + views/layouts/presentation_files/IEfix.css | 14 + views/layouts/presentation_files/Pencil.png | Bin 0 -> 599 bytes views/layouts/presentation_files/Preferences.png | Bin 0 -> 645 bytes views/layouts/presentation_files/Trash.png | Bin 0 -> 447 bytes views/layouts/presentation_files/avatar.png | Bin 0 -> 4956 bytes .../layouts/presentation_files/button_repeater.png | 9 + views/layouts/presentation_files/buttons.gif | Bin 0 -> 3064 bytes views/layouts/presentation_files/close.png | Bin 0 -> 1626 bytes views/layouts/presentation_files/coin.png | Bin 0 -> 4487 bytes views/layouts/presentation_files/cufon-yui.js | 7 + views/layouts/presentation_files/custom.js | 140 ++ views/layouts/presentation_files/dashboard.png | Bin 0 -> 4173 bytes views/layouts/presentation_files/dialog_bg.png | Bin 0 -> 2814 bytes views/layouts/presentation_files/download.png | Bin 0 -> 2239 bytes views/layouts/presentation_files/easyTooltip.js | 67 + views/layouts/presentation_files/error.png | Bin 0 -> 3071 bytes views/layouts/presentation_files/excanvas.js | 937 ++++++++++ .../presentation_files/iPhoneCheckboxes.css | 62 + views/layouts/presentation_files/info.png | Bin 0 -> 2383 bytes .../presentation_files/iphone-style-checkboxes.js | 227 +++ .../layouts/presentation_files/jQuery_UI_uniq.css | 356 ++++ .../layouts/presentation_files/jquery-1.4.2.min.js | 154 ++ .../jquery-ui-1.8.5.custom.min.js | 778 ++++++++ .../layouts/presentation_files/jquery.cleditor.css | 37 + .../presentation_files/jquery.cleditor.min.js | 31 + .../presentation_files/jquery.tablesorter.min.js | 4 + views/layouts/presentation_files/logo.png | Bin 0 -> 10571 bytes views/layouts/presentation_files/logo_bg.png | Bin 0 -> 13076 bytes views/layouts/presentation_files/media.png | Bin 0 -> 4211 bytes views/layouts/presentation_files/menu_arrow.png | Bin 0 -> 2982 bytes views/layouts/presentation_files/menu_current.png | Bin 0 -> 7350 bytes views/layouts/presentation_files/menu_spacer.png | Bin 0 -> 3164 bytes views/layouts/presentation_files/message.png | Bin 0 -> 2125 bytes views/layouts/presentation_files/notes.png | Bin 0 -> 3686 bytes views/layouts/presentation_files/off.png | Bin 0 -> 3261 bytes views/layouts/presentation_files/on.png | Bin 0 -> 3436 bytes views/layouts/presentation_files/posts.png | Bin 0 -> 3398 bytes views/layouts/presentation_files/print.png | Bin 0 -> 2312 bytes views/layouts/presentation_files/purchase.png | Bin 0 -> 2625 bytes views/layouts/presentation_files/secure.png | Bin 0 -> 2950 bytes views/layouts/presentation_files/settings.png | Bin 0 -> 3531 bytes views/layouts/presentation_files/slider.png | Bin 0 -> 3080 bytes views/layouts/presentation_files/stripe.png | Bin 0 -> 3179 bytes views/layouts/presentation_files/style.css | 977 +++++++++++ views/layouts/presentation_files/success.png | Bin 0 -> 2642 bytes views/layouts/presentation_files/tip.png | Bin 0 -> 3407 bytes views/layouts/presentation_files/ui-icons.png | Bin 0 -> 4369 bytes views/layouts/presentation_files/users.png | Bin 0 -> 3869 bytes views/layouts/presentation_files/visualize.css | 31 + .../layouts/presentation_files/visualize.jQuery.js | 463 +++++ views/layouts/presentation_files/warning.png | Bin 0 -> 1788 bytes views/layouts/untitled.html.php | 731 ++++++++ views/pages/contest.html.php | 10 + views/pages/feed.html.php | 14 + views/pages/home.html.php | 103 ++ webroot/.DS_Store | Bin 0 -> 15364 bytes webroot/.htaccess | 7 + webroot/15452_files/default_avatar_48.gif | Bin 0 -> 2352 bytes webroot/15452_files/simplethings-arrow-next.png | Bin 0 -> 540 bytes webroot/15452_files/simplethings-arrow-prev.png | Bin 0 -> 537 bytes webroot/15452_files/simplethings-clock.png | Bin 0 -> 719 bytes webroot/15452_files/simplethings-date-flag.png | Bin 0 -> 328 bytes webroot/15452_files/simplethings-footer-bg.png | Bin 0 -> 141 bytes webroot/15452_files/simplethings-header-bg.png | Bin 0 -> 180 bytes webroot/15452_files/simplethings-page-btn.png | Bin 0 -> 164 bytes .../15452_files/simplethings-question-bg-blue.png | Bin 0 -> 131 bytes .../simplethings-question-bottom-blue.png | Bin 0 -> 357 bytes .../15452_files/simplethings-question-top-blue.png | Bin 0 -> 264 bytes webroot/15452_files/simplethings-quote.png | Bin 0 -> 450 bytes webroot/15452_files/simplethings-reblogged.png | Bin 0 -> 634 bytes webroot/15452_files/simplethings-rss-btn.png | Bin 0 -> 159 bytes webroot/15452_files/simplethings-rss-icon.png | Bin 0 -> 430 bytes webroot/15452_files/simplethings-search-full.png | Bin 0 -> 2257 bytes webroot/15452_files/simplethings-tags.png | Bin 0 -> 526 bytes webroot/15452_files/simplethings-user-pic.png | Bin 0 -> 665 bytes webroot/15452_files/tumblelog.js | 1 + .../tumblr_ksc4i2SkVU1qz8ouqo1_r2_cover.jpg | Bin 0 -> 105289 bytes .../15452_files/tumblr_kzjlfiTnfe1qz4rgho1_250.jpg | Bin 0 -> 50430 bytes .../15452_files/tumblr_kzjlfiTnfe1qz4rgho1_500.jpg | Bin 0 -> 86821 bytes webroot/carbon.css | 202 +++ webroot/code/.DS_Store | Bin 0 -> 6148 bytes webroot/code/css/960.css | 1 + webroot/code/css/reset.css | 1 + webroot/code/css/text.css | 1 + webroot/code/css/uncompressed/960.css | 409 +++++ webroot/code/css/uncompressed/reset.css | 53 + webroot/code/css/uncompressed/text.css | 84 + webroot/code/demo.html | 592 +++++++ webroot/code/img/12_col.gif | Bin 0 -> 96 bytes webroot/code/img/16_col.gif | Bin 0 -> 101 bytes webroot/css/960.css | 1 + webroot/css/base.css | 1382 +++++++++++++++ webroot/css/debug.css | 603 +++++++ webroot/css/grid.css | 484 +++++ webroot/css/lithium.css | 294 ++++ webroot/css/prettyPhoto.css | 1 + webroot/css/reset.css | 1 + webroot/css/style.css | 170 ++ webroot/css/text.css | 1 + webroot/css/themes/black.css | 28 + webroot/css/themes/blue.css | 29 + webroot/css/themes/dark.css | 32 + webroot/css/themes/green.css | 29 + webroot/css/themes/grey.css | 32 + webroot/css/themes/light.css | 31 + webroot/css/themes/purple.css | 28 + webroot/css/themes/red.css | 30 + webroot/favicon.ico | Bin 0 -> 65764 bytes webroot/images/dark_rounded/btnNext.png | Bin 0 -> 1411 bytes webroot/images/dark_rounded/btnPrevious.png | Bin 0 -> 1442 bytes webroot/images/dark_rounded/contentPattern.png | Bin 0 -> 130 bytes webroot/images/dark_rounded/default_thumbnail.gif | Bin 0 -> 227 bytes webroot/images/dark_rounded/loader.gif | Bin 0 -> 2545 bytes webroot/images/dark_rounded/sprite.png | Bin 0 -> 4076 bytes webroot/images/dark_square/btnNext.png | Bin 0 -> 1411 bytes webroot/images/dark_square/btnPrevious.png | Bin 0 -> 1442 bytes webroot/images/dark_square/contentPattern.png | Bin 0 -> 121 bytes webroot/images/dark_square/default_thumbnail.gif | Bin 0 -> 227 bytes webroot/images/dark_square/loader.gif | Bin 0 -> 2545 bytes webroot/images/dark_square/sprite.png | Bin 0 -> 3507 bytes webroot/images/default/default_thumb.png | Bin 0 -> 1537 bytes webroot/images/default/loader.gif | Bin 0 -> 6331 bytes webroot/images/default/sprite.png | Bin 0 -> 6682 bytes webroot/images/default/sprite_next.png | Bin 0 -> 1358 bytes webroot/images/default/sprite_prev.png | Bin 0 -> 1376 bytes webroot/images/default/sprite_x.png | Bin 0 -> 1097 bytes webroot/images/default/sprite_y.png | Bin 0 -> 1162 bytes webroot/images/facebook/btnNext.png | Bin 0 -> 845 bytes webroot/images/facebook/btnPrevious.png | Bin 0 -> 828 bytes webroot/images/facebook/contentPatternBottom.png | Bin 0 -> 142 bytes webroot/images/facebook/contentPatternLeft.png | Bin 0 -> 137 bytes webroot/images/facebook/contentPatternRight.png | Bin 0 -> 136 bytes webroot/images/facebook/contentPatternTop.png | Bin 0 -> 142 bytes webroot/images/facebook/default_thumbnail.gif | Bin 0 -> 227 bytes webroot/images/facebook/loader.gif | Bin 0 -> 2545 bytes webroot/images/facebook/sprite.png | Bin 0 -> 4227 bytes webroot/images/light_rounded/btnNext.png | Bin 0 -> 1411 bytes webroot/images/light_rounded/btnPrevious.png | Bin 0 -> 1442 bytes webroot/images/light_rounded/default_thumbnail.gif | Bin 0 -> 227 bytes webroot/images/light_rounded/loader.gif | Bin 0 -> 2545 bytes webroot/images/light_rounded/sprite.png | Bin 0 -> 4099 bytes webroot/images/light_square/btnNext.png | Bin 0 -> 1411 bytes webroot/images/light_square/btnPrevious.png | Bin 0 -> 1442 bytes webroot/images/light_square/default_thumbnail.gif | Bin 0 -> 227 bytes webroot/images/light_square/loader.gif | Bin 0 -> 2545 bytes webroot/images/light_square/sprite.png | Bin 0 -> 3507 bytes webroot/img/.DS_Store | Bin 0 -> 6148 bytes webroot/img/about-small.jpg | Bin 0 -> 16616 bytes webroot/img/about.jpg | Bin 0 -> 33264 bytes webroot/img/appletv2.jpeg | Bin 0 -> 25102 bytes webroot/img/arrow-active.png | Bin 0 -> 2918 bytes webroot/img/arrow.png | Bin 0 -> 2974 bytes webroot/img/bg-dark.jpg | Bin 0 -> 8549 bytes webroot/img/bg-input.gif | Bin 0 -> 96 bytes webroot/img/bg.jpg | Bin 0 -> 7587 bytes webroot/img/bullet_arrow_right.png | Bin 0 -> 2938 bytes webroot/img/coding.png | Bin 0 -> 4122 bytes webroot/img/design.png | Bin 0 -> 3326 bytes webroot/img/empty | 0 webroot/img/error.png | Bin 0 -> 727 bytes webroot/img/features/box_address.png | Bin 0 -> 5312 bytes webroot/img/features/lock_closed.png | Bin 0 -> 5988 bytes webroot/img/features/magic_wand.png | Bin 0 -> 7959 bytes webroot/img/features/monitor.png | Bin 0 -> 6533 bytes webroot/img/features/preferences.png | Bin 0 -> 5919 bytes webroot/img/features/security.png | Bin 0 -> 4863 bytes webroot/img/grad-black-hover.gif | Bin 0 -> 282 bytes webroot/img/grad-black-rev.gif | Bin 0 -> 282 bytes webroot/img/grad-black.gif | Bin 0 -> 282 bytes webroot/img/grad-blue-hover.gif | Bin 0 -> 284 bytes webroot/img/grad-blue-rev.gif | Bin 0 -> 284 bytes webroot/img/grad-blue.gif | Bin 0 -> 284 bytes webroot/img/grad-green-hover.gif | Bin 0 -> 283 bytes webroot/img/grad-green-rev.gif | Bin 0 -> 283 bytes webroot/img/grad-green.gif | Bin 0 -> 283 bytes webroot/img/grad-grey-hover.gif | Bin 0 -> 278 bytes webroot/img/grad-grey-rev.gif | Bin 0 -> 278 bytes webroot/img/grad-grey.gif | Bin 0 -> 278 bytes webroot/img/grad-purple-hover.gif | Bin 0 -> 283 bytes webroot/img/grad-purple-rev.gif | Bin 0 -> 283 bytes webroot/img/grad-purple.gif | Bin 0 -> 283 bytes webroot/img/grad-red-hover.gif | Bin 0 -> 283 bytes webroot/img/grad-red-rev.gif | Bin 0 -> 283 bytes webroot/img/grad-red.gif | Bin 0 -> 283 bytes webroot/img/grad-rev.png | Bin 0 -> 2858 bytes webroot/img/grad.png | Bin 0 -> 2863 bytes webroot/img/icon-des.png | Bin 0 -> 5437 bytes webroot/img/icons/add.png | Bin 0 -> 698 bytes webroot/img/icons/asterisk_yellow.png | Bin 0 -> 925 bytes webroot/img/icons/bullet_arrow_right.png | Bin 0 -> 2938 bytes webroot/img/icons/bullet_toggle_minus.png | Bin 0 -> 314 bytes webroot/img/icons/bullet_toggle_plus.png | Bin 0 -> 332 bytes webroot/img/icons/calendar.png | Bin 0 -> 705 bytes webroot/img/icons/cancel.png | Bin 0 -> 727 bytes webroot/img/icons/close.png | Bin 0 -> 3282 bytes webroot/img/icons/cog.png | Bin 0 -> 777 bytes webroot/img/icons/comment_delete.png | Bin 0 -> 788 bytes webroot/img/icons/comment_edit.png | Bin 0 -> 799 bytes webroot/img/icons/comments.png | Bin 0 -> 846 bytes webroot/img/icons/cut.png | Bin 0 -> 510 bytes webroot/img/icons/error.png | Bin 0 -> 727 bytes webroot/img/icons/folder.png | Bin 0 -> 632 bytes webroot/img/icons/group.png | Bin 0 -> 918 bytes webroot/img/icons/image.png | Bin 0 -> 586 bytes webroot/img/icons/images.png | Bin 0 -> 727 bytes webroot/img/icons/information.png | Bin 0 -> 764 bytes webroot/img/icons/page.png | Bin 0 -> 487 bytes webroot/img/icons/page_code.png | Bin 0 -> 728 bytes webroot/img/icons/page_copy.png | Bin 0 -> 593 bytes webroot/img/icons/page_delete.png | Bin 0 -> 678 bytes webroot/img/icons/page_edit.png | Bin 0 -> 715 bytes webroot/img/icons/page_paste.png | Bin 0 -> 690 bytes webroot/img/icons/page_white.png | Bin 0 -> 416 bytes webroot/img/icons/page_white_acrobat.png | Bin 0 -> 689 bytes webroot/img/icons/page_white_flash.png | Bin 0 -> 670 bytes webroot/img/icons/page_white_gear.png | Bin 0 -> 732 bytes webroot/img/icons/page_white_php.png | Bin 0 -> 432 bytes webroot/img/icons/page_white_stack.png | Bin 0 -> 541 bytes webroot/img/icons/page_white_zip.png | Bin 0 -> 593 bytes webroot/img/icons/success.png | Bin 0 -> 712 bytes webroot/img/icons/tip.png | Bin 0 -> 685 bytes webroot/img/icons/user.png | Bin 0 -> 593 bytes webroot/img/icons/user_delete.png | Bin 0 -> 711 bytes webroot/img/icons/user_edit.png | Bin 0 -> 741 bytes webroot/img/icons/warning.png | Bin 0 -> 543 bytes webroot/img/icons/xhtml.png | Bin 0 -> 548 bytes webroot/img/lightbox/lightbox-blank.gif | Bin 0 -> 43 bytes webroot/img/lightbox/lightbox-btn-close.gif | Bin 0 -> 700 bytes webroot/img/lightbox/lightbox-btn-next.gif | Bin 0 -> 812 bytes webroot/img/lightbox/lightbox-btn-prev.gif | Bin 0 -> 832 bytes webroot/img/lightbox/lightbox-ico-loading.gif | Bin 0 -> 3990 bytes webroot/img/office.jpg | Bin 0 -> 38416 bytes webroot/img/old/coding.png | Bin 0 -> 5509 bytes webroot/img/old/design.png | Bin 0 -> 6695 bytes webroot/img/old/icon-des.png | Bin 0 -> 5446 bytes webroot/img/old/seo.png | Bin 0 -> 5706 bytes webroot/img/portfolio/admina-big.jpg | Bin 0 -> 87894 bytes webroot/img/portfolio/admina-mid.jpg | Bin 0 -> 30712 bytes webroot/img/portfolio/admina.jpg | Bin 0 -> 23936 bytes webroot/img/portfolio/adminbase-big.jpg | Bin 0 -> 73903 bytes webroot/img/portfolio/adminbase-mid.jpg | Bin 0 -> 24176 bytes webroot/img/portfolio/adminbase.jpg | Bin 0 -> 21771 bytes webroot/img/portfolio/vcard-big.jpg | Bin 0 -> 63955 bytes webroot/img/portfolio/vcard-mid.jpg | Bin 0 -> 29648 bytes webroot/img/portfolio/vcard.jpg | Bin 0 -> 25396 bytes webroot/img/portfolio/vcard2-big.jpg | Bin 0 -> 69940 bytes webroot/img/portfolio/vcard2-mid.jpg | Bin 0 -> 27055 bytes webroot/img/portfolio/vcard2.jpg | Bin 0 -> 21883 bytes webroot/img/process.gif | Bin 0 -> 781 bytes webroot/img/quote.gif | Bin 0 -> 1681 bytes webroot/img/screenshot.png | Bin 0 -> 94206 bytes webroot/img/screenshots/buttons.jpg | Bin 0 -> 23028 bytes webroot/img/screenshots/calendars.jpg | Bin 0 -> 20842 bytes webroot/img/screenshots/charts.jpg | Bin 0 -> 16965 bytes webroot/img/screenshots/coding.jpg | Bin 0 -> 19180 bytes webroot/img/screenshots/docs.jpg | Bin 0 -> 17392 bytes webroot/img/screenshots/forms.jpg | Bin 0 -> 16340 bytes webroot/img/screenshots/gallery.jpg | Bin 0 -> 24812 bytes webroot/img/screenshots/notifications.jpg | Bin 0 -> 23182 bytes webroot/img/screenshots/pagination.jpg | Bin 0 -> 16989 bytes webroot/img/screenshots/psd.jpg | Bin 0 -> 19826 bytes webroot/img/screenshots/switches.jpg | Bin 0 -> 22332 bytes webroot/img/screenshots/tabs.jpg | Bin 0 -> 18523 bytes webroot/img/screenshots/themes.jpg | Bin 0 -> 18548 bytes webroot/img/screenshots/tips.jpg | Bin 0 -> 19396 bytes webroot/img/screenshots/widgets.jpg | Bin 0 -> 19028 bytes webroot/img/screenshots/width.jpg | Bin 0 -> 19228 bytes webroot/img/scrollable.png | Bin 0 -> 5766 bytes webroot/img/seo.png | Bin 0 -> 7334 bytes webroot/img/social/16/audioboo.png | Bin 0 -> 726 bytes webroot/img/social/16/bebo.png | Bin 0 -> 564 bytes webroot/img/social/16/behance.png | Bin 0 -> 804 bytes webroot/img/social/16/blogger.png | Bin 0 -> 747 bytes webroot/img/social/16/buzz.png | Bin 0 -> 645 bytes webroot/img/social/16/creativecommons.png | Bin 0 -> 621 bytes webroot/img/social/16/dailybooth.png | Bin 0 -> 516 bytes webroot/img/social/16/delicious.png | Bin 0 -> 667 bytes webroot/img/social/16/designfloat.png | Bin 0 -> 870 bytes webroot/img/social/16/deviantart.png | Bin 0 -> 819 bytes webroot/img/social/16/digg.png | Bin 0 -> 813 bytes webroot/img/social/16/dopplr.png | Bin 0 -> 491 bytes webroot/img/social/16/dribbble.png | Bin 0 -> 753 bytes webroot/img/social/16/email.png | Bin 0 -> 504 bytes webroot/img/social/16/ember.png | Bin 0 -> 653 bytes webroot/img/social/16/facebook.png | Bin 0 -> 838 bytes webroot/img/social/16/flickr.png | Bin 0 -> 670 bytes webroot/img/social/16/forrst.png | Bin 0 -> 541 bytes webroot/img/social/16/friendfeed.png | Bin 0 -> 709 bytes webroot/img/social/16/google.png | Bin 0 -> 767 bytes webroot/img/social/16/gowalla.png | Bin 0 -> 715 bytes webroot/img/social/16/grooveshark.png | Bin 0 -> 697 bytes webroot/img/social/16/hyves.png | Bin 0 -> 736 bytes webroot/img/social/16/lastfm.png | Bin 0 -> 827 bytes webroot/img/social/16/linkedin.png | Bin 0 -> 798 bytes webroot/img/social/16/livejournal.png | Bin 0 -> 971 bytes webroot/img/social/16/lockerz.png | Bin 0 -> 602 bytes webroot/img/social/16/megavideo.png | Bin 0 -> 684 bytes webroot/img/social/16/myspace.png | Bin 0 -> 758 bytes webroot/img/social/16/piano.png | Bin 0 -> 560 bytes webroot/img/social/16/playfire.png | Bin 0 -> 667 bytes webroot/img/social/16/playstation.png | Bin 0 -> 830 bytes webroot/img/social/16/reddit.png | Bin 0 -> 918 bytes webroot/img/social/16/rss.png | Bin 0 -> 907 bytes webroot/img/social/16/skype.png | Bin 0 -> 700 bytes webroot/img/social/16/socialvibe.png | Bin 0 -> 888 bytes webroot/img/social/16/soundcloud.png | Bin 0 -> 513 bytes webroot/img/social/16/spotify.png | Bin 0 -> 877 bytes webroot/img/social/16/steam.png | Bin 0 -> 644 bytes webroot/img/social/16/stumbleupon.png | Bin 0 -> 818 bytes webroot/img/social/16/technorati.png | Bin 0 -> 775 bytes webroot/img/social/16/tumblr.png | Bin 0 -> 807 bytes webroot/img/social/16/twitpic.png | Bin 0 -> 719 bytes webroot/img/social/16/twitter.png | Bin 0 -> 804 bytes webroot/img/social/16/typepad.png | Bin 0 -> 656 bytes webroot/img/social/16/vimeo.png | Bin 0 -> 800 bytes webroot/img/social/16/wakoopa.png | Bin 0 -> 602 bytes webroot/img/social/16/wordpress.png | Bin 0 -> 837 bytes webroot/img/social/16/xing.png | Bin 0 -> 765 bytes webroot/img/social/16/yahoo.png | Bin 0 -> 611 bytes webroot/img/social/16/youtube.png | Bin 0 -> 872 bytes webroot/img/social/32/audioboo.png | Bin 0 -> 1392 bytes webroot/img/social/32/bebo.png | Bin 0 -> 997 bytes webroot/img/social/32/behance.png | Bin 0 -> 1218 bytes webroot/img/social/32/blogger.png | Bin 0 -> 928 bytes webroot/img/social/32/buzz.png | Bin 0 -> 610 bytes webroot/img/social/32/creativecommons.png | Bin 0 -> 1604 bytes webroot/img/social/32/dailybooth.png | Bin 0 -> 757 bytes webroot/img/social/32/delicious.png | Bin 0 -> 632 bytes webroot/img/social/32/designfloat.png | Bin 0 -> 1425 bytes webroot/img/social/32/deviantart.png | Bin 0 -> 1273 bytes webroot/img/social/32/digg.png | Bin 0 -> 1176 bytes webroot/img/social/32/dopplr.png | Bin 0 -> 433 bytes webroot/img/social/32/dribbble.png | Bin 0 -> 1717 bytes webroot/img/social/32/email.png | Bin 0 -> 880 bytes webroot/img/social/32/ember.png | Bin 0 -> 1251 bytes webroot/img/social/32/facebook.png | Bin 0 -> 1082 bytes webroot/img/social/32/flickr.png | Bin 0 -> 776 bytes webroot/img/social/32/forrst.png | Bin 0 -> 1001 bytes webroot/img/social/32/friendfeed.png | Bin 0 -> 1139 bytes webroot/img/social/32/google.png | Bin 0 -> 1431 bytes webroot/img/social/32/gowalla.png | Bin 0 -> 1557 bytes webroot/img/social/32/grooveshark.png | Bin 0 -> 2320 bytes webroot/img/social/32/hyves.png | Bin 0 -> 1084 bytes webroot/img/social/32/lastfm.png | Bin 0 -> 1546 bytes webroot/img/social/32/linkedin.png | Bin 0 -> 966 bytes webroot/img/social/32/livejournal.png | Bin 0 -> 2029 bytes webroot/img/social/32/lockerz.png | Bin 0 -> 935 bytes webroot/img/social/32/megavideo.png | Bin 0 -> 992 bytes webroot/img/social/32/myspace.png | Bin 0 -> 951 bytes webroot/img/social/32/piano.png | Bin 0 -> 542 bytes webroot/img/social/32/playfire.png | Bin 0 -> 1313 bytes webroot/img/social/32/playstation.png | Bin 0 -> 1440 bytes webroot/img/social/32/reddit.png | Bin 0 -> 1883 bytes webroot/img/social/32/rss.png | Bin 0 -> 1665 bytes webroot/img/social/32/skype.png | Bin 0 -> 1585 bytes webroot/img/social/32/socialvibe.png | Bin 0 -> 1350 bytes webroot/img/social/32/soundcloud.png | Bin 0 -> 816 bytes webroot/img/social/32/spotify.png | Bin 0 -> 1233 bytes webroot/img/social/32/steam.png | Bin 0 -> 1343 bytes webroot/img/social/32/stumbleupon.png | Bin 0 -> 1445 bytes webroot/img/social/32/technorati.png | Bin 0 -> 1079 bytes webroot/img/social/32/tumblr.png | Bin 0 -> 938 bytes webroot/img/social/32/twitpic.png | Bin 0 -> 958 bytes webroot/img/social/32/twitter.png | Bin 0 -> 964 bytes webroot/img/social/32/typepad.png | Bin 0 -> 1057 bytes webroot/img/social/32/vimeo.png | Bin 0 -> 1366 bytes webroot/img/social/32/wakoopa.png | Bin 0 -> 1447 bytes webroot/img/social/32/wordpress.png | Bin 0 -> 1693 bytes webroot/img/social/32/xing.png | Bin 0 -> 1508 bytes webroot/img/social/32/yahoo.png | Bin 0 -> 1115 bytes webroot/img/social/32/youtube.png | Bin 0 -> 1407 bytes webroot/img/success.png | Bin 0 -> 712 bytes webroot/img/tick.png | Bin 0 -> 3094 bytes webroot/img/tipsy.gif | Bin 0 -> 867 bytes webroot/index.php | 43 + webroot/js/Aller.font.js | 22 + webroot/js/cufon-yui.js | 7 + webroot/js/dd_belatedpng.js | 328 ++++ webroot/js/empty | 1 + webroot/js/functions.js | 46 + webroot/js/jquery-1.3.2.min.js | 19 + webroot/js/jquery-1.4.2.min.js | 154 ++ webroot/js/jquery-1.4.4.min.js | 167 ++ webroot/js/jquery-1.6.1.min.js | 18 + webroot/js/jquery.anchor.js | 39 + webroot/js/jquery.form.js | 37 + webroot/js/jquery.lightbox-0.5.min.js | 42 + webroot/js/jquery.prettyPhoto.js | 27 + webroot/js/jquery.tipsy.js | 104 ++ webroot/js/jquery.tools.min.js | 18 + webroot/js/modernizr-1.5.min.js | 28 + webroot/js/scroll.js | 20 + 598 files changed, 19414 insertions(+) create mode 100644 ACL.php create mode 100644 CSRF create mode 100644 config/.DS_Store create mode 100644 config/bootstrap.php create mode 100644 config/bootstrap/.DS_Store create mode 100644 config/bootstrap/action.php create mode 100644 config/bootstrap/auth.php create mode 100644 config/bootstrap/cache.php create mode 100644 config/bootstrap/connections.php create mode 100644 config/bootstrap/console.php create mode 100644 config/bootstrap/error.php create mode 100644 config/bootstrap/errors.php create mode 100644 config/bootstrap/g11n.php create mode 100644 config/bootstrap/libraries.php create mode 100644 config/bootstrap/media.php create mode 100644 config/bootstrap/session.php create mode 100644 config/routes.php create mode 100644 controllers/AdminController.php create mode 100644 controllers/AnimelistController.php create mode 100644 controllers/ContentController.php create mode 100644 controllers/FeedsController.php create mode 100644 controllers/PagesController.php create mode 100644 controllers/PhotosController.php create mode 100644 controllers/ProfileController.php create mode 100644 controllers/ProfilesController.php create mode 100644 controllers/SearchController.php create mode 100644 controllers/TopicController.php create mode 100644 controllers/UsersController.php create mode 100644 extensions/adapter/empty create mode 100644 extensions/command/ImportUsers.php create mode 100644 extensions/command/empty create mode 100644 extensions/data/source/empty create mode 100644 extensions/helper/empty create mode 100644 index.php create mode 100644 libraries/.DS_Store create mode 100644 libraries/_source/empty create mode 160000 libraries/li3_access create mode 160000 libraries/li3_flash_message create mode 160000 libraries/li3_paginate create mode 100644 libraries/openID/openid.php create mode 100644 models/Anime.php create mode 100644 models/Entry.php create mode 100644 models/Photo.php create mode 100644 models/Post.php create mode 100644 models/Profile.php create mode 100644 models/ProfilePic.php create mode 100644 models/Topic.php create mode 100644 models/User.php create mode 100644 models/confirmKey.php create mode 100644 models/contentList.php create mode 100644 models/untitled.php create mode 100644 resources/g11n/empty create mode 100644 resources/tmp/logs/empty create mode 100644 resources/tmp/tests/empty create mode 100644 tests/cases/controllers/PhotosControllerTest.php create mode 100644 tests/cases/controllers/ProfilesControllerTest.php create mode 100644 tests/cases/controllers/empty create mode 100644 tests/cases/extensions/adapter/empty create mode 100644 tests/cases/extensions/command/empty create mode 100644 tests/cases/extensions/data/source/empty create mode 100644 tests/cases/extensions/helper/empty create mode 100644 tests/cases/models/PhotoTest.php create mode 100644 tests/cases/models/ProfileTest.php create mode 100644 tests/cases/models/empty create mode 100644 tests/functional/empty create mode 100644 tests/integration/empty create mode 100644 tests/mocks/empty create mode 100644 views/.DS_Store create mode 100644 views/Admin/editUser.html.php create mode 100644 views/Admin/index.html.php create mode 100644 views/Admin/users.html.php create mode 100644 views/Anime_list/add.html.php create mode 100644 views/Anime_list/index.html create mode 100644 views/Anime_list/index.html.php create mode 100644 views/Anime_list/view.html.php create mode 100644 views/Content/anime.html.php create mode 100644 views/Content/index.html.php create mode 100644 views/Feeds/.DS_Store create mode 100644 views/Feeds/Carbon_files/avatar_9318cab29a1a_96.png create mode 100644 views/Feeds/Carbon_files/bg_caption.png create mode 100644 views/Feeds/Carbon_files/bg_search.png create mode 100644 views/Feeds/Carbon_files/bg_search_focus.png create mode 100644 views/Feeds/Carbon_files/bg_sidebar.png create mode 100644 views/Feeds/Carbon_files/bg_texture.png create mode 100644 views/Feeds/Carbon_files/button_nav_left.png create mode 100644 views/Feeds/Carbon_files/button_nav_right.png create mode 100644 views/Feeds/Carbon_files/caption_bot.png create mode 100644 views/Feeds/Carbon_files/caption_top.png create mode 100644 views/Feeds/Carbon_files/count-1.js create mode 100644 views/Feeds/Carbon_files/count.js create mode 100644 views/Feeds/Carbon_files/divider.png create mode 100644 views/Feeds/Carbon_files/icon_comment.png create mode 100644 views/Feeds/Carbon_files/icon_fav.png create mode 100644 views/Feeds/Carbon_files/icon_link.png create mode 100644 views/Feeds/Carbon_files/icon_rss.png create mode 100644 views/Feeds/Carbon_files/icon_source.png create mode 100644 views/Feeds/Carbon_files/icon_tag.png create mode 100644 views/Feeds/Carbon_files/jquery.min.js create mode 100644 views/Feeds/Carbon_files/photo_corner.png create mode 100644 views/Feeds/Carbon_files/portrait_frame.png create mode 100644 views/Feeds/Carbon_files/postmarker.png create mode 100644 views/Feeds/Carbon_files/postmarker_audio.png create mode 100644 views/Feeds/Carbon_files/postmarker_chat.png create mode 100644 views/Feeds/Carbon_files/postmarker_img.png create mode 100644 views/Feeds/Carbon_files/postmarker_quote.png create mode 100644 views/Feeds/Carbon_files/postmarker_text.png create mode 100644 views/Feeds/Carbon_files/postmarker_url.png create mode 100644 views/Feeds/Carbon_files/postmarker_video.png create mode 100644 views/Feeds/Carbon_files/quant.js create mode 100644 views/Feeds/Carbon_files/sidebar_icon_sprite.png create mode 100644 views/Feeds/Carbon_files/sidebar_top.png create mode 100644 views/Feeds/Carbon_files/title_bottom.png create mode 100644 views/Feeds/Carbon_files/title_slice.png create mode 100644 views/Feeds/Carbon_files/title_top.png create mode 100644 views/Feeds/Carbon_files/tumblelog.js create mode 100644 views/Feeds/Carbon_files/tumblr_lbn4lf36zN1qeglo0o1_500.jpg create mode 100644 views/Feeds/Carbon_files/tumblr_lbn5nwjpXc1qeglo0o1_1289347008_cover.jpg create mode 100644 views/Feeds/index.html.php create mode 100644 views/Feeds/index.html1.php create mode 100644 views/Photos/add.html.php create mode 100644 views/Photos/index.html.php create mode 100644 views/Photos/view.html.php create mode 100644 views/Profile/add.html.php create mode 100644 views/Profile/edit.html.php create mode 100644 views/Profile/view.html.php create mode 100644 views/Search/index.html.php create mode 100644 views/Users/Photos/index.html.php create mode 100644 views/Users/confirm.html.php create mode 100644 views/Users/feed.html.php create mode 100644 views/Users/index.html.php create mode 100644 views/Users/login.html.php create mode 100644 views/Users/logintest.html.php create mode 100644 views/Users/openid.html.php create mode 100644 views/Users/post.html.php create mode 100644 views/Users/profile.html.php create mode 100644 views/Users/signup.html.php create mode 100644 views/Users/step2.html.php create mode 100644 views/Users/test.html.php create mode 100644 views/_errors/development.html.php create mode 100644 views/elements/empty create mode 100644 views/layouts/.DS_Store create mode 100644 views/layouts/admin.html.php create mode 100644 views/layouts/default.html copy.php create mode 100644 views/layouts/default.html.php create mode 100644 views/layouts/default.xml.php create mode 100644 views/layouts/error.html.php create mode 100644 views/layouts/form.html.php create mode 100644 views/layouts/index.php_files/accept.png create mode 100644 views/layouts/index.php_files/add_16.png create mode 100644 views/layouts/index.php_files/alert-error-bg.png create mode 100644 views/layouts/index.php_files/alert-info-bg.png create mode 100644 views/layouts/index.php_files/alert-notice-bg.png create mode 100644 views/layouts/index.php_files/alert-success-bg.png create mode 100644 views/layouts/index.php_files/basic.css create mode 100644 views/layouts/index.php_files/blank_cell.png create mode 100644 views/layouts/index.php_files/change_password.png create mode 100644 views/layouts/index.php_files/delete.png create mode 100644 views/layouts/index.php_files/editable.png create mode 100644 views/layouts/index.php_files/email_32.png create mode 100644 views/layouts/index.php_files/exclamation.png create mode 100644 views/layouts/index.php_files/ie.css create mode 100644 views/layouts/index.php_files/info_bar_bg.png create mode 100644 views/layouts/index.php_files/information.png create mode 100644 views/layouts/index.php_files/inner-split-bg.png create mode 100644 views/layouts/index.php_files/jquery.ba-bbq.min.js create mode 100644 views/layouts/index.php_files/jquery.min.js create mode 100644 views/layouts/index.php_files/large-button-bg.png create mode 100644 views/layouts/index.php_files/light-bgs.png create mode 100644 views/layouts/index.php_files/list_hover.png create mode 100644 views/layouts/index.php_files/list_row_bg.png create mode 100644 views/layouts/index.php_files/list_top_bg.png create mode 100644 views/layouts/index.php_files/main.js create mode 100644 views/layouts/index.php_files/messages.png create mode 100644 views/layouts/index.php_files/nav.png create mode 100644 views/layouts/index.php_files/nav_divider.png create mode 100644 views/layouts/index.php_files/new-message.png create mode 100644 views/layouts/index.php_files/new_admin.png create mode 100644 views/layouts/index.php_files/new_client.png create mode 100644 views/layouts/index.php_files/new_invoice.png create mode 100644 views/layouts/index.php_files/new_project.png create mode 100644 views/layouts/index.php_files/progressbar.png create mode 100644 views/layouts/index.php_files/selected_bg.png create mode 100644 views/layouts/index.php_files/selected_side_highlight.png create mode 100644 views/layouts/index.php_files/small-button.png create mode 100644 views/layouts/index.php_files/style.css create mode 100644 views/layouts/index.php_files/table-header-bg.png create mode 100644 views/layouts/index.php_files/tabs_bg.png create mode 100644 views/layouts/index.php_files/tabs_bg2.png create mode 100644 views/layouts/index.php_files/tabs_divider.png create mode 100644 views/layouts/index.php_files/unselected_tabs_bg.png create mode 100644 views/layouts/presentation_files/118.png create mode 100644 views/layouts/presentation_files/123.png create mode 100644 views/layouts/presentation_files/14.png create mode 100644 views/layouts/presentation_files/18.png create mode 100644 views/layouts/presentation_files/2.png create mode 100644 views/layouts/presentation_files/21.png create mode 100644 views/layouts/presentation_files/25.png create mode 100644 views/layouts/presentation_files/27.png create mode 100644 views/layouts/presentation_files/3.png create mode 100644 views/layouts/presentation_files/36.png create mode 100644 views/layouts/presentation_files/42.png create mode 100644 views/layouts/presentation_files/54.png create mode 100644 views/layouts/presentation_files/75.png create mode 100644 views/layouts/presentation_files/80.png create mode 100644 views/layouts/presentation_files/81.png create mode 100644 views/layouts/presentation_files/ColaborateLight_400.font.js create mode 100644 views/layouts/presentation_files/IEfix.css create mode 100644 views/layouts/presentation_files/Pencil.png create mode 100644 views/layouts/presentation_files/Preferences.png create mode 100644 views/layouts/presentation_files/Trash.png create mode 100644 views/layouts/presentation_files/avatar.png create mode 100644 views/layouts/presentation_files/button_repeater.png create mode 100644 views/layouts/presentation_files/buttons.gif create mode 100644 views/layouts/presentation_files/close.png create mode 100644 views/layouts/presentation_files/coin.png create mode 100644 views/layouts/presentation_files/cufon-yui.js create mode 100644 views/layouts/presentation_files/custom.js create mode 100644 views/layouts/presentation_files/dashboard.png create mode 100644 views/layouts/presentation_files/dialog_bg.png create mode 100644 views/layouts/presentation_files/download.png create mode 100644 views/layouts/presentation_files/easyTooltip.js create mode 100644 views/layouts/presentation_files/error.png create mode 100644 views/layouts/presentation_files/excanvas.js create mode 100644 views/layouts/presentation_files/iPhoneCheckboxes.css create mode 100644 views/layouts/presentation_files/info.png create mode 100644 views/layouts/presentation_files/iphone-style-checkboxes.js create mode 100644 views/layouts/presentation_files/jQuery_UI_uniq.css create mode 100644 views/layouts/presentation_files/jquery-1.4.2.min.js create mode 100644 views/layouts/presentation_files/jquery-ui-1.8.5.custom.min.js create mode 100644 views/layouts/presentation_files/jquery.cleditor.css create mode 100644 views/layouts/presentation_files/jquery.cleditor.min.js create mode 100644 views/layouts/presentation_files/jquery.tablesorter.min.js create mode 100644 views/layouts/presentation_files/logo.png create mode 100644 views/layouts/presentation_files/logo_bg.png create mode 100644 views/layouts/presentation_files/media.png create mode 100644 views/layouts/presentation_files/menu_arrow.png create mode 100644 views/layouts/presentation_files/menu_current.png create mode 100644 views/layouts/presentation_files/menu_spacer.png create mode 100644 views/layouts/presentation_files/message.png create mode 100644 views/layouts/presentation_files/notes.png create mode 100644 views/layouts/presentation_files/off.png create mode 100644 views/layouts/presentation_files/on.png create mode 100644 views/layouts/presentation_files/posts.png create mode 100644 views/layouts/presentation_files/print.png create mode 100644 views/layouts/presentation_files/purchase.png create mode 100644 views/layouts/presentation_files/secure.png create mode 100644 views/layouts/presentation_files/settings.png create mode 100644 views/layouts/presentation_files/slider.png create mode 100644 views/layouts/presentation_files/stripe.png create mode 100644 views/layouts/presentation_files/style.css create mode 100644 views/layouts/presentation_files/success.png create mode 100644 views/layouts/presentation_files/tip.png create mode 100644 views/layouts/presentation_files/ui-icons.png create mode 100644 views/layouts/presentation_files/users.png create mode 100644 views/layouts/presentation_files/visualize.css create mode 100644 views/layouts/presentation_files/visualize.jQuery.js create mode 100644 views/layouts/presentation_files/warning.png create mode 100644 views/layouts/untitled.html.php create mode 100644 views/pages/contest.html.php create mode 100644 views/pages/feed.html.php create mode 100644 views/pages/home.html.php create mode 100644 webroot/.DS_Store create mode 100644 webroot/.htaccess create mode 100644 webroot/15452_files/default_avatar_48.gif create mode 100644 webroot/15452_files/simplethings-arrow-next.png create mode 100644 webroot/15452_files/simplethings-arrow-prev.png create mode 100644 webroot/15452_files/simplethings-clock.png create mode 100644 webroot/15452_files/simplethings-date-flag.png create mode 100644 webroot/15452_files/simplethings-footer-bg.png create mode 100644 webroot/15452_files/simplethings-header-bg.png create mode 100644 webroot/15452_files/simplethings-page-btn.png create mode 100644 webroot/15452_files/simplethings-question-bg-blue.png create mode 100644 webroot/15452_files/simplethings-question-bottom-blue.png create mode 100644 webroot/15452_files/simplethings-question-top-blue.png create mode 100644 webroot/15452_files/simplethings-quote.png create mode 100644 webroot/15452_files/simplethings-reblogged.png create mode 100644 webroot/15452_files/simplethings-rss-btn.png create mode 100644 webroot/15452_files/simplethings-rss-icon.png create mode 100644 webroot/15452_files/simplethings-search-full.png create mode 100644 webroot/15452_files/simplethings-tags.png create mode 100644 webroot/15452_files/simplethings-user-pic.png create mode 100644 webroot/15452_files/tumblelog.js create mode 100644 webroot/15452_files/tumblr_ksc4i2SkVU1qz8ouqo1_r2_cover.jpg create mode 100644 webroot/15452_files/tumblr_kzjlfiTnfe1qz4rgho1_250.jpg create mode 100644 webroot/15452_files/tumblr_kzjlfiTnfe1qz4rgho1_500.jpg create mode 100644 webroot/carbon.css create mode 100644 webroot/code/.DS_Store create mode 100755 webroot/code/css/960.css create mode 100755 webroot/code/css/reset.css create mode 100755 webroot/code/css/text.css create mode 100755 webroot/code/css/uncompressed/960.css create mode 100755 webroot/code/css/uncompressed/reset.css create mode 100755 webroot/code/css/uncompressed/text.css create mode 100755 webroot/code/demo.html create mode 100755 webroot/code/img/12_col.gif create mode 100755 webroot/code/img/16_col.gif create mode 100755 webroot/css/960.css create mode 100755 webroot/css/base.css create mode 100644 webroot/css/debug.css create mode 100755 webroot/css/grid.css create mode 100644 webroot/css/lithium.css create mode 100644 webroot/css/prettyPhoto.css create mode 100755 webroot/css/reset.css create mode 100755 webroot/css/style.css create mode 100755 webroot/css/text.css create mode 100755 webroot/css/themes/black.css create mode 100755 webroot/css/themes/blue.css create mode 100755 webroot/css/themes/dark.css create mode 100755 webroot/css/themes/green.css create mode 100755 webroot/css/themes/grey.css create mode 100755 webroot/css/themes/light.css create mode 100755 webroot/css/themes/purple.css create mode 100755 webroot/css/themes/red.css create mode 100644 webroot/favicon.ico create mode 100755 webroot/images/dark_rounded/btnNext.png create mode 100755 webroot/images/dark_rounded/btnPrevious.png create mode 100755 webroot/images/dark_rounded/contentPattern.png create mode 100755 webroot/images/dark_rounded/default_thumbnail.gif create mode 100755 webroot/images/dark_rounded/loader.gif create mode 100755 webroot/images/dark_rounded/sprite.png create mode 100755 webroot/images/dark_square/btnNext.png create mode 100755 webroot/images/dark_square/btnPrevious.png create mode 100755 webroot/images/dark_square/contentPattern.png create mode 100755 webroot/images/dark_square/default_thumbnail.gif create mode 100755 webroot/images/dark_square/loader.gif create mode 100755 webroot/images/dark_square/sprite.png create mode 100644 webroot/images/default/default_thumb.png create mode 100644 webroot/images/default/loader.gif create mode 100644 webroot/images/default/sprite.png create mode 100644 webroot/images/default/sprite_next.png create mode 100644 webroot/images/default/sprite_prev.png create mode 100644 webroot/images/default/sprite_x.png create mode 100644 webroot/images/default/sprite_y.png create mode 100755 webroot/images/facebook/btnNext.png create mode 100755 webroot/images/facebook/btnPrevious.png create mode 100755 webroot/images/facebook/contentPatternBottom.png create mode 100755 webroot/images/facebook/contentPatternLeft.png create mode 100755 webroot/images/facebook/contentPatternRight.png create mode 100755 webroot/images/facebook/contentPatternTop.png create mode 100755 webroot/images/facebook/default_thumbnail.gif create mode 100755 webroot/images/facebook/loader.gif create mode 100755 webroot/images/facebook/sprite.png create mode 100755 webroot/images/light_rounded/btnNext.png create mode 100755 webroot/images/light_rounded/btnPrevious.png create mode 100755 webroot/images/light_rounded/default_thumbnail.gif create mode 100755 webroot/images/light_rounded/loader.gif create mode 100755 webroot/images/light_rounded/sprite.png create mode 100755 webroot/images/light_square/btnNext.png create mode 100755 webroot/images/light_square/btnPrevious.png create mode 100755 webroot/images/light_square/default_thumbnail.gif create mode 100755 webroot/images/light_square/loader.gif create mode 100755 webroot/images/light_square/sprite.png create mode 100644 webroot/img/.DS_Store create mode 100755 webroot/img/about-small.jpg create mode 100755 webroot/img/about.jpg create mode 100644 webroot/img/appletv2.jpeg create mode 100755 webroot/img/arrow-active.png create mode 100755 webroot/img/arrow.png create mode 100755 webroot/img/bg-dark.jpg create mode 100755 webroot/img/bg-input.gif create mode 100755 webroot/img/bg.jpg create mode 100755 webroot/img/bullet_arrow_right.png create mode 100755 webroot/img/coding.png create mode 100755 webroot/img/design.png create mode 100644 webroot/img/empty create mode 100755 webroot/img/error.png create mode 100755 webroot/img/features/box_address.png create mode 100755 webroot/img/features/lock_closed.png create mode 100755 webroot/img/features/magic_wand.png create mode 100755 webroot/img/features/monitor.png create mode 100755 webroot/img/features/preferences.png create mode 100755 webroot/img/features/security.png create mode 100755 webroot/img/grad-black-hover.gif create mode 100755 webroot/img/grad-black-rev.gif create mode 100755 webroot/img/grad-black.gif create mode 100755 webroot/img/grad-blue-hover.gif create mode 100755 webroot/img/grad-blue-rev.gif create mode 100755 webroot/img/grad-blue.gif create mode 100755 webroot/img/grad-green-hover.gif create mode 100755 webroot/img/grad-green-rev.gif create mode 100755 webroot/img/grad-green.gif create mode 100755 webroot/img/grad-grey-hover.gif create mode 100755 webroot/img/grad-grey-rev.gif create mode 100755 webroot/img/grad-grey.gif create mode 100755 webroot/img/grad-purple-hover.gif create mode 100755 webroot/img/grad-purple-rev.gif create mode 100755 webroot/img/grad-purple.gif create mode 100755 webroot/img/grad-red-hover.gif create mode 100755 webroot/img/grad-red-rev.gif create mode 100755 webroot/img/grad-red.gif create mode 100755 webroot/img/grad-rev.png create mode 100755 webroot/img/grad.png create mode 100755 webroot/img/icon-des.png create mode 100755 webroot/img/icons/add.png create mode 100755 webroot/img/icons/asterisk_yellow.png create mode 100755 webroot/img/icons/bullet_arrow_right.png create mode 100755 webroot/img/icons/bullet_toggle_minus.png create mode 100755 webroot/img/icons/bullet_toggle_plus.png create mode 100755 webroot/img/icons/calendar.png create mode 100755 webroot/img/icons/cancel.png create mode 100755 webroot/img/icons/close.png create mode 100755 webroot/img/icons/cog.png create mode 100755 webroot/img/icons/comment_delete.png create mode 100755 webroot/img/icons/comment_edit.png create mode 100755 webroot/img/icons/comments.png create mode 100755 webroot/img/icons/cut.png create mode 100755 webroot/img/icons/error.png create mode 100755 webroot/img/icons/folder.png create mode 100755 webroot/img/icons/group.png create mode 100755 webroot/img/icons/image.png create mode 100755 webroot/img/icons/images.png create mode 100755 webroot/img/icons/information.png create mode 100755 webroot/img/icons/page.png create mode 100755 webroot/img/icons/page_code.png create mode 100755 webroot/img/icons/page_copy.png create mode 100755 webroot/img/icons/page_delete.png create mode 100755 webroot/img/icons/page_edit.png create mode 100755 webroot/img/icons/page_paste.png create mode 100755 webroot/img/icons/page_white.png create mode 100755 webroot/img/icons/page_white_acrobat.png create mode 100755 webroot/img/icons/page_white_flash.png create mode 100755 webroot/img/icons/page_white_gear.png create mode 100755 webroot/img/icons/page_white_php.png create mode 100755 webroot/img/icons/page_white_stack.png create mode 100755 webroot/img/icons/page_white_zip.png create mode 100755 webroot/img/icons/success.png create mode 100755 webroot/img/icons/tip.png create mode 100755 webroot/img/icons/user.png create mode 100755 webroot/img/icons/user_delete.png create mode 100755 webroot/img/icons/user_edit.png create mode 100755 webroot/img/icons/warning.png create mode 100755 webroot/img/icons/xhtml.png create mode 100755 webroot/img/lightbox/lightbox-blank.gif create mode 100755 webroot/img/lightbox/lightbox-btn-close.gif create mode 100755 webroot/img/lightbox/lightbox-btn-next.gif create mode 100755 webroot/img/lightbox/lightbox-btn-prev.gif create mode 100755 webroot/img/lightbox/lightbox-ico-loading.gif create mode 100755 webroot/img/office.jpg create mode 100755 webroot/img/old/coding.png create mode 100755 webroot/img/old/design.png create mode 100755 webroot/img/old/icon-des.png create mode 100755 webroot/img/old/seo.png create mode 100755 webroot/img/portfolio/admina-big.jpg create mode 100755 webroot/img/portfolio/admina-mid.jpg create mode 100755 webroot/img/portfolio/admina.jpg create mode 100755 webroot/img/portfolio/adminbase-big.jpg create mode 100755 webroot/img/portfolio/adminbase-mid.jpg create mode 100755 webroot/img/portfolio/adminbase.jpg create mode 100755 webroot/img/portfolio/vcard-big.jpg create mode 100755 webroot/img/portfolio/vcard-mid.jpg create mode 100755 webroot/img/portfolio/vcard.jpg create mode 100755 webroot/img/portfolio/vcard2-big.jpg create mode 100755 webroot/img/portfolio/vcard2-mid.jpg create mode 100755 webroot/img/portfolio/vcard2.jpg create mode 100755 webroot/img/process.gif create mode 100755 webroot/img/quote.gif create mode 100755 webroot/img/screenshot.png create mode 100755 webroot/img/screenshots/buttons.jpg create mode 100755 webroot/img/screenshots/calendars.jpg create mode 100755 webroot/img/screenshots/charts.jpg create mode 100755 webroot/img/screenshots/coding.jpg create mode 100755 webroot/img/screenshots/docs.jpg create mode 100755 webroot/img/screenshots/forms.jpg create mode 100755 webroot/img/screenshots/gallery.jpg create mode 100755 webroot/img/screenshots/notifications.jpg create mode 100755 webroot/img/screenshots/pagination.jpg create mode 100755 webroot/img/screenshots/psd.jpg create mode 100755 webroot/img/screenshots/switches.jpg create mode 100755 webroot/img/screenshots/tabs.jpg create mode 100755 webroot/img/screenshots/themes.jpg create mode 100755 webroot/img/screenshots/tips.jpg create mode 100755 webroot/img/screenshots/widgets.jpg create mode 100755 webroot/img/screenshots/width.jpg create mode 100755 webroot/img/scrollable.png create mode 100755 webroot/img/seo.png create mode 100755 webroot/img/social/16/audioboo.png create mode 100755 webroot/img/social/16/bebo.png create mode 100755 webroot/img/social/16/behance.png create mode 100755 webroot/img/social/16/blogger.png create mode 100755 webroot/img/social/16/buzz.png create mode 100755 webroot/img/social/16/creativecommons.png create mode 100755 webroot/img/social/16/dailybooth.png create mode 100755 webroot/img/social/16/delicious.png create mode 100755 webroot/img/social/16/designfloat.png create mode 100755 webroot/img/social/16/deviantart.png create mode 100755 webroot/img/social/16/digg.png create mode 100755 webroot/img/social/16/dopplr.png create mode 100755 webroot/img/social/16/dribbble.png create mode 100755 webroot/img/social/16/email.png create mode 100755 webroot/img/social/16/ember.png create mode 100755 webroot/img/social/16/facebook.png create mode 100755 webroot/img/social/16/flickr.png create mode 100755 webroot/img/social/16/forrst.png create mode 100755 webroot/img/social/16/friendfeed.png create mode 100755 webroot/img/social/16/google.png create mode 100755 webroot/img/social/16/gowalla.png create mode 100755 webroot/img/social/16/grooveshark.png create mode 100755 webroot/img/social/16/hyves.png create mode 100755 webroot/img/social/16/lastfm.png create mode 100755 webroot/img/social/16/linkedin.png create mode 100755 webroot/img/social/16/livejournal.png create mode 100755 webroot/img/social/16/lockerz.png create mode 100755 webroot/img/social/16/megavideo.png create mode 100755 webroot/img/social/16/myspace.png create mode 100755 webroot/img/social/16/piano.png create mode 100755 webroot/img/social/16/playfire.png create mode 100755 webroot/img/social/16/playstation.png create mode 100755 webroot/img/social/16/reddit.png create mode 100755 webroot/img/social/16/rss.png create mode 100755 webroot/img/social/16/skype.png create mode 100755 webroot/img/social/16/socialvibe.png create mode 100755 webroot/img/social/16/soundcloud.png create mode 100755 webroot/img/social/16/spotify.png create mode 100755 webroot/img/social/16/steam.png create mode 100755 webroot/img/social/16/stumbleupon.png create mode 100755 webroot/img/social/16/technorati.png create mode 100755 webroot/img/social/16/tumblr.png create mode 100755 webroot/img/social/16/twitpic.png create mode 100755 webroot/img/social/16/twitter.png create mode 100755 webroot/img/social/16/typepad.png create mode 100755 webroot/img/social/16/vimeo.png create mode 100755 webroot/img/social/16/wakoopa.png create mode 100755 webroot/img/social/16/wordpress.png create mode 100755 webroot/img/social/16/xing.png create mode 100755 webroot/img/social/16/yahoo.png create mode 100755 webroot/img/social/16/youtube.png create mode 100755 webroot/img/social/32/audioboo.png create mode 100755 webroot/img/social/32/bebo.png create mode 100755 webroot/img/social/32/behance.png create mode 100755 webroot/img/social/32/blogger.png create mode 100755 webroot/img/social/32/buzz.png create mode 100755 webroot/img/social/32/creativecommons.png create mode 100755 webroot/img/social/32/dailybooth.png create mode 100755 webroot/img/social/32/delicious.png create mode 100755 webroot/img/social/32/designfloat.png create mode 100755 webroot/img/social/32/deviantart.png create mode 100755 webroot/img/social/32/digg.png create mode 100755 webroot/img/social/32/dopplr.png create mode 100755 webroot/img/social/32/dribbble.png create mode 100755 webroot/img/social/32/email.png create mode 100755 webroot/img/social/32/ember.png create mode 100755 webroot/img/social/32/facebook.png create mode 100755 webroot/img/social/32/flickr.png create mode 100755 webroot/img/social/32/forrst.png create mode 100755 webroot/img/social/32/friendfeed.png create mode 100755 webroot/img/social/32/google.png create mode 100755 webroot/img/social/32/gowalla.png create mode 100755 webroot/img/social/32/grooveshark.png create mode 100755 webroot/img/social/32/hyves.png create mode 100755 webroot/img/social/32/lastfm.png create mode 100755 webroot/img/social/32/linkedin.png create mode 100755 webroot/img/social/32/livejournal.png create mode 100755 webroot/img/social/32/lockerz.png create mode 100755 webroot/img/social/32/megavideo.png create mode 100755 webroot/img/social/32/myspace.png create mode 100755 webroot/img/social/32/piano.png create mode 100755 webroot/img/social/32/playfire.png create mode 100755 webroot/img/social/32/playstation.png create mode 100755 webroot/img/social/32/reddit.png create mode 100755 webroot/img/social/32/rss.png create mode 100755 webroot/img/social/32/skype.png create mode 100755 webroot/img/social/32/socialvibe.png create mode 100755 webroot/img/social/32/soundcloud.png create mode 100755 webroot/img/social/32/spotify.png create mode 100755 webroot/img/social/32/steam.png create mode 100755 webroot/img/social/32/stumbleupon.png create mode 100755 webroot/img/social/32/technorati.png create mode 100755 webroot/img/social/32/tumblr.png create mode 100755 webroot/img/social/32/twitpic.png create mode 100755 webroot/img/social/32/twitter.png create mode 100755 webroot/img/social/32/typepad.png create mode 100755 webroot/img/social/32/vimeo.png create mode 100755 webroot/img/social/32/wakoopa.png create mode 100755 webroot/img/social/32/wordpress.png create mode 100755 webroot/img/social/32/xing.png create mode 100755 webroot/img/social/32/yahoo.png create mode 100755 webroot/img/social/32/youtube.png create mode 100755 webroot/img/success.png create mode 100755 webroot/img/tick.png create mode 100755 webroot/img/tipsy.gif create mode 100644 webroot/index.php create mode 100755 webroot/js/Aller.font.js create mode 100755 webroot/js/cufon-yui.js create mode 100755 webroot/js/dd_belatedpng.js create mode 100644 webroot/js/empty create mode 100755 webroot/js/functions.js create mode 100755 webroot/js/jquery-1.3.2.min.js create mode 100755 webroot/js/jquery-1.4.2.min.js create mode 100644 webroot/js/jquery-1.4.4.min.js create mode 100644 webroot/js/jquery-1.6.1.min.js create mode 100755 webroot/js/jquery.anchor.js create mode 100755 webroot/js/jquery.form.js create mode 100755 webroot/js/jquery.lightbox-0.5.min.js create mode 100644 webroot/js/jquery.prettyPhoto.js create mode 100755 webroot/js/jquery.tipsy.js create mode 100755 webroot/js/jquery.tools.min.js create mode 100755 webroot/js/modernizr-1.5.min.js create mode 100644 webroot/js/scroll.js diff --git a/ACL.php b/ACL.php new file mode 100644 index 0000000..aacd406 --- /dev/null +++ b/ACL.php @@ -0,0 +1,319 @@ +To Configure + + array( + 'adapter' => 'Permissions', + 'model' => 'app\models\Perms', + 'defaultNoUser' => array(), + 'defaultUser' => array( + 'route' => array( + 'users' => array( + 'logout', 'account' + ) + ) + ), + 'userIdentifier' => 'PrincipalID' + ) +)); + +Perms::applyFilter('find', function($self, $params, $chain) { + if($params['type'] != 'first') { + return $chain->next($self, $params, $chain); + } + $cacheKey = 'permissions_' . $params['options']['conditions']['id']; + $cache = Cache::read('default', $cacheKey); + if($cache) { + return $cache; + } + $result = $chain->next($self, $params, $chain); + Cache::write('default', $cacheKey, $result, '+1 day'); + return $result; +}); +?> + + 'app\models\perms', + 'defaultNoUser' => array(), + 'defaultUser' => array(), + 'userIdentifier' => 'id' + ); + parent::__construct($config + $defaults); + $this->_model = $this->_config['model']; + } + + /** + * @throws \lithium\core\ConfigException + * @param $user + * @param $request + * @param array $options + * @return array + */ + public function check($user, $request, array $options = array()) { + $config = $this->_config; + $model = $this->_model; + $params = compact('user', 'request', 'options'); + return $this->_filter(__METHOD__, $params, function($self, $params) use($config, $model) { + $user = $params['user']; + $request = $params['request']; + $options = $params['options']; + $reqIsObject = is_object($request); + $path = array(); + + switch (true) { + case $reqIsObject: + $path = array( + Permissions::pathRoute, + $request->params['controller'], + $request->params['action'] + ); + break; + case (!$reqIsObject && is_string($request)): + $path = explode('.', $request); + array_unshift($path, Permissions::pathCustom); + break; + case (!$reqIsObject && is_array($request)): + $path = $request; + break; + } + switch(true) { + case !$user: + $hasAccess = $self->_processPath($path, $config['defaultNoUser']); + return $hasAccess ? false : $options; + case ($result = $self->_processPath($path, $config['defaultUser'])): + return $result ? false : $options; + default: + $userId = $config['userIdentifier']; + if(!isset($user[$userId])) { + $message = "The user identifier '{$userId}' is not available."; + throw new ConfigException($message); + } + $perms = $model::find('first', array( + 'conditions' => array( + 'id' => $user[$userId] + ) + )); + if(!$perms) { + return false; + } + $userPath = unserialize($perms->perms); + $result = $self->_processPath($path, $userPath); + return $result ? array() : $options; + } + }); + } + + /** + * Adds a custom route to the users permission list. + * + * $customRoute is formatted as a dot path string, this is done as 'foo.bar.baz' for example. + * Asterisks are usable at the end of the path however not in the middle. A user with access + * to 'foo.bar.*' will have access to foo.bar.baz, foo.bar.aaa etc. + * + * @param $user + * @param $customRoute + * @return bool + */ + public function addCustomPath($user, $customRoute) { + if(!is_string($customRoute)) { + return false; + } + $parts = explode('.', $customRoute); + $value = array_pop($parts); + $parts = array_merge((array)self::pathCustom, $parts, (array)0); + return $this->add($user, Set::expand(array(implode('.', $parts) => $value))); + } + + /** + * Adds an action to the users permission list. If the action is set to * the user will have + * access to all of the controllers actions. + */ + public function addAction($user, $controller, $action) { + return $this->add($user, array( + self::pathRoute => array( + $controller => array( + $action + ) + ) + )); + } + + /** + * $user must contain the 'userIdentifier' key defined in config + * $paths are the paths which are to be added this is an array representation of the path and + * is from the origin, so 'route' or 'custom' must be specified. Multiple paths can be defined + * using this function + * + * @throws \lithium\core\ConfigException + * @param $user + * @param array $paths + * @return bool + */ + public function add($user, array $paths = array()) { + $model = $this->_model; + $userId = $this->_config['userIdentifier']; + $params = compact('model', 'userId', 'user', 'paths'); + return $this->_filter(__METHOD__, $params, function($self, $params) { + $model = $params['model']; + $userId = $params['userId']; + $user = $params['user']; + $paths = $params['paths']; + + if(!isset($user[$userId])) { + throw new ConfigException("The user identifier '{$userId}' is not available."); + } + $result = $model::find('first', array( + 'conditions' => array( + 'id' => $user[$userId] + ) + )); + if(!$result) { + $perms = $model::create(array( + 'id' => $user[$userId], + 'perms' => serialize($paths) + )); + return $perms->save(); + } + $allowedPaths = unserialize($result->perms); + $allowedPaths = array_merge_recursive($allowedPaths, $paths); + $result->perms = serialize($allowedPaths); + return $result->save(); + }); + } + + public function removeCustomPath($user, $customRoute) { + if(!is_string($customRoute)) { + return false; + } + $parts = explode('.', $customRoute); + $value = array_pop($parts); + $parts = array_merge((array)self::pathCustom, $parts, (array)0); + return $this->remove($user, Set::expand(array(implode('.', $parts) => $value))); + } + + /** + * Removes an action from a users permission list. Setting action to * removes all actions + * in the controller thus removing the controller from the users permission list. + */ + public function removeAction($user, $controller, $action) { + return $this->remove($user, array( + self::pathRoute => array( + $controller => array( + $action + ) + ) + )); + } + + /** + * use this to remove permissions from a user, multiple permissions can be defined in the paths + * array. The user must have the configured userIdentifier available. + * + * @throws \lithium\core\ConfigException + * @param $user + * @param array $paths + * @return bool + */ + public function remove($user, array $paths = array()) { + $model = $this->_model; + $userId = $this->_config['userIdentifier']; + $params = compact('model', 'userId', 'user', 'paths'); + return $this->_filter(__METHOD__, $params, function($self, $params) { + $model = $params['model']; + $userId = $params['userId']; + $user = $params['user']; + $paths = $params['paths']; + + if (!isset($user[$userId])) { + throw new ConfigException("The user identifier '{$userId}' is not available."); + } + $result = $model::find('first', array( + 'conditions' => array( + 'id' => $user[$userId] + ) + )); + if (!$result) { + return true; + } + $allowedPaths = unserialize($result->perms); + $pathsFlat = Set::flatten($paths); + foreach ($pathsFlat as $path => $value) { + $pointer = &$allowedPaths; + $pathParts = explode('.', $path); + array_pop($pathParts); + foreach ($pathParts as $pathPart) { + if (!isset($pointer[$pathPart])) { + unset($pointer); + $pointer = null; + break; + } + $pointer = &$pointer[$pathPart]; + } + switch(true) { + case !$pointer: + break; + case $value == '*': + $pointer = null; + break; + case (($index = array_search($value, $pointer)) !== false): + unset($pointer[$index]); + break; + } + } + $result->perms = serialize($self->_cleanPaths($allowedPaths)); + return $result->save(); + }); + } + + public function listPerms($user) { + $userId = $user[$this->_config['userIdentifier']]; + $model = $this->_model; + $result = $model::find('first', array( + 'conditions' => array( + 'id' => $userId + ) + )); + return $result ? unserialize($result->perms) : array(); + } + + public function _cleanPaths($paths) { + foreach ($paths as &$path) { + if (is_array($path)) { + $path = $this->_cleanPaths($path); + } + } + return array_filter($paths); + } + + public function _processPath($path, &$allowedPaths) { + $pointer = &$allowedPaths; + foreach($path as $item) { + switch(true) { + case (in_array('*', $pointer)): + return true; + case (in_array($item, $pointer)): + $pointer = array(); + continue; + case (!isset($pointer[$item])): + return false; + } + $pointer = &$pointer[$item]; + } + return true; + } +} + +?> \ No newline at end of file diff --git a/CSRF b/CSRF new file mode 100644 index 0000000..ae6b8e8 --- /dev/null +++ b/CSRF @@ -0,0 +1,67 @@ +// This code is brought to you by Sean Coates (seancoates.com): + +hidden( + \app\extensions\action\Request::CSRF_TOKEN_FIELD_NAME, + array('value' => Session::get_csrf_token()) + ); + } + + return $ret; + } +} + +?> + + \ No newline at end of file diff --git a/config/.DS_Store b/config/.DS_Store new file mode 100644 index 0000000..bd2fe53 Binary files /dev/null and b/config/.DS_Store differ diff --git a/config/bootstrap.php b/config/bootstrap.php new file mode 100644 index 0000000..ceadfaf --- /dev/null +++ b/config/bootstrap.php @@ -0,0 +1,86 @@ + \ No newline at end of file diff --git a/config/bootstrap/.DS_Store b/config/bootstrap/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/config/bootstrap/.DS_Store differ diff --git a/config/bootstrap/action.php b/config/bootstrap/action.php new file mode 100644 index 0000000..41b4d5e --- /dev/null +++ b/config/bootstrap/action.php @@ -0,0 +1,55 @@ + $config) { + if ($name === 'lithium') { + continue; + } + $file = "{$config['path']}/config/routes.php"; + file_exists($file) ? include $file : null; + } + return $chain->next($self, $params, $chain); +}); + +?> \ No newline at end of file diff --git a/config/bootstrap/auth.php b/config/bootstrap/auth.php new file mode 100644 index 0000000..11c963f --- /dev/null +++ b/config/bootstrap/auth.php @@ -0,0 +1,135 @@ + array('adapter' => 'Cookie'), + 'default' => array('adapter' => 'Php'), + 'flash_message' => array('adapter' => 'Php') +)); + +Auth::config(array( + 'default' => array( + 'adapter' => 'Form', + 'model' => 'User', + 'cookie' => '', + 'fields' => array('username', 'password'), + //'scope' => array('active' => 'true'), //The active field must be true otherwise they can't auth, though we need + //to eventually send them to a page that explains they are banned. + 'session' => array('options' => array('name' => 'default')), + 'filters' => array( + 'password' => function($password) { + return $password; //prevents li3 from hashing the password before hand. + }, + + function($data) { + if (!empty($data['username'])) { + + //Find the first element record that matches the username in the request and get the salt field + $salt = User::find('first', array('conditions' => array('username' => $data['username']))); + + //The password to query is the password from the request + //hashed with the users stored salt + $data['password'] = String::hashPassword($data['password'], $salt->salt); + } + return $data; + }) + ) +)); + +$secret = "cake"; + +// Adds remember feature for form-based authentications. +Auth::applyFilter('check', function($self, $params, $chain) use ($secret) { + $query = 'first'; + $scope = array(); + extract($self::invokeMethod('_config', array($params['name']))); + if ($result = $chain->next($self, $params, $chain)) { + $request = $params['credentials']; + if ($request && $adapter == 'Form' && !empty($request->data['remember'])) { + $data = array_intersect_key($result, array_combine($fields, $fields)); + $data = serialize($data); + Session::write( + "Auth.{$params['name']}", + base64_encode($data), + array('name' => 'cookie') + ); + } + return $result; + } + if ($adapter == 'Form') { + $data = Session::read("Auth.{$params['name']}", array('name' => 'cookie')); + if ($data) { + $data = base64_decode($data); + $data = unserialize($data); + if (array_keys($data) == $fields) { + $model = Libraries::locate('models', $model); + $data = array_map('strval', $data); + $user = $model::$query($scope + $data); + if ($user) { + return $self::set($params['name'], $user->data()); + } + } + } + } + return $result; +}); + +// Removes remember cookie after sign out. +Auth::applyFilter('clear', function($self, $params, $chain) { + $config = $self::invokeMethod('_config', array($params['name'])); + if ($config['adapter'] == 'Form') { + if (Session::read("Auth.{$params['name']}", array('name' => 'cookie'))) { + Session::delete("Auth.{$params['name']}", array('name' => 'cookie')); + } + } + return $chain->next($self, $params, $chain); +}); + +//So that we can filter a bunch of methods in one +Dispatcher::applyFilter('_callable', function($self, $params, $chain) { + + //Invoke the _callable method, then execute the logic below + $ctrl = $chain->next($self, $params, $chain); + + //if the user is logged in + $user = Auth::check('default'); + if($user) + { + //check if they are accessing an admin function + if ($ctrl->request->controller == 'admin' && !($user['level'] == 'root' || $user['level'] == 'admin')) + { + return function() use ($request) { + + //Users / index isn't public derp. + return new Response(compact('request') + array('location' => '/')); + }; + } + + //If they aren't trying to access admin, return + return $ctrl; + } + //If they are performing a public action continue, + if (isset($ctrl->publicActions) && in_array($params['request']->action, $ctrl->publicActions)) { + return $ctrl; + } + + //Otherwise, send them to the login page + return function() use ($request) { + return new Response(compact('request') + array('location' => '/login')); + }; + + +}); + + + + +?> \ No newline at end of file diff --git a/config/bootstrap/cache.php b/config/bootstrap/cache.php new file mode 100644 index 0000000..68f11e0 --- /dev/null +++ b/config/bootstrap/cache.php @@ -0,0 +1,62 @@ + 'File', 'strategies' => array('Serializer')); + +if ($apcEnabled) { + $default = array('adapter' => 'Apc'); +} +Cache::config(compact('default')); + +/** + * Caches paths for auto-loaded and service-located classes. + */ +Dispatcher::applyFilter('run', function($self, $params, $chain) { + $key = md5(LITHIUM_APP_PATH) . '.core.libraries'; + + if ($cache = Cache::read('default', $key)) { + $cache = (array) $cache + Libraries::cache(); + Libraries::cache($cache); + } + $result = $chain->next($self, $params, $chain); + + if ($cache != Libraries::cache()) { + Cache::write('default', $key, Libraries::cache(), '+1 day'); + } + return $result; +}); + +?> \ No newline at end of file diff --git a/config/bootstrap/connections.php b/config/bootstrap/connections.php new file mode 100644 index 0000000..a9355e6 --- /dev/null +++ b/config/bootstrap/connections.php @@ -0,0 +1,72 @@ + 'MongoDb', + 'host' => 'localhost', + 'database' => 'otakuhub', + 'persistent' => 'foo' + )); + +/** + * Uncomment this configuration to use CouchDB as your default database. + */ +// Connections::add('default', array( +// 'type' => 'http', +// 'adapter' => 'CouchDb', +// 'host' => 'localhost', +// 'database' => 'my_app' +// )); + +/** + * Uncomment this configuration to use MySQL as your default database. + */ +// Connections::add('default', array( +// 'type' => 'database', +// 'adapter' => 'MySql', +// 'host' => 'localhost', +// 'login' => 'root', +// 'password' => '', +// 'database' => 'my_app' +// )); + +?> \ No newline at end of file diff --git a/config/bootstrap/console.php b/config/bootstrap/console.php new file mode 100644 index 0000000..e47e2c0 --- /dev/null +++ b/config/bootstrap/console.php @@ -0,0 +1,19 @@ +response->styles(array( + 'heading' => '\033[1;30;46m' + )); + return $chain->next($self, $params, $chain); +}); + + +?> \ No newline at end of file diff --git a/config/bootstrap/error.php b/config/bootstrap/error.php new file mode 100644 index 0000000..dc33bf5 --- /dev/null +++ b/config/bootstrap/error.php @@ -0,0 +1,37 @@ + array('adapter' => 'File') +)); + + +ErrorHandler::apply('lithium\action\Dispatcher::run', array(), function($info, $params) { + $response = new Response(array('request' => $params['request'])); + + $message = "/(^Template not found|^Controller '\w+' not found|^Action '\w+' not found)/"; + $template = (preg_match($message, $info['message'])) ? '404' : '500'; + + Logger::write('error', "{$info['file']} : {$info['line']} : {$info['message']}"); + switch($template){ + case '500': + debug($info);die; + break; + } + Media::render($response, compact('info', 'params'), array( + 'controller' => 'errors', + 'template' => $template, + 'layout' => 'default', + 'request' => $params['request'] + )); + return $response; +}); \ No newline at end of file diff --git a/config/bootstrap/errors.php b/config/bootstrap/errors.php new file mode 100644 index 0000000..8354478 --- /dev/null +++ b/config/bootstrap/errors.php @@ -0,0 +1,28 @@ + $params['request'], + 'status' => $info['exception']->getCode() + )); + + Media::render($response, compact('info', 'params'), array( + 'controller' => '_errors', + 'template' => 'development', + 'layout' => 'error', + 'request' => $params['request'] + )); + return $response; +}); + +?> \ No newline at end of file diff --git a/config/bootstrap/g11n.php b/config/bootstrap/g11n.php new file mode 100644 index 0000000..e96241f --- /dev/null +++ b/config/bootstrap/g11n.php @@ -0,0 +1,149 @@ + 'English'); + +Environment::set('production', compact('locale', 'locales')); +Environment::set('development', compact('locale', 'locales')); +Environment::set('test', array('locale' => 'en', 'locales' => array('en' => 'English'))); + +/** + * Globalization (g11n) catalog configuration. The catalog allows for obtaining and + * writing globalized data. Each configuration can be adjusted through the following settings: + * + * - `'adapter'` _string_: The name of a supported adapter. The builtin adapters are `Memory` (a + * simple adapter good for runtime data and testing), `Php`, `Gettext`, `Cldr` (for + * interfacing with Unicode's common locale data repository) and `Code` (used mainly for + * extracting message templates from source code). + * + * - `'path'` All adapters with the exception of the `Memory` adapter require a directory + * which holds the data. + * + * - `'scope'` If you plan on using scoping i.e. for accessing plugin data separately you + * need to specify a scope for each configuration, except for those using the `Memory`, + * `Php` or `Gettext` adapter which handle this internally. + */ +Catalog::config(array( + 'runtime' => array( + 'adapter' => 'Memory' + ), + // 'app' => array( + // 'adapter' => 'Gettext', + // 'path' => Libraries::get(true, 'resources') . '/g11n' + // ), + 'lithium' => array( + 'adapter' => 'Php', + 'path' => LITHIUM_LIBRARY_PATH . '/lithium/g11n/resources/php' + ) +) + Catalog::config()); + +/** + * Integration with `Inflector`. + */ +// Inflector::rules('transliteration', Catalog::read(true, 'inflection.transliteration', 'en')); + +/** + * Inflector configuration examples. If your application has custom singular or plural rules, or + * extra non-ASCII characters to transliterate, you can configure that by uncommenting the lines + * below. + */ +// Inflector::rules('singular', array('rules' => array('/rata/' => '\1ratus'))); +// Inflector::rules('singular', array('irregular' => array('foo' => 'bar'))); +// +// Inflector::rules('plural', array('rules' => array('/rata/' => '\1ratum'))); +// Inflector::rules('plural', array('irregular' => array('bar' => 'foo'))); +// +// Inflector::rules('transliteration', array('/É|Ê/' => 'E')); +// +// Inflector::rules('uninflected', 'bord'); +// Inflector::rules('uninflected', array('bord', 'baird')); + + +/** + * Integration with `View`. Embeds message translation aliases into the `View` + * class (or other content handler, if specified) when content is rendered. This + * enables translation functions, i.e. ``. + */ +Media::applyFilter('_handle', function($self, $params, $chain) { + $params['handler'] += array('outputFilters' => array()); + $params['handler']['outputFilters'] += Message::aliases(); + return $chain->next($self, $params, $chain); +}); + +/** + * Integration with `Validator`. You can load locale dependent rules into the `Validator` + * by specifying them manually or retrieving them with the `Catalog` class. + */ +foreach (array('phone', 'postalCode', 'ssn') as $name) { + Validator::add($name, Catalog::read(true, "validation.{$name}", 'en_US')); +} + +/** + * Intercepts dispatching processes in order to set the effective locale by using + * the locale of the request or if that is not available retrieving a locale preferred + * by the client. + */ +ActionDispatcher::applyFilter('_callable', function($self, $params, $chain) { + $request = $params['request']; + $controller = $chain->next($self, $params, $chain); + + if (!$request->locale) { + $request->params['locale'] = Locale::preferred($request); + } + Environment::set(Environment::get(), array('locale' => $request->locale)); + return $controller; +}); + +ConsoleDispatcher::applyFilter('_callable', function($self, $params, $chain) { + $request = $params['request']; + $command = $chain->next($self, $params, $chain); + + if (!$request->locale) { + $request->params['locale'] = Locale::preferred($request); + } + Environment::set(Environment::get(), array('locale' => $request->locale)); + return $command; +}); + +?> \ No newline at end of file diff --git a/config/bootstrap/libraries.php b/config/bootstrap/libraries.php new file mode 100644 index 0000000..4bffbdd --- /dev/null +++ b/config/bootstrap/libraries.php @@ -0,0 +1,127 @@ +/webroot` to `/webroot/` (recommended for + * production), or a media filter to load plugin resources (see `/config/bootstrap/media.php`). + * + * Note that a library can be designed as both an application and a plugin, but this requires some + * special considerations in the bootstrap process, such as removing any `require` statements, and + * conditionally defining the constants below. + * + * By default, libraries are stored in the base `/libraries` directory, or in the + * application-specific `/libraries` directory. Libraries can be loaded from either place + * without additional configuration, but note that if the same library is in both directories, the + * application-specific `libraries` directory will override the global one. + * + * The one exception to this is the _primary_ library, which is an application configured with + * `'default' => true` (see below); this library uses the `LITHIUM_APP_PATH` constant (also defined + * below) as its path. Note, however, that any library can be overridden with an arbitrary path by + * passing the `'path'` key to its configuration. See `Libraries::add()` for more options. + * + * @see lithium\core\Libraries + */ + +/** + * This is the path to your application's directory. It contains all the sub-folders for your + * application's classes and files. You don't need to change this unless your webroot folder is + * stored outside of your app folder. + */ +define('LITHIUM_APP_PATH', dirname(dirname(__DIR__))); + +/** + * This is the path to the class libraries used by your application, and must contain a copy of the + * Lithium core. By default, this directory is named `libraries`, and resides in the same + * directory as your application. If you use the same libraries in multiple applications, you can + * set this to a shared path on your server. + */ +define('LITHIUM_LIBRARY_PATH', dirname(LITHIUM_APP_PATH) . '/libraries'); + +/** + * Locate and load Lithium core library files. Throws a fatal error if the core can't be found. + * If your Lithium core directory is named something other than `lithium`, change the string below. + */ +if (!include LITHIUM_LIBRARY_PATH . '/lithium/core/Libraries.php') { + $message = "Lithium core could not be found. Check the value of LITHIUM_LIBRARY_PATH in "; + $message .= __FILE__ . ". It should point to the directory containing your "; + $message .= "/libraries directory."; + throw new ErrorException($message); +} + +use lithium\core\Libraries; + +/** + * Optimize default request cycle by loading common classes. If you're implementing custom + * request/response or dispatch classes, you can safely remove these. Actually, you can safely + * remove them anyway, they're just there to give slightly you better out-of-the-box performance. + */ +require LITHIUM_LIBRARY_PATH . '/lithium/core/Object.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/core/StaticObject.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/util/Collection.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/util/collection/Filters.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/util/Inflector.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/util/String.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/core/Adaptable.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/core/Environment.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/net/Message.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/net/http/Message.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/net/http/Media.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/net/http/Request.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/net/http/Response.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/net/http/Route.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/net/http/Router.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/action/Controller.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/action/Dispatcher.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/action/Request.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/action/Response.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/template/View.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/template/view/Renderer.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/template/view/Compiler.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/template/view/adapter/File.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/storage/Cache.php'; +require LITHIUM_LIBRARY_PATH . '/lithium/storage/cache/adapter/Apc.php'; + + +/** + * Add the Lithium core library. This sets default paths and initializes the autoloader. You + * generally should not need to override any settings. + */ +Libraries::add('lithium'); + +/** + * Add the application. You can pass a `'path'` key here if this bootstrap file is outside of + * your main application, but generally you should not need to change any settings. + */ +Libraries::add('app', array('default' => true)); + +/** + * Add some plugins: + */ +// Libraries::add('li3_docs'); +Libraries::add('li3_flash_message'); +Libraries::add('li3_paginate'); +?> \ No newline at end of file diff --git a/config/bootstrap/media.php b/config/bootstrap/media.php new file mode 100644 index 0000000..66e002d --- /dev/null +++ b/config/bootstrap/media.php @@ -0,0 +1,63 @@ +to('json'); + * }}} + */ +use lithium\util\Collection; + +Collection::formats('lithium\net\http\Media'); + +/** + * This filter is a convenience method which allows you to automatically route requests for static + * assets stored within active plugins. For example, given a JavaScript file `bar.js` inside the + * `li3_foo` plugin installed in an application, requests to `http://app/path/li3_foo/js/bar.js` + * will be routed to `/path/to/app/libraries/plugins/li3_foo/webroot/js/bar.js` on the filesystem. + * In production, it is recommended that you disable this filter in favor of symlinking each + * plugin's `webroot` directory into your main application's `webroot` directory, or adding routing + * rules in your web server's configuration. + */ +use lithium\action\Dispatcher; +use lithium\action\Response; +use lithium\net\http\Media; + +Dispatcher::applyFilter('_callable', function($self, $params, $chain) { + list($library, $asset) = explode('/', $params['request']->url, 2) + array("", ""); + + if ($asset && ($path = Media::webroot($library)) && file_exists($file = "{$path}/{$asset}")) { + return function() use ($file) { + $info = pathinfo($file); + $media = Media::type($info['extension']); + $content = (array) $media['content']; + + return new Response(array( + 'headers' => array('Content-type' => reset($content)), + 'body' => file_get_contents($file) + )); + }; + } + return $chain->next($self, $params, $chain); +}); + +Media::type('jpg', 'image/jpeg', array('cast' => false, 'encode' => function($data) { + return $data['photo']->file->getBytes(); + })); + +?> \ No newline at end of file diff --git a/config/bootstrap/session.php b/config/bootstrap/session.php new file mode 100644 index 0000000..c664be4 --- /dev/null +++ b/config/bootstrap/session.php @@ -0,0 +1,49 @@ + array('adapter' => 'Cookie'), + 'default' => array('adapter' => 'Php') +)); +*/ +/** + * Uncomment the lines below to enable forms-based authentication. This configuration will attempt + * to authenticate users against a `Users` model. In a controller, run + * `Auth::check('default', $this->request)` to authenticate a user. This will check the POST data of + * the request (`lithium\action\Request::$data`) to see if the fields match the `'fields'` key of + * the configuration below. If successful, it will write the data returned from `Users::first()` to + * the session using the default session configuration. + * + * Once the session data is written, you can call `Auth::check('default')` to check authentication + * status or retrieve the user's data from the session. Call `Auth::clear('default')` to remove the + * user's authentication details from the session. This effectively logs a user out of the system. + * To modify the form input that the adapter accepts, or how the configured model is queried, or how + * the data is stored in the session, see the `Form` adapter API or the `Auth` API, respectively. + * + * @see lithium\security\auth\adapter\Form + * @see lithium\action\Request::$data + * @see lithium\security\Auth + */ +// use lithium\security\Auth; + +// Auth::config(array( +// 'default' => array( +// 'adapter' => 'Form', +// 'model' => 'Users', +// 'fields' => array('username', 'password') +// ) +// )); + +?> \ No newline at end of file diff --git a/config/routes.php b/config/routes.php new file mode 100644 index 0000000..bde33dd --- /dev/null +++ b/config/routes.php @@ -0,0 +1,149 @@ + 'lithium\test\Controller')); + Router::connect('/test', array('controller' => 'lithium\test\Controller')); +} + + +/* This is the login and logout routes */ +Router::connect('/login', array('controller' => 'users', 'action' => 'login')); +Router::connect('/logout', array('controller' => 'users', 'action' => 'logout')); + +/* Content routes */ +Router::connect('/anime', array('controller' => 'content', 'action' => 'anime')); +Router::connect('/anime/{:args}', array('controller' => 'content', 'action' => 'anime')); + +//Pagination route +Router::connect('/{:controller}/{:action}/page:{:page:[0-9]+}'); + + +/** +* Define an anonymous function that we will pass to the router instead of linking to a controller action +* The logic is quite simple: +* Call the version() method on the Photo model class with $request->id (MongoId for image) and a set of options. This is passed as an array to allow adding more options later. +* Finally just return a Response object with the image data as body (this is what version() returns) and the appropriate content type for the file ending. +* +* This method is limited, supports few formats etc but its a good start +*/ +$imageSizer = function($request) { + $contentTypeMappings = array( + 'jpg' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'png' => 'image/png', + 'gif' => 'image/gif' + ); + // Generate file based image of this + $imageBody = Photo::version($request->id, array( + 'width' => $request->width, + 'height' => $request->height + )); + return new Response(array( + 'headers' => array('Content-type' => $contentTypeMappings[$request->type]), + 'body' => $imageBody + )); +}; + +/** +This is a little bit more complicated. +We state that the handler for when this route is matched is the anonymous function we've declared and +we set up a pattern to match our two cases of image urls — both with and without size information. +The regex is quite simple even if it looks complex: +^/image/ <- begin with /image/ +(?P) is for setting up a named capture group. This equals doing {:foo:{pattern}} in Lithium. +So we have 1 capture group named {id} that have to match by 24 signs (mongoid), and an optional part "_{width}x{height}" and finally the filtype. + +Im unsure if the keys array can be handled some other way, but it failed for me without it. +*/ +$imageHandlingOptions = array( + 'handler' => $imageSizer, + 'pattern' => '@^/image/(?P[0-9a-f]{24})(_(?P[0-9]*)x(?P[0-9]*)?)\.(?[a-z]{2,4})@', + 'keys' => array('id'=>'id', 'width'=>'width', 'height'=>'height', 'type'=>'type') +); + +/** +Finally we connect this as a route. The regex sent as the first param here is overriden by the more complex one we have defined in the options array. +*/ +Router::connect('/image/{:id:[0-9a-f]{24}}.jpg', array(), $imageHandlingOptions); + + + +/** + * ### Database object routes + * + * The routes below are used primarily for accessing database objects, where `{:id}` corresponds to + * the primary key of the database object, and can be accessed in the controller as + * `$this->request->id`. + * + * If you're using a relational database, such as MySQL, SQLite or Postgres, where the primary key + * is an integer, uncomment the routes below to enable URLs like `/posts/edit/1138`, + * `/posts/view/1138.json`, etc. + */ +// Router::connect('/{:controller}/{:action}/{:id:\d+}.{:type}', array('id' => null)); +// Router::connect('/{:controller}/{:action}/{:id:\d+}'); + +/** + * If you're using a document-oriented database, such as CouchDB or MongoDB, or another type of + * database which uses 24-character hexidecimal values as primary keys, uncomment the routes below. + */ +Router::connect('/{:controller}/{:action}/{:id:[0-9a-f]{24}}.{:type}', array('id' => null)); +Router::connect('/{:controller}/{:action}/{:id:[0-9a-f]{24}}'); + +/** + * Finally, connect the default route. This route acts as a catch-all, intercepting requests in the + * following forms: + * + * - `/foo/bar`: Routes to `FooController::bar()` with no parameters passed. + * - `/foo/bar/param1/param2`: Routes to `FooController::bar('param1, 'param2')`. + * - `/foo`: Routes to `FooController::index()`, since `'index'` is assumed to be the action if none + * is otherwise specified. + * + * In almost all cases, custom routes should be added above this one, since route-matching works in + * a top-down fashion. + */ +Router::connect('/{:controller}/{:action}/{:args}'); + +?> \ No newline at end of file diff --git a/controllers/AdminController.php b/controllers/AdminController.php new file mode 100644 index 0000000..3e4dfab --- /dev/null +++ b/controllers/AdminController.php @@ -0,0 +1,100 @@ +request->page ?: 1; + //$order = array('created' => 'DESC'); + $total = User::count(); + $users = User::all(compact('limit','page')); + $this->render(array('layout' => 'admin', 'data' => compact('users', 'total', 'page', 'limit'))); + } + + public function users() + { + $users = User::all(); + $this->render(array('layout' => 'admin', 'data' => compact('users'))); + //Should have paginate for when there is more users. + } + + + //This is basically admins version of signup + public function addUser() + { + $sucsess = false; + + //If the request isn't empty + if($this->request->data) { + //Does admins data need to be validated? + $user = User::Create($this->request->data); + $sucsess = $user->save(); + } + if ($sucsess) { + return $this->redirect('Users'); + } + + FlashMessage::set($user->name . "was added sucessfully."); + } + + public function editUser($username = NULL) + { + if ($username != NULL) + { + $user = User::find('first', array('conditions' => compact('username'))); + + if($this->request->data) + { + $user->set($this->request->data); + if ($user->save(null, array('validate' => false))) + { + FlashMessage::set('User updated sucsessfully'); + $this->redirect('Admin::index'); + } + else + { + FlashMessage::set('There was an error'); + $this->redirect('Admin::index'); + + } + } + else + { + //unset($user->password); + return compact('user'); + } + } + } + + public function removeUser($username) + { + /* + //Form data needs to have $username and $confirm = true to do the delete. + if($this->request->data) + { + //If the user has confirmed the deletion of the user. + if($this->request->data->confirm) + { */ + $user = User::find('first', array('conditions' => compact('username'))); + $user->delete(); + FlashMessage::set("User was deleted sucsessfully."); + $this->redirect('Admin'); + //} + } + /*else + { + //Render the form + $this->render(array('layout' => 'form', 'data' => compact('users'))); + + }*/ + //} +} +?> \ No newline at end of file diff --git a/controllers/AnimelistController.php b/controllers/AnimelistController.php new file mode 100644 index 0000000..c61577a --- /dev/null +++ b/controllers/AnimelistController.php @@ -0,0 +1,77 @@ + compact('username'))); + + + $watching = array(); + $paused = array(); + $dropped = array(); + $planning = array(); + $finished = array(); + + + foreach($user->animelist as $entry) + { + switch($entry->my_status) + { + case "Completed": $finished[] = $entry; break; + case "Watching": $watching[] = $entry; break; + case "On-Hold" : $paused[] = $entry; break; + case "Dropped" : $dropped[] = $entry; break; + case "Plan to Watch": $planning[] = $entry; break; + } + } + + + //In the future we can use set or something + switch($sort) + { + case "planning" : return compact('user', 'planning'); break; + case "completed" : return compact('user', 'finished'); break; + case "onhold": return compact('user', 'paused'); break; + case "watching" : return compact('user', 'watching'); break; + case "dropped": return compact('user', 'dropped'); + default: return compact('user', 'watching', 'paused', 'dropped', 'planning', 'finished'); break; + } + } + + public function add($id) + { + if (empty($this->request->data)) + { + $anime = Anime::find('first', array('conditions' => array('special_id' => $id))); + $entry = null; + return compact('anime', 'entry'); + } + + $entry = Entry::create($this->request->data); + + if (isset($this->request->data['tags'])) + { + $entry->my_tags = explode(' ', $this->request->data['tags']); + unset($this->request->data['tags']); + } + + if ($entry->validates()) { + $entry->add($username); + + return $this->redirects('Animelist::Index'); + } + + return $entry; + + } + + +} \ No newline at end of file diff --git a/controllers/ContentController.php b/controllers/ContentController.php new file mode 100644 index 0000000..688c2a8 --- /dev/null +++ b/controllers/ContentController.php @@ -0,0 +1,62 @@ +request->page ?: 1; + $order = array('title' => 'ASC'); + $content; + $total; + + if ($id != null) + { + $content = Anime::find('first', array('conditions' => array('special_id' => $id), 'order' => array('title' => 'ASC'))); + return compact('content'); + } + else + { + $content = Anime::all(compact('limit','page','order')); + $total = Anime::count(); + $this->render(array('template' => 'index', 'data' => compact('limit', 'page', 'content', 'total'))); + } + } +} \ No newline at end of file diff --git a/controllers/FeedsController.php b/controllers/FeedsController.php new file mode 100644 index 0000000..dfbd5f3 --- /dev/null +++ b/controllers/FeedsController.php @@ -0,0 +1,79 @@ +redirect('Users::login'); + } + + //else + //Figure out what user is logged in (from their session cookie presumably) + /* Display the users last 20 posts in decending order. */ + $user = Session::read('username'); + + //Since there can only be one of each username, getting the first occurence of $user should be fine + $query = User::find('first', array('conditions' => array('username' => $user))); + $feed = $query->posts; + + + return compact($feed); //Return the feed array to the + } + + /** + * New needs to do a few things + * 1) Validation, + * Ensure that the post is unique, + * Flood protection + * Spam Protection at some point + * 2) Storage + * The post needs to be stored in the users feed as well as users who are friends with them + * + */ + public function new() + { + + } + + /** + * Hide needs to put a "HIDES" edge on the graph + * By getting the users document from the database, querying its id + *then doing something like $thisUser->hides($username) + */ + public function hide($username) + { + + } + + + /** + *Does the same sort of validation as new, but deletes a post obviously :P + */ + public function delete($id) + { + $user = Auth::check('default'); + $post = Post::find($id); + + if ($post->username == $user['username']) { + $post->delete(); + } + + return $this->redirect('Feed::Index'); + + } +} + +?> \ No newline at end of file diff --git a/controllers/PagesController.php b/controllers/PagesController.php new file mode 100644 index 0000000..47b88d2 --- /dev/null +++ b/controllers/PagesController.php @@ -0,0 +1,36 @@ +render(array('template' => join('/', $path))); + } +} + +?> \ No newline at end of file diff --git a/controllers/PhotosController.php b/controllers/PhotosController.php new file mode 100644 index 0000000..ea41234 --- /dev/null +++ b/controllers/PhotosController.php @@ -0,0 +1,41 @@ +request->id); + return compact('photo'); + } + + public function add() { + $photo = Photo::create(); + + if (($this->request->data) && $photo->save($this->request->data)) { + $this->redirect(array('Photos::view', 'id' => $photo->id)); + } + return compact('photo'); + } + + public function edit() { + $photo = Photo::find($this->request->id); + + if (!$photo) { + $this->redirect('Photos::index'); + } + if (($this->request->data) && $photo->save($this->request->data)) { + $this->redirect(array('Photos::view', 'args' => array($photo->id))); + } + return compact('photo'); + } +} + +?> \ No newline at end of file diff --git a/controllers/ProfileController.php b/controllers/ProfileController.php new file mode 100644 index 0000000..8e5d487 --- /dev/null +++ b/controllers/ProfileController.php @@ -0,0 +1,75 @@ + compact('username'))); + //If the user variable isn't empty a user was found. + if (!empty($user)) + { + + //The only issue(?) is that this will update the profile views even if the user views their own profile, maybe we should fix that. + $user->incrementViews(); + + $photo = null; + $profile = $user->profile; + return compact('user', 'photo', 'profile'); + } + else + { + //Tell the user that user wasn't found. + } + } + + public function create() + { + + } + + public function edit($username) + { + $user = Auth::check('default'); + + if ($user) { + $user = User::find('first', array('conditions' => array('username' => $user['username']))); + $profile = $user->profile; + $photo; + + + if (empty($this->request->data)) { + return compact('profile', 'user'); + } + + //If a photo was uploaded + if (isset($this->request->data['photo'])) + { + /* Update / Add the profile picture */ + //Store the image in grid FS + $photo = Photo::create($this->request->data["photo"]); + + //We don't to resave the photo in the profile data + unset($this->request->data["photo"]); + + //Save the photo + $photo->save(); + + //Since images are accessed via /image/mongoid we just store the mongo id so we + //can substitue it in the tag. + $user->profilepic = $photo->_id->__toString(); + } + + $user->profile = $this->request->data; + + if ($user->save(null, array('validate' =>false))) { + return $this->redirect("/profile/view/$user->username"); + } + } + } +} \ No newline at end of file diff --git a/controllers/ProfilesController.php b/controllers/ProfilesController.php new file mode 100644 index 0000000..022b540 --- /dev/null +++ b/controllers/ProfilesController.php @@ -0,0 +1,41 @@ +request->id); + return compact('profile'); + } + + public function add() { + $profile = Profile::create(); + + if (($this->request->data) && $profile->save($this->request->data)) { + $this->redirect(array('Profiles::view', 'args' => array($profile->id))); + } + return compact('profile'); + } + + public function edit() { + $profile = Profile::find($this->request->id); + + if (!$profile) { + $this->redirect('Profiles::index'); + } + if (($this->request->data) && $profile->save($this->request->data)) { + $this->redirect(array('Profiles::view', 'args' => array($profile->id))); + } + return compact('profile'); + } +} + +?> \ No newline at end of file diff --git a/controllers/SearchController.php b/controllers/SearchController.php new file mode 100644 index 0000000..fea8e41 --- /dev/null +++ b/controllers/SearchController.php @@ -0,0 +1,37 @@ +request->query['search'])) { + //Redirect them or something + } + + + $searchParam = '/' . $this->request->query['search'] . '/i'; + + $content; + $limit = 20; + $page = $this->request->page ?: 1; + $total; //<-- number of search results + + + switch($type) + { + case "anime": $content = Anime::find('all', array('conditions' => array('title' => array('like' => $searchParam)), $limit, $page)); + $total = Anime::count(array('title' => array('like' => $searchParam))); + break; + case "kdrama": break; + case "manga": break; + } + return compact('content', 'type', 'by', 'limit', 'total', 'page'); + } + + +} \ No newline at end of file diff --git a/controllers/TopicController.php b/controllers/TopicController.php new file mode 100644 index 0000000..827c188 --- /dev/null +++ b/controllers/TopicController.php @@ -0,0 +1,25 @@ + compact('topicname'))); + } + + public function new() + { + if ($this->request->data) + { + $topic = Topic::create($this->request->data); + $topic->save(); + } + } +} \ No newline at end of file diff --git a/controllers/UsersController.php b/controllers/UsersController.php new file mode 100644 index 0000000..15da52b --- /dev/null +++ b/controllers/UsersController.php @@ -0,0 +1,473 @@ + array('level' != private))) + * However, we need to differentiate posts that are Hidden (posts that begin with a @username), Friends only (set by user) or + * Public (by default all posts.) there should be a method that filters the new post method, that takes a post, determines + * what access level it should be then passes that back to the calling method (in save?) + * + * Of course, for logged in users, we need to do a multiselect I guess, something like find posts where access level is hidden + * friends only, and public, ordered by date (descending) limit 20 or so (use pagination plugin) + * + * Finally, there should be an an option to make all posts private, this can be done by the postlevel() method, it can check i + * the user has the private option set, then if true return private for all posts :) + */ + + public function index($username = null) + { + //If no username was entered, + if ($username == null) + { + //Show a user list? + // TODO: Pagination + //Show a list of all users + $users = User::all(); + return compact('users'); + //maybe we can use the endpoint hook and show a "network activity feed" + //For example show all public posts as they get posted using ajax ? + //Maybe we should have a route for this? /activity maybe? + } + //Otherwise get that user + $user = User::find('first', array('conditions' => compact('username'))); + + //find all posts, sort by date, order descending, limit to 20 + $feed; + + //Dont know if php will keep counts return on the stack so I'm storing it to avoid calling it 3 times. + $tmpCount = count($user->feed); + + //If the user has 20 or more posts then query 20, otherwise query the number of posts the user has + $count = ($tmpCount >= 20) ? 20 : $tmpCount; + + //If the user is logged in + $user = Auth::check('default'); + if ($user) + { + if ($user->username == $username) + { + $feed = $user->getPosts(array('level' => null)); + return compact($feed, $user); + } + //if the user is logged in and the users are friends + if (User::areFriend(Auth::check('default'), $user)) + { + $feed = $user->getPosts(array('level' => null)); + return compact($feed, $user); + } + } //If they aren't friend, or if the user isn't logged in it defaults to the public version (filter private posts) + //If the user isn't logged in, then we should show a signup partial like twitter + else + { + //find all non-private posts, limit 20, order descending (decending was taken care of with array_unshift btw) + $feed = $user->getPost(array('level' => array('$ne' => "private"))); + return compact($feed, $user); + } + } + + + /** + * How this method should work: + * Since this network is default open like twitter, there is three types of relationships: + * 1) Mutually Oblivious: Neither user knows each other. + * 2) You Follow: You follow a user and sees their non-private posts + * 3) Friends: being friends allows you to see each others privates posts + * (@see app\models\post) for an example of how this works + * + * Now, for now there are two types of requests: Friend requests which causes both users to automatically follow eachother + * And follows. Follows are unidirectional and thus don't require the followees permission + */ + public function follow($username = null) + { + $status; + $message; + if($this->request->data) + { + $user = Auth::check('default'); + if ($user) + { + $user = User::find('first', array('conditions' => array('username' => $user['username']))); + if ($user->follow($username)) + { + $status = true; + + return array('sucseeded' => true, 'message' => 'You are now following $username'); + } + } + } + } + + /** + * Calls the user to addFriend method, then returns the status. + * @param username The name of the user to add as a friend + */ + public function addfriend($username = null) + { + + } + + public function reconfirm() + { + //Search the database for email address + if (ConfirmKey::count(array('conditions' => array('email' => $this->request->data['email']))) != 0) + { + //Resend the confirmation email + } + else + { + //Show them a message + } + + //Send a new key + } + + public function profile($username) + { + //If no username is passed in. + if (empty($username)) + { + $this->redirect('/'); + } + + //Otherwise + else + { + //Find that user, and go to their profile page. + $user = User::find('first', array('conditions' => compact('username'))); + //$photo = (empty($user->profilepic) ? ProfilePic::create() : $user->profilepic); + return compact('user', 'photo'); + //Render the profile layout + + } + } + + public function post() + { + if ($this->request->data) + { + $user = Auth::check('default'); + if ($user) { + $user = User::create($user, array('exists' => true)); + $user->post($this->request->data); + } + + /* :TODO: Need to return a status here */ + $this->redirect('Users::feed'); + } + } + + + public function feed() + { + //Get the currently logged in user + $user = Auth::check('default'); + + //If there is a user logged in (There should be since feed isn't a public function) + if ($user) + { + //Get that user from the database + $user = User::find('first', array('conditions' => array('username' => $user['username']))); + + //Set the feed variable scope (since we are going to use it outside the loop) + $feed; + + //For each post ID in $users feed, + foreach ($user->feed as $post) + { + //Find the post by it's ID + $post = Post::find($post); + + //If a post was found, + if (!empty($post)) + { + //Add it to the feed + $feed[] = $post; + } + //Else we should remove the the ID from the users feed. + } + + /* new posts are appended to the end of the feed array, therefore new posts naturally end up at the bottom of the feed + * therefore, we reverse the order of the array so that new posts end up at the top of the feed. + * This is probably faster than doing sorting by date at the database level, though it for some reason + * posts don't get inserted in the right order it could cause them to come out wrong in the view */ + $feed = array_reverse($feed); + + //This renders a custom layout we use for the feed, then passes user and feed to the view for the variables. + $this->render(array('layout' => 'untitled', 'data' => compact('user', 'feed'))); + } + + } + + public function openid() + { + if ($this->request->data) + { + if (!empty($this->request->query)) + { + var_dump($this->request->query); + } + else + { + $openid = new LightOpenID; + echo $openid->validates(); + } + } + } + + public function signup() + { + //If the request isn't empty + if($this->request->data) + { + //Create a user from the data + $user = User::Create($this->request->data); + + //Until the save bug is fixed + $results = $user->validates(); + + if ($results) + { + //The user isn't active until after they confirm. + $user->confirmed = false; + $user->active = false; + $user->joinedOn = new MongoDate(); + + //Generate a confirmation key for the user + $key = confirmKey::Create(array('key' => confirmKey::generate($user->email), 'username' => $user->username)); + + //Save it to the database + $key->save(); + + //If everything goes ok + if ($user->save(null, array('validates' => false))) + { + //Store some session information + //Session::write('username', $user->username); + //Session::write('email', $user->email); + + //For the debug version, send the key to the front page + $link = "/users/confirm"; + return compact('key', 'link'); + + // /* + // //Send them to the confirmation page. + // $this->redirect('users/confirm'); + + } + } + else + { + return compact('user'); + } + } + } + + public function login($location = null, $args = null) + { + //Put in a check to make sure the user has confirmed their account + //The check should probably happen below after the auth check. + /* + If the user is valid, but not confirmed, + tell the user they haven't confirmed, + offer to resend the confirmation email or changed their email address. + */ + if (!empty($this->request->data)) { + $user = Auth::check('default', $this->request); + if ($user) + { + $user = User::find('first', array('conditions' => array('username' => $user['username']))); + $user->lastLogin = new MongoDate(); + $user->save(null, array('validate' => false)); + + + //If the user hasn't confirmed their account + if(!$user->confirmed) + { + //Redirect them to the confirmation page. + return $this->redirect('Users::confirm'); + } + + //If the user's account is not active they are probably banned + if (!$user->active) + { + return $this->redirect('/pages/banned'); + } + + //If the user was trying to go somewhere, redirect them there + if ($location != null) + { + + } + //Otherwise send them to the hompa + return $this->redirect('Users::feed'); + } + else + { + FlashMessage::set('Username or Password Incorrect.'); + } + } + } + + //Logout + public function logout() + { + //If the user logs out + //Clear their auth cookie + Auth::Clear('default'); + + //Redirect them to the homepage. + return $this->redirect('/'); + } + + private function changePassword() + { + //Get the user to verify their current password + $input = $this->request->data; + + //If there is inputfrom the form + if ($input) + { + //Get the user from auth + $user = Auth::check('default'); + if(!empty($user) && ($data['newpass'] == $data['confirm'])) + { + //find the user by their ID + $user = User::find($user['_id']); + + //Set the newpassword, this triggers the hash function in ->save() + $user->newpass = $data['newpass']; + + //Save the data + if ($user->save(null, array('validate' => false))) { + //Tell the user their password was updated sucsessfully + } + + //Else there was an error, so send them away + /* If the compare is changed to a validator + * returning the user object will show the error in the view.*/ + return compact('user'); + + } + } + } + + public function requestFriend($username) { + //If the user isn't blocking this user, + + //And the user doesn't have private set + + //Send them a DM with a confirm key + $key = confirmKey::create(); + $thisUser = auth::check('default'); + $link = Html::link('here', "/users/confirmFriend/$this->username/$key->key"); + $post = Post::create(array('body' => "$thisUser->username want's to be your friend. Click $link to confirm")); + + $post->directMessage($username); + + } + + /* Potential hack here, in theory, a user could sign up a new account + * then send a direct message manually using the confirm key from the email. + */ + public function confirmFriend($username, $key) { + /* Normally we could try and find the cKey, then if it doesn't exist + * Do something about it, + * However, ConfirmKey::validates basically counts the number of keys that + * match $key, this is probably better than find since ->validates() may be a bit + * more efficent */ + + $cKey = confirmKey::create(compact('key')); + if ($cKey->validates()) + { + $thisUser = Auth::check('default'); + $thisUser = User::find('first', array('conditions' => array('username' => $thisUser['username']))); + $requestingUser = User::find('first', array('conditions' => compact('username'))); + $requestingUser->addFriend($thisUser->username); + $thisUser->addFriend($requetingUser->username); + + //Some action here if true :TODO: + } + + //Some action here if false + } + + + public function confirm($key = null) + { + //Situation one + //They have a key + if (!(empty($key))) + { + //Find the key in the database + $foundKey = confirmKey::find('first', array('conditions' => compact('key'))); + + //If the key exists + if($foundKey != NULL) + { + /* Note: foundKey->validates() does the same check, but it was added incase more validation is needed */ + //Find that user in the database + $foundUser = User::find('first', array('conditions' => array("username" => $foundKey->username))); + $valid = ($foundUser != NULL); + + //Set the users account active and confirmed. + $foundUser->confirmed = true; + $foundUser->active = true; + + //If the user is saved sucsessfully, + if($foundUser->save(null, array('validate' => false))) + { + /* If the save is sucsessful we are done */ + //Delete their key, + $foundKey->delete(); + + //Send them to the homepage (probably login though) + $this->redirect("/"); + + } + else + { + FlashMessage::set("There was an error."); + } + + } + else + { + //Otherwise + FlashMessage::set("There was an error finding the key."); + return; + } + } + } + + + public function step2() + { + //Check that step1 is completed sucsessfully, + //Then take them to their profile in edit mode + } +} + +?> \ No newline at end of file diff --git a/extensions/adapter/empty b/extensions/adapter/empty new file mode 100644 index 0000000..e69de29 diff --git a/extensions/command/ImportUsers.php b/extensions/command/ImportUsers.php new file mode 100644 index 0000000..032ca2d --- /dev/null +++ b/extensions/command/ImportUsers.php @@ -0,0 +1,59 @@ + false)); + $user->username = $usernames[$i]; + $user->password = $passes[rand(0, 202)]; + $user->email = $emails[$i]; + + + $tf = rand(0,1) == 0 ? false : true; + $user->confirmed = $tf; + $user->active = $tf; + $user->joinedOn = new MongoDate(); + $user->level = "User"; + + if ($user->validates()) + { + var_dump($user); + exit(); + $user->save(null, array('validates' => false)); + } + else + { + var_dump($user); + print_r($user->errors()); + exit(); + } + + } + } + /*else + { + $this->out("No file was specfied"); + exit(); + } + }*/ +} \ No newline at end of file diff --git a/extensions/command/empty b/extensions/command/empty new file mode 100644 index 0000000..e69de29 diff --git a/extensions/data/source/empty b/extensions/data/source/empty new file mode 100644 index 0000000..e69de29 diff --git a/extensions/helper/empty b/extensions/helper/empty new file mode 100644 index 0000000..e69de29 diff --git a/index.php b/index.php new file mode 100644 index 0000000..4718294 --- /dev/null +++ b/index.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/libraries/.DS_Store b/libraries/.DS_Store new file mode 100644 index 0000000..3186a84 Binary files /dev/null and b/libraries/.DS_Store differ diff --git a/libraries/_source/empty b/libraries/_source/empty new file mode 100644 index 0000000..e69de29 diff --git a/libraries/li3_access b/libraries/li3_access new file mode 160000 index 0000000..b26e48e --- /dev/null +++ b/libraries/li3_access @@ -0,0 +1 @@ +Subproject commit b26e48eb7ffc6d44630528efd90e9fc5df79f34a diff --git a/libraries/li3_flash_message b/libraries/li3_flash_message new file mode 160000 index 0000000..107831d --- /dev/null +++ b/libraries/li3_flash_message @@ -0,0 +1 @@ +Subproject commit 107831d5138544d0ed31b29b16cfd1e3cc205c2e diff --git a/libraries/li3_paginate b/libraries/li3_paginate new file mode 160000 index 0000000..4d0b592 --- /dev/null +++ b/libraries/li3_paginate @@ -0,0 +1 @@ +Subproject commit 4d0b592f1c590354a516032990b4c43b9527bbae diff --git a/libraries/openID/openid.php b/libraries/openID/openid.php new file mode 100644 index 0000000..767a274 --- /dev/null +++ b/libraries/openID/openid.php @@ -0,0 +1,765 @@ + + * $openid = new LightOpenID; + * $openid->identity = 'ID supplied by user'; + * header('Location: ' . $openid->authUrl()); + * + * The provider then sends various parameters via GET, one of them is openid_mode. + * Step two is verification: + * + * if ($this->data['openid_mode']) { + * $openid = new LightOpenID; + * echo $openid->validate() ? 'Logged in.' : 'Failed'; + * } + * + * + * Optionally, you can set $returnUrl and $realm (or $trustRoot, which is an alias). + * The default values for those are: + * $openid->realm = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST']; + * $openid->returnUrl = $openid->realm . $_SERVER['REQUEST_URI']; + * If you don't know their meaning, refer to any openid tutorial, or specification. Or just guess. + * + * AX and SREG extensions are supported. + * To use them, specify $openid->required and/or $openid->optional before calling $openid->authUrl(). + * These are arrays, with values being AX schema paths (the 'path' part of the URL). + * For example: + * $openid->required = array('namePerson/friendly', 'contact/email'); + * $openid->optional = array('namePerson/first'); + * If the server supports only SREG or OpenID 1.1, these are automaticaly + * mapped to SREG names, so that user doesn't have to know anything about the server. + * + * To get the values, use $openid->getAttributes(). + * + * + * The library requires PHP >= 5.1.2 with curl or http/https stream wrappers enabled. + * @author Mewp + * @copyright Copyright (c) 2010, Mewp + * @license http://www.opensource.org/licenses/mit-license.php MIT + */ +class LightOpenID +{ + public $returnUrl + , $required = array() + , $optional = array() + , $verify_peer = null + , $capath = null + , $cainfo = null + , $data; + private $identity, $claimed_id; + protected $server, $version, $trustRoot, $aliases, $identifier_select = false + , $ax = false, $sreg = false, $setup_url = null; + static protected $ax_to_sreg = array( + 'namePerson/friendly' => 'nickname', + 'contact/email' => 'email', + 'namePerson' => 'fullname', + 'birthDate' => 'dob', + 'person/gender' => 'gender', + 'contact/postalCode/home' => 'postcode', + 'contact/country/home' => 'country', + 'pref/language' => 'language', + 'pref/timezone' => 'timezone', + ); + + function __construct() + { + $this->trustRoot = 'http://' . $_SERVER['HTTP_HOST']; + if ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') + || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) + && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') + ) { + $this->trustRoot = 'https://' . $_SERVER['HTTP_HOST']; + } + $uri = rtrim(preg_replace('#((?<=\?)|&)openid\.[^&]+#', '', $_SERVER['REQUEST_URI']), '?'); + $this->returnUrl = $this->trustRoot . $uri; + + $this->data = $_POST + $_GET; # OPs may send data as POST or GET. + + if(!function_exists('curl_init') && !in_array('https', stream_get_wrappers())) { + throw new ErrorException('You must have either https wrappers or curl enabled.'); + } + } + + function __set($name, $value) + { + switch ($name) { + case 'identity': + if (strlen($value = trim((String) $value))) { + if (preg_match('#^xri:/*#i', $value, $m)) { + $value = substr($value, strlen($m[0])); + } elseif (!preg_match('/^(?:[=@+\$!\(]|https?:)/i', $value)) { + $value = "http://$value"; + } + if (preg_match('#^https?://[^/]+$#i', $value, $m)) { + $value .= '/'; + } + } + $this->$name = $this->claimed_id = $value; + break; + case 'trustRoot': + case 'realm': + $this->trustRoot = trim($value); + } + } + + function __get($name) + { + switch ($name) { + case 'identity': + # We return claimed_id instead of identity, + # because the developer should see the claimed identifier, + # i.e. what he set as identity, not the op-local identifier (which is what we verify) + return $this->claimed_id; + case 'trustRoot': + case 'realm': + return $this->trustRoot; + case 'mode': + return empty($this->data['openid_mode']) ? null : $this->data['openid_mode']; + } + } + + /** + * Checks if the server specified in the url exists. + * + * @param $url url to check + * @return true, if the server exists; false otherwise + */ + function hostExists($url) + { + if (strpos($url, '/') === false) { + $server = $url; + } else { + $server = @parse_url($url, PHP_URL_HOST); + } + + if (!$server) { + return false; + } + + return !!gethostbynamel($server); + } + + protected function request_curl($url, $method='GET', $params=array()) + { + $params = http_build_query($params, '', '&'); + $curl = curl_init($url . ($method == 'GET' && $params ? '?' . $params : '')); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($curl, CURLOPT_HEADER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/xrds+xml, */*')); + + if($this->verify_peer !== null) { + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $this->verify_peer); + if($this->capath) { + curl_setopt($curl, CURLOPT_CAPATH, $this->capath); + } + + if($this->cainfo) { + curl_setopt($curl, CURLOPT_CAINFO, $this->cainfo); + } + } + + if ($method == 'POST') { + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, $params); + } elseif ($method == 'HEAD') { + curl_setopt($curl, CURLOPT_HEADER, true); + curl_setopt($curl, CURLOPT_NOBODY, true); + } else { + curl_setopt($curl, CURLOPT_HTTPGET, true); + } + $response = curl_exec($curl); + + if($method == 'HEAD') { + $headers = array(); + foreach(explode("\n", $response) as $header) { + $pos = strpos($header,':'); + $name = strtolower(trim(substr($header, 0, $pos))); + $headers[$name] = trim(substr($header, $pos+1)); + } + + # Updating claimed_id in case of redirections. + $effective_url = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); + if($effective_url != $url) { + $this->identity = $this->claimed_id = $effective_url; + } + + return $headers; + } + + if (curl_errno($curl)) { + throw new ErrorException(curl_error($curl), curl_errno($curl)); + } + + return $response; + } + + protected function request_streams($url, $method='GET', $params=array()) + { + if(!$this->hostExists($url)) { + throw new ErrorException("Could not connect to $url.", 404); + } + + $params = http_build_query($params, '', '&'); + switch($method) { + case 'GET': + $opts = array( + 'http' => array( + 'method' => 'GET', + 'header' => 'Accept: application/xrds+xml, */*', + 'ignore_errors' => true, + ) + ); + $url = $url . ($params ? '?' . $params : ''); + break; + case 'POST': + $opts = array( + 'http' => array( + 'method' => 'POST', + 'header' => 'Content-type: application/x-www-form-urlencoded', + 'content' => $params, + 'ignore_errors' => true, + ) + ); + break; + case 'HEAD': + # We want to send a HEAD request, + # but since get_headers doesn't accept $context parameter, + # we have to change the defaults. + $default = stream_context_get_options(stream_context_get_default()); + stream_context_get_default( + array('http' => array( + 'method' => 'HEAD', + 'header' => 'Accept: application/xrds+xml, */*', + 'ignore_errors' => true, + )) + ); + + $url = $url . ($params ? '?' . $params : ''); + $headers_tmp = get_headers ($url); + if(!$headers_tmp) { + return array(); + } + + # Parsing headers. + $headers = array(); + foreach($headers_tmp as $header) { + $pos = strpos($header,':'); + $name = strtolower(trim(substr($header, 0, $pos))); + $headers[$name] = trim(substr($header, $pos+1)); + + # Following possible redirections. The point is just to have + # claimed_id change with them, because get_headers() will + # follow redirections automatically. + # We ignore redirections with relative paths. + # If any known provider uses them, file a bug report. + if($name == 'location') { + if(strpos($headers[$name], 'http') === 0) { + $this->identity = $this->claimed_id = $headers[$name]; + } elseif($headers[$name][0] == '/') { + $parsed_url = parse_url($this->claimed_id); + $this->identity = + $this->claimed_id = $parsed_url['scheme'] . '://' + . $parsed_url['host'] + . $headers[$name]; + } + } + } + + # And restore them. + stream_context_get_default($default); + return $headers; + } + + if($this->verify_peer) { + $opts += array('ssl' => array( + 'verify_peer' => true, + 'capath' => $this->capath, + 'cafile' => $this->cainfo, + )); + } + + $context = stream_context_create ($opts); + + return file_get_contents($url, false, $context); + } + + protected function request($url, $method='GET', $params=array()) + { + if (function_exists('curl_init') + && (!in_array('https', stream_get_wrappers()) || !ini_get('safe_mode') && !ini_get('open_basedir')) + ) { + return $this->request_curl($url, $method, $params); + } + return $this->request_streams($url, $method, $params); + } + + protected function build_url($url, $parts) + { + if (isset($url['query'], $parts['query'])) { + $parts['query'] = $url['query'] . '&' . $parts['query']; + } + + $url = $parts + $url; + $url = $url['scheme'] . '://' + . (empty($url['username'])?'' + :(empty($url['password'])? "{$url['username']}@" + :"{$url['username']}:{$url['password']}@")) + . $url['host'] + . (empty($url['port'])?'':":{$url['port']}") + . (empty($url['path'])?'':$url['path']) + . (empty($url['query'])?'':"?{$url['query']}") + . (empty($url['fragment'])?'':"#{$url['fragment']}"); + return $url; + } + + /** + * Helper function used to scan for / tags and extract information + * from them + */ + protected function htmlTag($content, $tag, $attrName, $attrValue, $valueName) + { + preg_match_all("#<{$tag}[^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*$valueName=['\"](.+?)['\"][^>]*/?>#i", $content, $matches1); + preg_match_all("#<{$tag}[^>]*$valueName=['\"](.+?)['\"][^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*/?>#i", $content, $matches2); + + $result = array_merge($matches1[1], $matches2[1]); + return empty($result)?false:$result[0]; + } + + /** + * Performs Yadis and HTML discovery. Normally not used. + * @param $url Identity URL. + * @return String OP Endpoint (i.e. OpenID provider address). + * @throws ErrorException + */ + function discover($url) + { + if (!$url) throw new ErrorException('No identity supplied.'); + # Use xri.net proxy to resolve i-name identities + if (!preg_match('#^https?:#', $url)) { + $url = "https://xri.net/$url"; + } + + # We save the original url in case of Yadis discovery failure. + # It can happen when we'll be lead to an XRDS document + # which does not have any OpenID2 services. + $originalUrl = $url; + + # A flag to disable yadis discovery in case of failure in headers. + $yadis = true; + + # We'll jump a maximum of 5 times, to avoid endless redirections. + for ($i = 0; $i < 5; $i ++) { + if ($yadis) { + $headers = $this->request($url, 'HEAD'); + + $next = false; + if (isset($headers['x-xrds-location'])) { + $url = $this->build_url(parse_url($url), parse_url(trim($headers['x-xrds-location']))); + $next = true; + } + + if (isset($headers['content-type']) + && (strpos($headers['content-type'], 'application/xrds+xml') !== false + || strpos($headers['content-type'], 'text/xml') !== false) + ) { + # Apparently, some providers return XRDS documents as text/html. + # While it is against the spec, allowing this here shouldn't break + # compatibility with anything. + # --- + # Found an XRDS document, now let's find the server, and optionally delegate. + $content = $this->request($url, 'GET'); + + preg_match_all('#(.*?)#s', $content, $m); + foreach($m[1] as $content) { + $content = ' ' . $content; # The space is added, so that strpos doesn't return 0. + + # OpenID 2 + $ns = preg_quote('http://specs.openid.net/auth/2.0/'); + if(preg_match('#\s*'.$ns.'(server|signon)\s*#s', $content, $type)) { + if ($type[1] == 'server') $this->identifier_select = true; + + preg_match('#(.*)#', $content, $server); + preg_match('#<(Local|Canonical)ID>(.*)#', $content, $delegate); + if (empty($server)) { + return false; + } + # Does the server advertise support for either AX or SREG? + $this->ax = (bool) strpos($content, 'http://openid.net/srv/ax/1.0'); + $this->sreg = strpos($content, 'http://openid.net/sreg/1.0') + || strpos($content, 'http://openid.net/extensions/sreg/1.1'); + + $server = $server[1]; + if (isset($delegate[2])) $this->identity = trim($delegate[2]); + $this->version = 2; + + $this->server = $server; + return $server; + } + + # OpenID 1.1 + $ns = preg_quote('http://openid.net/signon/1.1'); + if (preg_match('#\s*'.$ns.'\s*#s', $content)) { + + preg_match('#(.*)#', $content, $server); + preg_match('#<.*?Delegate>(.*)#', $content, $delegate); + if (empty($server)) { + return false; + } + # AX can be used only with OpenID 2.0, so checking only SREG + $this->sreg = strpos($content, 'http://openid.net/sreg/1.0') + || strpos($content, 'http://openid.net/extensions/sreg/1.1'); + + $server = $server[1]; + if (isset($delegate[1])) $this->identity = $delegate[1]; + $this->version = 1; + + $this->server = $server; + return $server; + } + } + + $next = true; + $yadis = false; + $url = $originalUrl; + $content = null; + break; + } + if ($next) continue; + + # There are no relevant information in headers, so we search the body. + $content = $this->request($url, 'GET'); + $location = $this->htmlTag($content, 'meta', 'http-equiv', 'X-XRDS-Location', 'content'); + if ($location) { + $url = $this->build_url(parse_url($url), parse_url($location)); + continue; + } + } + + if (!$content) $content = $this->request($url, 'GET'); + + # At this point, the YADIS Discovery has failed, so we'll switch + # to openid2 HTML discovery, then fallback to openid 1.1 discovery. + $server = $this->htmlTag($content, 'link', 'rel', 'openid2.provider', 'href'); + $delegate = $this->htmlTag($content, 'link', 'rel', 'openid2.local_id', 'href'); + $this->version = 2; + + if (!$server) { + # The same with openid 1.1 + $server = $this->htmlTag($content, 'link', 'rel', 'openid.server', 'href'); + $delegate = $this->htmlTag($content, 'link', 'rel', 'openid.delegate', 'href'); + $this->version = 1; + } + + if ($server) { + # We found an OpenID2 OP Endpoint + if ($delegate) { + # We have also found an OP-Local ID. + $this->identity = $delegate; + } + $this->server = $server; + return $server; + } + + throw new ErrorException("No OpenID Server found at $url", 404); + } + throw new ErrorException('Endless redirection!', 500); + } + + protected function sregParams() + { + $params = array(); + # We always use SREG 1.1, even if the server is advertising only support for 1.0. + # That's because it's fully backwards compatibile with 1.0, and some providers + # advertise 1.0 even if they accept only 1.1. One such provider is myopenid.com + $params['openid.ns.sreg'] = 'http://openid.net/extensions/sreg/1.1'; + if ($this->required) { + $params['openid.sreg.required'] = array(); + foreach ($this->required as $required) { + if (!isset(self::$ax_to_sreg[$required])) continue; + $params['openid.sreg.required'][] = self::$ax_to_sreg[$required]; + } + $params['openid.sreg.required'] = implode(',', $params['openid.sreg.required']); + } + + if ($this->optional) { + $params['openid.sreg.optional'] = array(); + foreach ($this->optional as $optional) { + if (!isset(self::$ax_to_sreg[$optional])) continue; + $params['openid.sreg.optional'][] = self::$ax_to_sreg[$optional]; + } + $params['openid.sreg.optional'] = implode(',', $params['openid.sreg.optional']); + } + return $params; + } + + protected function axParams() + { + $params = array(); + if ($this->required || $this->optional) { + $params['openid.ns.ax'] = 'http://openid.net/srv/ax/1.0'; + $params['openid.ax.mode'] = 'fetch_request'; + $this->aliases = array(); + $counts = array(); + $required = array(); + $optional = array(); + foreach (array('required','optional') as $type) { + foreach ($this->$type as $alias => $field) { + if (is_int($alias)) $alias = strtr($field, '/', '_'); + $this->aliases[$alias] = 'http://axschema.org/' . $field; + if (empty($counts[$alias])) $counts[$alias] = 0; + $counts[$alias] += 1; + ${$type}[] = $alias; + } + } + foreach ($this->aliases as $alias => $ns) { + $params['openid.ax.type.' . $alias] = $ns; + } + foreach ($counts as $alias => $count) { + if ($count == 1) continue; + $params['openid.ax.count.' . $alias] = $count; + } + + # Don't send empty ax.requied and ax.if_available. + # Google and possibly other providers refuse to support ax when one of these is empty. + if($required) { + $params['openid.ax.required'] = implode(',', $required); + } + if($optional) { + $params['openid.ax.if_available'] = implode(',', $optional); + } + } + return $params; + } + + protected function authUrl_v1($immediate) + { + $returnUrl = $this->returnUrl; + # If we have an openid.delegate that is different from our claimed id, + # we need to somehow preserve the claimed id between requests. + # The simplest way is to just send it along with the return_to url. + if($this->identity != $this->claimed_id) { + $returnUrl .= (strpos($returnUrl, '?') ? '&' : '?') . 'openid.claimed_id=' . $this->claimed_id; + } + + $params = array( + 'openid.return_to' => $returnUrl, + 'openid.mode' => $immediate ? 'checkid_immediate' : 'checkid_setup', + 'openid.identity' => $this->identity, + 'openid.trust_root' => $this->trustRoot, + ) + $this->sregParams(); + + return $this->build_url(parse_url($this->server) + , array('query' => http_build_query($params, '', '&'))); + } + + protected function authUrl_v2($immediate) + { + $params = array( + 'openid.ns' => 'http://specs.openid.net/auth/2.0', + 'openid.mode' => $immediate ? 'checkid_immediate' : 'checkid_setup', + 'openid.return_to' => $this->returnUrl, + 'openid.realm' => $this->trustRoot, + ); + if ($this->ax) { + $params += $this->axParams(); + } + if ($this->sreg) { + $params += $this->sregParams(); + } + if (!$this->ax && !$this->sreg) { + # If OP doesn't advertise either SREG, nor AX, let's send them both + # in worst case we don't get anything in return. + $params += $this->axParams() + $this->sregParams(); + } + + if ($this->identifier_select) { + $params['openid.identity'] = $params['openid.claimed_id'] + = 'http://specs.openid.net/auth/2.0/identifier_select'; + } else { + $params['openid.identity'] = $this->identity; + $params['openid.claimed_id'] = $this->claimed_id; + } + + return $this->build_url(parse_url($this->server) + , array('query' => http_build_query($params, '', '&'))); + } + + /** + * Returns authentication url. Usually, you want to redirect your user to it. + * @return String The authentication url. + * @param String $select_identifier Whether to request OP to select identity for an user in OpenID 2. Does not affect OpenID 1. + * @throws ErrorException + */ + function authUrl($immediate = false) + { + if ($this->setup_url && !$immediate) return $this->setup_url; + if (!$this->server) $this->discover($this->identity); + + if ($this->version == 2) { + return $this->authUrl_v2($immediate); + } + return $this->authUrl_v1($immediate); + } + + /** + * Performs OpenID verification with the OP. + * @return Bool Whether the verification was successful. + * @throws ErrorException + */ + function validate() + { + # If the request was using immediate mode, a failure may be reported + # by presenting user_setup_url (for 1.1) or reporting + # mode 'setup_needed' (for 2.0). Also catching all modes other than + # id_res, in order to avoid throwing errors. + if(isset($this->data['openid_user_setup_url'])) { + $this->setup_url = $this->data['openid_user_setup_url']; + return false; + } + if($this->mode != 'id_res') { + return false; + } + + $this->claimed_id = isset($this->data['openid_claimed_id'])?$this->data['openid_claimed_id']:$this->data['openid_identity']; + $params = array( + 'openid.assoc_handle' => $this->data['openid_assoc_handle'], + 'openid.signed' => $this->data['openid_signed'], + 'openid.sig' => $this->data['openid_sig'], + ); + + if (isset($this->data['openid_ns'])) { + # We're dealing with an OpenID 2.0 server, so let's set an ns + # Even though we should know location of the endpoint, + # we still need to verify it by discovery, so $server is not set here + $params['openid.ns'] = 'http://specs.openid.net/auth/2.0'; + } elseif (isset($this->data['openid_claimed_id']) + && $this->data['openid_claimed_id'] != $this->data['openid_identity'] + ) { + # If it's an OpenID 1 provider, and we've got claimed_id, + # we have to append it to the returnUrl, like authUrl_v1 does. + $this->returnUrl .= (strpos($this->returnUrl, '?') ? '&' : '?') + . 'openid.claimed_id=' . $this->claimed_id; + } + + if ($this->data['openid_return_to'] != $this->returnUrl) { + # The return_to url must match the url of current request. + # I'm assuing that noone will set the returnUrl to something that doesn't make sense. + return false; + } + + $server = $this->discover($this->claimed_id); + + foreach (explode(',', $this->data['openid_signed']) as $item) { + # Checking whether magic_quotes_gpc is turned on, because + # the function may fail if it is. For example, when fetching + # AX namePerson, it might containg an apostrophe, which will be escaped. + # In such case, validation would fail, since we'd send different data than OP + # wants to verify. stripslashes() should solve that problem, but we can't + # use it when magic_quotes is off. + $value = $this->data['openid_' . str_replace('.','_',$item)]; + $params['openid.' . $item] = get_magic_quotes_gpc() ? stripslashes($value) : $value; + + } + + $params['openid.mode'] = 'check_authentication'; + + $response = $this->request($server, 'POST', $params); + + return preg_match('/is_valid\s*:\s*true/i', $response); + } + + protected function getAxAttributes() + { + $alias = null; + if (isset($this->data['openid_ns_ax']) + && $this->data['openid_ns_ax'] != 'http://openid.net/srv/ax/1.0' + ) { # It's the most likely case, so we'll check it before + $alias = 'ax'; + } else { + # 'ax' prefix is either undefined, or points to another extension, + # so we search for another prefix + foreach ($this->data as $key => $val) { + if (substr($key, 0, strlen('openid_ns_')) == 'openid_ns_' + && $val == 'http://openid.net/srv/ax/1.0' + ) { + $alias = substr($key, strlen('openid_ns_')); + break; + } + } + } + if (!$alias) { + # An alias for AX schema has not been found, + # so there is no AX data in the OP's response + return array(); + } + + $attributes = array(); + foreach (explode(',', $this->data['openid_signed']) as $key) { + $keyMatch = $alias . '.value.'; + if (substr($key, 0, strlen($keyMatch)) != $keyMatch) { + continue; + } + $key = substr($key, strlen($keyMatch)); + if (!isset($this->data['openid_' . $alias . '_type_' . $key])) { + # OP is breaking the spec by returning a field without + # associated ns. This shouldn't happen, but it's better + # to check, than cause an E_NOTICE. + continue; + } + $value = $this->data['openid_' . $alias . '_value_' . $key]; + $key = substr($this->data['openid_' . $alias . '_type_' . $key], + strlen('http://axschema.org/')); + + $attributes[$key] = $value; + } + return $attributes; + } + + protected function getSregAttributes() + { + $attributes = array(); + $sreg_to_ax = array_flip(self::$ax_to_sreg); + foreach (explode(',', $this->data['openid_signed']) as $key) { + $keyMatch = 'sreg.'; + if (substr($key, 0, strlen($keyMatch)) != $keyMatch) { + continue; + } + $key = substr($key, strlen($keyMatch)); + if (!isset($sreg_to_ax[$key])) { + # The field name isn't part of the SREG spec, so we ignore it. + continue; + } + $attributes[$sreg_to_ax[$key]] = $this->data['openid_sreg_' . $key]; + } + return $attributes; + } + + /** + * Gets AX/SREG attributes provided by OP. should be used only after successful validaton. + * Note that it does not guarantee that any of the required/optional parameters will be present, + * or that there will be no other attributes besides those specified. + * In other words. OP may provide whatever information it wants to. + * * SREG names will be mapped to AX names. + * * @return Array Array of attributes with keys being the AX schema names, e.g. 'contact/email' + * @see http://www.axschema.org/types/ + */ + function getAttributes() + { + if (isset($this->data['openid_ns']) + && $this->data['openid_ns'] == 'http://specs.openid.net/auth/2.0' + ) { # OpenID 2.0 + # We search for both AX and SREG attributes, with AX taking precedence. + return $this->getAxAttributes() + $this->getSregAttributes(); + } + return $this->getSregAttributes(); + } +} diff --git a/models/Anime.php b/models/Anime.php new file mode 100644 index 0000000..ffa40eb --- /dev/null +++ b/models/Anime.php @@ -0,0 +1,8 @@ + '_id', 'source' => 'anime'); + +} \ No newline at end of file diff --git a/models/Entry.php b/models/Entry.php new file mode 100644 index 0000000..3b27393 --- /dev/null +++ b/models/Entry.php @@ -0,0 +1,9 @@ + 'fs.files'); + public $validates = array(); + + + /** + * Generate a cached version under webroot + * @param string $id The image id as in mongodb + * @param array $options Possible values are + * width + * height + * @return mixed + */ + public static function version($id, $options = array()) { + if (!$id) + return false; + // This is the same as Photo::first($id) when called from inside itself + $self = static::first($id); + return ($self) ? $self->generateVersion($options) : false; + } + + /** + * Generate a cached version under webroot + * @param Document $self The document from the db + * @param array $options Possible values are + * @return mixed + */ + public function generateVersion($self, $options = array()) { + // This is quite naive, it would fail at .jpeg for example. Be more elaborate on production code! + $type = substr($self->file->file['filename'], -3); + $path = LITHIUM_APP_PATH . "/webroot/image/{$self->_id}"; + $originalPath = $path . "." . $type; + + // Always create the original variant if it doesnt exist yet. It is needed for resize + if (!file_exists($originalPath)) + file_put_contents($originalPath, $self->file->getBytes()); + + if (isset($options['width']) && isset($options['height'])) { + $width = (int) $options['width']; + $height = (int) $options['height']; + + $path .= "_{$width}x{$height}.{$type}"; + + // This requires imagemagick and access to system calls. + // It is possible to use gd but it is a much worse alternative so please dont. + $convertCommand = "convert $originalPath -resize {$width}x{$height}\> $path"; + shell_exec($convertCommand); + // Return data of the resized version + return file_get_contents($path); + } + // If no width/height were set, just return data of the original + return $self->file->getBytes(); + } +} + +?> \ No newline at end of file diff --git a/models/Post.php b/models/Post.php new file mode 100644 index 0000000..653beb2 --- /dev/null +++ b/models/Post.php @@ -0,0 +1,137 @@ + '_id'); + +//Overrides save so we can do some stuff before the data is commited to the database. + +/* Post model $_Schema: + * _id => MongoID + * user_id -> mongoID of the user that posted it + * datetime -> mongodate of when the post was posted + * body -> the text of the post + * level -> access level required to see the post + * comments[] => list of comments + * type -> the type of post, IE picture text, chat etc + */ + + /** + * Parses an array of words to find mentions and topic tags then converts them + * @param Entitiy $entity Not used, but otherwise lithium will pass entity into words which makes the program blowup + * @param Mixed $input, either a string, or a spilt array of words (ie an exploded string) + * @return String a string with the topics and mentions converted + */ + public function parse($entity, $input) + { + $words; + if (is_array($input)) { + $words = $input; + } + else { + $words = explode(" ", $input); + } + + //Count the number of words + $count = count($words); + + + //For each word in the array + for ($i = 0; $i < $count; $i++) + { + //If the word begins with a '@' convert it to a mention + if ($words[$i][0] == '@') + { + $words[$i] = $this->convertToMention($words[$i]); + } + //Else if the word beings with a '#' Convert to topic link + else if ($words[$i][0] == '#') + { + $words[$i] = $this->convertToTopic($words[$i]); + } + } + return implode(" ", $words); + } + + //TODO: Some sort of security check to make sure + //That the user is ok with receiving message + + public function directMessage($entity, $to) + { + //Get the user the message is to + $user = User::find('first', array('conditions' => array('username' => $to))); + + //If find() returned a user, + if ($user) + { + //Add the post to their feed, + return $post->store($user); + } + //If the user wasn't found + return false; + } + + /** + * Converts a string with a topic tag(eg: #madoka) to clickable link to the topic eg #madoka + * @param String $input The string with topic tag + * @return String the string with href + */ + public function convertToTopic($input) + { + //Remove the # character from the beginning + $output = substr($input, 1); + + //Formats the string and returns it. + return "$input"; + } + + /** + * converts a mention (eg: @bob) to a clickable link to the user's profile eg #madoka + * @param String $input The string with topic tag + * @return String the string with href + */ + public function convertToMention($input) + { + //Remove the @ character from the beginning + $output = substr($input, 1); + + //Formats the string and returns it. + return "$input"; + } + + /** + * Stores the post to all the user's friends feed + * @param Post $entity The post to be stored + * @param Array $users an Array of users objects to store the post to + * @return boolean True if sucsessful, false otherwise + */ + //Store all can take a single param as well, therefore it should replace the store method once we're sure it works properly :TODO: + public function storeAll($entity, $users) + { + $ids; + foreach($users as $user) + { + $ids[] = $user->_id; + } + + $updateData = array('$push' => array('feed' => $entity['_id']->__toString())); + + $conditions = array('_id' => array('$in' => $ids)); + $result = User::update($updateData, $conditions, array('atomic' => false)); + + return $result; + } + + public function store($entity, $user) + { + $updateData = array('$push' => array('feed' => $entity['_id']->__toString())); + $conditions = array('_id' => $user['_id']); + $result = User::update($updateData, $conditions, array('atomic' => false)); + + return $result; + } +} + +?> \ No newline at end of file diff --git a/models/Profile.php b/models/Profile.php new file mode 100644 index 0000000..a85be6d --- /dev/null +++ b/models/Profile.php @@ -0,0 +1,17 @@ + array(array('date')) + ); +} + +?> \ No newline at end of file diff --git a/models/ProfilePic.php b/models/ProfilePic.php new file mode 100644 index 0000000..079f5b7 --- /dev/null +++ b/models/ProfilePic.php @@ -0,0 +1,28 @@ + 'fs.files'); + + //Overriding save to do the thumbnailing :) + public function save($entity, $data, array $options = array()) + { + //Create a new imagemagick object from the uploaded file + $im = new Imagick($data['file']); + + //Create a thumbnail of the file, then store it in the "thumbnail" object + $data['thumbnail'] = $im->thumbnailImage(200, null); + + //Pass the changes off to the original save method. + return parent::save($entity, $data, $options); + } +} + +?> \ No newline at end of file diff --git a/models/Topic.php b/models/Topic.php new file mode 100644 index 0000000..6f12aa2 --- /dev/null +++ b/models/Topic.php @@ -0,0 +1,13 @@ + '_id'); + protected $_schema = array('_id' => array('type' => 'id'), 'feed' => array('type'=>'string', 'array'=>true)); + + public static function __init() + { + //Initialize the parent if you want the database and everything setup (which of course we do) + parent::__init(); + + //Confirms that the username isn't already in use. + Validator::add('isUniqUser', function($username) { + //If we can't find a user with the same user name then the name is unique. + return User::count(array('conditions' => compact('username'))) == 0; + }); + + //Checks if the username contains profanity + Validator::add('isClean', function($username) { + //Needs to do a dictonary lookup, but too lazy to implement right now. + return true; + }); + + Validator::add('isValidGender', function($gender) { + //If the geneder is male or female return true. + return ($gender == 'Male' || $gender == 'Female'); + }); + + Validator::add('isUniqueEmail', function($email) { + //Find all the email address that match the one inputted, + //If there is none found (count == 0) then return true (Email address is unique) + return User::count(array('conditions' => compact('email'))) == 0; + }); + + Validator::add('validBirthday', function($birthday) { + // :TODO: + //*birthday needs to be 1930 <= $birthday <= current year - 11 (11 or older); + return true; + }); + } + + + /* Validation code */ + /* + Things that need to be validated + *The username cannot be taken + *the username cannot cotain special chars or spaces + *there must be an email address + *The email address needs to be a valid email + *it cannot be in use already + *the password needs to be atleast 6 characters + *the username cannot contain profanity + *birthday needs to be 1930 <= $birthday <= current year - 11 (11 or older); + *gender must be Male or Female + */ + public $validates = array( + 'username' => array(array('isUniqUser', 'message' => "Username is already taken."), + array('notEmpty', 'message' => 'Please enter a Username.'), + array('isClean', 'message' => 'Profanity is not allowed in Usernames'), + array('alphaNumeric', 'message' => "Usernames cant contain special characters") + ), + + 'email' => array(array('email', 'message' => 'The email address is not valid.'), + array('notEmpty', 'message' => 'An email address must be entered.'), + array('isUniqueEmail', 'message' => 'That email address is already in use. Did you forget your password?') + ), + + + //Passwords validation is invented. + 'password' => array(array('lengthBetween' =>array('min' => '6', 'max' =>'20'), + 'message' => 'Your password must be between 6 and 20 characters') + ) /*, + + //It's always possible for people to submit invalid data using cURL or something. + 'gender' => array('isValidGender', 'message' => 'Please check for dangly bits or lack thereof.') + */ + ); + + + /* Defaults */ + /* + joindate = today, + accesslevel = "user" + */ + + public function updateuser($entity, $data) + { + $conditions = array('_id' => $entity->_id, 'state' => 'default'); + $options = array('multiple' => false, 'safe' => true, 'upsert'=>true); + return static::update($data, $conditions, $options); + } + + /** + * Creates a post and stores it into the appropriate user(s) array(s) + * @param User $entity the instance of the user posting the message + * @param Array $data The data from the request (usually submiited from the form) + * @param Array $options Currently not implemented + * @return null Nothing for now, though should return true or false in the future :TODO: + */ + public function post($entity, $data, array $options = array()) + { + //TODO, fix all methods so that they don't take $data directly + //TODO add validators to these methods/models + + //Create the post + $post = Post::create(array('datetime' => new MongoDate(), + 'username' => $entity->username, + 'user_id' => $entity->_id, + 'level' => null)); + //1. Parse + //Break the string into an array of words + $search = explode(" ", $data['body']); + + //if the first word is DM + if ($search[0] == "DM") + { + //Remove the '@' symbol before we search for that username + $to = substr($search[1], 1); + + $post->type = "DM"; + //:TODO: Catch the return incase it's false. + return $post->directMessage($to); + } + + //If the post beings with a mention (it's a reply / note) + if ($search[0] == "@") + { + //Set the post level to hidden + $post->level = "hidden"; + } + + + //Check if there are any mentions or topics + $post->body = $post->parse($search); + + + //Because there is a chance that parse will set post level to something + //We pass the current value to level since it will just + //return the same it not set. + //Yes, we could use an if ! null but whatever. + $post->level = $this->postLevel($entity, $post, $post->level); + + //Save the post to the posts database. + $post->save(); + + //If the user has friends + if (count($entity->friends) > 0) + { + //Save this posts to the feed of all the Users Friends + $post->storeAll($entity->friends); + } + //Add this post to the user's feed array + $post->store($entity); + + + + + //$save = $entity->save(null, array('validate' => false)); + /* In the future, there should be a way to make this method quicker and non-blocking*/ + //For each friend, post it in their feed (friends is an array of usernames as strings) + /*if (!empty($entity->friends)) + { + foreach ($entity->friends as $friend) + { + //Grab the friend from the database + $curFriend = User::find('first', array('conditions' => array('username' => $friend))); + + //Add the post to their feed. + //Array unshift puts the new post at the first element of the feed array. + $curFriend->feed = array_unshift($post->_id, $curFriend->feed); + + //Save the friend to the database, + $curFriend->save(array('validates' => false)); + + //Eventually, we can call a node.js endpoint here + //To tell all subscribers that there is a new a post + //Something like "curl POST $post->_id nodeserver://endpoint/myFeed" + } + } */ + } + + /** + * Store's the post to the specified user's feed + * @param User $user The user to add the post to + * @param Post $post The post too add to the feed + * @return boolean True if the operation sucsceeded, false otherwise + */ + private function storePost($user, $post) + { + $updateData = array('$push' => array('feed' => $post['_id']->__toString())); + $conditions = array('_id' => $user['_id']); + $result = User::update($updateData, $conditions, array('atomic' => false)); + + return $result; + } + + + /** + * Returns the appropriate post level for the post + * @see app\models\Post + * @param User $user The user instance of the user that the post will be posted to + * @param Post $post The Post to determine the level for + * @param string $level The level (if you want to override the output) + * @return string $level if one is passed in, otherwise hidden if the post begins with a mention or private if the user has his posts protected + */ + public static function postLevel($user, $post, $level = null) + { + //if for some crazy reason you need to set the post to a specific type using this + // method then if $level is not null, return $level + if ($level != null) + { + return $level; + } + //If the post is directed at user (begins with @username) + //This is done in parse right now + //return "hidden" + + //If the user has their post set to private + if (isset($user->settings['private'])); + { + //return private + return "private"; + } + + //If none of the above apply + return "public"; + } + + //When we switch to a graph database, there is a bidirection vertex function + //So we can cut this search down to one query, and one line of code :P + /** + * Check wether user1 and user2 are friends + * + * @param string $user1 The username of the first user + * @param string $user2 The username of the second user + * @return boolean True if the users are friends, false otherwise + */ + public static function areFriends($user1, $user2) + { + //Get the first user from the database, + $usr1 = User::find('first', array('conditions' => array('username' => $user1))); + + //If user 2 is in user1's friends, + if (in_array($user2, $usr1->friends)) + { + $usr2 = User::find('first', array('conditions' => array('username' => $user2))); + //And user1 is in user2s friends + if (in_array($user1, $usr2->friends)) + { + return true; + } + } + //otherwise + return false; + } + + /** + * GetPosts gets posts from the user (entity) based on some params, and returns them + * @param User $entity, the calling object + * @param Array $options, the options that will be used, you can see the defaults below + * @return array(), with all the posts found or false, if somehow that didn't happen + */ + public function getPosts($entity, array $options = array()) + { + $posts; + $defaults = array( + 'limit' => '20', + 'qualifier' => 'all', + 'level' => 'public', + ); + + //If the user passed in options + if (!empty($options)) + { + //merge the options with the defaults (upsert them) + array_merge($defaults, $options); + } + + //var_dump($entity); + //exit(); + //If the user has more posts than the limit, return the limit, if the have less return + $count = (count($entity->feed) >= $defaults['limit']) ? $defaults['limit'] : count($entity->feed); + if ($count == 0) + { + return false; + } + //else + var_dump(Post::find('all', array('conditions' => array('$in' => $entity->feed)))); + exit(); + for ($i = 0; $i < $count; $i++) + { + $posts[] = Post::find('all', array('conditions' => array('$in' => $entity->feed))); + $posts[] = Post::find($qaulifier, array('conditions' => array('_id' => $entity->feed[$i], 'level' => $defaults[level]))); + } + return $posts; + } + + /** + * Increments the amount profile views for the user. + * This is the command we are going to give to Mongo, which breaks down to db.users.update({_id : $id}, {$inc: {profileViews : 1}} ) + * Which says, find the user by their mongo ID, then increment their profile views by one. + * @param User $entity The instance of user to increment + * @param string $type Not implemented but in the future will allow you to increment anime manga and kdrama list views :TODO: + * @return null + */ + public function incrementViews($entity, $type = null) + { + if ($type = null) + { + $views = 'profileViews'; + } + $updateData = array('$inc' => array('profileViews' => 1)); + $conditions = array('_id' => $entity['_id']); + $result = User::update($updateData, $conditions, array('atomic' => false)); + return $result; + + } + + + //Overrides save so we can do some stuff before the data is commited to the database. + public function save($entity, $data = null, array $options = array()) + { + //If the new password field is empty, or this is a new user + if(!empty($entity->newpass) || !$entity->exists()) + { + //Generate Salt for the user. + $salt = String::genSalt('bf', 6); + + //Hash their password. + $data['password'] = String::hashPassword($entity->newpass, $salt); + $data['salt'] = $salt; + unset($entity->newpass); + } + //If the entity doesn't exist or if the password password has been modified + return parent::save($entity, $data, $options); + } +} + +?> \ No newline at end of file diff --git a/models/confirmKey.php b/models/confirmKey.php new file mode 100644 index 0000000..6a941ad --- /dev/null +++ b/models/confirmKey.php @@ -0,0 +1,46 @@ + '_id'); + //array('isValidKey', 'message' => 'Key does not exist'); + + public static function __init() + { + //Make sure the class we extend inits. + parent::__init(); + + //Checks if the key is valid (in the database); + Validator::add('isValidKey', function($key) { + return confirmKey::count(array('conditions' => compact('key'))) == 1; + }); + } + + //For now, this will remain, but eventually it should just filter the save + //Method since the confirmation key doesn't really need to be returned to the controller. + public function generate($email) + { + //Doesn't need to be ultra secure since they just need to click the generated link + return String::hash($email.$this->secret, array('type' => 'crc32')); + } + + /* + * Old Validates function + public function isValidKey($key) + { + //If they key is valid, it should be found in the database + //If there is 1 key that matches the input key, + return confirmKey::count(array('conditions' => compact('key'))) == 1; + } + */ +} +?> \ No newline at end of file diff --git a/models/contentList.php b/models/contentList.php new file mode 100644 index 0000000..017e261 --- /dev/null +++ b/models/contentList.php @@ -0,0 +1,17 @@ + array('' + $conditions = array('_id' => $user['_id']); + $result = User::update($updateData, $conditions, array('atomic' => false)); + } +} \ No newline at end of file diff --git a/models/untitled.php b/models/untitled.php new file mode 100644 index 0000000..46fd26c --- /dev/null +++ b/models/untitled.php @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/resources/g11n/empty b/resources/g11n/empty new file mode 100644 index 0000000..e69de29 diff --git a/resources/tmp/logs/empty b/resources/tmp/logs/empty new file mode 100644 index 0000000..e69de29 diff --git a/resources/tmp/tests/empty b/resources/tmp/tests/empty new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/controllers/PhotosControllerTest.php b/tests/cases/controllers/PhotosControllerTest.php new file mode 100644 index 0000000..d1fc9e2 --- /dev/null +++ b/tests/cases/controllers/PhotosControllerTest.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/tests/cases/controllers/ProfilesControllerTest.php b/tests/cases/controllers/ProfilesControllerTest.php new file mode 100644 index 0000000..9bd29b6 --- /dev/null +++ b/tests/cases/controllers/ProfilesControllerTest.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/tests/cases/controllers/empty b/tests/cases/controllers/empty new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/extensions/adapter/empty b/tests/cases/extensions/adapter/empty new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/extensions/command/empty b/tests/cases/extensions/command/empty new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/extensions/data/source/empty b/tests/cases/extensions/data/source/empty new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tests/cases/extensions/data/source/empty @@ -0,0 +1 @@ + diff --git a/tests/cases/extensions/helper/empty b/tests/cases/extensions/helper/empty new file mode 100644 index 0000000..e69de29 diff --git a/tests/cases/models/PhotoTest.php b/tests/cases/models/PhotoTest.php new file mode 100644 index 0000000..6c7cc78 --- /dev/null +++ b/tests/cases/models/PhotoTest.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/tests/cases/models/ProfileTest.php b/tests/cases/models/ProfileTest.php new file mode 100644 index 0000000..946ea8e --- /dev/null +++ b/tests/cases/models/ProfileTest.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/tests/cases/models/empty b/tests/cases/models/empty new file mode 100644 index 0000000..e69de29 diff --git a/tests/functional/empty b/tests/functional/empty new file mode 100644 index 0000000..e69de29 diff --git a/tests/integration/empty b/tests/integration/empty new file mode 100644 index 0000000..e69de29 diff --git a/tests/mocks/empty b/tests/mocks/empty new file mode 100644 index 0000000..e69de29 diff --git a/views/.DS_Store b/views/.DS_Store new file mode 100644 index 0000000..91c6902 Binary files /dev/null and b/views/.DS_Store differ diff --git a/views/Admin/editUser.html.php b/views/Admin/editUser.html.php new file mode 100644 index 0000000..53d0742 --- /dev/null +++ b/views/Admin/editUser.html.php @@ -0,0 +1,11 @@ + +form->create($user); ?> + +form->create(); ?> + + form->field('username'); ?> + form->field('newpass', array('label' => 'New Password')); ?> + form->field('email'); ?> + form->select('level', array('User' => 'User', 'Mod' => 'Mod', 'Admin' => 'Admin', 'root' => 'Root'), array('value' => 1)); ?> + form->submit('Save!'); ?> +form->end(); ?> \ No newline at end of file diff --git a/views/Admin/index.html.php b/views/Admin/index.html.php new file mode 100644 index 0000000..35cc451 --- /dev/null +++ b/views/Admin/index.html.php @@ -0,0 +1,99 @@ +flashMessage->output(); ?> +
+
+
+
+
+ + + +
+
+
+

Users

+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActiveUsernameReal NameEmailJoin DateAccess Level
+ active ? "checked" : ""; ?> > + + username ?> + + Some Filler + + email ?> + + joinedOn->sec) ?> + + level)) ? $user->level : "Not Set"; ?> + + Edit + + Delete +
+ +
+ +
+
\ No newline at end of file diff --git a/views/Admin/users.html.php b/views/Admin/users.html.php new file mode 100644 index 0000000..11dea9f --- /dev/null +++ b/views/Admin/users.html.php @@ -0,0 +1,103 @@ +flashMessage->output(); ?> +
+ +
+
+
+
+ + + +
+
+
+

Users

+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActiveUsernameReal NameEmailJoin DateAccess Level
+ + + username ?> + + Some Filler + + email ?> + + joinedOn->sec) ?> + + level)) ? $user->level : "Not Set"; ?> + + Edit + + Delete +
+ +
+ +
+
\ No newline at end of file diff --git a/views/Anime_list/add.html.php b/views/Anime_list/add.html.php new file mode 100644 index 0000000..5e9699a --- /dev/null +++ b/views/Anime_list/add.html.php @@ -0,0 +1,33 @@ + +

Anime not found

+ +

series_title ?>

+form->create($entry); + echo $this->form->hidden('series_animedb_id', array('value' => $anime->special_id)); + /* + + TV + 26 + */ + + echo $this->form->field('my_watched_episodes', array('label' => 'Watched Episodes')); + echo $this->form->field('my_start_date', array('label' => 'Start Date')); + echo $this->form->field('my_finish_date', array('label' => 'Finish Date')); + //Make this Ajax in the future, but it will have to be removed + //If we partner with CR or otherwise + //echo $this->form->field('my_fansub_group', ); + echo $this->form->field('my_score', array('label' => 'Score')); + //echo $this->form->field() // + // + echo $this->form->label('my_status', 'Status'); + echo $this->form->select('my_status', array('Plan to Watch', 'On-Hold', 'Completed', 'Watching'), array('value' => 0)); //Plan to Watch + echo $this->form->field('my_comments', array('label' => 'Comments')); + echo $this->form->field('my_times_watched', array('label' => 'Times Watched')); + echo $this->form->label('rewatch_value', 'Rewatch Value'); + echo $this->form->select('rewatch_value', array('High', 'Medium', 'Low', 'None'), array('value' => 0)); + echo $this->form->field('tags', array('type' => 'textarea')); + echo $this->form->field('rewatching', array('value' => false)); + echo $this->form->submit('Save!'); +?> + \ No newline at end of file diff --git a/views/Anime_list/index.html b/views/Anime_list/index.html new file mode 100644 index 0000000..ad9911a --- /dev/null +++ b/views/Anime_list/index.html @@ -0,0 +1,3 @@ +

username ?>'s AnimeList

+ + \ No newline at end of file diff --git a/views/Anime_list/index.html.php b/views/Anime_list/index.html.php new file mode 100644 index 0000000..abe931b --- /dev/null +++ b/views/Anime_list/index.html.php @@ -0,0 +1,74 @@ +

username ?>'s AnimeList

+
+html->link("Completed", "/animelist/view/$user->username/completed"); ?>
+ + +

Watching

+ + + + + + + + +

Finished Animes

+
+
+ + + + + +

Plans to Watch

+
+
+ + + + + +

Paused

+
+
+ + + + + + + +

Dropped

+
+
+ + + \ No newline at end of file diff --git a/views/Content/anime.html.php b/views/Content/anime.html.php new file mode 100644 index 0000000..4a3b8c9 --- /dev/null +++ b/views/Content/anime.html.php @@ -0,0 +1,68 @@ +

title ?>

+
+
+ +
+ + +
+ +

Synopsis

+
+synopsis ?> + +

Related Animes

+
+ +

Characters And VA's

+
+cast as $char): ?> +character ?> +role ?> +Played by: + people)): ?> + people as $actor): ?> + name ?> + language ?> + + + +
+
+
\ No newline at end of file diff --git a/views/Content/index.html.php b/views/Content/index.html.php new file mode 100644 index 0000000..842203e --- /dev/null +++ b/views/Content/index.html.php @@ -0,0 +1,7 @@ + + + + + +
imgNameEpisodesTypeScore
"image" title ?> episode_count ?>view_type ?>mal_score ?>
+Paginator->paginate(); ?> \ No newline at end of file diff --git a/views/Feeds/.DS_Store b/views/Feeds/.DS_Store new file mode 100644 index 0000000..27a9597 Binary files /dev/null and b/views/Feeds/.DS_Store differ diff --git a/views/Feeds/Carbon_files/avatar_9318cab29a1a_96.png b/views/Feeds/Carbon_files/avatar_9318cab29a1a_96.png new file mode 100644 index 0000000..e1394a2 Binary files /dev/null and b/views/Feeds/Carbon_files/avatar_9318cab29a1a_96.png differ diff --git a/views/Feeds/Carbon_files/bg_caption.png b/views/Feeds/Carbon_files/bg_caption.png new file mode 100644 index 0000000..2b9cbdb Binary files /dev/null and b/views/Feeds/Carbon_files/bg_caption.png differ diff --git a/views/Feeds/Carbon_files/bg_search.png b/views/Feeds/Carbon_files/bg_search.png new file mode 100644 index 0000000..191ec63 Binary files /dev/null and b/views/Feeds/Carbon_files/bg_search.png differ diff --git a/views/Feeds/Carbon_files/bg_search_focus.png b/views/Feeds/Carbon_files/bg_search_focus.png new file mode 100644 index 0000000..94b43ff Binary files /dev/null and b/views/Feeds/Carbon_files/bg_search_focus.png differ diff --git a/views/Feeds/Carbon_files/bg_sidebar.png b/views/Feeds/Carbon_files/bg_sidebar.png new file mode 100644 index 0000000..076754d Binary files /dev/null and b/views/Feeds/Carbon_files/bg_sidebar.png differ diff --git a/views/Feeds/Carbon_files/bg_texture.png b/views/Feeds/Carbon_files/bg_texture.png new file mode 100644 index 0000000..8e6a5bb Binary files /dev/null and b/views/Feeds/Carbon_files/bg_texture.png differ diff --git a/views/Feeds/Carbon_files/button_nav_left.png b/views/Feeds/Carbon_files/button_nav_left.png new file mode 100644 index 0000000..6635fd3 Binary files /dev/null and b/views/Feeds/Carbon_files/button_nav_left.png differ diff --git a/views/Feeds/Carbon_files/button_nav_right.png b/views/Feeds/Carbon_files/button_nav_right.png new file mode 100644 index 0000000..55442fb Binary files /dev/null and b/views/Feeds/Carbon_files/button_nav_right.png differ diff --git a/views/Feeds/Carbon_files/caption_bot.png b/views/Feeds/Carbon_files/caption_bot.png new file mode 100644 index 0000000..9f40a55 Binary files /dev/null and b/views/Feeds/Carbon_files/caption_bot.png differ diff --git a/views/Feeds/Carbon_files/caption_top.png b/views/Feeds/Carbon_files/caption_top.png new file mode 100644 index 0000000..adf191e Binary files /dev/null and b/views/Feeds/Carbon_files/caption_top.png differ diff --git a/views/Feeds/Carbon_files/count-1.js b/views/Feeds/Carbon_files/count-1.js new file mode 100644 index 0000000..0111122 --- /dev/null +++ b/views/Feeds/Carbon_files/count-1.js @@ -0,0 +1,5 @@ +var DISQUSWIDGETS; + +if (typeof DISQUSWIDGETS != 'undefined') { + DISQUSWIDGETS.displayCount({"showReactions": false, "text": {"and": "and", "reactions": {"zero": "0 Reactions", "multiple": "{num} Reactions", "one": "1 Reaction"}, "comments": {"zero": "0 Comments", "multiple": "{num} Comments", "one": "1 Comment"}}, "counts": [{"uid": 1, "comments": 3}, {"uid": 0, "comments": 7}, {"uid": 3, "comments": 0}, {"uid": 2, "comments": 3}, {"uid": 5, "comments": 2}, {"uid": 4, "comments": 0}, {"uid": 6, "comments": 0}]}); +} diff --git a/views/Feeds/Carbon_files/count.js b/views/Feeds/Carbon_files/count.js new file mode 100644 index 0000000..b0d5f91 Binary files /dev/null and b/views/Feeds/Carbon_files/count.js differ diff --git a/views/Feeds/Carbon_files/divider.png b/views/Feeds/Carbon_files/divider.png new file mode 100644 index 0000000..8940861 Binary files /dev/null and b/views/Feeds/Carbon_files/divider.png differ diff --git a/views/Feeds/Carbon_files/icon_comment.png b/views/Feeds/Carbon_files/icon_comment.png new file mode 100644 index 0000000..028494a Binary files /dev/null and b/views/Feeds/Carbon_files/icon_comment.png differ diff --git a/views/Feeds/Carbon_files/icon_fav.png b/views/Feeds/Carbon_files/icon_fav.png new file mode 100644 index 0000000..6fb457e Binary files /dev/null and b/views/Feeds/Carbon_files/icon_fav.png differ diff --git a/views/Feeds/Carbon_files/icon_link.png b/views/Feeds/Carbon_files/icon_link.png new file mode 100644 index 0000000..1695df9 Binary files /dev/null and b/views/Feeds/Carbon_files/icon_link.png differ diff --git a/views/Feeds/Carbon_files/icon_rss.png b/views/Feeds/Carbon_files/icon_rss.png new file mode 100644 index 0000000..d0ea78c Binary files /dev/null and b/views/Feeds/Carbon_files/icon_rss.png differ diff --git a/views/Feeds/Carbon_files/icon_source.png b/views/Feeds/Carbon_files/icon_source.png new file mode 100644 index 0000000..7505cb5 Binary files /dev/null and b/views/Feeds/Carbon_files/icon_source.png differ diff --git a/views/Feeds/Carbon_files/icon_tag.png b/views/Feeds/Carbon_files/icon_tag.png new file mode 100644 index 0000000..ba613cf Binary files /dev/null and b/views/Feeds/Carbon_files/icon_tag.png differ diff --git a/views/Feeds/Carbon_files/jquery.min.js b/views/Feeds/Carbon_files/jquery.min.js new file mode 100644 index 0000000..c941a5f --- /dev/null +++ b/views/Feeds/Carbon_files/jquery.min.js @@ -0,0 +1,166 @@ +/*! + * jQuery JavaScript Library v1.4.3 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Oct 14 23:10:06 2010 -0400 + */ +(function(E,A){function U(){return false}function ba(){return true}function ja(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ga(a){var b,d,e=[],f=[],h,k,l,n,s,v,B,D;k=c.data(this,this.nodeType?"events":"__events__");if(typeof k==="function")k=k.events;if(!(a.liveFired===this||!k||!k.live||a.button&&a.type==="click")){if(a.namespace)D=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var H=k.live.slice(0);for(n=0;nd)break;a.currentTarget=f.elem;a.data=f.handleObj.data; +a.handleObj=f.handleObj;D=f.handleObj.origHandler.apply(f.elem,arguments);if(D===false||a.isPropagationStopped()){d=f.level;if(D===false)b=false}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(Ha,"`").replace(Ia,"&")}function ka(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Ja.test(b))return c.filter(b, +e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function la(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var k in e[h])c.event.add(this,h,e[h][k],e[h][k].data)}}})}function Ka(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)} +function ma(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?La:Ma,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function ca(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Na.test(a)?e(a,h):ca(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)? +e(a,""):c.each(b,function(f,h){ca(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(na.concat.apply([],na.slice(0,b)),function(){d[this]=a});return d}function oa(a){if(!da[a]){var b=c("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";da[a]=d}return da[a]}function ea(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var u=E.document,c=function(){function a(){if(!b.isReady){try{u.documentElement.doScroll("left")}catch(i){setTimeout(a, +1);return}b.ready()}}var b=function(i,r){return new b.fn.init(i,r)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,k=/\S/,l=/^\s+/,n=/\s+$/,s=/\W/,v=/\d/,B=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,D=/^[\],:{}\s]*$/,H=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,G=/(?:^|:|,)(?:\s*\[)+/g,M=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,j=/(msie) ([\w.]+)/,o=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false, +q=[],t,x=Object.prototype.toString,C=Object.prototype.hasOwnProperty,P=Array.prototype.push,N=Array.prototype.slice,R=String.prototype.trim,Q=Array.prototype.indexOf,L={};b.fn=b.prototype={init:function(i,r){var y,z,F;if(!i)return this;if(i.nodeType){this.context=this[0]=i;this.length=1;return this}if(i==="body"&&!r&&u.body){this.context=u;this[0]=u.body;this.selector="body";this.length=1;return this}if(typeof i==="string")if((y=h.exec(i))&&(y[1]||!r))if(y[1]){F=r?r.ownerDocument||r:u;if(z=B.exec(i))if(b.isPlainObject(r)){i= +[u.createElement(z[1])];b.fn.attr.call(i,r,true)}else i=[F.createElement(z[1])];else{z=b.buildFragment([y[1]],[F]);i=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,i)}else{if((z=u.getElementById(y[2]))&&z.parentNode){if(z.id!==y[2])return f.find(i);this.length=1;this[0]=z}this.context=u;this.selector=i;return this}else if(!r&&!s.test(i)){this.selector=i;this.context=u;i=u.getElementsByTagName(i);return b.merge(this,i)}else return!r||r.jquery?(r||f).find(i):b(r).find(i); +else if(b.isFunction(i))return f.ready(i);if(i.selector!==A){this.selector=i.selector;this.context=i.context}return b.makeArray(i,this)},selector:"",jquery:"1.4.3",length:0,size:function(){return this.length},toArray:function(){return N.call(this,0)},get:function(i){return i==null?this.toArray():i<0?this.slice(i)[0]:this[i]},pushStack:function(i,r,y){var z=b();b.isArray(i)?P.apply(z,i):b.merge(z,i);z.prevObject=this;z.context=this.context;if(r==="find")z.selector=this.selector+(this.selector?" ": +"")+y;else if(r)z.selector=this.selector+"."+r+"("+y+")";return z},each:function(i,r){return b.each(this,i,r)},ready:function(i){b.bindReady();if(b.isReady)i.call(u,b);else q&&q.push(i);return this},eq:function(i){return i===-1?this.slice(i):this.slice(i,+i+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(i){return this.pushStack(b.map(this,function(r,y){return i.call(r, +y,r)}))},end:function(){return this.prevObject||b(null)},push:P,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var i=arguments[0]||{},r=1,y=arguments.length,z=false,F,I,K,J,fa;if(typeof i==="boolean"){z=i;i=arguments[1]||{};r=2}if(typeof i!=="object"&&!b.isFunction(i))i={};if(y===r){i=this;--r}for(;r0)){if(q){for(var r=0;i=q[r++];)i.call(u,b);q=null}b.fn.triggerHandler&&b(u).triggerHandler("ready")}}},bindReady:function(){if(!p){p=true;if(u.readyState==="complete")return setTimeout(b.ready, +1);if(u.addEventListener){u.addEventListener("DOMContentLoaded",t,false);E.addEventListener("load",b.ready,false)}else if(u.attachEvent){u.attachEvent("onreadystatechange",t);E.attachEvent("onload",b.ready);var i=false;try{i=E.frameElement==null}catch(r){}u.documentElement.doScroll&&i&&a()}}},isFunction:function(i){return b.type(i)==="function"},isArray:Array.isArray||function(i){return b.type(i)==="array"},isWindow:function(i){return i&&typeof i==="object"&&"setInterval"in i},isNaN:function(i){return i== +null||!v.test(i)||isNaN(i)},type:function(i){return i==null?String(i):L[x.call(i)]||"object"},isPlainObject:function(i){if(!i||b.type(i)!=="object"||i.nodeType||b.isWindow(i))return false;if(i.constructor&&!C.call(i,"constructor")&&!C.call(i.constructor.prototype,"isPrototypeOf"))return false;for(var r in i);return r===A||C.call(i,r)},isEmptyObject:function(i){for(var r in i)return false;return true},error:function(i){throw i;},parseJSON:function(i){if(typeof i!=="string"||!i)return null;i=b.trim(i); +if(D.test(i.replace(H,"@").replace(w,"]").replace(G,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(i):(new Function("return "+i))();else b.error("Invalid JSON: "+i)},noop:function(){},globalEval:function(i){if(i&&k.test(i)){var r=u.getElementsByTagName("head")[0]||u.documentElement,y=u.createElement("script");y.type="text/javascript";if(b.support.scriptEval)y.appendChild(u.createTextNode(i));else y.text=i;r.insertBefore(y,r.firstChild);r.removeChild(y)}},nodeName:function(i,r){return i.nodeName&&i.nodeName.toUpperCase()=== +r.toUpperCase()},each:function(i,r,y){var z,F=0,I=i.length,K=I===A||b.isFunction(i);if(y)if(K)for(z in i){if(r.apply(i[z],y)===false)break}else for(;F";a=u.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var s=u.createElement("div"); +s.style.width=s.style.paddingLeft="1px";u.body.appendChild(s);c.boxModel=c.support.boxModel=s.offsetWidth===2;if("zoom"in s.style){s.style.display="inline";s.style.zoom=1;c.support.inlineBlockNeedsLayout=s.offsetWidth===2;s.style.display="";s.innerHTML="
";c.support.shrinkWrapBlocks=s.offsetWidth!==2}s.innerHTML="
t
";var v=s.getElementsByTagName("td");c.support.reliableHiddenOffsets=v[0].offsetHeight=== +0;v[0].style.display="";v[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&v[0].offsetHeight===0;s.innerHTML="";u.body.removeChild(s).style.display="none"});a=function(s){var v=u.createElement("div");s="on"+s;var B=s in v;if(!B){v.setAttribute(s,"return;");B=typeof v[s]==="function"}return B};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength", +cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var pa={},Oa=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?pa:a;var e=a.nodeType,f=e?a[c.expando]:null,h=c.cache;if(!(e&&!f&&typeof b==="string"&&d===A)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]= +c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==A)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?pa:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);else if(d)delete f[e];else for(var k in a)delete a[k]}},acceptData:function(a){if(a.nodeName){var b= +c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){if(typeof a==="undefined")return this.length?c.data(this[0]):null;else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===A){var e=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(e===A&&this.length){e=c.data(this[0],a);if(e===A&&this[0].nodeType===1){e=this[0].getAttribute("data-"+a);if(typeof e=== +"string")try{e=e==="true"?true:e==="false"?false:e==="null"?null:!c.isNaN(e)?parseFloat(e):Oa.test(e)?c.parseJSON(e):e}catch(f){}else e=A}}return e===A&&d[1]?this.data(d[0]):e}else return this.each(function(){var h=c(this),k=[d[0],b];h.triggerHandler("setData"+d[1]+"!",k);c.data(this,a,b);h.triggerHandler("changeData"+d[1]+"!",k)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=c.data(a,b);if(!d)return e|| +[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===A)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this, +a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var qa=/[\n\t]/g,ga=/\s+/,Pa=/\r/g,Qa=/^(?:href|src|style)$/,Ra=/^(?:button|input)$/i,Sa=/^(?:button|input|object|select|textarea)$/i,Ta=/^a(?:rea)?$/i,ra=/^(?:radio|checkbox)$/i;c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this, +a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(s){var v=c(this);v.addClass(a.call(this,s,v.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ga),d=0,e=this.length;d-1)return true;return false}, +val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h=0;else if(c.nodeName(this,"select")){var B=c.makeArray(v);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),B)>=0});if(!B.length)this.selectedIndex=-1}else this.value=v}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return A;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==A;b=e&&c.props[b]||b;if(a.nodeType===1){var h=Qa.test(b);if((b in a||a[b]!==A)&&e&&!h){if(f){b==="type"&&Ra.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Sa.test(a.nodeName)||Ta.test(a.nodeName)&&a.href?0:A;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return A;a=!c.support.hrefNormalized&&e&& +h?a.getAttribute(b,2):a.getAttribute(b);return a===null?A:a}}});var X=/\.(.*)$/,ha=/^(?:textarea|input|select)$/i,Ha=/\./g,Ia=/ /g,Ua=/[^\w\s.|`]/g,Va=function(a){return a.replace(Ua,"\\$&")},sa={focusin:0,focusout:0};c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var k=a.nodeType?"events":"__events__",l=h[k],n=h.handle;if(typeof l=== +"function"){n=l.handle;l=l.events}else if(!l){a.nodeType||(h[k]=h=function(){});h.events=l={}}if(!n)h.handle=n=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(n.elem,arguments):A};n.elem=a;b=b.split(" ");for(var s=0,v;k=b[s++];){h=f?c.extend({},f):{handler:d,data:e};if(k.indexOf(".")>-1){v=k.split(".");k=v.shift();h.namespace=v.slice(0).sort().join(".")}else{v=[];h.namespace=""}h.type=k;if(!h.guid)h.guid=d.guid;var B=l[k],D=c.event.special[k]||{};if(!B){B=l[k]=[]; +if(!D.setup||D.setup.call(a,e,v,n)===false)if(a.addEventListener)a.addEventListener(k,n,false);else a.attachEvent&&a.attachEvent("on"+k,n)}if(D.add){D.add.call(a,h);if(!h.handler.guid)h.handler.guid=d.guid}B.push(h);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,k=0,l,n,s,v,B,D,H=a.nodeType?"events":"__events__",w=c.data(a),G=w&&w[H];if(w&&G){if(typeof G==="function"){w=G;G=G.events}if(b&&b.type){d=b.handler;b=b.type}if(!b|| +typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in G)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[k++];){v=f;l=f.indexOf(".")<0;n=[];if(!l){n=f.split(".");f=n.shift();s=RegExp("(^|\\.)"+c.map(n.slice(0).sort(),Va).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(B=G[f])if(d){v=c.event.special[f]||{};for(h=e||0;h=0){a.type= +f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return A;a.result=A;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)=== +false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){e=a.target;var k,l=f.replace(X,""),n=c.nodeName(e,"a")&&l==="click",s=c.event.special[l]||{};if((!s._default||s._default.call(d,a)===false)&&!n&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[l]){if(k=e["on"+l])e["on"+l]=null;c.event.triggered=true;e[l]()}}catch(v){}if(k)e["on"+l]=k;c.event.triggered=false}}},handle:function(a){var b,d,e; +d=[];var f,h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var k=d.length;f-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ha.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=va(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===A||f===e))if(e!=null||f){a.type="change";a.liveFired= +A;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",va(a))}},setup:function(){if(this.type=== +"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ha.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ha.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}u.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){sa[b]++===0&&u.addEventListener(a,d,true)},teardown:function(){--sa[b]=== +0&&u.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=A}var k=b==="one"?c.proxy(f,function(n){c(this).unbind(n,k);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var l=this.length;h0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); +(function(){function a(g,j,o,m,p,q){p=0;for(var t=m.length;p0){C=x;break}}x=x[g]}m[p]=C}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,k=true;[0,0].sort(function(){k=false;return 0});var l=function(g,j,o,m){o=o||[];var p=j=j||u;if(j.nodeType!==1&&j.nodeType!==9)return[];if(!g||typeof g!=="string")return o;var q=[],t,x,C,P,N=true,R=l.isXML(j),Q=g,L;do{d.exec("");if(t=d.exec(Q)){Q=t[3];q.push(t[1]);if(t[2]){P=t[3]; +break}}}while(t);if(q.length>1&&s.exec(g))if(q.length===2&&n.relative[q[0]])x=M(q[0]+q[1],j);else for(x=n.relative[q[0]]?[j]:l(q.shift(),j);q.length;){g=q.shift();if(n.relative[g])g+=q.shift();x=M(g,x)}else{if(!m&&q.length>1&&j.nodeType===9&&!R&&n.match.ID.test(q[0])&&!n.match.ID.test(q[q.length-1])){t=l.find(q.shift(),j,R);j=t.expr?l.filter(t.expr,t.set)[0]:t.set[0]}if(j){t=m?{expr:q.pop(),set:D(m)}:l.find(q.pop(),q.length===1&&(q[0]==="~"||q[0]==="+")&&j.parentNode?j.parentNode:j,R);x=t.expr?l.filter(t.expr, +t.set):t.set;if(q.length>0)C=D(x);else N=false;for(;q.length;){t=L=q.pop();if(n.relative[L])t=q.pop();else L="";if(t==null)t=j;n.relative[L](C,t,R)}}else C=[]}C||(C=x);C||l.error(L||g);if(f.call(C)==="[object Array]")if(N)if(j&&j.nodeType===1)for(g=0;C[g]!=null;g++){if(C[g]&&(C[g]===true||C[g].nodeType===1&&l.contains(j,C[g])))o.push(x[g])}else for(g=0;C[g]!=null;g++)C[g]&&C[g].nodeType===1&&o.push(x[g]);else o.push.apply(o,C);else D(C,o);if(P){l(P,p,o,m);l.uniqueSort(o)}return o};l.uniqueSort=function(g){if(w){h= +k;g.sort(w);if(h)for(var j=1;j0};l.find=function(g,j,o){var m;if(!g)return[];for(var p=0,q=n.order.length;p":function(g,j){var o=typeof j==="string",m,p=0,q=g.length;if(o&&!/\W/.test(j))for(j=j.toLowerCase();p=0))o||m.push(t);else if(o)j[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var j=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=j[1]+(j[2]||1)-0;g[3]=j[3]-0}g[0]=e++;return g},ATTR:function(g,j,o, +m,p,q){j=g[1].replace(/\\/g,"");if(!q&&n.attrMap[j])g[1]=n.attrMap[j];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,j,o,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=l(g[3],null,null,j);else{g=l.filter(g[3],j,o,true^p);o||m.push.apply(m,g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== +true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,j,o){return!!l(o[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== +g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,j){return j===0},last:function(g,j,o,m){return j===m.length-1},even:function(g,j){return j%2===0},odd:function(g,j){return j%2===1},lt:function(g,j,o){return jo[3]-0},nth:function(g,j,o){return o[3]- +0===j},eq:function(g,j,o){return o[3]-0===j}},filter:{PSEUDO:function(g,j,o,m){var p=j[1],q=n.filters[p];if(q)return q(g,o,j,m);else if(p==="contains")return(g.textContent||g.innerText||l.getText([g])||"").indexOf(j[3])>=0;else if(p==="not"){j=j[3];o=0;for(m=j.length;o=0}},ID:function(g,j){return g.nodeType===1&&g.getAttribute("id")===j},TAG:function(g,j){return j==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== +j},CLASS:function(g,j){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(j)>-1},ATTR:function(g,j){var o=j[1];o=n.attrHandle[o]?n.attrHandle[o](g):g[o]!=null?g[o]:g.getAttribute(o);var m=o+"",p=j[2],q=j[4];return o==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&o!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,j,o,m){var p=n.setFilters[j[2]]; +if(p)return p(g,o,j,m)}}},s=n.match.POS,v=function(g,j){return"\\"+(j-0+1)},B;for(B in n.match){n.match[B]=RegExp(n.match[B].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[B]=RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[B].source.replace(/\\(\d+)/g,v))}var D=function(g,j){g=Array.prototype.slice.call(g,0);if(j){j.push.apply(j,g);return j}return g};try{Array.prototype.slice.call(u.documentElement.childNodes,0)}catch(H){D=function(g,j){var o=j||[],m=0;if(f.call(g)==="[object Array]")Array.prototype.push.apply(o, +g);else if(typeof g.length==="number")for(var p=g.length;m";var o=u.documentElement;o.insertBefore(g,o.firstChild);if(u.getElementById(j)){n.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:A:[]};n.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}o.removeChild(g); +o=g=null})();(function(){var g=u.createElement("div");g.appendChild(u.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(j,o){var m=o.getElementsByTagName(j[1]);if(j[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(j){return j.getAttribute("href",2)};g=null})();u.querySelectorAll&& +function(){var g=l,j=u.createElement("div");j.innerHTML="

";if(!(j.querySelectorAll&&j.querySelectorAll(".TEST").length===0)){l=function(m,p,q,t){p=p||u;if(!t&&!l.isXML(p))if(p.nodeType===9)try{return D(p.querySelectorAll(m),q)}catch(x){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var C=p.id,P=p.id="__sizzle__";try{return D(p.querySelectorAll("#"+P+" "+m),q)}catch(N){}finally{if(C)p.id=C;else p.removeAttribute("id")}}return g(m,p,q,t)};for(var o in g)l[o]=g[o]; +j=null}}();(function(){var g=u.documentElement,j=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,o=false;try{j.call(u.documentElement,":sizzle")}catch(m){o=true}if(j)l.matchesSelector=function(p,q){try{if(o||!n.match.PSEUDO.test(q))return j.call(p,q)}catch(t){}return l(q,null,null,[p]).length>0}})();(function(){var g=u.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length=== +0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(j,o,m){if(typeof o.getElementsByClassName!=="undefined"&&!m)return o.getElementsByClassName(j[1])};g=null}}})();l.contains=u.documentElement.contains?function(g,j){return g!==j&&(g.contains?g.contains(j):true)}:function(g,j){return!!(g.compareDocumentPosition(j)&16)};l.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var M=function(g, +j){for(var o=[],m="",p,q=j.nodeType?[j]:j;p=n.match.PSEUDO.exec(g);){m+=p[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;p=0;for(var t=q.length;p0)for(var h=d;h0},closest:function(a, +b){var d=[],e,f,h=this[0];if(c.isArray(a)){var k={},l,n=1;if(h&&a.length){e=0;for(f=a.length;e-1:c(h).is(e))d.push({selector:l,elem:h,level:n})}h=h.parentNode;n++}}return d}k=$a.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h|| +!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}}); +c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling", +d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Wa.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||Ya.test(e))&&Xa.test(a))f=f.reverse();return this.pushStack(f,a,Za.call(arguments).join(","))}}); +c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===A||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var xa=/ jQuery\d+="(?:\d+|null)"/g, +$=/^\s+/,ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,za=/<([\w:]+)/,ab=/\s]+\/)>/g,O={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"], +area:[1,"",""],_default:[0,"",""]};O.optgroup=O.option;O.tbody=O.tfoot=O.colgroup=O.caption=O.thead;O.th=O.td;if(!c.support.htmlSerialize)O._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==A)return this.empty().append((this[0]&&this[0].ownerDocument||u).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this, +d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})}, +unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a= +c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*")); +c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(xa,"").replace(cb,'="$1">').replace($, +"")],e)[0]}else return this.cloneNode(true)});if(a===true){la(this,b);la(this.find("*"),b.find("*"))}return b},html:function(a){if(a===A)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(xa,""):null;else if(typeof a==="string"&&!Aa.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!O[(za.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ya,"<$1>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?l.cloneNode(true):l)}k.length&&c.each(k,Ka)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:u;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===u&&!Aa.test(a[0])&&(c.support.checkClone|| +!Ba.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h= +d.length;f0?this.clone(true):this).get();c(d[f])[b](k);e=e.concat(k)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||u;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||u;for(var f=[],h=0,k;(k=a[h])!=null;h++){if(typeof k==="number")k+="";if(k){if(typeof k==="string"&&!bb.test(k))k=b.createTextNode(k);else if(typeof k==="string"){k=k.replace(ya,"<$1>");var l=(za.exec(k)||["",""])[1].toLowerCase(),n=O[l]||O._default, +s=n[0],v=b.createElement("div");for(v.innerHTML=n[1]+k+n[2];s--;)v=v.lastChild;if(!c.support.tbody){s=ab.test(k);l=l==="table"&&!s?v.firstChild&&v.firstChild.childNodes:n[1]===""&&!s?v.childNodes:[];for(n=l.length-1;n>=0;--n)c.nodeName(l[n],"tbody")&&!l[n].childNodes.length&&l[n].parentNode.removeChild(l[n])}!c.support.leadingWhitespace&&$.test(k)&&v.insertBefore(b.createTextNode($.exec(k)[0]),v.firstChild);k=v.childNodes}if(k.nodeType)f.push(k);else f=c.merge(f,k)}}if(d)for(h=0;f[h];h++)if(e&& +c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,k=0,l;(l=a[k])!=null;k++)if(!(l.nodeName&&c.noData[l.nodeName.toLowerCase()]))if(d=l[c.expando]){if((b=e[d])&&b.events)for(var n in b.events)f[n]? +c.event.remove(l,n):c.removeEvent(l,n,b.handle);if(h)delete l[c.expando];else l.removeAttribute&&l.removeAttribute(c.expando);delete e[d]}}});var Ca=/alpha\([^)]*\)/i,db=/opacity=([^)]*)/,eb=/-([a-z])/ig,fb=/([A-Z])/g,Da=/^-?\d+(?:px)?$/i,gb=/^-?\d/,hb={position:"absolute",visibility:"hidden",display:"block"},La=["Left","Right"],Ma=["Top","Bottom"],W,ib=u.defaultView&&u.defaultView.getComputedStyle,jb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===A)return this; +return c.access(this,a,b,true,function(d,e,f){return f!==A?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),k=a.style,l=c.cssHooks[h];b=c.cssProps[h]|| +h;if(d!==A){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!l||!("set"in l)||(d=l.set(a,d))!==A)try{k[b]=d}catch(n){}}}else{if(l&&"get"in l&&(f=l.get(a,false,e))!==A)return f;return k[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==A)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]= +e[f]},camelCase:function(a){return a.replace(eb,jb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=ma(d,b,f);else c.swap(d,hb,function(){h=ma(d,b,f)});return h+"px"}},set:function(d,e){if(Da.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return db.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"": +b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=d.filter||"";d.filter=Ca.test(f)?f.replace(Ca,e):d.filter+" "+e}};if(ib)W=function(a,b,d){var e;d=d.replace(fb,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return A;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};else if(u.documentElement.currentStyle)W=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b], +h=a.style;if(!Da.test(f)&&gb.test(f)){d=h.left;e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f};if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var kb=c.now(),lb=/)<[^<]*)*<\/script>/gi, +mb=/^(?:select|textarea)/i,nb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ob=/^(?:GET|HEAD|DELETE)$/,Na=/\[\]$/,T=/\=\?(&|$)/,ia=/\?/,pb=/([?&])_=[^&]*/,qb=/^(\w+:)?\/\/([^\/?#]+)/,rb=/%20/g,sb=/#.*$/,Ea=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ea)return Ea.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d= +b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(k,l){if(l==="success"||l==="notmodified")h.html(f?c("
").append(k.responseText.replace(lb,"")).find(f):k.responseText);d&&h.each(d,[k.responseText,l,k])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& +!this.disabled&&(this.checked||mb.test(this.nodeName)||nb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, +getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", +script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),k=ob.test(h);b.url=b.url.replace(sb,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ia.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| +!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+kb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var l=E[d];E[d]=function(m){f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);if(c.isFunction(l))l(m);else{E[d]=A;try{delete E[d]}catch(p){}}v&&v.removeChild(B)}}if(b.dataType==="script"&&b.cache===null)b.cache= +false;if(b.cache===false&&h==="GET"){var n=c.now(),s=b.url.replace(pb,"$1_="+n);b.url=s+(s===b.url?(ia.test(b.url)?"&":"?")+"_="+n:"")}if(b.data&&h==="GET")b.url+=(ia.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");n=(n=qb.exec(b.url))&&(n[1]&&n[1]!==location.protocol||n[2]!==location.host);if(b.dataType==="script"&&h==="GET"&&n){var v=u.getElementsByTagName("head")[0]||u.documentElement,B=u.createElement("script");if(b.scriptCharset)B.charset=b.scriptCharset;B.src= +b.url;if(!d){var D=false;B.onload=B.onreadystatechange=function(){if(!D&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){D=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);B.onload=B.onreadystatechange=null;v&&B.parentNode&&v.removeChild(B)}}}v.insertBefore(B,v.firstChild);return A}var H=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!k||a&&a.contentType)w.setRequestHeader("Content-Type", +b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}n||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(G){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& +c.triggerGlobal(b,"ajaxSend",[w,b]);var M=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){H||c.handleComplete(b,w,e,f);H=true;if(w)w.onreadystatechange=c.noop}else if(!H&&w&&(w.readyState===4||m==="timeout")){H=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| +c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&g.call&&g.call(w);M("abort")}}catch(j){}b.async&&b.timeout>0&&setTimeout(function(){w&&!H&&M("timeout")},b.timeout);try{w.send(k||b.data==null?null:b.data)}catch(o){c.handleError(b,w,null,o);c.handleComplete(b,w,e,f)}b.async||M();return w}},param:function(a,b){var d=[],e=function(h,k){k=c.isFunction(k)?k():k;d[d.length]=encodeURIComponent(h)+ +"="+encodeURIComponent(k)};if(b===A)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)ca(f,a[f],b,e);return d.join("&").replace(rb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",[b,a])},handleComplete:function(a, +b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),e=a.getResponseHeader("Etag"); +if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});if(E.ActiveXObject)c.ajaxSettings.xhr= +function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var da={},tb=/^(?:toggle|show|hide)$/,ub=/^([+\-]=)?([\d+.\-]+)(.*)$/,aa,na=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",3),a,b,d);else{a= +0;for(b=this.length;a=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, +d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* +Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(h){return f.step(h)} +this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var f=this;a=c.fx;e.elem=this.elem;if(e()&&c.timers.push(e)&&!aa)aa=setInterval(a.tick,a.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; +this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(l,n){f.style["overflow"+n]=h.overflow[l]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| +this.options.show)for(var k in this.options.curAnim)c.style(this.elem,k,this.options.orig[k]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= +c.timers,b=0;b-1;e={};var s={};if(n)s=f.position();k=n?s.top:parseInt(k,10)||0;l=n?s.left:parseInt(l,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+k;if(b.left!=null)e.left=b.left-h.left+l;"using"in b?b.using.call(a, +e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Fa.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||u.body;a&&!Fa.test(a.nodeName)&& +c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==A)return this.each(function(){if(h=ea(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=ea(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); +c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(h){var k=c(this);k[d](e.call(this,h,k[d]()))});return c.isWindow(f)?f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b]:f.nodeType===9?Math.max(f.documentElement["client"+ +b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]):e===A?parseFloat(c.css(f,d)):this.css(d,typeof e==="string"?e:e+"px")}})})(window); diff --git a/views/Feeds/Carbon_files/photo_corner.png b/views/Feeds/Carbon_files/photo_corner.png new file mode 100644 index 0000000..fa694c3 Binary files /dev/null and b/views/Feeds/Carbon_files/photo_corner.png differ diff --git a/views/Feeds/Carbon_files/portrait_frame.png b/views/Feeds/Carbon_files/portrait_frame.png new file mode 100644 index 0000000..bb6a603 Binary files /dev/null and b/views/Feeds/Carbon_files/portrait_frame.png differ diff --git a/views/Feeds/Carbon_files/postmarker.png b/views/Feeds/Carbon_files/postmarker.png new file mode 100644 index 0000000..22ec876 Binary files /dev/null and b/views/Feeds/Carbon_files/postmarker.png differ diff --git a/views/Feeds/Carbon_files/postmarker_audio.png b/views/Feeds/Carbon_files/postmarker_audio.png new file mode 100644 index 0000000..b229397 Binary files /dev/null and b/views/Feeds/Carbon_files/postmarker_audio.png differ diff --git a/views/Feeds/Carbon_files/postmarker_chat.png b/views/Feeds/Carbon_files/postmarker_chat.png new file mode 100644 index 0000000..80a4c31 Binary files /dev/null and b/views/Feeds/Carbon_files/postmarker_chat.png differ diff --git a/views/Feeds/Carbon_files/postmarker_img.png b/views/Feeds/Carbon_files/postmarker_img.png new file mode 100644 index 0000000..7654323 Binary files /dev/null and b/views/Feeds/Carbon_files/postmarker_img.png differ diff --git a/views/Feeds/Carbon_files/postmarker_quote.png b/views/Feeds/Carbon_files/postmarker_quote.png new file mode 100644 index 0000000..0d30d4a Binary files /dev/null and b/views/Feeds/Carbon_files/postmarker_quote.png differ diff --git a/views/Feeds/Carbon_files/postmarker_text.png b/views/Feeds/Carbon_files/postmarker_text.png new file mode 100644 index 0000000..27c8b88 Binary files /dev/null and b/views/Feeds/Carbon_files/postmarker_text.png differ diff --git a/views/Feeds/Carbon_files/postmarker_url.png b/views/Feeds/Carbon_files/postmarker_url.png new file mode 100644 index 0000000..8c1844b Binary files /dev/null and b/views/Feeds/Carbon_files/postmarker_url.png differ diff --git a/views/Feeds/Carbon_files/postmarker_video.png b/views/Feeds/Carbon_files/postmarker_video.png new file mode 100644 index 0000000..c3f9fab Binary files /dev/null and b/views/Feeds/Carbon_files/postmarker_video.png differ diff --git a/views/Feeds/Carbon_files/quant.js b/views/Feeds/Carbon_files/quant.js new file mode 100644 index 0000000..ec3bd69 --- /dev/null +++ b/views/Feeds/Carbon_files/quant.js @@ -0,0 +1,28 @@ +if(!__qc){var __qc={qcdst:function(){if(__qc.qctzoff(0)!=__qc.qctzoff(6))return 1;return 0;},qctzoff:function(m){var d1=new Date(2000,m,1,0,0,0,0);var t=d1.toGMTString();var d3=new Date(t.substring(0,t.lastIndexOf(" ")-1));return d1-d3;},qceuc:function(s){if(typeof(encodeURIComponent)=='function'){return encodeURIComponent(s);} +else{return escape(s);}},qcrnd:function(){return Math.round(Math.random()*2147483647);},qcgc:function(n){var v='';var c=document.cookie;if(!c)return v;var i=c.indexOf(n+"=");var len=i+n.length+1;if(i>-1){var end=c.indexOf(";",len);if(end<0)end=c.length;v=c.substring(len,end);} +return v;},qcdomain:function(){var d=document.domain;if(d.substring(0,4)=="www.")d=d.substring(4,d.length);var a=d.split(".");var len=a.length;if(len<3)return d;var e=a[len-1];if(e.length<3)return d;d=a[len-2]+"."+a[len-1];return d;},qhash2:function(h,s){for(var i=0;i0){s+=";fpan=0;fpa="+a;} +else{var da=new Date();a='P0-'+__qc.qcrnd()+'-'+da.getTime();u.cookie="__qca="+a+"; expires=Sun, 18 Jan 2038 00:00:00 GMT; path=/; domain="+d;a=__qc.qcgc("__qca");if(a.length>0){s+=";fpan=1;fpa="+a;} +else{s+=";fpan=u;fpa=";}} +return s;},qcdc:function(n){document.cookie=n+"=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain="+__qc.qcdomain();},qpxload:function(img){if(img&&typeof(img.width)=="number"&&img.width==3){__qc.qcdc("__qca");}},qcp:function(p,myqo){var s='',a=null;var media='webpage',event='load';if(myqo!=null){for(var k in myqo){if(typeof(k)!='string'){continue;} +if(typeof(myqo[k])!='string'){continue;} +if(k=='qacct'){a=myqo[k];continue;} +s+=';'+k+p+'='+__qc.qceuc(myqo[k]);if(k=='media'){media=myqo[k];} +if(k=='event'){event=myqo[k];}}} +if(typeof a!="string"){if((typeof _qacct=="undefined")||(_qacct.length==0))return'';a=_qacct;} +if(media=='webpage'&&event=='load'){for(var i=0;i<__qc.qpixelsent.length;i++){if(__qc.qpixelsent[i]==a)return'';} +__qc.qpixelsent.push(a);} +if(media=='ad'){__qc.qad=1;} +s=';a'+p+'='+a+s;return s;},qcesc:function(s){return s.replace(/\./g,'%2E').replace(/,/g,'%2C');},qcd:function(o){return(typeof(o)!="undefined"&&o!=null);},qcogl:function(){var m=document.getElementsByTagName('meta');var o='';for(var i=0;i=1000)return o;if(__qc.qcd(m[i])&&__qc.qcd(m[i].attributes)&&__qc.qcd(m[i].attributes.property)&&__qc.qcd(m[i].attributes.property.value)&&__qc.qcd(m[i].content)){var p=m[i].attributes.property.value;var c=m[i].content;if(p.length>3&&p.substring(0,3)=='og:'){if(o.length>0)o+=',';var l=(c.length>80)?80:c.length;o+=__qc.qcesc(p.substring(3,p.length))+'.'+__qc.qcesc(c.substring(0,l));}}} +return __qc.qceuc(o);},firepixel:function(qoptions){var e=(typeof(encodeURIComponent)=='function')?"n":"s";var r=__qc.qcrnd();var sr='',qo='',qm='',url='',ref='',je='u',ns='1';var qocount=0;__qc.qad=0;if(typeof __qc.qpixelsent=="undefined"){__qc.qpixelsent=new Array();} +if(typeof qoptions!="undefined"&&qoptions!=null){__qc.qopts=qoptions;for(var k in __qc.qopts){if(typeof(__qc.qopts[k])=='string'){qo=__qc.qcp("",__qc.qopts);break;}else if(typeof(__qc.qopts[k])=='object'&&__qc.qopts[k]!=null){++qocount;qo+=__qc.qcp("."+qocount,__qc.qopts[k]);}}}else if(typeof _qacct=="string"){qo=__qc.qcp("",null);} +if(qo.length==0)return;var ce=(navigator.cookieEnabled)?"1":"0";if(typeof navigator.javaEnabled!='undefined')je=(navigator.javaEnabled())?"1":"0";if(typeof _qmeta!="undefined"&&_qmeta!=null){qm=';m='+__qc.qceuc(_qmeta);_qmeta=null;} +if(self.screen){sr=screen.width+"x"+screen.height+"x"+screen.colorDepth;} +var d=new Date();var dst=__qc.qcdst();var qs='http';if(window.location.protocol=='https:'){qs+='s';} +qs+="://pixel.quantserve.com";var fp=__qc.qcsc();if(window.location&&window.location.href)url=__qc.qceuc(window.location.href);if(window.document&&window.document.referrer)ref=__qc.qceuc(window.document.referrer);if(self==top)ns='0';var ogl=__qc.qcogl();var img=new Image();img.alt="";img.src=qs+'/pixel'+';r='+r+fp+';ns='+ns+';url='+url+';ref='+ref+';ce='+ce+';je='+je+';sr='+sr+';enc='+e+';ogl='+ogl+';dst='+dst+';et='+d.getTime()+';tzo='+d.getTimezoneOffset()+qo+qm;img.onload=function(){__qc.qpxload(img);}},quantserve:function(){if(typeof _qevents=='undefined'){_qevents=[];} +if(typeof _qoptions!="undefined"&&_qoptions!=null){__qc.firepixel(_qoptions);_qoptions=null;}else if(!_qevents.length&&typeof _qacct!="undefined"){__qc.firepixel(null);} +if(!__qc.evts){for(var k in _qevents){__qc.firepixel(_qevents[k]);} +_qevents={push:function(){var a=arguments;for(var i=0;i0){var a=navigator.mimeTypes;if(a&&a["application/x-shockwave-flash"]&&a["application/x-shockwave-flash"].enabledPlugin&&a["application/x-shockwave-flash"].enabledPlugin.description){return parseInt(a["application/x-shockwave-flash"].enabledPlugin.description.split(" ")[2].split(".")[0],10)}}else{if(navigator.appVersion.indexOf("Mac")==-1&&window.execScript){try{var c=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");var b=c.GetVariable("$version");return b.split(",")[0].split(" ")[1]}catch(d){}return 0}}}function replaceIfFlash(b,a,c){if(flashVersion()>=b){document.getElementById(a).innerHTML=c}}function renderVideo(c,g,e,a,b){var d=navigator.userAgent.toLowerCase();var f=(d.indexOf("iphone")!=-1);if(f){document.getElementById(c).innerHTML=''}else{replaceIfFlash(10,c,'')}}; \ No newline at end of file diff --git a/views/Feeds/Carbon_files/tumblr_lbn4lf36zN1qeglo0o1_500.jpg b/views/Feeds/Carbon_files/tumblr_lbn4lf36zN1qeglo0o1_500.jpg new file mode 100644 index 0000000..bb61425 Binary files /dev/null and b/views/Feeds/Carbon_files/tumblr_lbn4lf36zN1qeglo0o1_500.jpg differ diff --git a/views/Feeds/Carbon_files/tumblr_lbn5nwjpXc1qeglo0o1_1289347008_cover.jpg b/views/Feeds/Carbon_files/tumblr_lbn5nwjpXc1qeglo0o1_1289347008_cover.jpg new file mode 100644 index 0000000..788eb89 Binary files /dev/null and b/views/Feeds/Carbon_files/tumblr_lbn5nwjpXc1qeglo0o1_1289347008_cover.jpg differ diff --git a/views/Feeds/index.html.php b/views/Feeds/index.html.php new file mode 100644 index 0000000..9ab37d0 --- /dev/null +++ b/views/Feeds/index.html.php @@ -0,0 +1,634 @@ + + + + + + Carbon + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ What's up doc? +
+
+ + + + Subscribe via RSS +
+
+ + + + +
+ + + + +
+ Image +
This is a photo.
+

This is a photo.

+
+ + + + + + + + +
+ + + + + + +
+ + + + + + +
+ Video +
+

A cool little video.

+
+ + + + + +
+ +
+
+ + + + + + +
+ + + + + + + + +
+ Chat Transcript +

Pursuing Peter

+
    + +
  • + + Liam: + + "Peter has stopped replying to my emails again." + +
  • + +
  • + + William: + + "Let's both send him one at the same time." + +
  • + +
  • + + Liam: + + "Good idea!" + +
  • + +
  • + + William: + + "Alright!" +
  • + +
+
+ + + +
+ +
+
+ + + + + + +
+ + + + + + + + + +
+ Link + Purchase this theme + +
+ + +
+ +
+
+ + + + + + +
+ + + +
+ Quote +
Kelly wants to know if there is something for the background available besides the blue ladies underwear pattern.
+ —Said in a high nasal voice. +
+ + + + + + + + + +
+ + + + + + +
+ + +
+ Text +

A Clean, Well-Lighted Place

+

BY ERNEST HEMINGWAY

+ +

It was very late and everyone had left the cafe except an old man who sat in the shadow the leaves of the tree made against the electric light. In the day time the street was dusty, but at night the dew settled the dust and the old man liked to sit late because he was deaf and now at night it was quiet and he felt the difference. The two waiters inside the cafe knew that the old man was a little drunk, and while he was a good client they knew that if he became too drunk he would leave without paying, so they kept watch on him.

+ +

Read the rest: here.

+
+ + + + + + + + + + +
+ + + + + + +
+ + + + + + + +
+ Audio +
+ +
+ +
+ + +
[Flash 9 is required to listen to audio.]
+ +
+

Certain Things

+ +

Destroyer

+ +

Your Blues

+
+
+ + +
+ + + + +
+ +
+
+ + + + + + + + + + + + + +
    + +
  • Older
  • +
  • Page 1 of 2
  • +
+ +
+
+ +
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/views/Feeds/index.html1.php b/views/Feeds/index.html1.php new file mode 100644 index 0000000..55d5396 --- /dev/null +++ b/views/Feeds/index.html1.php @@ -0,0 +1 @@ +post as $post): ?> diff --git a/views/Photos/add.html.php b/views/Photos/add.html.php new file mode 100644 index 0000000..cd6e508 --- /dev/null +++ b/views/Photos/add.html.php @@ -0,0 +1,5 @@ +

Upload a photo

+form->create($photo, array('type' => 'file')); ?> + form->field('file', array('type' => 'file')); ?> + form->submit("Upload"); ?> +form->end(); ?> \ No newline at end of file diff --git a/views/Photos/index.html.php b/views/Photos/index.html.php new file mode 100644 index 0000000..5d10867 --- /dev/null +++ b/views/Photos/index.html.php @@ -0,0 +1,7 @@ + +html->link("Add a photo","photos::add"); ?> + + + html->image("/photos/view/{$photo->_id}.jpg"); ?> + + \ No newline at end of file diff --git a/views/Photos/view.html.php b/views/Photos/view.html.php new file mode 100644 index 0000000..c492b6e --- /dev/null +++ b/views/Photos/view.html.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/Profile/add.html.php b/views/Profile/add.html.php new file mode 100644 index 0000000..76744b9 --- /dev/null +++ b/views/Profile/add.html.php @@ -0,0 +1,4 @@ +form->create($photo, array('type' = > 'file')); ?> +

Upload a photo

+ form->field('file', array('type' => 'file')); ?> + form->end(); ?> \ No newline at end of file diff --git a/views/Profile/edit.html.php b/views/Profile/edit.html.php new file mode 100644 index 0000000..6e0a2b2 --- /dev/null +++ b/views/Profile/edit.html.php @@ -0,0 +1,6 @@ +form->create($profile); ?> + form->field('firstname', array('type' => 'text')); ?> + form->field('lastname', array('type' => 'text')); ?> + form->field('birthday', array('type' => 'text')); ?> + form->submit('save'); ?> +form->end(); ?> \ No newline at end of file diff --git a/views/Profile/view.html.php b/views/Profile/view.html.php new file mode 100644 index 0000000..c6c0ed1 --- /dev/null +++ b/views/Profile/view.html.php @@ -0,0 +1,19 @@ +form->create($photo, array('type' => 'file')); ?> + + form->label("This is you"); ?> + +

Upload a photo

+ form->field('file', array('type' => 'file')); ?> + +form->end(); ?> +

username ?>

+
+profile views: profileViews ?>
+Last Online: lastLogin)) ? "Never" : date('m/d/y', $user->lastLogin->sec); ?>
+ + $value): ?> + : + + +html->link('Click to edit profile', "/profile/edit/$user->username"); ?> + \ No newline at end of file diff --git a/views/Search/index.html.php b/views/Search/index.html.php new file mode 100644 index 0000000..16e4f33 --- /dev/null +++ b/views/Search/index.html.php @@ -0,0 +1,7 @@ +
+ + + + +
imgNameEpisodesTypeScore
"image" title ?> episode_count ?>view_type ?>mal_score ?>
+Paginator->paginate(array('separator' => '', 'action' => 'index')); ?> diff --git a/views/Users/Photos/index.html.php b/views/Users/Photos/index.html.php new file mode 100644 index 0000000..ba0fd60 --- /dev/null +++ b/views/Users/Photos/index.html.php @@ -0,0 +1,7 @@ + +html->link("photo::add", "Add a photo"); ?> + + + + + \ No newline at end of file diff --git a/views/Users/confirm.html.php b/views/Users/confirm.html.php new file mode 100644 index 0000000..cd0a6a7 --- /dev/null +++ b/views/Users/confirm.html.php @@ -0,0 +1 @@ +

Thanks for signing up. Please check your email to confirm your registration. If you lost you key click here to have it resent

diff --git a/views/Users/feed.html.php b/views/Users/feed.html.php new file mode 100644 index 0000000..d37b0a6 --- /dev/null +++ b/views/Users/feed.html.php @@ -0,0 +1,45 @@ +

Welcome username ?>

+
+form->create(null, array('action' => 'post')); ?> + form->field('body', array('type' => 'textarea')); ?> + form->submit('Post!'); ?> +form->end(); ?> +
+

Here are some posts:

+ + + +
+ Nov + 8 +
+ + + +
+ + +

body ?>

+ + + + +
+
+ + +

Woops! You have no posts, why not post something and get the party started!

+ + \ No newline at end of file diff --git a/views/Users/index.html.php b/views/Users/index.html.php new file mode 100644 index 0000000..4705d1c --- /dev/null +++ b/views/Users/index.html.php @@ -0,0 +1,12 @@ + +

No Users Found!

+ + + +

username ?>

+

Salted Password: password ?>

+

Salt: salt ?>

+

Joined on: joinedOn->sec) ?>

+ + + \ No newline at end of file diff --git a/views/Users/login.html.php b/views/Users/login.html.php new file mode 100644 index 0000000..0bfb2c5 --- /dev/null +++ b/views/Users/login.html.php @@ -0,0 +1,7 @@ +flashMessage->output(); ?> +form->create(); ?> + form->field('username'); ?> + form->field('password', array('type' => 'password')); ?> + form->field('remember', array('type' => 'checkbox')); ?> + form->submit('Login!'); ?> +form->end(); ?> \ No newline at end of file diff --git a/views/Users/logintest.html.php b/views/Users/logintest.html.php new file mode 100644 index 0000000..f1f91c4 --- /dev/null +++ b/views/Users/logintest.html.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/Users/openid.html.php b/views/Users/openid.html.php new file mode 100644 index 0000000..9a6e588 --- /dev/null +++ b/views/Users/openid.html.php @@ -0,0 +1,4 @@ +form->create(); ?> + form->field('identity', array('type' => 'text')); ?> + form->submit('Login'); ?> +form->end(); ?> \ No newline at end of file diff --git a/views/Users/post.html.php b/views/Users/post.html.php new file mode 100644 index 0000000..5f2c237 --- /dev/null +++ b/views/Users/post.html.php @@ -0,0 +1,3 @@ +form->create($post); ?> + form->field("body", array('type' => 'textarea')); ?> +form->end(); ?> \ No newline at end of file diff --git a/views/Users/profile.html.php b/views/Users/profile.html.php new file mode 100644 index 0000000..a29304d --- /dev/null +++ b/views/Users/profile.html.php @@ -0,0 +1,9 @@ +

name; ?>

+form->create($photo, array('type' => 'file')); ?> + exists()): ?> + form->label("This is you"); ?> + +

Upload a photo

+ form->field('file', array('type' => 'file')); ?> + +form->end(); ?> \ No newline at end of file diff --git a/views/Users/signup.html.php b/views/Users/signup.html.php new file mode 100644 index 0000000..58aa0b0 --- /dev/null +++ b/views/Users/signup.html.php @@ -0,0 +1,17 @@ + +Confirmation Link: Link + + +form->create($user); ?> + +form->create(); ?> + + form->field('username'); ?> + form->field('password', array('type' => 'password')); ?> + form->field('email'); ?> + + form->submit('Signup!'); ?> +form->end(); ?> + \ No newline at end of file diff --git a/views/Users/step2.html.php b/views/Users/step2.html.php new file mode 100644 index 0000000..dfdcffa --- /dev/null +++ b/views/Users/step2.html.php @@ -0,0 +1,12 @@ +flashMessage->output(); ?> +form->create(); ?> + form->field('Name'); ?> + + form->text("What's your birthday>"); ?> + form->field('day', array('type' => 'text')); ?> + form->field('month', array('type' => 'text')); ?> + form->field('year', array('type' => 'text')); ?> + form->field('location', array('type' => 'text')) ?> + form->select('gender', array('Male' => 'Male', 'Female' => 'Female')); ?> + form->submit('Create my account!'); ?> +form->end(); ?> \ No newline at end of file diff --git a/views/Users/test.html.php b/views/Users/test.html.php new file mode 100644 index 0000000..e69de29 diff --git a/views/_errors/development.html.php b/views/_errors/development.html.php new file mode 100644 index 0000000..18654f6 --- /dev/null +++ b/views/_errors/development.html.php @@ -0,0 +1,108 @@ +', '', "\n"); +$context = 5; + +/** + * Set Lithium-esque colors for syntax highlighing. + */ +ini_set('highlight.string', '#4DDB4A'); +ini_set('highlight.comment', '#D42AAE'); +ini_set('highlight.keyword', '#D42AAE'); +ini_set('highlight.default', '#3C96FF'); +ini_set('highlight.htm', '#FFFFFF'); + +$stack = Debugger::trace(array('format' => 'array', 'trace' => $exception->getTrace())); + +array_unshift($stack, array( + 'functionRef' => '[exception]', + 'file' => $exception->getFile(), + 'line' => $exception->getLine() +)); + +?> +

Exception

+ +
+ + + getCode()): ?> + (code ) + +
+ +
getMessage(); ?>
+ +

Source

+ +
+ +

Stack Trace

+ +
+
    + $frame): ?> + +
  1. + + + + +
  2. + +
+
+ + \ No newline at end of file diff --git a/views/elements/empty b/views/elements/empty new file mode 100644 index 0000000..e69de29 diff --git a/views/layouts/.DS_Store b/views/layouts/.DS_Store new file mode 100644 index 0000000..1dbc4c8 Binary files /dev/null and b/views/layouts/.DS_Store differ diff --git a/views/layouts/admin.html.php b/views/layouts/admin.html.php new file mode 100644 index 0000000..95ff3e7 --- /dev/null +++ b/views/layouts/admin.html.php @@ -0,0 +1,91 @@ + + + + + html->charset();?> + Application > <?php echo $this->title(); ?> + + + + + + + + + + + + + + +
+ content(); ?> +
+ + + + + \ No newline at end of file diff --git a/views/layouts/default.html copy.php b/views/layouts/default.html copy.php new file mode 100644 index 0000000..bad2fe4 --- /dev/null +++ b/views/layouts/default.html copy.php @@ -0,0 +1,52 @@ + + + + + html->charset();?> + OtakuHub > <?php echo $this->title(); ?> + html->style(array('debug', 'lithium')); ?> + scripts(); ?> + + + + + + html->link('Icon', null, array('type' => 'icon')); ?> + + +
+ +
+ content(); ?> +
+
+ + diff --git a/views/layouts/default.html.php b/views/layouts/default.html.php new file mode 100644 index 0000000..30f38c6 --- /dev/null +++ b/views/layouts/default.html.php @@ -0,0 +1,129 @@ + + + + + html->charset();?> + OtakuHub > <?php echo $this->title(); ?> + html->style(array('style', 'base', 'grid')); ?> + html->style(array('themes/light', 'themes/green')); ?> + html->style(array('prettyPhoto')); ?> + + + + html->link('Icon', null, array('type' => 'icon')); ?> + + +
+
+ +

Kameleon

+ + +
+
+ +
+ content(); ?> +
+
+ +
+ + + + + + + + + + + + + html->script("/js/jquery.anchor.js"); ?> + html->script("/js/jquery.prettyPhoto.js"); ?> + + + + scripts(); ?> + + + + + diff --git a/views/layouts/default.xml.php b/views/layouts/default.xml.php new file mode 100644 index 0000000..4a92323 --- /dev/null +++ b/views/layouts/default.xml.php @@ -0,0 +1,10 @@ + +'; ?> +content;?> diff --git a/views/layouts/error.html.php b/views/layouts/error.html.php new file mode 100644 index 0000000..2f26d97 --- /dev/null +++ b/views/layouts/error.html.php @@ -0,0 +1,46 @@ + + + + + html->charset(); ?> + Unhandled exception + html->style(array('debug', 'lithium')); ?> + scripts(); ?> + html->link('Icon', null, array('type' => 'icon')); ?> + + +
+ +
+ content(); ?> +
+
+ + \ No newline at end of file diff --git a/views/layouts/form.html.php b/views/layouts/form.html.php new file mode 100644 index 0000000..9bdaccd --- /dev/null +++ b/views/layouts/form.html.php @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + +content(); ?> + + \ No newline at end of file diff --git a/views/layouts/index.php_files/accept.png b/views/layouts/index.php_files/accept.png new file mode 100644 index 0000000..89c8129 Binary files /dev/null and b/views/layouts/index.php_files/accept.png differ diff --git a/views/layouts/index.php_files/add_16.png b/views/layouts/index.php_files/add_16.png new file mode 100644 index 0000000..63a3f17 Binary files /dev/null and b/views/layouts/index.php_files/add_16.png differ diff --git a/views/layouts/index.php_files/alert-error-bg.png b/views/layouts/index.php_files/alert-error-bg.png new file mode 100644 index 0000000..75ec426 Binary files /dev/null and b/views/layouts/index.php_files/alert-error-bg.png differ diff --git a/views/layouts/index.php_files/alert-info-bg.png b/views/layouts/index.php_files/alert-info-bg.png new file mode 100644 index 0000000..1a637a0 Binary files /dev/null and b/views/layouts/index.php_files/alert-info-bg.png differ diff --git a/views/layouts/index.php_files/alert-notice-bg.png b/views/layouts/index.php_files/alert-notice-bg.png new file mode 100644 index 0000000..66ff527 Binary files /dev/null and b/views/layouts/index.php_files/alert-notice-bg.png differ diff --git a/views/layouts/index.php_files/alert-success-bg.png b/views/layouts/index.php_files/alert-success-bg.png new file mode 100644 index 0000000..f380aa3 Binary files /dev/null and b/views/layouts/index.php_files/alert-success-bg.png differ diff --git a/views/layouts/index.php_files/basic.css b/views/layouts/index.php_files/basic.css new file mode 100644 index 0000000..c9fccc0 --- /dev/null +++ b/views/layouts/index.php_files/basic.css @@ -0,0 +1,198 @@ +/* http://meyerweb.com/eric/tools/css/reset/ */ +/* v1.0 | 20080212 */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; +} +body { + line-height: 1.5; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} +del { + text-decoration: line-through; +} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} + +/* -------------------------------------------------------------- + + typography.css + * Sets up some sensible default typography. + +-------------------------------------------------------------- */ + +/* Default font settings. + The font-size percentage is of 16px. (0.75 * 16px = 12px) */ +html { font-size:100.01%; } +body { + font-size: 75%; + color: #222; + background: #fff; + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; +} + + +/* Headings +-------------------------------------------------------------- */ + +h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #333; } + +h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; } +h2 { font-size: 2em; margin-bottom: 0.75em; } +h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; } +h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; } +h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; } +h6 { font-size: 1em; font-weight: bold; } + +h1 img, h2 img, h3 img, +h4 img, h5 img, h6 img { + margin: 0; +} + + +/* Text elements +-------------------------------------------------------------- */ + +p { margin: 0 0 1.5em; } +p img.left { float: left; margin: 1.5em 1.5em 1.5em 0; padding: 0; } +p img.right { float: right; margin: 1.5em 0 1.5em 1.5em; } + +a:focus, +a:hover { color: #000; } +a { color: #009; text-decoration: underline; } + +blockquote { margin: 1.5em; color: #666; font-style: italic; } +strong { font-weight: bold; } +em,dfn { font-style: italic; } +dfn { font-weight: bold; } +sup, sub { line-height: 0; } + +abbr, +acronym { border-bottom: 1px dotted #666; } +address { margin: 0 0 1.5em; font-style: italic; } +del { color:#666; } + +pre { margin: 1.5em 0; white-space: pre; } +pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; } + + +/* Lists +-------------------------------------------------------------- */ + +li ul, +li ol { margin: 0; } +ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 3.333em; } + +ul { list-style-type: disc; } +ol { list-style-type: decimal; } + +dl { margin: 0 0 1.5em 0; } +dl dt { font-weight: bold; } +dd { margin-left: 1.5em;} + + +/* Tables +-------------------------------------------------------------- */ + +table { margin-bottom: 1.4em; width:100%; } +th { font-weight: bold; } +thead th { background: #c3d9ff; } +th,td,caption { padding: 4px 10px 4px 5px; } +tr.even { background: #e5ecf9; } +tfoot { font-style: italic; } +caption { background: #eee; } + + +/* Misc classes +-------------------------------------------------------------- */ + +.small { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; } +.large { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; } +.hide { display: none; } + +.quiet { color: #666; } +.loud { color: #000; } +.highlight { background:#ff0; } +.added { background:#060; color: #fff; } +.removed { background:#900; color: #fff; } + +.first { margin-left:0 !important; padding-left:0 !important; } +.last { margin-right:0 !important; padding-right:0 !important; } +.top { margin-top:0 !important; padding-top:0 !important; } +.bottom { margin-bottom:0; padding-bottom:0; } + + + +/* `Clear Floated Elements +----------------------------------------------------------------------------------------------------*/ + +/* http://sonspring.com/journal/clearing-floats */ + +.clear { + clear: both; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; +} + +/* http://perishablepress.com/press/2009/12/06/new-clearfix-hack */ + +.clearfix:after { + clear: both; + content: ' '; + display: block; + font-size: 0; + line-height: 0; + visibility: hidden; + width: 0; + height: 0; +} + +/* + The following zoom:1 rule is specifically for IE6 + IE7. + Move to separate stylesheet if invalid CSS is a problem. +*/ +* html .clearfix, +*:first-child+html .clearfix { + zoom: 1; +} \ No newline at end of file diff --git a/views/layouts/index.php_files/blank_cell.png b/views/layouts/index.php_files/blank_cell.png new file mode 100644 index 0000000..10deeaf Binary files /dev/null and b/views/layouts/index.php_files/blank_cell.png differ diff --git a/views/layouts/index.php_files/change_password.png b/views/layouts/index.php_files/change_password.png new file mode 100644 index 0000000..696c553 Binary files /dev/null and b/views/layouts/index.php_files/change_password.png differ diff --git a/views/layouts/index.php_files/delete.png b/views/layouts/index.php_files/delete.png new file mode 100644 index 0000000..dbbc6c3 Binary files /dev/null and b/views/layouts/index.php_files/delete.png differ diff --git a/views/layouts/index.php_files/editable.png b/views/layouts/index.php_files/editable.png new file mode 100644 index 0000000..e7351fb Binary files /dev/null and b/views/layouts/index.php_files/editable.png differ diff --git a/views/layouts/index.php_files/email_32.png b/views/layouts/index.php_files/email_32.png new file mode 100644 index 0000000..d7206ad Binary files /dev/null and b/views/layouts/index.php_files/email_32.png differ diff --git a/views/layouts/index.php_files/exclamation.png b/views/layouts/index.php_files/exclamation.png new file mode 100644 index 0000000..c37bd06 Binary files /dev/null and b/views/layouts/index.php_files/exclamation.png differ diff --git a/views/layouts/index.php_files/ie.css b/views/layouts/index.php_files/ie.css new file mode 100644 index 0000000..cc84912 --- /dev/null +++ b/views/layouts/index.php_files/ie.css @@ -0,0 +1,74 @@ +#page-content-outer { + border: 1px solid #ccc; + padding-top: 1px; + + display:block; + +} + +#content{ + *padding-top:60px +} + + + +.form { + padding-top: 1px; +} + + + +.list td { + border-bottom: 1px dotted #eee; + +} + +.list tr:hover>th, th { + background: #eee url(table-header-bg.png) repeat-x 0 0 scroll; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + +} + + + +.list tr:hover>td { + background: transparent url(list_hover.png) repeat-x 0 -1px scroll; + +} + +.list td .small-button { + margin: 0 5px 8px 0; +} + +ul.tab_menu a span { + display: inline-block; + padding: 9px 29px 8px; +} + +.small-button { + margin-right: 2px; +} + +.small-button span { + padding: 0 11px 1px 8px; + +} + +.client-actions .danger{ + *margin-top:-23px; + +} + +#alert{ + top:45px; + z-index:99999; +} + +.large.button input{ + padding-top:5px; +} + +.form-title{ + *margin-top:24px; +} \ No newline at end of file diff --git a/views/layouts/index.php_files/info_bar_bg.png b/views/layouts/index.php_files/info_bar_bg.png new file mode 100644 index 0000000..2838af5 Binary files /dev/null and b/views/layouts/index.php_files/info_bar_bg.png differ diff --git a/views/layouts/index.php_files/information.png b/views/layouts/index.php_files/information.png new file mode 100644 index 0000000..12cd1ae Binary files /dev/null and b/views/layouts/index.php_files/information.png differ diff --git a/views/layouts/index.php_files/inner-split-bg.png b/views/layouts/index.php_files/inner-split-bg.png new file mode 100644 index 0000000..321996b Binary files /dev/null and b/views/layouts/index.php_files/inner-split-bg.png differ diff --git a/views/layouts/index.php_files/jquery.ba-bbq.min.js b/views/layouts/index.php_files/jquery.ba-bbq.min.js new file mode 100644 index 0000000..64748bf --- /dev/null +++ b/views/layouts/index.php_files/jquery.ba-bbq.min.js @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /demos/acpdemo/application/views/js/jquery.ba-bbq.min.js was not found on this server.

+

Additionally, a 404 Not Found +error was encountered while trying to use an ErrorDocument to handle the request.

+ diff --git a/views/layouts/index.php_files/jquery.min.js b/views/layouts/index.php_files/jquery.min.js new file mode 100644 index 0000000..0c7294c --- /dev/null +++ b/views/layouts/index.php_files/jquery.min.js @@ -0,0 +1,152 @@ +/*! + * jQuery JavaScript Library v1.4.1 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Jan 25 19:43:33 2010 -0500 + */ +(function(z,v){function la(){if(!c.isReady){try{r.documentElement.doScroll("left")}catch(a){setTimeout(la,1);return}c.ready()}}function Ma(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,i){var j=a.length;if(typeof b==="object"){for(var n in b)X(a,n,b[n],f,e,d);return a}if(d!==v){f=!i&&f&&c.isFunction(d);for(n=0;n-1){i=j.data;i.beforeFilter&&i.beforeFilter[a.type]&&!i.beforeFilter[a.type](a)||f.push(j.selector)}else delete x[o]}i=c(a.target).closest(f, +a.currentTarget);m=0;for(s=i.length;m)[^>]*$|^#([\w-]+)$/,Qa=/^.[^:#\[\.,]*$/,Ra=/\S/,Sa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Ta=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,O=navigator.userAgent, +va=false,P=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,Q=Array.prototype.slice,wa=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(typeof a==="string")if((d=Pa.exec(a))&&(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:r;if(a=Ta.exec(a))if(c.isPlainObject(b)){a=[r.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=ra([d[1]], +[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}}else{if(b=r.getElementById(d[2])){if(b.id!==d[2])return S.find(a);this.length=1;this[0]=b}this.context=r;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=r;a=r.getElementsByTagName(a)}else return!b||b.jquery?(b||S).find(a):c(b).find(a);else if(c.isFunction(a))return S.ready(a);if(a.selector!==v){this.selector=a.selector;this.context=a.context}return c.isArray(a)?this.setArray(a):c.makeArray(a, +this)},selector:"",jquery:"1.4.1",length:0,size:function(){return this.length},toArray:function(){return Q.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){a=c(a||null);a.prevObject=this;a.context=this.context;if(b==="find")a.selector=this.selector+(this.selector?" ":"")+d;else if(b)a.selector=this.selector+"."+b+"("+d+")";return a},setArray:function(a){this.length=0;ba.apply(this,a);return this},each:function(a,b){return c.each(this, +a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(r,c);else P&&P.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(Q.apply(this,arguments),"slice",Q.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice}; +c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,i,j,n;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a";var e=d.getElementsByTagName("*"),i=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!i)){c.support= +{leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(i.getAttribute("style")),hrefNormalized:i.getAttribute("href")==="/a",opacity:/^0.55$/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:r.createElement("select").appendChild(r.createElement("option")).selected,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null}; +b.type="text/javascript";try{b.appendChild(r.createTextNode("window."+f+"=1;"))}catch(j){}a.insertBefore(b,a.firstChild);if(z[f]){c.support.scriptEval=true;delete z[f]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function n(){c.support.noCloneEvent=false;d.detachEvent("onclick",n)});d.cloneNode(true).fireEvent("onclick")}d=r.createElement("div");d.innerHTML="";a=r.createDocumentFragment();a.appendChild(d.firstChild); +c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var n=r.createElement("div");n.style.width=n.style.paddingLeft="1px";r.body.appendChild(n);c.boxModel=c.support.boxModel=n.offsetWidth===2;r.body.removeChild(n).style.display="none"});a=function(n){var o=r.createElement("div");n="on"+n;var m=n in o;if(!m){o.setAttribute(n,"return;");m=typeof o[n]==="function"}return m};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=i=null}})();c.props= +{"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ua=0,xa={},Va={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var f=a[G],e=c.cache;if(!b&&!f)return null;f||(f=++Ua);if(typeof b==="object"){a[G]=f;e=e[f]=c.extend(true, +{},b)}else e=e[f]?e[f]:typeof d==="undefined"?Va:(e[f]={});if(d!==v){a[G]=f;e[b]=d}return typeof b==="string"?e[b]:e}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{try{delete a[G]}catch(i){a.removeAttribute&&a.removeAttribute(G)}delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this, +a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===v){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===v&&this.length)f=c.data(this[0],a);return f===v&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d); +return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===v)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]|| +a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var ya=/[\n\t]/g,ca=/\s+/,Wa=/\r/g,Xa=/href|src|style/,Ya=/(button|input)/i,Za=/(button|input|object|select|textarea)/i,$a=/^(a|area)$/i,za=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(o){var m= +c(this);m.addClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===v){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value|| +{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var i=b?d:0;for(d=b?d+1:e.length;i=0;else if(c.nodeName(this,"select")){var x=c.makeArray(s);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),x)>=0});if(!x.length)this.selectedIndex=-1}else this.value=s}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return v;if(f&&b in c.attrFn)return c(a)[b](d); +f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==v;b=f&&c.props[b]||b;if(a.nodeType===1){var i=Xa.test(b);if(b in a&&f&&!i){if(e){b==="type"&&Ya.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Za.test(a.nodeName)||$a.test(a.nodeName)&&a.href?0:v;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText= +""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&i?a.getAttribute(b,2):a.getAttribute(b);return a===null?v:a}return c.style(a,b,d)}});var ab=function(a){return a.replace(/[^\w\s\.\|`]/g,function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==z&&!a.frameElement)a=z;if(!d.guid)d.guid=c.guid++;if(f!==v){d=c.proxy(d);d.data=f}var e=c.data(a,"events")||c.data(a,"events",{}),i=c.data(a,"handle"),j;if(!i){j= +function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(j.elem,arguments):v};i=c.data(a,"handle",j)}if(i){i.elem=a;b=b.split(/\s+/);for(var n,o=0;n=b[o++];){var m=n.split(".");n=m.shift();if(o>1){d=c.proxy(d);if(f!==v)d.data=f}d.type=m.slice(0).sort().join(".");var s=e[n],x=this.special[n]||{};if(!s){s=e[n]={};if(!x.setup||x.setup.call(a,f,m,d)===false)if(a.addEventListener)a.addEventListener(n,i,false);else a.attachEvent&&a.attachEvent("on"+n,i)}if(x.add)if((m=x.add.call(a, +d,f,m,s))&&c.isFunction(m)){m.guid=m.guid||d.guid;m.data=m.data||d.data;m.type=m.type||d.type;d=m}s[d.guid]=d;this.global[n]=true}a=null}}},global:{},remove:function(a,b,d){if(!(a.nodeType===3||a.nodeType===8)){var f=c.data(a,"events"),e,i,j;if(f){if(b===v||typeof b==="string"&&b.charAt(0)===".")for(i in f)this.remove(a,i+(b||""));else{if(b.type){d=b.handler;b=b.type}b=b.split(/\s+/);for(var n=0;i=b[n++];){var o=i.split(".");i=o.shift();var m=!o.length,s=c.map(o.slice(0).sort(),ab);s=new RegExp("(^|\\.)"+ +s.join("\\.(?:.*\\.)?")+"(\\.|$)");var x=this.special[i]||{};if(f[i]){if(d){j=f[i][d.guid];delete f[i][d.guid]}else for(var A in f[i])if(m||s.test(f[i][A].type))delete f[i][A];x.remove&&x.remove.call(a,o,j);for(e in f[i])break;if(!e){if(!x.teardown||x.teardown.call(a,o)===false)if(a.removeEventListener)a.removeEventListener(i,c.data(a,"handle"),false);else a.detachEvent&&a.detachEvent("on"+i,c.data(a,"handle"));e=null;delete f[i]}}}}for(e in f)break;if(!e){if(A=c.data(a,"handle"))A.elem=null;c.removeData(a, +"events");c.removeData(a,"handle")}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();this.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return v;a.result=v;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d, +b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(i){}if(!a.isPropagationStopped()&&f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){d=a.target;var j;if(!(c.nodeName(d,"a")&&e==="click")&&!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()])){try{if(d[e]){if(j=d["on"+e])d["on"+e]=null;this.triggered=true;d[e]()}}catch(n){}if(j)d["on"+e]=j;this.triggered=false}}},handle:function(a){var b, +d;a=arguments[0]=c.event.fix(a||z.event);a.currentTarget=this;d=a.type.split(".");a.type=d.shift();b=!d.length&&!a.exclusive;var f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)");d=(c.data(this,"events")||{})[a.type];for(var e in d){var i=d[e];if(b||f.test(i.type)){a.handler=i;a.data=i.data;i=i.apply(this,arguments);if(i!==v){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), +fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||r;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=r.documentElement;d=r.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| +d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==v)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a,b){c.extend(a,b||{});a.guid+=b.selector+b.live;b.liveProxy=a;c.event.add(this,b.live,na,b)},remove:function(a){if(a.length){var b= +0,d=new RegExp("(^|\\.)"+a[0]+"(\\.|$)");c.each(c.data(this,"events").live||{},function(){d.test(this.type)&&b++});b<1&&c.event.remove(this,a[0],na)}},special:{}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true}; +c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y};var Aa=function(a){for(var b= +a.relatedTarget;b&&b!==this;)try{b=b.parentNode}catch(d){break}if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}},Ba=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ba:Aa,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ba:Aa)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(a,b,d){if(this.nodeName.toLowerCase()!== +"form"){c.event.add(this,"click.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="submit"||i==="image")&&c(e).closest("form").length)return ma("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="text"||i==="password")&&c(e).closest("form").length&&f.keyCode===13)return ma("submit",this,arguments)})}else return false},remove:function(a,b){c.event.remove(this,"click.specialSubmit"+(b?"."+b.guid:""));c.event.remove(this, +"keypress.specialSubmit"+(b?"."+b.guid:""))}};if(!c.support.changeBubbles){var da=/textarea|input|select/i;function Ca(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d}function ea(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Ca(d);if(a.type!=="focusout"|| +d.type!=="radio")c.data(d,"_change_data",e);if(!(f===v||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}}c.event.special.change={filters:{focusout:ea,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return ea.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return ea.call(this,a)},beforeactivate:function(a){a= +a.target;a.nodeName.toLowerCase()==="input"&&a.type==="radio"&&c.data(a,"_change_data",Ca(a))}},setup:function(a,b,d){for(var f in T)c.event.add(this,f+".specialChange."+d.guid,T[f]);return da.test(this.nodeName)},remove:function(a,b){for(var d in T)c.event.remove(this,d+".specialChange"+(b?"."+b.guid:""),T[d]);return da.test(this.nodeName)}};var T=c.event.special.change.filters}r.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this, +f)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var i in d)this[b](i,f,d[i],e);return this}if(c.isFunction(f)){e=f;f=v}var j=b==="one"?c.proxy(e,function(n){c(this).unbind(n,j);return e.apply(this,arguments)}):e;return d==="unload"&&b!=="one"?this.one(d,f,e):this.each(function(){c.event.add(this,d,j,f)})}});c.fn.extend({unbind:function(a, +b){if(typeof a==="object"&&!a.preventDefault){for(var d in a)this.unbind(d,a[d]);return this}return this.each(function(){c.event.remove(this,a,b)})},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},toggle:function(a){for(var b=arguments,d=1;d0){y=t;break}}t=t[g]}l[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,i=Object.prototype.toString,j=false,n=true;[0,0].sort(function(){n=false;return 0});var o=function(g,h,k,l){k=k||[];var q=h=h||r;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g|| +typeof g!=="string")return k;for(var p=[],u,t,y,R,H=true,M=w(h),I=g;(f.exec(""),u=f.exec(I))!==null;){I=u[3];p.push(u[1]);if(u[2]){R=u[3];break}}if(p.length>1&&s.exec(g))if(p.length===2&&m.relative[p[0]])t=fa(p[0]+p[1],h);else for(t=m.relative[p[0]]?[h]:o(p.shift(),h);p.length;){g=p.shift();if(m.relative[g])g+=p.shift();t=fa(g,t)}else{if(!l&&p.length>1&&h.nodeType===9&&!M&&m.match.ID.test(p[0])&&!m.match.ID.test(p[p.length-1])){u=o.find(p.shift(),h,M);h=u.expr?o.filter(u.expr,u.set)[0]:u.set[0]}if(h){u= +l?{expr:p.pop(),set:A(l)}:o.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=u.expr?o.filter(u.expr,u.set):u.set;if(p.length>0)y=A(t);else H=false;for(;p.length;){var D=p.pop();u=D;if(m.relative[D])u=p.pop();else D="";if(u==null)u=h;m.relative[D](y,u,M)}}else y=[]}y||(y=t);y||o.error(D||g);if(i.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))k.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&& +y[g].nodeType===1&&k.push(t[g]);else k.push.apply(k,y);else A(y,k);if(R){o(R,q,k,l);o.uniqueSort(k)}return k};o.uniqueSort=function(g){if(C){j=n;g.sort(C);if(j)for(var h=1;h":function(g,h){var k=typeof h==="string";if(k&&!/\W/.test(h)){h=h.toLowerCase();for(var l=0,q=g.length;l=0))k||l.push(u);else if(k)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&& +"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,k,l,q,p){h=g[1].replace(/\\/g,"");if(!p&&m.attrMap[h])g[1]=m.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,k,l,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=o(g[3],null,null,h);else{g=o.filter(g[3],h,k,true^q);k||l.push.apply(l,g);return false}else if(m.match.POS.test(g[0])||m.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true); +return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,k){return!!o(k[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"=== +g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,h){return h===0},last:function(g,h,k,l){return h===l.length-1},even:function(g,h){return h%2=== +0},odd:function(g,h){return h%2===1},lt:function(g,h,k){return hk[3]-0},nth:function(g,h,k){return k[3]-0===h},eq:function(g,h,k){return k[3]-0===h}},filter:{PSEUDO:function(g,h,k,l){var q=h[1],p=m.filters[q];if(p)return p(g,k,h,l);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=h[3];k=0;for(l=h.length;k= +0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var k=h[1];g=m.attrHandle[k]?m.attrHandle[k](g):g[k]!=null?g[k]:g.getAttribute(k);k=g+"";var l=h[2];h=h[4];return g==null?l==="!=":l==="="?k===h:l==="*="?k.indexOf(h)>=0:l==="~="?(" "+k+" ").indexOf(h)>=0:!h?k&&g!==false:l==="!="?k!==h:l==="^="? +k.indexOf(h)===0:l==="$="?k.substr(k.length-h.length)===h:l==="|="?k===h||k.substr(0,h.length+1)===h+"-":false},POS:function(g,h,k,l){var q=m.setFilters[h[2]];if(q)return q(g,k,h,l)}}},s=m.match.POS;for(var x in m.match){m.match[x]=new RegExp(m.match[x].source+/(?![^\[]*\])(?![^\(]*\))/.source);m.leftMatch[x]=new RegExp(/(^(?:.|\r|\n)*?)/.source+m.match[x].source.replace(/\\(\d+)/g,function(g,h){return"\\"+(h-0+1)}))}var A=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g}; +try{Array.prototype.slice.call(r.documentElement.childNodes,0)}catch(B){A=function(g,h){h=h||[];if(i.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var k=0,l=g.length;k";var k=r.documentElement;k.insertBefore(g,k.firstChild);if(r.getElementById(h)){m.find.ID=function(l,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(l[1]))?q.id===l[1]||typeof q.getAttributeNode!=="undefined"&&q.getAttributeNode("id").nodeValue===l[1]?[q]:v:[]};m.filter.ID=function(l,q){var p=typeof l.getAttributeNode!=="undefined"&&l.getAttributeNode("id"); +return l.nodeType===1&&p&&p.nodeValue===q}}k.removeChild(g);k=g=null})();(function(){var g=r.createElement("div");g.appendChild(r.createComment(""));if(g.getElementsByTagName("*").length>0)m.find.TAG=function(h,k){k=k.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var l=0;k[l];l++)k[l].nodeType===1&&h.push(k[l]);k=h}return k};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")m.attrHandle.href=function(h){return h.getAttribute("href", +2)};g=null})();r.querySelectorAll&&function(){var g=o,h=r.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){o=function(l,q,p,u){q=q||r;if(!u&&q.nodeType===9&&!w(q))try{return A(q.querySelectorAll(l),p)}catch(t){}return g(l,q,p,u)};for(var k in g)o[k]=g[k];h=null}}();(function(){var g=r.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length=== +0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){m.order.splice(1,0,"CLASS");m.find.CLASS=function(h,k,l){if(typeof k.getElementsByClassName!=="undefined"&&!l)return k.getElementsByClassName(h[1])};g=null}}})();var E=r.compareDocumentPosition?function(g,h){return g.compareDocumentPosition(h)&16}:function(g,h){return g!==h&&(g.contains?g.contains(h):true)},w=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},fa=function(g,h){var k=[], +l="",q;for(h=h.nodeType?[h]:h;q=m.match.PSEUDO.exec(g);){l+=q[0];g=g.replace(m.match.PSEUDO,"")}g=m.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var i=d;i0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,i={},j;if(f&&a.length){e=0;for(var n=a.length;e +-1:c(f).is(e)){d.push({selector:j,elem:f});delete i[j]}}f=f.parentNode}}return d}var o=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(m,s){for(;s&&s.ownerDocument&&s!==b;){if(o?o.index(s)>-1:c(s).is(a))return s;s=s.parentNode}return null})},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(), +a);return this.pushStack(pa(a[0])||pa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")}, +nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);bb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e): +e;if((this.length>1||db.test(f))&&cb.test(a))e=e.reverse();return this.pushStack(e,a,Q.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===v||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!== +b&&d.push(a);return d}});var Fa=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ga=/(<([\w:]+)[^>]*?)\/>/g,eb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,Ha=/<([\w:]+)/,fb=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"], +col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==v)return this.empty().append((this[0]&&this[0].ownerDocument||r).createTextNode(a));return c.getText(this)}, +wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length? +d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments, +false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&& +!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Fa,"").replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){qa(this,b);qa(this.find("*"),b.find("*"))}return b},html:function(a){if(a===v)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Fa,""):null;else if(typeof a==="string"&&!/'},pp_settings);var matchedObjects=this,percentBased=false,pp_dimensions,pp_open,pp_contentHeight,pp_contentWidth,pp_containerHeight,pp_containerWidth,windowHeight=$(window).height(),windowWidth=$(window).width(),pp_slideshow;doresize=true,scroll_pos=_get_scroll();$(window).unbind('resize.prettyphoto').bind('resize.prettyphoto',function(){_center_overlay();_resize_overlay();});if(pp_settings.keyboard_shortcuts){$(document).unbind('keydown.prettyphoto').bind('keydown.prettyphoto',function(e){if(typeof $pp_pic_holder!='undefined'){if($pp_pic_holder.is(':visible')){switch(e.keyCode){case 37:$.prettyPhoto.changePage('previous');e.preventDefault();break;case 39:$.prettyPhoto.changePage('next');e.preventDefault();break;case 27:if(!settings.modal) +$.prettyPhoto.close();e.preventDefault();break;};};};});};$.prettyPhoto.initialize=function(){settings=pp_settings;if(settings.theme=='pp_default')settings.horizontal_padding=16;if(settings.ie6_fallback&&$.browser.msie&&parseInt($.browser.version)==6)settings.theme="light_square";theRel=$(this).attr('rel');galleryRegExp=/\[(?:.*)\]/;isSet=(galleryRegExp.exec(theRel))?true:false;pp_images=(isSet)?jQuery.map(matchedObjects,function(n,i){if($(n).attr('rel').indexOf(theRel)!=-1)return $(n).attr('href');}):$.makeArray($(this).attr('href'));pp_titles=(isSet)?jQuery.map(matchedObjects,function(n,i){if($(n).attr('rel').indexOf(theRel)!=-1)return($(n).find('img').attr('alt'))?$(n).find('img').attr('alt'):"";}):$.makeArray($(this).find('img').attr('alt'));pp_descriptions=(isSet)?jQuery.map(matchedObjects,function(n,i){if($(n).attr('rel').indexOf(theRel)!=-1)return($(n).attr('title'))?$(n).attr('title'):"";}):$.makeArray($(this).attr('title'));set_position=jQuery.inArray($(this).attr('href'),pp_images);rel_index=(isSet)?set_position:$("a[rel^='"+theRel+"']").index($(this));_build_overlay(this);if(settings.allow_resize) +$(window).bind('scroll.prettyphoto',function(){_center_overlay();});$.prettyPhoto.open();return false;} +$.prettyPhoto.open=function(event){if(typeof settings=="undefined"){settings=pp_settings;if($.browser.msie&&$.browser.version==6)settings.theme="light_square";pp_images=$.makeArray(arguments[0]);pp_titles=(arguments[1])?$.makeArray(arguments[1]):$.makeArray("");pp_descriptions=(arguments[2])?$.makeArray(arguments[2]):$.makeArray("");isSet=(pp_images.length>1)?true:false;set_position=0;_build_overlay(event.target);} +if($.browser.msie&&$.browser.version==6)$('select').css('visibility','hidden');if(settings.hideflash)$('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','hidden');_checkPosition($(pp_images).size());$('.pp_loaderIcon').show();if($ppt.is(':hidden'))$ppt.css('opacity',0).show();$pp_overlay.show().fadeTo(settings.animation_speed,settings.opacity);$pp_pic_holder.find('.currentTextHolder').text((set_position+1)+settings.counter_separator_label+$(pp_images).size());if(pp_descriptions[set_position]!=""){$pp_pic_holder.find('.pp_description').show().html(unescape(pp_descriptions[set_position]));}else{$pp_pic_holder.find('.pp_description').hide();} +movie_width=(parseFloat(getParam('width',pp_images[set_position])))?getParam('width',pp_images[set_position]):settings.default_width.toString();movie_height=(parseFloat(getParam('height',pp_images[set_position])))?getParam('height',pp_images[set_position]):settings.default_height.toString();percentBased=false;if(movie_height.indexOf('%')!=-1){movie_height=parseFloat(($(window).height()*parseFloat(movie_height)/100)-150);percentBased=true;} +if(movie_width.indexOf('%')!=-1){movie_width=parseFloat(($(window).width()*parseFloat(movie_width)/100)-150);percentBased=true;} +$pp_pic_holder.fadeIn(function(){(settings.show_title&&pp_titles[set_position]!=""&&typeof pp_titles[set_position]!="undefined")?$ppt.html(unescape(pp_titles[set_position])):$ppt.html(' ');imgPreloader="";skipInjection=false;switch(_getFileType(pp_images[set_position])){case'image':imgPreloader=new Image();nextImage=new Image();if(isSet&&set_position<$(pp_images).size()-1)nextImage.src=pp_images[set_position+1];prevImage=new Image();if(isSet&&pp_images[set_position-1])prevImage.src=pp_images[set_position-1];$pp_pic_holder.find('#pp_full_res')[0].innerHTML=settings.image_markup.replace(/{path}/g,pp_images[set_position]);imgPreloader.onload=function(){pp_dimensions=_fitToViewport(imgPreloader.width,imgPreloader.height);_showContent();};imgPreloader.onerror=function(){alert('Image cannot be loaded. Make sure the path is correct and image exist.');$.prettyPhoto.close();};imgPreloader.src=pp_images[set_position];break;case'youtube':pp_dimensions=_fitToViewport(movie_width,movie_height);movie='http://www.youtube.com/embed/'+getParam('v',pp_images[set_position]);(getParam('rel',pp_images[set_position]))?movie+="?rel="+getParam('rel',pp_images[set_position]):movie+="?rel=1";if(settings.autoplay)movie+="&autoplay=1";toInject=settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie);break;case'vimeo':pp_dimensions=_fitToViewport(movie_width,movie_height);movie_id=pp_images[set_position];var regExp=/http:\/\/(www\.)?vimeo.com\/(\d+)/;var match=movie_id.match(regExp);movie='http://player.vimeo.com/video/'+match[2]+'?title=0&byline=0&portrait=0';if(settings.autoplay)movie+="&autoplay=1;";vimeo_width=pp_dimensions['width']+'/embed/?moog_width='+pp_dimensions['width'];toInject=settings.iframe_markup.replace(/{width}/g,vimeo_width).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,movie);break;case'quicktime':pp_dimensions=_fitToViewport(movie_width,movie_height);pp_dimensions['height']+=15;pp_dimensions['contentHeight']+=15;pp_dimensions['containerHeight']+=15;toInject=settings.quicktime_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,pp_images[set_position]).replace(/{autoplay}/g,settings.autoplay);break;case'flash':pp_dimensions=_fitToViewport(movie_width,movie_height);flash_vars=pp_images[set_position];flash_vars=flash_vars.substring(pp_images[set_position].indexOf('flashvars')+10,pp_images[set_position].length);filename=pp_images[set_position];filename=filename.substring(0,filename.indexOf('?'));toInject=settings.flash_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,filename+'?'+flash_vars);break;case'iframe':pp_dimensions=_fitToViewport(movie_width,movie_height);frame_url=pp_images[set_position];frame_url=frame_url.substr(0,frame_url.indexOf('iframe')-1);toInject=settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,frame_url);break;case'ajax':doresize=false;pp_dimensions=_fitToViewport(movie_width,movie_height);doresize=true;skipInjection=true;$.get(pp_images[set_position],function(responseHTML){toInject=settings.inline_markup.replace(/{content}/g,responseHTML);$pp_pic_holder.find('#pp_full_res')[0].innerHTML=toInject;_showContent();});break;case'custom':pp_dimensions=_fitToViewport(movie_width,movie_height);toInject=settings.custom_markup;break;case'inline':myClone=$(pp_images[set_position]).clone().append('
').css({'width':settings.default_width}).wrapInner('
').appendTo($('body')).show();doresize=false;pp_dimensions=_fitToViewport($(myClone).width(),$(myClone).height());doresize=true;$(myClone).remove();toInject=settings.inline_markup.replace(/{content}/g,$(pp_images[set_position]).html());break;};if(!imgPreloader&&!skipInjection){$pp_pic_holder.find('#pp_full_res')[0].innerHTML=toInject;_showContent();};});return false;};$.prettyPhoto.changePage=function(direction){currentGalleryPage=0;if(direction=='previous'){set_position--;if(set_position<0)set_position=$(pp_images).size()-1;}else if(direction=='next'){set_position++;if(set_position>$(pp_images).size()-1)set_position=0;}else{set_position=direction;};rel_index=set_position;if(!doresize)doresize=true;$('.pp_contract').removeClass('pp_contract').addClass('pp_expand');_hideContent(function(){$.prettyPhoto.open();});};$.prettyPhoto.changeGalleryPage=function(direction){if(direction=='next'){currentGalleryPage++;if(currentGalleryPage>totalPage)currentGalleryPage=0;}else if(direction=='previous'){currentGalleryPage--;if(currentGalleryPage<0)currentGalleryPage=totalPage;}else{currentGalleryPage=direction;};slide_speed=(direction=='next'||direction=='previous')?settings.animation_speed:0;slide_to=currentGalleryPage*(itemsPerPage*itemWidth);$pp_gallery.find('ul').animate({left:-slide_to},slide_speed);};$.prettyPhoto.startSlideshow=function(){if(typeof pp_slideshow=='undefined'){$pp_pic_holder.find('.pp_play').unbind('click').removeClass('pp_play').addClass('pp_pause').click(function(){$.prettyPhoto.stopSlideshow();return false;});pp_slideshow=setInterval($.prettyPhoto.startSlideshow,settings.slideshow);}else{$.prettyPhoto.changePage('next');};} +$.prettyPhoto.stopSlideshow=function(){$pp_pic_holder.find('.pp_pause').unbind('click').removeClass('pp_pause').addClass('pp_play').click(function(){$.prettyPhoto.startSlideshow();return false;});clearInterval(pp_slideshow);pp_slideshow=undefined;} +$.prettyPhoto.close=function(){if($pp_overlay.is(":animated"))return;$.prettyPhoto.stopSlideshow();$pp_pic_holder.stop().find('object,embed').css('visibility','hidden');$('div.pp_pic_holder,div.ppt,.pp_fade').fadeOut(settings.animation_speed,function(){$(this).remove();});$pp_overlay.fadeOut(settings.animation_speed,function(){if($.browser.msie&&$.browser.version==6)$('select').css('visibility','visible');if(settings.hideflash)$('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','visible');$(this).remove();$(window).unbind('scroll.prettyphoto');settings.callback();doresize=true;pp_open=false;delete settings;});};function _showContent(){$('.pp_loaderIcon').hide();projectedTop=scroll_pos['scrollTop']+((windowHeight/2)-(pp_dimensions['containerHeight']/2));if(projectedTop<0)projectedTop=0;$ppt.fadeTo(settings.animation_speed,1);$pp_pic_holder.find('.pp_content').animate({height:pp_dimensions['contentHeight'],width:pp_dimensions['contentWidth']},settings.animation_speed);$pp_pic_holder.animate({'top':projectedTop,'left':(windowWidth/2)-(pp_dimensions['containerWidth']/2),width:pp_dimensions['containerWidth']},settings.animation_speed,function(){$pp_pic_holder.find('.pp_hoverContainer,#fullResImage').height(pp_dimensions['height']).width(pp_dimensions['width']);$pp_pic_holder.find('.pp_fade').fadeIn(settings.animation_speed);if(isSet&&_getFileType(pp_images[set_position])=="image"){$pp_pic_holder.find('.pp_hoverContainer').show();}else{$pp_pic_holder.find('.pp_hoverContainer').hide();} +if(pp_dimensions['resized']){$('a.pp_expand,a.pp_contract').show();}else{$('a.pp_expand').hide();} +if(settings.autoplay_slideshow&&!pp_slideshow&&!pp_open)$.prettyPhoto.startSlideshow();if(settings.deeplinking) +setHashtag();settings.changepicturecallback();pp_open=true;});_insert_gallery();};function _hideContent(callback){$pp_pic_holder.find('#pp_full_res object,#pp_full_res embed').css('visibility','hidden');$pp_pic_holder.find('.pp_fade').fadeOut(settings.animation_speed,function(){$('.pp_loaderIcon').show();callback();});};function _checkPosition(setCount){(setCount>1)?$('.pp_nav').show():$('.pp_nav').hide();};function _fitToViewport(width,height){resized=false;_getDimensions(width,height);imageWidth=width,imageHeight=height;if(((pp_containerWidth>windowWidth)||(pp_containerHeight>windowHeight))&&doresize&&settings.allow_resize&&!percentBased){resized=true,fitting=false;while(!fitting){if((pp_containerWidth>windowWidth)){imageWidth=(windowWidth-200);imageHeight=(height/width)*imageWidth;}else if((pp_containerHeight>windowHeight)){imageHeight=(windowHeight-200);imageWidth=(width/height)*imageHeight;}else{fitting=true;};pp_containerHeight=imageHeight,pp_containerWidth=imageWidth;};_getDimensions(imageWidth,imageHeight);if((pp_containerWidth>windowWidth)||(pp_containerHeight>windowHeight)){_fitToViewport(pp_containerWidth,pp_containerHeight)};};return{width:Math.floor(imageWidth),height:Math.floor(imageHeight),containerHeight:Math.floor(pp_containerHeight),containerWidth:Math.floor(pp_containerWidth)+(settings.horizontal_padding*2),contentHeight:Math.floor(pp_contentHeight),contentWidth:Math.floor(pp_contentWidth),resized:resized};};function _getDimensions(width,height){width=parseFloat(width);height=parseFloat(height);$pp_details=$pp_pic_holder.find('.pp_details');$pp_details.width(width);detailsHeight=parseFloat($pp_details.css('marginTop'))+parseFloat($pp_details.css('marginBottom'));$pp_details=$pp_details.clone().addClass(settings.theme).width(width).appendTo($('body')).css({'position':'absolute','top':-10000});detailsHeight+=$pp_details.height();detailsHeight=(detailsHeight<=34)?36:detailsHeight;if($.browser.msie&&$.browser.version==7)detailsHeight+=8;$pp_details.remove();$pp_title=$pp_pic_holder.find('.ppt');$pp_title.width(width);titleHeight=parseFloat($pp_title.css('marginTop'))+parseFloat($pp_title.css('marginBottom'));$pp_title=$pp_title.clone().appendTo($('body')).css({'position':'absolute','top':-10000});titleHeight+=$pp_title.height();$pp_title.remove();pp_contentHeight=height+detailsHeight;pp_contentWidth=width;pp_containerHeight=pp_contentHeight+titleHeight+$pp_pic_holder.find('.pp_top').height()+$pp_pic_holder.find('.pp_bottom').height();pp_containerWidth=width;} +function _getFileType(itemSrc){if(itemSrc.match(/youtube\.com\/watch/i)){return'youtube';}else if(itemSrc.match(/vimeo\.com/i)){return'vimeo';}else if(itemSrc.match(/\b.mov\b/i)){return'quicktime';}else if(itemSrc.match(/\b.swf\b/i)){return'flash';}else if(itemSrc.match(/\biframe=true\b/i)){return'iframe';}else if(itemSrc.match(/\bajax=true\b/i)){return'ajax';}else if(itemSrc.match(/\bcustom=true\b/i)){return'custom';}else if(itemSrc.substr(0,1)=='#'){return'inline';}else{return'image';};};function _center_overlay(){if(doresize&&typeof $pp_pic_holder!='undefined'){scroll_pos=_get_scroll();contentHeight=$pp_pic_holder.height(),contentwidth=$pp_pic_holder.width();projectedTop=(windowHeight/2)+scroll_pos['scrollTop']-(contentHeight/2);if(projectedTop<0)projectedTop=0;if(contentHeight>windowHeight) +return;$pp_pic_holder.css({'top':projectedTop,'left':(windowWidth/2)+scroll_pos['scrollLeft']-(contentwidth/2)});};};function _get_scroll(){if(self.pageYOffset){return{scrollTop:self.pageYOffset,scrollLeft:self.pageXOffset};}else if(document.documentElement&&document.documentElement.scrollTop){return{scrollTop:document.documentElement.scrollTop,scrollLeft:document.documentElement.scrollLeft};}else if(document.body){return{scrollTop:document.body.scrollTop,scrollLeft:document.body.scrollLeft};};};function _resize_overlay(){windowHeight=$(window).height(),windowWidth=$(window).width();if(typeof $pp_overlay!="undefined")$pp_overlay.height($(document).height()).width(windowWidth);};function _insert_gallery(){if(isSet&&settings.overlay_gallery&&_getFileType(pp_images[set_position])=="image"&&(settings.ie6_fallback&&!($.browser.msie&&parseInt($.browser.version)==6))){itemWidth=52+5;navWidth=(settings.theme=="facebook"||settings.theme=="pp_default")?50:30;itemsPerPage=Math.floor((pp_dimensions['containerWidth']-100-navWidth)/itemWidth);itemsPerPage=(itemsPerPage";};toInject=settings.gallery_markup.replace(/{gallery}/g,toInject);$pp_pic_holder.find('#pp_full_res').after(toInject);$pp_gallery=$('.pp_pic_holder .pp_gallery'),$pp_gallery_li=$pp_gallery.find('li');$pp_gallery.find('.pp_arrow_next').click(function(){$.prettyPhoto.changeGalleryPage('next');$.prettyPhoto.stopSlideshow();return false;});$pp_gallery.find('.pp_arrow_previous').click(function(){$.prettyPhoto.changeGalleryPage('previous');$.prettyPhoto.stopSlideshow();return false;});$pp_pic_holder.find('.pp_content').hover(function(){$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeIn();},function(){$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeOut();});itemWidth=52+5;$pp_gallery_li.each(function(i){$(this).find('a').click(function(){$.prettyPhoto.changePage(i);$.prettyPhoto.stopSlideshow();return false;});});};if(settings.slideshow){$pp_pic_holder.find('.pp_nav').prepend('Play') +$pp_pic_holder.find('.pp_nav .pp_play').click(function(){$.prettyPhoto.startSlideshow();return false;});} +$pp_pic_holder.attr('class','pp_pic_holder '+settings.theme);$pp_overlay.css({'opacity':0,'height':$(document).height(),'width':$(window).width()}).bind('click',function(){if(!settings.modal)$.prettyPhoto.close();});$('a.pp_close').bind('click',function(){$.prettyPhoto.close();return false;});$('a.pp_expand').bind('click',function(e){if($(this).hasClass('pp_expand')){$(this).removeClass('pp_expand').addClass('pp_contract');doresize=false;}else{$(this).removeClass('pp_contract').addClass('pp_expand');doresize=true;};_hideContent(function(){$.prettyPhoto.open();});return false;});$pp_pic_holder.find('.pp_previous, .pp_nav .pp_arrow_previous').bind('click',function(){$.prettyPhoto.changePage('previous');$.prettyPhoto.stopSlideshow();return false;});$pp_pic_holder.find('.pp_next, .pp_nav .pp_arrow_next').bind('click',function(){$.prettyPhoto.changePage('next');$.prettyPhoto.stopSlideshow();return false;});_center_overlay();};if(!pp_alreadyInitialized&&getHashtag()){pp_alreadyInitialized=true;hashIndex=getHashtag();hashRel=hashIndex;hashIndex=hashIndex.substring(hashIndex.indexOf('/')+1,hashIndex.length-1);hashRel=hashRel.substring(0,hashRel.indexOf('/'));setTimeout(function(){$("a[rel^='"+hashRel+"']:eq("+hashIndex+")").trigger('click');},50);} +return this.unbind('click.prettyphoto').bind('click.prettyphoto',$.prettyPhoto.initialize);};function getHashtag(){url=location.href;hashtag=(url.indexOf('#!')!=-1)?decodeURI(url.substring(url.indexOf('#!')+2,url.length)):false;return hashtag;};function setHashtag(){if(typeof theRel=='undefined')return;location.hash='!'+theRel+'/'+rel_index+'/';};function getParam(name,url){name=name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");var regexS="[\\?&]"+name+"=([^&#]*)";var regex=new RegExp(regexS);var results=regex.exec(url);return(results==null)?"":results[1];}})(jQuery);var pp_alreadyInitialized=false; \ No newline at end of file diff --git a/webroot/js/jquery.tipsy.js b/webroot/js/jquery.tipsy.js new file mode 100755 index 0000000..b0a644a --- /dev/null +++ b/webroot/js/jquery.tipsy.js @@ -0,0 +1,104 @@ +(function($) { + $.fn.tipsy = function(options) { + + options = $.extend({}, $.fn.tipsy.defaults, options); + + return this.each(function() { + + var opts = $.fn.tipsy.elementOptions(this, options); + + $(this).hover(function() { + + $.data(this, 'cancel.tipsy', true); + + var tip = $.data(this, 'active.tipsy'); + if (!tip) { + tip = $('
'); + tip.css({position: 'absolute', zIndex: 100000}); + $.data(this, 'active.tipsy', tip); + } + + if ($(this).attr('title') || typeof($(this).attr('original-title')) != 'string') { + $(this).attr('original-title', $(this).attr('title') || '').removeAttr('title'); + } + + var title; + if (typeof opts.title == 'string') { + title = $(this).attr(opts.title == 'title' ? 'original-title' : opts.title); + } else if (typeof opts.title == 'function') { + title = opts.title.call(this); + } + + tip.find('.tipsy-inner')[opts.html ? 'html' : 'text'](title || opts.fallback); + + var pos = $.extend({}, $(this).offset(), {width: this.offsetWidth, height: this.offsetHeight}); + tip.get(0).className = 'tipsy'; // reset classname in case of dynamic gravity + tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).appendTo(document.body); + var actualWidth = tip[0].offsetWidth, actualHeight = tip[0].offsetHeight; + var gravity = (typeof opts.gravity == 'function') ? opts.gravity.call(this) : opts.gravity; + + switch (gravity.charAt(0)) { + case 'n': + tip.css({top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}).addClass('tipsy-north'); + break; + case 's': + tip.css({top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}).addClass('tipsy-south'); + break; + case 'e': + tip.css({top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}).addClass('tipsy-east'); + break; + case 'w': + tip.css({top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}).addClass('tipsy-west'); + break; + } + + if (opts.fade) { + tip.css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: 0.8}); + } else { + tip.css({visibility: 'visible'}); + } + + }, function() { + $.data(this, 'cancel.tipsy', false); + var self = this; + setTimeout(function() { + if ($.data(this, 'cancel.tipsy')) return; + var tip = $.data(self, 'active.tipsy'); + if (opts.fade) { + tip.stop().fadeOut(function() { $(this).remove(); }); + } else { + tip.remove(); + } + }, 100); + + }); + + }); + + }; + + // Overwrite this method to provide options on a per-element basis. + // For example, you could store the gravity in a 'tipsy-gravity' attribute: + // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' }); + // (remember - do not modify 'options' in place!) + $.fn.tipsy.elementOptions = function(ele, options) { + return $.metadata ? $.extend({}, options, $(ele).metadata()) : options; + }; + + $.fn.tipsy.defaults = { + fade: false, + fallback: '', + gravity: 'n', + html: false, + title: 'title' + }; + + $.fn.tipsy.autoNS = function() { + return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n'; + }; + + $.fn.tipsy.autoWE = function() { + return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w'; + }; + +})(jQuery); diff --git a/webroot/js/jquery.tools.min.js b/webroot/js/jquery.tools.min.js new file mode 100755 index 0000000..9e99b74 --- /dev/null +++ b/webroot/js/jquery.tools.min.js @@ -0,0 +1,18 @@ +/* + * jQuery Tools 1.2.5 - The missing UI library for the Web + * + * [scrollable] + * + * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE. + * + * http://flowplayer.org/tools/ + * + * File generated: Fri Oct 22 10:05:18 GMT 2010 + */ +(function(e){function p(f,c){var b=e(c);return b.length<2?b:f.parent().find(c)}function u(f,c){var b=this,n=f.add(b),g=f.children(),l=0,j=c.vertical;k||(k=b);if(g.length>1)g=e(c.items,f);e.extend(b,{getConf:function(){return c},getIndex:function(){return l},getSize:function(){return b.getItems().size()},getNaviButtons:function(){return o.add(q)},getRoot:function(){return f},getItemWrap:function(){return g},getItems:function(){return g.children(c.item).not("."+c.clonedClass)},move:function(a,d){return b.seekTo(l+ +a,d)},next:function(a){return b.move(1,a)},prev:function(a){return b.move(-1,a)},begin:function(a){return b.seekTo(0,a)},end:function(a){return b.seekTo(b.getSize()-1,a)},focus:function(){return k=b},addItem:function(a){a=e(a);if(c.circular){g.children("."+c.clonedClass+":last").before(a);g.children("."+c.clonedClass+":first").replaceWith(a.clone().addClass(c.clonedClass))}else g.append(a);n.trigger("onAddItem",[a]);return b},seekTo:function(a,d,h){a.jquery||(a*=1);if(c.circular&&a===0&&l==-1&&d!== +0)return b;if(!c.circular&&a<0||a>b.getSize()||a<-1)return b;var i=a;if(a.jquery)a=b.getItems().index(a);else i=b.getItems().eq(a);var r=e.Event("onBeforeSeek");if(!h){n.trigger(r,[a,d]);if(r.isDefaultPrevented()||!i.length)return b}i=j?{top:-i.position().top}:{left:-i.position().left};l=a;k=b;if(d===undefined)d=c.speed;g.animate(i,d,c.easing,h||function(){n.trigger("onSeek",[a])});return b}});e.each(["onBeforeSeek","onSeek","onAddItem"],function(a,d){e.isFunction(c[d])&&e(b).bind(d,c[d]);b[d]=function(h){h&& +e(b).bind(d,h);return b}});if(c.circular){var s=b.getItems().slice(-1).clone().prependTo(g),t=b.getItems().eq(1).clone().appendTo(g);s.add(t).addClass(c.clonedClass);b.onBeforeSeek(function(a,d,h){if(!a.isDefaultPrevented())if(d==-1){b.seekTo(s,h,function(){b.end(0)});return a.preventDefault()}else d==b.getSize()&&b.seekTo(t,h,function(){b.begin(0)})});b.seekTo(0,0,function(){})}var o=p(f,c.prev).click(function(){b.prev()}),q=p(f,c.next).click(function(){b.next()});if(!c.circular&&b.getSize()>1){b.onBeforeSeek(function(a, +d){setTimeout(function(){if(!a.isDefaultPrevented()){o.toggleClass(c.disabledClass,d<=0);q.toggleClass(c.disabledClass,d>=b.getSize()-1)}},1)});c.initialIndex||o.addClass(c.disabledClass)}c.mousewheel&&e.fn.mousewheel&&f.mousewheel(function(a,d){if(c.mousewheel){b.move(d<0?1:-1,c.wheelSpeed||50);return false}});if(c.touch){var m={};g[0].ontouchstart=function(a){a=a.touches[0];m.x=a.clientX;m.y=a.clientY};g[0].ontouchmove=function(a){if(a.touches.length==1&&!g.is(":animated")){var d=a.touches[0],h= +m.x-d.clientX;d=m.y-d.clientY;b[j&&d>0||!j&&h>0?"next":"prev"]();a.preventDefault()}}}c.keyboard&&e(document).bind("keydown.scrollable",function(a){if(!(!c.keyboard||a.altKey||a.ctrlKey||e(a.target).is(":input")))if(!(c.keyboard!="static"&&k!=b)){var d=a.keyCode;if(j&&(d==38||d==40)){b.move(d==38?-1:1);return a.preventDefault()}if(!j&&(d==37||d==39)){b.move(d==37?-1:1);return a.preventDefault()}}});c.initialIndex&&b.seekTo(c.initialIndex,0,function(){})}e.tools=e.tools||{version:"1.2.5"};e.tools.scrollable= +{conf:{activeClass:"active",circular:false,clonedClass:"cloned",disabledClass:"disabled",easing:"swing",initialIndex:0,item:null,items:".items",keyboard:true,mousewheel:false,next:".next",prev:".prev",speed:400,vertical:false,touch:true,wheelSpeed:0}};var k;e.fn.scrollable=function(f){var c=this.data("scrollable");if(c)return c;f=e.extend({},e.tools.scrollable.conf,f);this.each(function(){c=new u(e(this),f);e(this).data("scrollable",c)});return f.api?c:this}})(jQuery); diff --git a/webroot/js/modernizr-1.5.min.js b/webroot/js/modernizr-1.5.min.js new file mode 100755 index 0000000..a1de3f7 --- /dev/null +++ b/webroot/js/modernizr-1.5.min.js @@ -0,0 +1,28 @@ +/*! + * Modernizr JavaScript library 1.5 + * http://www.modernizr.com/ + * + * Copyright (c) 2009-2010 Faruk Ates - http://farukat.es/ + * Dual-licensed under the BSD and MIT licenses. + * http://www.modernizr.com/license/ + * + * Featuring major contributions by + * Paul Irish - http://paulirish.com + */ + window.Modernizr=function(i,e,I){function C(a,b){for(var c in a)if(m[a[c]]!==I&&(!b||b(a[c],D)))return true}function r(a,b){var c=a.charAt(0).toUpperCase()+a.substr(1);return!!C([a,"Webkit"+c,"Moz"+c,"O"+c,"ms"+c,"Khtml"+c],b)}function P(){j[E]=function(a){for(var b=0,c=a.length;b7)};d.historymanagement=function(){return!!(i.history&&history.pushState)};d.draganddrop=function(){return u("drag")&&u("dragstart")&&u("dragenter")&&u("dragover")&&u("dragleave")&&u("dragend")&&u("drop")};d.websockets=function(){return"WebSocket"in i};d.rgba=function(){m.cssText="background-color:rgba(150,255,150,.5)";return(""+m.backgroundColor).indexOf("rgba")!==-1};d.hsla=function(){m.cssText="background-color:hsla(120,40%,100%,.5)";return(""+ + m.backgroundColor).indexOf("rgba")!==-1};d.multiplebgs=function(){m.cssText="background:url(//:),url(//:),red url(//:)";return/(url\s*\(.*?){3}/.test(m.background)};d.backgroundsize=function(){return r("backgroundSize")};d.borderimage=function(){return r("borderImage")};d.borderradius=function(){return r("borderRadius","",function(a){return(""+a).indexOf("orderRadius")!==-1})};d.boxshadow=function(){return r("boxShadow")};d.opacity=function(){var a=y.join("opacity:.5;")+"";m.cssText=a;return(""+m.opacity).indexOf("0.5")!== + -1};d.cssanimations=function(){return r("animationName")};d.csscolumns=function(){return r("columnCount")};d.cssgradients=function(){var a=("background-image:"+y.join("gradient(linear,left top,right bottom,from(#9f9),to(white));background-image:")+y.join("linear-gradient(left top,#9f9, white);background-image:")).slice(0,-17);m.cssText=a;return(""+m.backgroundImage).indexOf("gradient")!==-1};d.cssreflections=function(){return r("boxReflect")};d.csstransforms=function(){return!!C(["transformProperty", + "WebkitTransform","MozTransform","OTransform","msTransform"])};d.csstransforms3d=function(){var a=!!C(["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"]);if(a){var b=document.createElement("style"),c=e.createElement("div");b.textContent="@media ("+y.join("transform-3d),(")+"modernizr){#modernizr{height:3px}}";e.getElementsByTagName("head")[0].appendChild(b);c.id="modernizr";s.appendChild(c);a=c.offsetHeight===3;b.parentNode.removeChild(b);c.parentNode.removeChild(c)}return a}; + d.csstransitions=function(){return r("transitionProperty")};d.fontface=function(){var a;if(/*@cc_on@if(@_jscript_version>=5)!@end@*/0)a=true;else{var b=e.createElement("style"),c=e.createElement("span"),h,t=false,g=e.body,o,w;b.textContent="@font-face{font-family:testfont;src:url('data:font/ttf;base64,AAEAAAAMAIAAAwBAT1MvMliohmwAAADMAAAAVmNtYXCp5qrBAAABJAAAANhjdnQgACICiAAAAfwAAAAEZ2FzcP//AAMAAAIAAAAACGdseWYv5OZoAAACCAAAANxoZWFk69bnvwAAAuQAAAA2aGhlYQUJAt8AAAMcAAAAJGhtdHgGDgC4AAADQAAAABRsb2NhAIQAwgAAA1QAAAAMbWF4cABVANgAAANgAAAAIG5hbWUgXduAAAADgAAABPVwb3N03NkzmgAACHgAAAA4AAECBAEsAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAACAAMDAAAAAAAAgAACbwAAAAoAAAAAAAAAAFBmRWQAAAAgqS8DM/8zAFwDMwDNAAAABQAAAAAAAAAAAAMAAAADAAAAHAABAAAAAABGAAMAAQAAAK4ABAAqAAAABgAEAAEAAgAuqQD//wAAAC6pAP///9ZXAwAAAAAAAAACAAAABgBoAAAAAAAvAAEAAAAAAAAAAAAAAAAAAAABAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEACoAAAAGAAQAAQACAC6pAP//AAAALqkA////1lcDAAAAAAAAAAIAAAAiAogAAAAB//8AAgACACIAAAEyAqoAAwAHAC6xAQAvPLIHBADtMrEGBdw8sgMCAO0yALEDAC88sgUEAO0ysgcGAfw8sgECAO0yMxEhESczESMiARDuzMwCqv1WIgJmAAACAFUAAAIRAc0ADwAfAAATFRQWOwEyNj0BNCYrASIGARQGKwEiJj0BNDY7ATIWFX8aIvAiGhoi8CIaAZIoN/43KCg3/jcoAWD0JB4eJPQkHh7++EY2NkbVRjY2RgAAAAABAEH/+QCdAEEACQAANjQ2MzIWFAYjIkEeEA8fHw8QDxwWFhwWAAAAAQAAAAIAAIuYbWpfDzz1AAsEAAAAAADFn9IuAAAAAMWf0i797/8zA4gDMwAAAAgAAgAAAAAAAAABAAADM/8zAFwDx/3v/98DiAABAAAAAAAAAAAAAAAAAAAABQF2ACIAAAAAAVUAAAJmAFUA3QBBAAAAKgAqACoAWgBuAAEAAAAFAFAABwBUAAQAAgAAAAEAAQAAAEAALgADAAMAAAAQAMYAAQAAAAAAAACLAAAAAQAAAAAAAQAhAIsAAQAAAAAAAgAFAKwAAQAAAAAAAwBDALEAAQAAAAAABAAnAPQAAQAAAAAABQAKARsAAQAAAAAABgAmASUAAQAAAAAADgAaAUsAAwABBAkAAAEWAWUAAwABBAkAAQBCAnsAAwABBAkAAgAKAr0AAwABBAkAAwCGAscAAwABBAkABABOA00AAwABBAkABQAUA5sAAwABBAkABgBMA68AAwABBAkADgA0A/tDb3B5cmlnaHQgMjAwOSBieSBEYW5pZWwgSm9obnNvbi4gIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UuIEtheWFoIExpIGdseXBocyBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDMuYmFlYzJhOTJiZmZlNTAzMiAtIHN1YnNldCBvZiBKdXJhTGlnaHRiYWVjMmE5MmJmZmU1MDMyIC0gc3Vic2V0IG9mIEZvbnRGb3JnZSAyLjAgOiBKdXJhIExpZ2h0IDogMjMtMS0yMDA5YmFlYzJhOTJiZmZlNTAzMiAtIHN1YnNldCBvZiBKdXJhIExpZ2h0VmVyc2lvbiAyIGJhZWMyYTkyYmZmZTUwMzIgLSBzdWJzZXQgb2YgSnVyYUxpZ2h0aHR0cDovL3NjcmlwdHMuc2lsLm9yZy9PRkwAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMAA5ACAAYgB5ACAARABhAG4AaQBlAGwAIABKAG8AaABuAHMAbwBuAC4AIAAgAFIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAdABlAHIAbQBzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALgAgAEsAYQB5AGEAaAAgAEwAaQAgAGcAbAB5AHAAaABzACAAYQByAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAEcAUABMACAAdgBlAHIAcwBpAG8AbgAgADMALgBiAGEAZQBjADIAYQA5ADIAYgBmAGYAZQA1ADAAMwAyACAALQAgAHMAdQBiAHMAZQB0ACAAbwBmACAASgB1AHIAYQBMAGkAZwBoAHQAYgBhAGUAYwAyAGEAOQAyAGIAZgBmAGUANQAwADMAMgAgAC0AIABzAHUAYgBzAGUAdAAgAG8AZgAgAEYAbwBuAHQARgBvAHIAZwBlACAAMgAuADAAIAA6ACAASgB1AHIAYQAgAEwAaQBnAGgAdAAgADoAIAAyADMALQAxAC0AMgAwADAAOQBiAGEAZQBjADIAYQA5ADIAYgBmAGYAZQA1ADAAMwAyACAALQAgAHMAdQBiAHMAZQB0ACAAbwBmACAASgB1AHIAYQAgAEwAaQBnAGgAdABWAGUAcgBzAGkAbwBuACAAMgAgAGIAYQBlAGMAMgBhADkAMgBiAGYAZgBlADUAMAAzADIAIAAtACAAcwB1AGIAcwBlAHQAIABvAGYAIABKAHUAcgBhAEwAaQBnAGgAdABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwAAAAAAgAAAAAAAP+BADMAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAQACAQIAEQt6ZXJva2F5YWhsaQ==')}"; + e.getElementsByTagName("head")[0].appendChild(b);c.setAttribute("style","font:99px _,arial,helvetica;position:absolute;visibility:hidden");if(!g){g=s.appendChild(e.createElement("fontface"));t=true}c.innerHTML="........";c.id="fonttest";g.appendChild(c);h=c.offsetWidth*c.offsetHeight;c.style.font="99px testfont,_,arial,helvetica";a=h!==c.offsetWidth*c.offsetHeight;var v=function(){if(g.parentNode){a=j.fontface=h!==c.offsetWidth*c.offsetHeight;s.className=s.className.replace(/(no-)?fontface\b/,"")+ + (a?" ":" no-")+"fontface"}};setTimeout(v,75);setTimeout(v,150);addEventListener("load",function(){v();(w=true)&&o&&o(a);setTimeout(function(){t||(g=c);g.parentNode.removeChild(g);b.parentNode.removeChild(b)},50)},false)}j._fontfaceready=function(p){w||a?p(a):(o=p)};return a||h!==c.offsetWidth};d.video=function(){var a=e.createElement("video"),b=!!a.canPlayType;if(b){b=new Boolean(b);b.ogg=a.canPlayType('video/ogg; codecs="theora"');b.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"');b.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"')}return b}; + d.audio=function(){var a=e.createElement("audio"),b=!!a.canPlayType;if(b){b=new Boolean(b);b.ogg=a.canPlayType('audio/ogg; codecs="vorbis"');b.mp3=a.canPlayType("audio/mpeg;");b.wav=a.canPlayType('audio/wav; codecs="1"');b.m4a=a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")}return b};d.localStorage=function(){return"localStorage"in i&&i.localStorage!==null};d.sessionStorage=function(){try{return"sessionStorage"in i&&i.sessionStorage!==null}catch(a){return false}};d.webworkers=function(){return!!i.Worker}; + d.applicationCache=function(){var a=i.applicationCache;return!!(a&&typeof a.status!="undefined"&&typeof a.update=="function"&&typeof a.swapCache=="function")};d.svg=function(){return!!e.createElementNS&&!!e.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect};d.smil=function(){return!!e.createElementNS&&/SVG/.test(M.call(e.createElementNS("http://www.w3.org/2000/svg","animate")))};d.svgclippaths=function(){return!!e.createElementNS&&/SVG/.test(M.call(e.createElementNS("http://www.w3.org/2000/svg", + "clipPath")))};for(var z in d)if(O(d,z))N.push(((j[z.toLowerCase()]=d[z]())?"":"no-")+z.toLowerCase());j[E]||P();j.addTest=function(a,b){a=a.toLowerCase();if(!j[a]){b=!!b();s.className+=" "+(b?"":"no-")+a;j[a]=b;return j}};m.cssText="";D=n=null;(function(){var a=e.createElement("div");a.innerHTML="";return a.childNodes.length!==1})()&&function(a,b){function c(f,k){if(o[f])o[f].styleSheet.cssText+=k;else{var l=t[G],q=b[A]("style");q.media=f;l.insertBefore(q,l[G]);o[f]=q;c(f,k)}}function h(f, + k){for(var l=new RegExp("\\b("+w+")\\b(?!.*[;}])","gi"),q=function(B){return".iepp_"+B},x=-1;++x\\s*$","i");g.innerHTML=f.outerHTML.replace(/\r|\n/g," ").replace(l,f.currentStyle.display=="block"?"":"");l=g.childNodes[0];l.className+=" iepp_"+q;l=p[p.length]=[f,l];f.parentNode.replaceChild(l[1],l[0])}h(b.styleSheets,"all")});a.attachEvent("onafterprint", + function(){for(var f=-1,k;++f