From: <neb...@us...> - 2009-05-27 21:49:18
|
Revision: 1775 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=1775&view=rev Author: nebelschwade Date: 2009-05-27 21:49:13 +0000 (Wed, 27 May 2009) Log Message: ----------- + Frontend changed for better usability + Frontend Performancefixes, JavaScript & Sprites + The Search now allows for searching Artist and Tags and actually returns sth. + Full Albums found in the search can now be played -> xspf-Playlistfile + FirePHP-Debugger + View-Class Changed general Filestructure and removed unused ARC-Framework Modified Paths: -------------- trunk/src/moosique.net/css/default.css trunk/src/moosique.net/css/style.css trunk/src/moosique.net/img/controls.png trunk/src/moosique.net/img/loading.gif trunk/src/moosique.net/index.php trunk/src/moosique.net/js/ajax.js trunk/src/moosique.net/js/interface.js trunk/src/moosique.net/js/mootools-core.js trunk/src/moosique.net/js/mootools-more.js trunk/src/moosique.net/js/player.js Added Paths: ----------- trunk/src/moosique.net/img/noArtistImage.png trunk/src/moosique.net/moosique/ trunk/src/moosique.net/moosique/classes/ trunk/src/moosique.net/moosique/classes/Config.php trunk/src/moosique.net/moosique/classes/Debugger.php trunk/src/moosique.net/moosique/classes/DllearnerConnection.php trunk/src/moosique.net/moosique/classes/FirePHP.php trunk/src/moosique.net/moosique/classes/LastFM.php trunk/src/moosique.net/moosique/classes/RequestHandler.php trunk/src/moosique.net/moosique/classes/SparqlQueryBuilder.php trunk/src/moosique.net/moosique/classes/Utilities.php trunk/src/moosique.net/moosique/classes/View.php trunk/src/moosique.net/moosique/config.ini trunk/src/moosique.net/moosique/def0.xsd trunk/src/moosique.net/moosique/def1.xsd trunk/src/moosique.net/moosique/index.php trunk/src/moosique.net/moosique/main.wsdl trunk/src/moosique.net/moosique/xml2json/ trunk/src/moosique.net/moosique/xml2json/json.php trunk/src/moosique.net/moosique/xml2json/xml2json.php Removed Paths: ------------- trunk/src/moosique.net/img/bg_body.png trunk/src/moosique.net/img/del.png trunk/src/moosique.net/img/next.png trunk/src/moosique.net/img/pause.png trunk/src/moosique.net/img/play.png trunk/src/moosique.net/img/prev.png trunk/src/moosique.net/img/stop.png trunk/src/moosique.net/js/ie6fixes.js trunk/src/moosique.net/js/slimbox.js trunk/src/moosique.net/mp3/ trunk/src/moosique.net/php/ Modified: trunk/src/moosique.net/css/default.css =================================================================== --- trunk/src/moosique.net/css/default.css 2009-05-27 10:51:47 UTC (rev 1774) +++ trunk/src/moosique.net/css/default.css 2009-05-27 21:49:13 UTC (rev 1775) @@ -1,44 +1,44 @@ -@charset 'utf-8'; -@media all { /* Yes we want to reset this for print-Styles too */ -/* Based on various Reset-Styles, included own stuff and added mediabox-Style */ -/* Reset all elements except form stuff */ -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, 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-weight: inherit; font-style: inherit; vertical-align: baseline; -} - -html { height: 100%; } -body { height: 101%; background-color: #fff; color: #000; line-height: 1; } -ol, ul { list-style: none; } -table { border-collapse: collapse; border-spacing: 0; } -caption, th, td { text-align: left; font-weight: normal; } -blockquote:before, blockquote:after, q:before, q:after { content: ""; } -blockquote, q { quotes: "" ""; } -strong, b { font-weight: bold; } -em, i { font-style: italic; } -label, input[type=button], input[type=submit], button { cursor: pointer; } -abbr[title] { border-bottom: 1px dotted #888 !important; cursor: help; } -a abbr { cursor: pointer !important; } - -/* General purpose-Classes */ -.hidden { position: absolute; left: -9999999em; top: -9999999em;} - -/* Clearfix hack */ -.clearfix:after { clear: both; content: "."; display: block; height: 0; visibility: hidden; } -.clearfix { display: inline-block; } -* html .clearfix { height: 1%; } -.clearfix { display: block; } - -/* Special Stuff */ -:focus { outline: 0; } -a { text-decoration: none; } -a:hover { text-decoration: underline; } -a:active { position: relative; top: 1px; } -input:focus, textarea:focus, select:focus { background: #eee; } -fieldset { border: 1px solid #333; padding: 9px; } -fieldset legend { padding: 0 9px; } -h1, h2, h3, h4, h5, h6 { clear: both; font-weight: normal; } - -} /* End @media all */ \ No newline at end of file +@media all { /* Yes we want to reset this for print-Styles too */ +/* Based on various Reset-Styles, included own stuff and added mediabox-Style */ +/* Reset all elements except form stuff */ +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, 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-weight: inherit; font-style: inherit; vertical-align: baseline; +} + +html { height: 100%; } +body { height: 101%; background-color: #fff; color: #000; line-height: 1; } +ol, ul { list-style: none; } +table { border-collapse: collapse; border-spacing: 0; } +caption, th, td { text-align: left; font-weight: normal; } +blockquote:before, blockquote:after, q:before, q:after { content: ""; } +blockquote, q { quotes: "" ""; } +strong, b { font-weight: bold; } +em, i { font-style: italic; } +label, input[type=button], input[type=submit], button { cursor: pointer; } +abbr[title] { border-bottom: 1px dotted #888 !important; cursor: help; } +a abbr { cursor: pointer !important; } + +/* General purpose-Classes */ +.hidden { position: absolute; left: -9999999em; top: -9999999em;} + +/* Clearfix hack */ +.clearfix:after { clear: both; content: "."; display: block; height: 0; visibility: hidden; } +.clearfix { display: inline-block; } +* html .clearfix { height: 1%; } +.clearfix { display: block; } + +/* Special Stuff */ +:focus { outline: 0; } +a { text-decoration: none; } +a:hover { text-decoration: underline; } +a:active { position: relative; top: 1px; } +.ie6 a:active, .ie7 a:active { position: static; top: auto; } +input:focus, textarea:focus, select:focus { background: #eee; } +fieldset { border: 1px solid #333; padding: 9px; } +fieldset legend { padding: 0 9px; } +h1, h2, h3, h4, h5, h6 { clear: both; font-weight: normal; } + +} /* End @media all */ Modified: trunk/src/moosique.net/css/style.css =================================================================== --- trunk/src/moosique.net/css/style.css 2009-05-27 10:51:47 UTC (rev 1774) +++ trunk/src/moosique.net/css/style.css 2009-05-27 21:49:13 UTC (rev 1775) @@ -1,12 +1,8 @@ -@charset 'utf-8'; -@import url(default.css); - /* moosique.net * * Semiblack: #131313 - * Dark Grey: #383838 * Light Grey: #545454 - * White: #fff + * White: #f8faf7 * Yellowish: #ffbc00 * */ @@ -16,14 +12,14 @@ /* Default Element Styling --- Start Editing below this line */ /* =================================================================== */ * { - font-family: Verdana, Arial, "Lucida Grande", Helvetica, sans-serif; - font-size: 14px; - line-height: 18px; - color: #fff; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; + color: #131313; } body { - background: #333; + background: #f8faf7; } a:hover { @@ -32,7 +28,7 @@ /* Abstand Zeilenhoehe nach unten bei manchen Elementen */ p, h1, h2, h3, h4, h5, h6, table, ul, ol, blockquote, pre, form { - margin-bottom: 18px; + margin-bottom: 16px; } /* Default Container Positioning */ @@ -42,25 +38,27 @@ } #headerContainer { - height: 140px; - background: #131313; - border-top: 1px solid #999; - border-bottom: 10px solid #ffbc00; + height: 95px; + background: #333; + border-bottom: 5px solid #ffbc00; + padding: 20px 0 0 0; } #header { - width: 960px; + width: 760px; margin: 0 auto; } #container { - border-top: 1px solid #1a1a1a; + border-top: 1px solid #ccc; } #mainContainer { - width: 960px; + width: 700px; margin: 0 auto; - padding: 30px 0; + padding: 30px; + border: 1px solid #ccc; + border-top: none; } #footer { @@ -71,316 +69,304 @@ /* header Area */ /* =================================================================== */ #header h1 a { - font-size: 36px; - line-height: 90px; - font-family: Georgia, "Times New Roman", Times, serif; + font-size: 32px; + line-height: 32px; + font-family: Georgia, Times, "Times New Roman", serif; text-decoration: none; + color: #f8faf7; } -#now { +#status, #header .currentlyPlaying { position: absolute; - top: 20px; - left: 280px; - width: 410px; - height: 37px; - padding: 10px 20px; - background: #545454; + top: 0; + right: 0; + width: 380px; + background: #545454; + padding: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; } -#now h2, #now h3, now p { - margin: 0; +#status { + background: #545454; + color: #f8faf7; + z-index: 1000000; + height: 32px; + line-height: 32px; + text-align: center; } -#now h2, #now p { - font-size: 11px; - line-height: 11px; +.currentlyPlaying h2, .currentlyPlaying h3, .currentlyPlaying h4 { + margin-bottom: 0; } -#now h3 { - font-size: 18px; - line-height: 24px; +#header .currentlyPlaying h2 { + font-size: 10px; } -#now p { +#header .currentlyPlaying h4 { position: absolute; - top: 10px; + bottom: 10px; right: 10px; - text-align: right; + font-size: 10px; } -#status { - position: absolute; - top: 83px; - left: 300px; - width: 410px; - font-size: 11px; +#searchForm input#searchValue { + margin: 0 5px; + width: 100px; } -#playerControls { +#loadingImg { + display: none; +} + +/* mainMenu & status */ +/* =================================================================== */ + +#mainMenu ul { position: absolute; - width: 116px; - height: 37px; - top: 20px; - right: 0; - padding: 10px 20px; - background: #545454; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; + top: 70px; + right: 0; } -#prev, #next, #stop, #playPause { - display: block; - width: 20px; - height: 37px; - text-decoration: none; - text-indent: -1000000px; +#mainMenu ul li { float: left; - margin-right: 10px; + -moz-border-radius-topleft: 10px; + -moz-border-radius-topright: 10px; + -webkit-border-top-left-radius: 10px; + -webkit-border-top-right-radius: 10px; + padding: 0 15px; + background: #545454; + margin: 5px 0 0 5px; + height: 20px; + line-height: 20px; } -#playPause { - width: 26px; +#mainMenu ul li a { + color: #131313; } -#next { - margin-right: 0; +#mainMenu ul li.active { + height: 25px; + line-height: 25px; + margin-top: 0; + background: #ffbc00; } -/* clicky feel */ -#prev:active, #next:active, #stop:active, #playPause:active { - position: relative; - top: 2px; +#mainMenu ul li.active a { + font-weight: bold; } -#prev { - background: url(../img/controls.png) 0px -160px no-repeat; +#mainMenu ul li a:hover { + text-decoration: none; } -#next { - background: url(../img/controls.png) 0px -120px no-repeat; + + +/* Content Area Default Styles */ +/* =================================================================== */ +#content h2, #content h3 { + font-size: 16px; + line-height: 24px; + font-weight: bold; } -#playPause { - background: url(../img/controls.png) 0px 0px no-repeat; -} -#stop { - background: url(../img/controls.png) 0px -80px no-repeat; -} -#toggles { - position: absolute; - width: 156px; - height: 18px; - top: 93px; - right: 0; - text-align: center; +/* for debugging */ +#content pre { + font-family: "Courier New", Courier, monospace; + font-size: 10px; } -#toggleMute, #togglePlaylist { - font-size: 11px; - text-decoration: none; +/* Initial hiding */ +#recommendations, #player, #information, #help { + display: none; /* Initial Hide */ } -#toggleMute { - padding-right: 10px; +#footer * { + font-size: 10px; } -/* Playlist Area */ +/* home -- search results */ /* =================================================================== */ - -#playlistContainer { - position: absolute; - width: 368px; - top: 30px; - right: 0; - background: #000; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; - z-index: 100; - display: none; +#results h3 em { + font-size: 16px; } -#playlistHeader { - position: relative; - -moz-border-radius-topleft: 10px; - -moz-border-radius-topright: 10px; - -webkit-border-top-left-radius: 10px; - -webkit-border-top-right-radius: 10px; - background: #111; - padding: 5px 10px; - cursor: move; +#results ul li h3 a { + font-weight: normal; } -#playlistFooter { - position: absolute; - width: 100%; - bottom: 0; - -moz-border-radius-bottomleft: 10px; - -moz-border-radius-bottomright: 10px; - -webkit-border-bottom-left-radius: 10px; - -webkit-border-bottom-right-radius: 10px; - background: #111; - padding: 5px 0; - cursor: se-resize; +#results ul li img { + border: 2px solid #545454; + margin-bottom: 16px; } -#closePlaylist { - position: absolute; - width: 100px; - height: 20px; - top: 5px; - right: 10px; - text-align: right; - font-size: 10px; +#results ul li { + display: block; + border: 1px dotted #545454; + padding: 16px; + margin: 0 16px 16px 0; + float: left; + width: 300px; } -#playlist { - padding: 20px; - margin: 0 0 20px 0; +#results .artistSearch ul li { + height: 450px; } -#playlist li { - position: relative; /* Delete Buttons */ - list-style: decimal; - list-style-position: inside; - cursor: move; - padding: 3px; +#results ul ul { + list-style: square; } -#playlist li a.ymp-btn-page-pause { - font-weight: bold; +#results ul li ul li, +#results .artistSearch ul li ul li, +#results .tagSearch ul li ul li { + border: none; + display: list-item; + padding: 0; + margin: 0 0 0 32px; + width: auto; + height: auto; + float: none; } -/* Delete buttons */ -#playlist li a.del { - position: absolute; - display: block; - top: 5px; - right: 10px; - width: 14px; - height: 14px; - line-height: 14px; - margin-right: -19px; - z-index: 1000; - text-indent: -99999999px; - background: url(../img/controls.png) 0px -200px no-repeat; +#results .tagSearch ul li ul { + clear: both; } + -/* mainMenu */ -/* =================================================================== */ -#mainMenu ul { - position: absolute; - top: -46px; - left: 0; +#results .artistSearch ul li div.artistImage { + text-align: center; } -#mainMenu ul li { +#results .tagSearch ul li div.cover { + margin-right: 16px; + width: 110px; float: left; - -moz-border-radius-topleft: 10px; - -moz-border-radius-topright: 10px; - -webkit-border-top-left-radius: 10px; - -webkit-border-top-right-radius: 10px; - padding: 0 15px; - background: #545454; - margin: 5px 5px 0 0; - height: 30px; - line-height: 30px; } -#mainMenu ul li a { - color: #131313; +#results .tagSearch ul li h4 { + display: inline; + font-weight: bold; } -#mainMenu ul li.active { - height: 35px; - line-height: 35px; - margin-top: 0; - background: #ffbc00; + + + + +/* Recommendations */ +/* =================================================================== */ +#recommended { + list-style: decimal; + margin-left: 24px; } -#mainMenu ul li.active a { +#recommended li { + line-height: 24px; +} + +#recommended a:hover { + cursor: pointer; + text-decoration: none; font-weight: bold; + color: #131313; } -/* Content Area Default Styles */ + +/* information */ /* =================================================================== */ -#mainContainer h2 { - font-size: 20px; - line-height: 28px; - font-weight: bold; -} -/* for debugging */ -#mainContainer pre { - font-size: 12px; - font-family: "Courier New", Courier, monospace; -} -/* search */ +/* player */ /* =================================================================== */ -#searchForm * { - color: #131313; + +#playerControls { + position: absolute; + width: 149px; + height: 37px; + top: 0; + right: 0; + padding: 10px 20px; + background: #545454; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; } +#prev, #next, #stop, #playPause, #mute { + display: block; + width: 20px; + height: 37px; + text-decoration: none; + text-indent: -1000000px; + float: left; + margin-right: 10px; +} -/* Recommendations */ -/* =================================================================== */ -#recommendations { - display: none; /* Initial Hide */ +/* clicky feel */ +#prev:active, #next:active, #stop:active, +#playPause:active, #mute:active { + position: relative; + top: 2px; } -#recommendations ol { - list-style: decimal; - margin-left: 24px; - width: 50%; +/* Sprites */ +#prev { background: url(../img/controls.png) 0px -160px no-repeat; } +#next { background: url(../img/controls.png) 0px -120px no-repeat; } +#stop { background: url(../img/controls.png) 0px -80px no-repeat; } + +#playPause { + background: url(../img/controls.png) 0px 0px no-repeat; + width: 26px; } -#recommendations ol li a { +#mute { + background: url(../img/controls.png) 0px -280px no-repeat; + margin-right: 0; + width: 23px; +} +/* End Sprites */ + +#playlist li { + position: relative; /* Delete Buttons */ + list-style: decimal; + list-style-position: inside; cursor: move; - text-decoration: none; + padding: 3px; } -#recommendations ol li a:hover { - text-decoration: none; - color: #fff; +#playlist li a.ymp-btn-page-pause { + font-weight: bold; } -#recommendations li:hover { - border: 1px solid #ffbc00; +/* Delete buttons */ +#playlist li a.del { + position: absolute; + display: block; + top: 5px; + right: 20px; + width: 14px; + height: 14px; + line-height: 14px; + margin-right: -19px; + z-index: 1000; + text-indent: -99999999px; + background: url(../img/controls.png) 0px -200px no-repeat; } - /* Draggable li-Items */ -#playlist li.moving, #recommendations li.moving { +#playlist li.moving { background: #666; border: 3px solid #ffbc00; - color: #000; font-weight: bold; } -/* information */ -/* =================================================================== */ -#information { - display: none; /* Initial Hide */ -} -/* Sidebar Area */ -/* =================================================================== */ - -/* Footer Area */ -/* =================================================================== */ -#footer a { - font-size: 11px; -} - - -} /* end @media screen \ No newline at end of file +} /* end @media screen */ \ No newline at end of file Deleted: trunk/src/moosique.net/img/bg_body.png =================================================================== (Binary files differ) Modified: trunk/src/moosique.net/img/controls.png =================================================================== (Binary files differ) Deleted: trunk/src/moosique.net/img/del.png =================================================================== (Binary files differ) Modified: trunk/src/moosique.net/img/loading.gif =================================================================== (Binary files differ) Deleted: trunk/src/moosique.net/img/next.png =================================================================== (Binary files differ) Added: trunk/src/moosique.net/img/noArtistImage.png =================================================================== (Binary files differ) Property changes on: trunk/src/moosique.net/img/noArtistImage.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Deleted: trunk/src/moosique.net/img/pause.png =================================================================== (Binary files differ) Deleted: trunk/src/moosique.net/img/play.png =================================================================== (Binary files differ) Deleted: trunk/src/moosique.net/img/prev.png =================================================================== (Binary files differ) Deleted: trunk/src/moosique.net/img/stop.png =================================================================== (Binary files differ) Modified: trunk/src/moosique.net/index.php =================================================================== --- trunk/src/moosique.net/index.php 2009-05-27 10:51:47 UTC (rev 1774) +++ trunk/src/moosique.net/index.php 2009-05-27 21:49:13 UTC (rev 1775) @@ -1,10 +1,11 @@ -<!DOCTYPE html +<?php session_start(); ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>moosique.net</title> + <link href="css/default.css" rel="stylesheet" type="text/css" /> <link href="css/style.css" rel="stylesheet" type="text/css" /> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> @@ -16,120 +17,135 @@ <div id="headerContainer"> <div id="header"> <h1><a href="index.php">moosique.net</a></h1> - <div id="now"> - <h2>Player stopped</h2> - <h3>...</h3> - <p>0:00 / 0:00</p> - </div> - <div id="status"> + <div id="mainMenu"> + <ul class="clearfix"> + <li class="active"><a href="#" class="home">Home</a></li> + <li><a href="#" class="player">Player</a></li> + <li><a href="#" class="recommendations">Recommendations</a></li> + <li><a href="#" class="information">Information</a></li> + <li><a href="#" class="help">Help</a></li> + </ul> </div> - <div id="playerControls"> - <a href="#" id="prev" title="Play previous Track in Playlist">Previous Tack</a> - <a href="#" id="playPause" title="Play/Pause">Play / Pause</a> - <a href="#" id="stop" title="Stop playing">Stop</a> - <a href="#" id="next" title="Play next Track in Playlist">Next Track</a> + <form id="searchForm" method="get" action="moosique/"> + <div class="clearfix"> + <select name="typeOfSearch" id="typeOfSearch"> + <option value="artistSearch">Artist</option> + <option value="tagSearch">Tag</option> + <?php /* + <option value="songSearch">Song</option> + <option value="lastfm">Last.fm-User</option> + */ ?> + </select> + <input id="searchValue" name="searchValue" type="text" /> + <input id="searchSubmit" name="searchSubmit" value="Search" title="Search" type="submit" disabled="disabled" /> + <img id="loadingImg" src="img/loading.gif" alt="Loading..." /> + </div> + </form> + + <div id="status"> </div> + + <div class="currentlyPlaying"> + <h2>Player stopped</h2> + <h3>...</h3> + <h4>0:00 / 0:00</h4> </div> - <div id="toggles"> - <a href="#" id="toggleMute" title="Sound on/off">Mute</a> - <a href="#" id="togglePlaylist" title="Show/Hide Playlist">Playlist</a> - </div> </div> </div> <div id="container"> - <div id="mainContainer"> - <div id="mainMenu"> - <ul class="clearfix"> - <li class="active"><a href="#" class="search">Search</a></li> - <li><a href="#" class="recommendations">Recommendations</a></li> - <li><a href="#" class="information">Information</a></li> - </ul> - </div> - <div id="content"> + <div id="content" class="clearfix"> - - <div id="search"> - <h2>Welcome to moosique.net!</h2> - <p> - Want to listen to some good free music? Just enter an artist or song - name, search for tags or enter your last.fm username and let the moogic - happen... - </p> - <form id="searchForm" method="post" action="php/ajaxer.php"> - <div> - <select name="typeOfSearch" id="typeOfSearch"> - <option value="artist">Artist</option> - <option value="song">Songtitle</option> - <option value="tag">Tag</option> - <option value="lastfm">Last.fm-User</option> - </select> - <input id="searchValue" name="searchValue" type="text" /> - <input id="searchSubmit" name="searchSubmit" value="Search" title="Search" type="submit" /> - </div> - </form> + <div id="home"> + <div id="welcome"> + <h2>Welcome to moosique.net!</h2> + <p> + Want to listen to some good free music? Just enter an artist or song + name or search for music using tags <!-- or enter your last.fm username --> and let the moogic + happen. By listening to songs you like, the system will automatically learn about + your musical taste and generate recommendations. You can find them in the tab »Recommendations«. + </p> + <p> + You can find information about the song currently playing in the tab »Information« and view + your Playlist and control the Player in the Tab »Player«. + </p> + <p> + Now get started and add something to the Playlist! + </p> + </div> <div id="results"> </div> </div> <div id="recommendations"> - <h2>Try dragging these samples to the playlist</h2> - <ol> - <li><a href="http://stream6-3.jamendo.com/8654/mp31/01%20-%20Low%20Earth%20Orbit%20-%20My%20Mistakes.mp3">Low Earth Orbit - My Mistakes</a></li> - <li><a href="http://stream6-3.jamendo.com/8654/mp31/02%20-%20Low%20Earth%20Orbit%20-%20Like%20Mud.mp3">Low Earth Orbit - Like Mud</a></li> - <li><a href="http://stream6-3.jamendo.com/8654/mp31/03%20-%20Low%20Earth%20Orbit%20-%20Defend.mp3">Low Earth Orbit - Defend</a></li> - <li><a href="http://stream6-3.jamendo.com/8654/mp31/04%20-%20Low%20Earth%20Orbit%20-%20What%20Can%20I%20Say.mp3">Low Earth Orbit - What Can I Say</a></li> + <h2>Recommended Songs</h2> + <p>Click a song to add it to your playlist.</p> + <ol id="recommended"> + <li></li> </ol> </div> <div id="information"> - <div id="sidebar"> - <div id="moreInfo"> - <h2>About the Artist</h2> - <img src="http://imgjam.com/albums/8654/covers/1.200.jpg" alt="Cover" /> - <p> - Iusto odio dignissim qui blandit praesent. Nisl ut aliquip ex ea commodo, consequat - duis autem vel eum. Nam liber tempor cum soluta nobis eleifend option congue nihil - imperdiet doming id. In hendrerit eu feugiat nulla luptatum zzril delenit augue duis - dolore te feugait. Quod ii legunt saepius claritas est etiam processus dynamicus - qui nobis videntur parum. - </p> - </div> + <div id="moreInfo"> + <h2>About the Artist</h2> + <img src="http://imgjam.com/albums/8654/covers/1.200.jpg" alt="Cover" /> + <p> + Iusto odio dignissim qui blandit praesent. Nisl ut aliquip ex ea commodo, consequat + duis autem vel eum. Nam liber tempor cum soluta nobis eleifend option congue nihil + imperdiet doming id. In hendrerit eu feugiat nulla luptatum zzril delenit augue duis + dolore te feugait. Quod ii legunt saepius claritas est etiam processus dynamicus + qui nobis videntur parum. + </p> </div> </div> + + <div id="player"> + <h3>Playlist</h3> + <p> + You can delete entries from the playlist by clicking the small x on the left. <br /> + You also can move the playlist-entries around to change their order. + </p> - </div> + <ol id="playlist"> + <li></li> + </ol> - <div id="playlistContainer"> - <div id="playlistHeader"> - Playlist - <a href="#" id="closePlaylist" title="Close Playlist Window">Close Window</a> + <div id="playerControls"> + <a href="#" id="playPause" title="Play/Pause">Play / Pause</a> + <a href="#" id="stop" title="Stop playing">Stop</a> + <a href="#" id="prev" title="Play previous Track in Playlist">Previous Tack</a> + <a href="#" id="next" title="Play next Track in Playlist">Next Track</a> + <a href="#" id="mute" title="Sound on/off">Mute</a> + </div> + </div> - <ol id="playlist"> - <li><a href="mp3/moosique.mp3" class="htrack">Welcome to moosique</a></li> - </ol> - <div id="playlistFooter"> </div> - </div> - - <div id="footer"> - <a href="http://mediaplayer.yahoo.com/">Yahoo! Media Player</a> | - <a href="http://aksw.org/Projects/DLLearner">Powered by DL-Learner</a> - </div> + + <div id="help"> + + </div> + + </div> <!-- end content --> + </div> <!-- end mainContainer --> + <div id="footer"> + <a href="http://jamendo.com">Jamendo</a> | + <a href="http://mediaplayer.yahoo.com/">Yahoo! Media Player</a> | + <a href="http://aksw.org/Projects/DLLearner">Powered by DL-Learner</a> </div> - </div> + </div> <!-- end container --> <!-- JS at the bottom, faster loading pages --> + <script type="text/javascript" src="http://mediaplayer.yahoo.com/js"></script> + <script type="text/javascript" src="js/mootools-core.js"></script> <script type="text/javascript" src="js/mootools-more.js"></script> - <script type="text/javascript" src="http://mediaplayer.yahoo.com/js"></script> - + <script type="text/javascript" src="js/player.js"></script> <script type="text/javascript" src="js/interface.js"></script> <script type="text/javascript" src="js/ajax.js"></script> Modified: trunk/src/moosique.net/js/ajax.js =================================================================== --- trunk/src/moosique.net/js/ajax.js 2009-05-27 10:51:47 UTC (rev 1774) +++ trunk/src/moosique.net/js/ajax.js 2009-05-27 21:49:13 UTC (rev 1775) @@ -1,55 +1,93 @@ window.addEvent('domready', function() { -var responseObject = ''; - // handle search requests $('searchForm').addEvent('submit', function(e) { var results = $('results'); var submit = $('searchSubmit'); + var loading = $('loadingImg'); e.stop(); // prevent form submitting the non-ajax way this.set('send', { - onRequest: function(response) { + onRequest: function() { submit.set('disabled', 'disabled'); // disable submit button until request complete - results.set('html', '<h2>Processing your search request...</h2>'); + // show homescreen for resultdisplaying + showTab('home'); + submit.setStyle('display', 'none'); + loading.setStyle('display', 'inline'); + results.set('html', '<h2>Searching...</h2>'); }, - onFailure: function(response) { + onFailure: function() { results.set('html', '<h2>Unable to process your search. Try again.</h2>'); }, onSuccess: function(response) { submit.erase('disabled'); // reenable submitbutton - responseObject = JSON.decode(response); - // info.set('text', response); - results.set('html', '<h2>Done.</h2>'); - // Firebug needed - console.log(responseObject); - - - - /* - var newPlaylistItem = new Element('a', { - 'href': responseObject.playlist.trackList.track.location, - 'html': responseObject.playlist.trackList.track.creator + ' - ' + responseObject.playlist.trackList.track.title - }); + submit.setStyle('display', 'inline'); + loading.setStyle('display', 'none'); - newPlaylistItem.inject(info); - */ + // if the welcome-text ist present, cut it to help + if ($('welcome')) { + if ($('welcome').get('html').length > 100) { + $('help').set('html', $('welcome').get('html')); + $('welcome').destroy(); + } + } + + // display results + results.set('html', response); + + // addEvents to result-links + makeAddable(); } - - - }); - this.send(); + // only send form if value is at least 3 + if ($('searchValue').get('value').length > 2) { + this.send(); + } - }); +makeAddable(); +}); -}); \ No newline at end of file + +/** + * For Recommendations and Search-Results + */ +function makeAddable() { + $$('a.addToPlaylist').each(function(a) { + a.addEvent('click', function(e) { + e.stop(); // dont follow link + // remove the class from preventing adding again + + a.removeClass('addToPlaylist'); + + // TODO, now using xspfs, later we only will use mp3-links + a.set('type', 'application/xspf+xml'); + + // if the Playlist is empty, remove entries + if ($('playlist').getFirst()) { + if ($('playlist').getFirst().get('text') == '') { + $('playlist').empty(); + } + } + + + a.getParent().inject($('playlist')); + if (a.get('title')) { + a.set('text', a.get('title')); + } + + // + mooPlayer.refreshPlaylist(); + showTab('player'); + + }); + }); +} \ No newline at end of file Deleted: trunk/src/moosique.net/js/ie6fixes.js =================================================================== --- trunk/src/moosique.net/js/ie6fixes.js 2009-05-27 10:51:47 UTC (rev 1774) +++ trunk/src/moosique.net/js/ie6fixes.js 2009-05-27 21:49:13 UTC (rev 1775) @@ -1,48 +0,0 @@ -window.addEvent('domready', function() { - if (Browser.Engine.trident4) { - - // PNG-Support for IE6 for all img-Tags - $$('img').each(function(i) { - // additional styles - iStyle = "display: inline-block; "; - if (i.getParent().get('href') !== "") { - iStyle += "cursor: pointer; " - } - // if the img-src is a .png - var iName = i.get('src').toLowerCase(); - if (iName.substring(iName.length - 3, iName.length) == "png") { - var strNewHTML = '<span id="' + i.get('id') + - '" class="'+ i.get('class') + - '" style="' + iStyle + - 'width: ' + i.getSize().x + - 'px; height: ' + i.getSize().y + - 'px; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader' + - "(src=\'" + i.getProperty('src') + "\', sizingMethod='scale');\"></span>"; - i.outerHTML = strNewHTML; - } - }); - - // PNG-Background-Image-Support for chosen tags (edit for performance) - $$('div', 'a', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'li', 'form').each(function(el) { - var bgImg = el.getStyle('background-image'); - if (bgImg.contains('.png')) { - var expression = /url\("(.*\.png)"\)/; // IE-only, other browsers dont "" - var result = expression.exec(bgImg); - var imgUrl = result[1]; - - var method = 'crop'; - // if repeat-x or y scale the image, does not work for patterns - if ( el.getStyle('background-repeat') == 'repeat-x' || - el.getStyle('background-repeat') == 'repeat-y') { - method = 'scale'; - } - if (imgUrl.length > 4) { - el.setStyles({ - 'background-image': 'none', - 'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + imgUrl + "', sizingMethod='" + method + "');" - }); - } - } - }); - } -}); \ No newline at end of file Modified: trunk/src/moosique.net/js/interface.js =================================================================== --- trunk/src/moosique.net/js/interface.js 2009-05-27 10:51:47 UTC (rev 1774) +++ trunk/src/moosique.net/js/interface.js 2009-05-27 21:49:13 UTC (rev 1775) @@ -5,13 +5,32 @@ $$('#mainMenu ul li a').each(function(a) { a.addEvent('click', function(e) { e.stop(); // dont follow link - $$('#mainMenu ul li').removeClass('active'); - a.getParent().toggleClass('active'); - console.log(a.get('class')); - $('content').getChildren().setStyle('display', 'none') - $(a.get('class')).setStyle('display', 'block'); + showTab(a.get('class').toString()); }); }); -}); \ No newline at end of file +$('searchValue').addEvent('keyup', function() { + if (this.get('value').length > 2) { + $('searchSubmit').erase('disabled'); + } else { + $('searchSubmit').set('disabled', 'disabled'); + } +}); + + +}); + +/** + * + * @param {String} tabID ID of the Tab to show + */ +function showTab(tabID) { + $$('#mainMenu ul li').removeClass('active'); + $$('#mainMenu ul li a.' + tabID).getParent().toggleClass('active'); + $('content').getChildren().setStyle('display', 'none') + $(tabID).setStyle('display', 'block'); + +} + + Modified: trunk/src/moosique.net/js/mootools-core.js =================================================================== --- trunk/src/moosique.net/js/mootools-core.js 2009-05-27 10:51:47 UTC (rev 1774) +++ trunk/src/moosique.net/js/mootools-core.js 2009-05-27 21:49:13 UTC (rev 1775) @@ -1,129 +1,352 @@ -//MooTools, <http://mootools.net>, My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2008 Valerio Proietti, <http://mad4milk.net>, MIT Style License. +//MooTools, <http://mootools.net>, My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2009 Valerio Proietti, <http://mad4milk.net>, MIT Style License. -var MooTools={'version':'1.2.1','build':'0d4845aab3d9a4fdee2f0d4a6dd59210e4b697cf'};var Native=function(options){options=options||{};var name=options.name;var legacy=options.legacy;var protect=options.protect;var methods=options.implement;var generics=options.generics;var initialize=options.initialize;var afterImplement=options.afterImplement||function(){};var object=initialize||legacy;generics=generics!==false;object.constructor=Native;object.$family={name:'native'};if(legacy&&initialize)object.prototype=legacy.prototype;object.prototype.constructor=object;if(name){var family=name.toLowerCase();object.prototype.$family={name:family};Native.typize(object,family);} -var add=function(obj,name,method,force){if(!protect||force||!obj.prototype[name])obj.prototype[name]=method;if(generics)Native.genericize(obj,name,protect);afterImplement.call(obj,name,method);return obj;};object.alias=function(a1,a2,a3){if(typeof a1=='string'){if((a1=this.prototype[a1]))return add(this,a2,a1,a3);} -for(var a in a1)this.alias(a,a1[a],a2);return this;};object.implement=function(a1,a2,a3){if(typeof a1=='string')return add(this,a1,a2,a3);for(var p in a1)add(this,p,a1[p],a2);return this;};if(methods)object.implement(methods);return object;};Native.genericize=function(object,property,check){if((!check||!object[property])&&typeof object.prototype[property]=='function')object[property]=function(){var args=Array.prototype.slice.call(arguments);return object.prototype[property].apply(args.shift(),args);};};Native.implement=function(objects,properties){for(var i=0,l=objects.length;i<l;i++)objects[i].implement(properties);};Native.typize=function(object,family){if(!object.type)object.type=function(item){return($type(item)===family);};};(function(){var natives={'Array':Array,'Date':Date,'Function':Function,'Number':Number,'RegExp':RegExp,'String':String};for(var n in natives)new Native({name:n,initialize:natives[n],protect:true});var types={'boolean':Boolean,'native':Native,'object':Object};for(var t in types)Native.typize(types[t],t);var generics={'Array':["concat","indexOf","join","lastIndexOf","pop","push","reverse","shift","slice","sort","splice","toString","unshift","valueOf"],'String':["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","replace","search","slice","split","substr","substring","toLowerCase","toUpperCase","valueOf"]};for(var g in generics){for(var i=generics[g].length;i--;)Native.genericize(window[g],generics[g][i],true);};})();var Hash=new Native({name:'Hash',initialize:function(object){if($type(object)=='hash')object=$unlink(object.getClean());for(var key in object)this[key]=object[key];return this;}});Hash.implement({forEach:function(fn,bind){for(var key in this){if(this.hasOwnProperty(key))fn.call(bind,this[key],key,this);}},getClean:function(){var clean={};for(var key in this){if(this.hasOwnProperty(key))clean[key]=this[key];} -return clean;},getLength:function(){var length=0;for(var key in this){if(this.hasOwnProperty(key))length++;} -return length;}});Hash.alias('forEach','each');Array.implement({forEach:function(fn,bind){for(var i=0,l=this.length;i<l;i++)fn.call(bind,this[i],i,this);}});Array.alias('forEach','each');function $A(iterable){if(iterable.item){var array=[];for(var i=0,l=iterable.length;i<l;i++)array[i]=iterable[i];return array;} -return Array.prototype.slice.call(iterable);};function $arguments(i){return function(){return arguments[i];};};function $chk(obj){return!!(obj||obj===0);};function $clear(timer){clearTimeout(timer);clearInterval(timer);return null;};function $defined(obj){return(obj!=undefined);};function $each(iterable,fn,bind){var type=$type(iterable);((type=='arguments'||type=='collection'||type=='array')?Array:Hash).each(iterable,fn,bind);};function $empty(){};function $extend(original,extended){for(var key in(extended||{}))original[key]=extended[key];return original;};function $H(object){return new Hash(object);};function $lambda(value){return(typeof value=='function')?value:function(){return value;};};function $merge(){var mix={};for(var i=0,l=arguments.length;i<l;i++){var object=arguments[i];if($type(object)!='object')continue;for(var key in object){var op=object[key],mp=mix[key];mix[key]=(mp&&$type(op)=='object'&&$type(mp)=='object')?$merge(mp,op):$unlink(op);}} -return mix;};function $pick(){for(var i=0,l=arguments.length;i<l;i++){if(arguments[i]!=undefined)return arguments[i];} -return null;};function $random(min,max){return Math.floor(Math.random()*(max-min+1)+min);};function $splat(obj){var type=$type(obj);return(type)?((type!='array'&&type!='arguments')?[obj]:obj):[];};var $time=Date.now||function(){return+new Date;};function $try(){for(var i=0,l=arguments.length;i<l;i++){try{return arguments[i]();}catch(e){}} -return null;};function $type(obj){if(obj==undefined)return false;if(obj.$family)return(obj.$family.name=='number'&&!isFinite(obj))?false:obj.$family.name;if(obj.nodeName){switch(obj.nodeType){case 1:return'element';case 3:return(/\S/).test(obj.nodeValue)?'textnode':'whitespace';}}else if(typeof obj.length=='number'){if(obj.callee)return'arguments';else if(obj.item)return'collection';} -return typeof obj;};function $unlink(object){var unlinked;switch($type(object)){case'object':unlinked={};for(var p in object)unlinked[p]=$unlink(object[p]);break;case'hash':unlinked=new Hash(object);break;case'array':unlinked=[];for(var i=0,l=object.length;i<l;i++)unlinked[i]=$unlink(object[i]);break;default:return object;} -return unlinked;};var Browser=$merge({Engine:{name:'unknown',version:0},Platform:{name:(window.orientation!=undefined)?'ipod':(navigator.platform.match(/mac|win|linux/i)||['other'])[0].toLowerCase()},Features:{xpath:!!(document.evaluate),air:!!(window.runtime),query:!!(document.querySelector)},Plugins:{},Engines:{presto:function(){return(!window.opera)?false:((arguments.callee.caller)?960:((document.getElementsByClassName)?950:925));},trident:function(){return(!window.ActiveXObject)?false:((window.XMLHttpRequest)?5:4);},webkit:function(){return(navigator.taintEnabled)?false:((Browser.Features.xpath)?((Browser.Features.query)?525:420):419);},gecko:function(){return(document.getBoxObjectFor==undefined)?false:((document.getElementsByClassName)?19:18);}}},Browser||{});Browser.Platform[Browser.Platform.name]=true;Browser.detect=function(){for(var engine in this.Engines){var version=this.Engines[engine]();if(version){this.Engine={name:engine,version:version};this.Engine[engine]=this.Engine[engine+version]=true;break;}} -return{name:engine,version:version};};Browser.detect();Browser.Request=function(){return $try(function(){return new XMLHttpRequest();},function(){return new ActiveXObject('MSXML2.XMLHTTP');});};Browser.Features.xhr=!!(Browser.Request());Browser.Plugins.Flash=(function(){var version=($try(function(){return navigator.plugins['Shockwave Flash'].description;},function(){return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');})||'0 r0').match(/\d+/g);return{version:parseInt(version[0]||0+'.'+version[1]||0),build:parseInt(version[2]||0)};})();function $exec(text){if(!text)return text;if(window.execScript){window.execScript(text);}else{var script=document.createElement('script');script.setAttribute('type','text/javascript');script[(Browser.Engine.webkit&&Browser.Engine.version<420)?'innerText':'text']=text;document.head.appendChild(script);document.head.removeChild(script);} -return text;};Native.UID=1;var $uid=(Browser.Engine.trident)?function(item){return(item.uid||(item.uid=[Native.UID++]))[0];}:function(item){return item.uid||(item.uid=Native.UID++);};var Window=new Native({name:'Window',legacy:(Browser.Engine.trident)?null:window.Window,initialize:function(win){$uid(win);if(!win.Element){win.Element=$empty;if(Browser.Engine.webkit)win.document.createElement("iframe");win.Element.prototype=(Browser.Engine.webkit)?window["[[DOMElement.prototype]]"]:{};} -win.document.window=win;return $extend(win,Window.Prototype);},afterImplement:function(property,value){window[property]=Window.Prototype[property]=value;}});Window.Prototype={$family:{name:'window'}};new Window(window);var Document=new Native({name:'Document',legacy:(Browser.Engine.trident)?null:window.Document,initialize:function(doc){$uid(doc);doc.head=doc.getElementsByTagName('head')[0];doc.html=doc.getElementsByTagName('html')[0];if(Browser.Engine.trident&&Browser.Engine.version<=4)$try(function(){doc.execCommand("BackgroundImageCache",false,true);});if(Browser.Engine.trident)doc.window.attachEvent('onunload',function(){doc.window.detachEvent('onunload',arguments.callee);doc.head=doc.html=doc.window=null;});return $extend(doc,Document.Prototype);},afterImplement:function(property,value){document[property]=Document.Prototype[property]=value;}});Document.Prototype={$family:{name:'document'}};new Document(document);Array.implement({every:function(fn,bind){for(var i=0,l=this.length;i<l;i++){if(!fn.call(bind,this[i],i,this))return false;} -return true;},filter:function(fn,bind){var results=[];for(var i=0,l=this.length;i<l;i++){if(fn.call(bind,this[i],i,this))results.push(this[i]);} -return results;},clean:function(){return this.filter($defined);},indexOf:function(item,from){var len=this.length;for(var i=(from<0)?Math.max(0,len+from):from||0;i<len;i++){if(this[i]===item)return i;} -return-1;},map:function(fn,bind){var results=[];for(var i=0,l=this.length;i<l;i++)results[i]=fn.call(bind,this[i],i,this);return results;},some:function(fn,bind){for(var i=0,l=this.length;i<l;i++){if(fn.call(bind,this[i],i,this))return true;} -return false;},associate:function(keys){var obj={},length=Math.min(this.length,keys.length);for(var i=0;i<length;i++)obj[keys[i]]=this[i];return obj;},link:function(object){var result={};for(var i=0,l=this.length;i<l;i++){for(var key in object){if(object[key](this[i])){result[key]=this[i];delete object[key];break;}}} -return result;},contains:function(item,from){return this.indexOf(item,from)!=-1;},extend:function(array){for(var i=0,j=array.length;i<j;i++)this.push(array[i]);return this;},getLast:function(){return(this.length)?this[this.length-1]:null;},getRandom:function(){return(this.length)?this[$random(0,this.length-1)]:null;},include:function(item){if(!this.contains(item))this.push(item);return this;},combine:function(array){for(var i=0,l=array.length;i<l;i++)this.include(array[i]);return this;},erase:function(item){for(var i=this.length;i--;i){if(this[i]===item)this.splice(i,1);} -return this;},empty:function(){this.length=0;return this;},flatten:function(){var array=[];for(var i=0,l=this.length;i<l;i++){var type=$type(this[i]);if(!type)continue;array=array.concat((type=='array'||type=='collection'||type=='arguments')?Array.flatten(this[i]):this[i]);} -return array;},hexToRgb:function(array){if(this.length!=3)return null;var rgb=this.map(function(value){if(value.length==1)value+=value;return value.toInt(16);});return(array)?rgb:'rgb('+rgb+')';},rgbToHex:function(array){if(this.length<3)return null;if(this.length==4&&this[3]==0&&!array)return'transparent';var hex=[];for(var i=0;i<3;i++){var bit=(this[i]-0).toString(16);hex.push((bit.length==1)?'0'+bit:bit);} -return(array)?hex:'#'+hex.join('');}});Function.implement({extend:function(properties){for(var property in properties)this[property]=properties[property];return this;},create:function(options){var self=this;options=options||{};return function(event){var args=options.arguments;args=(args!=undefined)?$splat(args):Array.slice(arguments,(options.event)?1:0);if(options.event)args=[event||window.event].extend(args);var returns=function(){return self.apply(options.bind||null,args);};if(options.delay)return setTimeout(returns,options.delay);if(options.periodical)return setInterval(returns,options.periodical);if(options.attempt)return $try(returns);return returns();};},run:function(args,bind){return this.apply(bind,$splat(args));},pass:function(args,bind){return this.create({bind:bind,arguments:args});},bind:function(bind,args){return this.create({bind:bind,arguments:args});},bindWithEvent:function(bind,args){return this.create({bind:bind,arguments:args,event:true});},attempt:function(args,bind){return this.create({bind:bind,arguments:args,attempt:true})();},delay:function(delay,bind,args){return this.create({bind:bind,arguments:args,delay:delay})();},periodical:function(periodical,bind,args){return this.create({bind:bind,arguments:args,periodical:periodical})();}});Number.implement({limit:function(min,max){return Math.min(max,Math.max(min,this));},round:function(precision){precision=Math.pow(10,precision||0);return Math.round(this*precision)/precision;},times:function(fn,bind){for(var i=0;i<this;i++)fn.call(bind,i,this);},toFloat:function(){return parseFloat(this);},toInt:function(base){return parseInt(this,base||10);}});Number.alias('times','each');(function(math){var methods={};math.each(function(name){if(!Number[name])methods[name]=function(){return Math[name].apply(null,[this].concat($A(arguments)));};});Number.implement(methods);})(['abs','acos','asin','atan','atan2','ceil','cos','exp','floor','log','max','min','pow','sin','sqrt','tan']);String.implement({test:function(regex,params){return((typeof regex=='string')?new RegExp(regex,params):regex).test(this);},contains:function(string,separator){return(separator)?(separator+this+separator).indexOf(separator+string+separator)>-1:this.indexOf(string)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,'');},clean:function(){return this.replace(/\s+/g,' ').trim();},camelCase:function(){return this.replace(/-\D/g,function(match){return match.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(match){return('-'+match.charAt(0).toLowerCase());});},capitalize:function(){return this.replace(/\b[a-z]/g,function(match){return match.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,'\\$1');},toInt:function(base){return parseInt(this,base||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(array){var hex=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(hex)?hex.slice(1).hexToRgb(array):null;},rgbToHex:function(array){var rgb=this.match(/\d{1,3}/g);return(rgb)?rgb.rgbToHex(array):null;},stripScripts:function(option){var scripts='';var text=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){scripts+=arguments[1]+'\n';return'';});if(option===true)$exec(scripts);else if($type(option)=='function')option(scripts,text);return text;},substitute:function(object,regexp){return this.replace(regexp||(/\\?\{([^{}]+)\}/g),function(match,name){if(match.charAt(0)=='\\')return match.slice(1);return(object[name]!=undefined)?object[name]:'';});}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(value){for(var key in this){if(this.hasOwnProperty(key)&&this[key]===value)return key;} -return null;},hasValue:function(value){return(Hash.keyOf(this,value)!==null);},extend:function(properties){Hash.each(properties,function(value,key){Hash.set(this,key,value);},this);return this;},combine:function(properties){Hash.each(properties,function(value,key){Hash.include(this,key,value);},this);return this;},erase:function(key){if(this.hasOwnProperty(key))delete this[key];return this;},get:function(key){return(this.hasOwnProperty(key))?this[key]:null;},set:function(key,value){if(!this[key]||this.hasOwnProperty(key))this[key]=value;return this;},empty:function(){Hash.each(this,function(value,key){delete this[key];},this);return this;},include:function(key,value){var k=this[key];if(k==undefined)this[key]=value;return this;},map:function(fn,bind){var results=new Hash;Hash.each(this,function(value,key){results.set(key,fn.call(bind,value,key,this));},this);return results;},filter:function(fn,bind){var results=new Hash;Hash.each(this,function(value,key){if(fn.call(bind,value,key,this))results.set(key,value);},this);return results;},every:function(fn,bind){for(var key in this){if(this.hasOwnProperty(key)&&!fn.call(bind,this[key],key))return false;} -return true;},some:function(fn,bind){for(var key in this){if(this.hasOwnProperty(key)&&fn.call(bind,this[key],key))return true;} -return false;},getKeys:function(){var keys=[];Hash.each(this,function(value,key){keys.push(key);});return keys;},getValues:function(){var values=[];Hash.each(this,function(value){values.push(value);});return values;},toQueryString:function(base){var queryString=[];Hash.each(this,function(value,key){if(base)key=base+'['+key+']';var result;switch($type(value)){case'object':result=Hash.toQueryString(value,key);break;case'array':var qs={};value.each(function(val,i){qs[i]=val;});result=Hash.toQueryString(qs,key);break;default:result=key+'='+encodeURIComponent(value);} -if(value!=undefined)queryString.push(result);});return queryString.join('&');}});Hash.alias({keyOf:'indexOf',hasValue:'contains'});var Event=new Native({name:'Event',initialize:function(event,win){win=win||window;var doc=win.document;event=event||win.event;if(event.$extended)return event;this.$extended=true;var type=event.type;var target=event.target||event.srcElement;while(target&&target.nodeType==3)target=target.parentNode;if(type.test(/key/)){var code=event.which||event.keyCode;var key=Event.Keys.keyOf(code);if(type=='keydown'){var fKey=code-111;if(fKey>0&&fKey<13)key='f'+fKey;} -key=key||String.fromCharCode(code).toLowerCase();}else if(type.match(/(click|mouse|menu)/i)){doc=(!doc.compatMode||doc.compatMode=='CSS1Compat')?doc.html:doc.body;var page={x:event.pageX||event.clientX+doc.scrollLeft,y:event.pageY||event.clientY+doc.scrollTop};var client={x:(event.pageX)?event.pageX-win.pageXOffset:event.clientX,y:(event.pageY)?event.pageY-win.pageYOffset:event.clientY};if(type.match(/DOMMouseScroll|mousewheel/)){var wheel=(event.wheelDelta)?event.wheelDelta/120:-(event.detail||0)/3;} -var rightClick=(event.which==3)||(event.button==2);var related=null;if(type.match(/over|out/)){switch(type){case'mouseover':related=event.relatedTarget||event.fromElement;break;case'mouseout':related=event.relatedTarget||event.toElement;} -if(!(function(){while(related&&related.nodeType==3)related=related.parentNode;return true;}).create({attempt:Browser.Engine.gecko})())related=false;}} -return $extend(this,{event:event,type:type,page:page,client:client,rightClick:rightClick,wheel:wheel,relatedTarget:related,target:target,code:code,key:key,shift:event.shiftKey,control:event.ctrlKey,alt:event.altKey,meta:event.metaKey});}});Event.Keys=new Hash({'enter':13,'up':38,'down':40,'left':37,'right':39,'esc':27,'space':32,'backspace':8,'tab':9,'delete':46});Event.implement({stop:function(){return this.stopPropagation().preventDefault();},stopPropagation:function(){if(this.event.stopPropagation)this.event.stopPropagation();else this.event.cancelBubble=true;return this;},preventDefault:function(){if(this.event.preventDefault)this.event.preventDefault();else this.event.returnValue=false;return this;}});var Class=new Native({name:'Class',initialize:function(properties){properties=properties||{};var klass=function(){for(var key in this){if($type(this[key])!='function')this[key]=$unlink(this[key]);} -this.constructor=klass;if(Class.prototyping)return this;var instance=(this.initialize)?this.initialize.apply(this,arguments):this;if(this.options&&this.options.initialize)this.options.initialize.call(this);return instance;};for(var mutator in Class.Mutators){if(!properties[mutator])continue;properties=Class.Mutators[mutator](properties,properties[mutator]);delete properties[mutator];} -$extend(klass,this);klass.constructor=Class;klass.prototype=properties;return klass;}});Class.Mutators={Extends:function(self,klass){Class.prototyping=klass.prototype;var subclass=new klass;delete subclass.parent;subclass=Class.inherit(subclass,self);delete Class.prototyping;return subclass;},Implements:function(self,klasses){$splat(klasses).each(function(klass){Class.prototying=klass;$extend(self,($type(klass)=='class')?new klass:klass);delete Class.prototyping;});return self;}};Class.extend({inherit:function(object,properties){var caller=arguments.callee.caller;for(var key in properties){var override=properties[key];var previous=object[key];var type=$type(override);if(previous&&type=='function'){if(override!=previous){if(caller){override.__parent=previous;object[key]=override;}else{Class.override(object,key,override);}}}else if(type=='object'){object[key]=$merge(previous,override);}else{object[key]=override;}} -if(caller)object.parent=function(){return arguments.callee.caller.__parent.apply(this,arguments);};return object;},override:function(object,name,method){var parent=Class.prototyping;if(parent&&object[name]!=parent[name])parent=null;var override=function(){var previous=this.parent;this.parent=parent?parent[name]:object[name];var value=method.apply(this,arguments);this.parent=previous;return value;};object[name]=override;}});Class.implement({implement:function(){var proto=this.prototype;$each(arguments,function(properties){Class.inherit(proto,properties);});return this;}});var Chain=new Class({$chain:[],chain:function(){this.$chain.extend(Array.flatten(arguments));return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty();return this;}});var Events=new Class({$events:{},addEvent:function(type,fn,internal){type=Events.removeOn(type);if(fn!=$empty){this.$events[type]=this.$events[type]||[];this.$events[type].include(fn);if(internal)fn.internal=true;} -return this;},addEvents:function(events){for(var type in events)this.addEvent(type,events[type]);return this;},fireEvent:function(type,args,delay){type=Events.removeOn(type);if(!this.$events||!this.$events[type])return this;this.$events[type].each(function(fn){fn.create({'bind':this,'delay':delay,'arguments':args})();},this);return this;},removeEvent:function(type,fn){type=Events.removeOn(type);if(!this.$events[type])return this;if(!fn.internal)this.$events[type].erase(fn);return this;},removeEvents:function(events){if($type(events)=='object'){for(var type in events)this.removeEvent(type,events[type]);return this;} -if(events)events=Events.removeOn(events);for(var type in this.$events){if(events&&events!=type)continue;var f... [truncated message content] |