www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit d8aedf04b9a6300f8ce284ce289edb01f8f20e42
parent 5110c0d379ac27096c2cc393b699ab70fda528f9
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Sun, 10 Apr 2011 14:18:10 +0200

Merge branch 'html5' of github:jsmaniac/2011-m1s2-ter into unstable

Conflicts:
	code/serveur/php/server.php
	organisation/notes

Diffstat:
Mcode/PtiClic/AndroidManifest.xml | 38+++++++++++++++++++++-----------------
Mcode/PtiClic/proguard.cfg | 2++
Dcode/PtiClic/res/layout/basegame.xml | 104-------------------------------------------------------------------------------
Mcode/PtiClic/res/layout/frontpage.xml | 46++++++----------------------------------------
Dcode/PtiClic/res/layout/score.xml | 76----------------------------------------------------------------------------
Dcode/PtiClic/src/org/pticlic/BaseScore.java | 149-------------------------------------------------------------------------------
Mcode/PtiClic/src/org/pticlic/FrontPage.java | 100++++++++-----------------------------------------------------------------------
Mcode/PtiClic/src/org/pticlic/Information.java | 7+++++--
Dcode/PtiClic/src/org/pticlic/games/BaseGame.java | 434-------------------------------------------------------------------------------
Mcode/PtiClic/src/org/pticlic/model/Constant.java | 2+-
Dcode/PtiClic/src/org/pticlic/model/DownloadedBaseGame.java | 144-------------------------------------------------------------------------------
Dcode/PtiClic/src/org/pticlic/model/DownloadedGame.java | 57---------------------------------------------------------
Dcode/PtiClic/src/org/pticlic/model/Match.java | 74--------------------------------------------------------------------------
Mcode/PtiClic/src/org/pticlic/model/Network.java | 183-------------------------------------------------------------------------------
Dcode/PtiClic/src/org/pticlic/model/Relation.java | 88-------------------------------------------------------------------------------
Acode/html5/img/aide.png | 0
Acode/html5/img/config.png | 0
Acode/html5/img/icon.png | 0
Acode/html5/img/mode_chrono.png | 0
Acode/html5/img/mode_marathon.png | 0
Acode/html5/img/mode_normal.png | 0
Acode/html5/img/mode_ombre.png | 0
Acode/html5/img/rel/-1.png | 0
Acode/html5/img/rel/0.png | 0
Acode/html5/img/rel/10.png | 0
Acode/html5/img/rel/5.png | 0
Acode/html5/img/rel/7.png | 0
Acode/html5/img/rel/9.png | 0
Acode/html5/img/rel/default.png | 0
Acode/html5/img/splash.png | 0
Acode/html5/index.html | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acode/html5/jquery-1.5.1.min.js | 17+++++++++++++++++
Acode/html5/jquery-ui-1.8.11.custom.min.js | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acode/html5/my-extensions.js | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acode/html5/pticlic.js | 129+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acode/html5/score.html | 31+++++++++++++++++++++++++++++++
Acode/html5/score.js | 40++++++++++++++++++++++++++++++++++++++++
Acode/html5/score.json | 2++
Acode/html5/tmp.json | 2++
Mcode/serveur/php/pticlic.php | 82++++++++++++++++++++++++++++++++-----------------------------------------------
Mcode/serveur/php/relations.php | 83++++++++++++++++++++++++++++++++++++++++---------------------------------------
Acode/serveur/php/ressources/errors.inc | 43+++++++++++++++++++++++++++++++++++++++++++
Acode/serveur/php/ressources/sql.inc | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcode/serveur/php/server.php | 18++++++++----------
Morganisation/notes | 3++-
45 files changed, 751 insertions(+), 1561 deletions(-)

diff --git a/code/PtiClic/AndroidManifest.xml b/code/PtiClic/AndroidManifest.xml @@ -1,24 +1,28 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="org.pticlic" - android:versionCode="1" android:versionName="@string/version"> - <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar" android:debuggable="true"> - <activity android:name=".Main" android:screenOrientation="portrait"> - <intent-filter> - <action android:name="android.intent.action.MAIN" /> - <category android:name="android.intent.category.LAUNCHER" /> - </intent-filter> - </activity> + package="org.pticlic" android:versionCode="1" android:versionName="@string/version"> + <application android:icon="@drawable/icon" android:label="@string/app_name" + android:theme="@android:style/Theme.NoTitleBar" android:debuggable="true"> + <activity android:name=".Main" android:screenOrientation="portrait"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> - <activity android:name=".Preference" android:label="Préférence" android:screenOrientation="portrait"></activity> - <activity android:name=".games.BaseGame" android:screenOrientation="portrait"></activity> - <activity android:label="Information" android:name=".Information" android:screenOrientation="portrait"></activity> - <activity android:name="BaseScore" android:label="Score" android:screenOrientation="portrait"></activity> -<activity android:name="FrontPage" android:screenOrientation="portrait"></activity> -</application> + <activity android:name=".Preference" android:label="Préférence" + android:screenOrientation="portrait"></activity> + <activity android:label="Information" android:name=".Information" + android:screenOrientation="portrait"></activity> -<uses-permission android:name="android.permission.INTERNET"></uses-permission> + <activity android:name="FrontPage" android:screenOrientation="portrait"> -<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> + </activity> + </application> + + + <uses-permission android:name="android.permission.INTERNET"></uses-permission> + + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> </manifest> diff --git a/code/PtiClic/proguard.cfg b/code/PtiClic/proguard.cfg @@ -10,6 +10,8 @@ -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { diff --git a/code/PtiClic/res/layout/basegame.xml b/code/PtiClic/res/layout/basegame.xml @@ -1,104 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout android:layout_width="fill_parent" - android:layout_height="fill_parent" android:orientation="vertical" - xmlns:android="http://schemas.android.com/apk/res/android"> - - <LinearLayout android:layout_width="fill_parent" - android:layout_height="fill_parent" android:orientation="vertical" - android:layout_weight="2"> - - <LinearLayout android:layout_width="fill_parent" - android:layout_height="wrap_content" android:orientation="horizontal" android:paddingTop="10dip"> - - <TextView android:id="@+id/wordRemaining" android:text="0/10" - android:textStyle="bold" android:layout_height="wrap_content" - android:layout_width="wrap_content" android:paddingRight="5dip" android:paddingTop="10dip" android:paddingLeft="13dip"> - </TextView> - - <TextView android:id="@+id/mainWord" android:textStyle="bold" android:textSize="30dip" - android:layout_weight="1" android:layout_width="fill_parent" android:paddingBottom="10dip" android:layout_height="90dip" android:gravity="top|center_vertical|center_horizontal" android:text="Un truc super long"> - </TextView> - - <ImageView android:src="@drawable/aide" android:id="@+id/aideBaseGame" - android:paddingRight="10px" android:layout_width="wrap_content" - android:layout_height="wrap_content"></ImageView> - - </LinearLayout> - - <TextView android:id="@+id/currentWord" android:layout_width="fill_parent" - android:text="currentWord" android:textStyle="bold" android:textSize="20dip" - android:layout_height="fill_parent" android:gravity="top|center"> - </TextView> - - </LinearLayout> - - <LinearLayout android:layout_height="fill_parent" - android:layout_width="fill_parent" android:orientation="horizontal" android:id="@+id/menuLayout" android:layout_weight="8"> - - <LinearLayout android:layout_height="wrap_content" - android:layout_width="fill_parent" android:orientation="horizontal" - android:id="@+id/relation1Layout" android:layout_weight="1" - android:layout_gravity="center" android:clickable="true"> - <ImageView android:id="@+id/relation1" android:src="@drawable/contenant" - android:layout_weight="1" android:layout_height="wrap_content" - android:layout_width="wrap_content" android:layout_marginLeft="10dip"> - </ImageView> - <TextView android:id="@+id/relation1Name" - android:text="contenant" - android:textStyle="bold" android:textSize="15dip" - android:layout_height="wrap_content" android:layout_weight="3" - android:layout_gravity="center_vertical" android:visibility="gone" android:layout_width="fill_parent" android:gravity="center"> - </TextView> - </LinearLayout> - - <LinearLayout android:layout_height="wrap_content" - android:layout_width="fill_parent" android:orientation="horizontal" - android:id="@+id/relation2Layout" android:layout_weight="1" - android:layout_gravity="center" android:clickable="true"> - <ImageView android:id="@+id/relation2" android:src="@drawable/contenu" - android:layout_weight="1" android:layout_height="wrap_content" - android:layout_width="wrap_content" android:layout_marginLeft="10dip"> - </ImageView> - <TextView android:id="@+id/relation2Name" - android:text="contenu" - android:textStyle="bold" android:textSize="15dip" - android:layout_height="wrap_content" android:layout_weight="3" - android:layout_gravity="center_vertical" android:visibility="gone" android:layout_width="fill_parent" android:gravity="center"> - </TextView> - </LinearLayout> - - <LinearLayout android:layout_height="wrap_content" - android:layout_width="fill_parent" android:orientation="horizontal" - android:id="@+id/relation3Layout" android:layout_weight="1" - android:layout_gravity="center" android:clickable="true"> - <ImageView android:id="@+id/relation3" android:src="@drawable/contraire" - android:layout_weight="1" android:layout_height="wrap_content" - android:layout_width="wrap_content" android:layout_marginLeft="10dip"> - </ImageView> - <TextView android:id="@+id/relation3Name" - android:text="contraire" - android:textStyle="bold" android:textSize="15dip" - android:layout_height="wrap_content" android:layout_weight="3" - android:layout_gravity="center_vertical" android:visibility="gone" android:layout_width="fill_parent" android:gravity="center"> - </TextView> - </LinearLayout> - - <LinearLayout android:layout_height="wrap_content" - android:layout_width="fill_parent" android:orientation="horizontal" - android:id="@+id/relation4Layout" android:layout_weight="1" - android:layout_gravity="center" android:clickable="true"> - <ImageView android:id="@+id/relation4" android:src="@drawable/synonyme" - android:layout_weight="1" android:layout_height="wrap_content" - android:layout_width="wrap_content" android:layout_gravity="center" android:layout_marginLeft="10dip"> - </ImageView> - <TextView android:id="@+id/relation4Name" - android:text="synonyme" - android:textStyle="bold" android:textSize="15dip" - android:layout_height="wrap_content" android:layout_weight="3" - android:layout_gravity="center_vertical" android:visibility="gone" android:layout_width="fill_parent" android:gravity="center"> - </TextView> - </LinearLayout> - - </LinearLayout> - -</LinearLayout> diff --git a/code/PtiClic/res/layout/frontpage.xml b/code/PtiClic/res/layout/frontpage.xml @@ -1,41 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="fill_parent" android:layout_height="fill_parent" - android:orientation="vertical"> - - <TextView android:text="@string/app_name" android:id="@+id/logo" - android:layout_width="fill_parent" android:layout_height="wrap_content" - android:textSize="50px" android:layout_weight="1" /> - - <RelativeLayout android:layout_height="wrap_content" - android:id="@+id/RelativeLayout01" android:layout_width="wrap_content" - android:layout_gravity="bottom|center_horizontal"> - - <ImageView android:layout_height="wrap_content" - android:text="@string/play_label" android:layout_width="wrap_content" - android:id="@+id/play" android:clickable="true" android:padding="30dip" - android:src="@drawable/mode_normal"/> - - <ImageView android:src="@drawable/config" - android:layout_height="wrap_content" android:id="@+id/prefs" - android:layout_width="wrap_content" android:layout_below="@+id/play" - android:layout_alignLeft="@+id/play" android:layout_alignRight="@+id/play" - android:padding="30dip"></ImageView> - - </RelativeLayout> - - <LinearLayout android:id="@+id/LinearLayout01" - android:layout_height="wrap_content" android:layout_width="fill_parent" - android:orientation="vertical" android:layout_weight="1"> - - <TextView android:layout_height="wrap_content" - android:layout_width="fill_parent" android:textStyle="bold" - android:gravity="center_horizontal" android:text="@+id/login" - android:id="@+id/login"></TextView> - <ImageView android:layout_height="wrap_content" android:id="@+id/infoButton" - android:layout_width="wrap_content" android:layout_gravity="right" - android:layout_weight="5" android:clickable="true" android:src="@drawable/aide" android:paddingRight="10px"/> - - </LinearLayout> - -</LinearLayout> +<WebView xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/webview" + android:layout_width="fill_parent" + android:layout_height="fill_parent" +/> +\ No newline at end of file diff --git a/code/PtiClic/res/layout/score.xml b/code/PtiClic/res/layout/score.xml @@ -1,76 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_height="fill_parent" android:orientation="vertical" - android:id="@+id/LinearLayout01" android:layout_gravity="center" - android:layout_width="fill_parent"> - <LinearLayout android:layout_width="fill_parent" - android:layout_height="wrap_content" android:id="@+id/linearLayout2" - android:orientation="vertical" android:layout_weight="2"> - - <TextView android:layout_width="fill_parent" android:id="@+id/textView1" - android:layout_height="wrap_content" android:text="@string/score_your_score" - android:gravity="center|bottom" android:layout_weight="1" android:textSize="25dip" - android:textStyle="bold"></TextView> - - <TextView android:layout_width="fill_parent" android:id="@+id/total" - android:layout_height="wrap_content" android:text="@+id/total" - android:textStyle="bold" android:textSize="25dip" - android:layout_weight="1" android:gravity="center|top"></TextView> - - <TextView android:layout_width="fill_parent" android:id="@+id/textView1" - android:layout_height="wrap_content" android:text="@string/score_your_answers" - android:gravity="center|bottom" android:layout_weight="0.1" - android:textSize="25dip" android:textStyle="bold"></TextView> - - <TextView android:layout_width="fill_parent" android:id="@+id/textView1" - android:layout_height="wrap_content" android:text="@string/score_explanation" - android:gravity="center|top" android:layout_weight="1" - android:textSize="15dip"></TextView> - - <TextView android:layout_height="wrap_content" android:id="@+id/scoreRel1" - android:text="@+id/scoreRel1" android:layout_width="fill_parent" - android:textStyle="bold" android:paddingLeft="10dip"></TextView> - - <TextView android:layout_height="wrap_content" android:id="@+id/scoreWords1" - android:layout_width="fill_parent" android:paddingLeft="30dip" - android:text="@+id/scoreWords1" android:paddingBottom="5dip"></TextView> - - <TextView android:layout_height="wrap_content" android:id="@+id/scoreRel2" - android:text="@+id/scoreRel2" android:layout_width="fill_parent" - android:textStyle="bold" android:paddingLeft="10dip"></TextView> - - <TextView android:layout_height="wrap_content" android:id="@+id/scoreWords2" - android:text="@+id/scoreWords2" android:layout_width="fill_parent" - android:paddingLeft="30dip" android:paddingBottom="5dip"></TextView> - - <TextView android:layout_height="wrap_content" android:id="@+id/scoreRel3" - android:text="@+id/scoreRel3" android:layout_width="fill_parent" - android:textStyle="bold" android:paddingLeft="10dip"></TextView> - - <TextView android:layout_height="wrap_content" android:id="@+id/scoreWords3" - android:text="@+id/scoreWords3" android:layout_width="fill_parent" - android:paddingLeft="30dip" android:paddingBottom="5dip"></TextView> - - <TextView android:layout_height="wrap_content" android:id="@+id/scoreRel4" - android:text="@+id/scoreRel4" android:layout_width="fill_parent" - android:textStyle="bold" android:paddingLeft="10dip"></TextView> - - <TextView android:layout_height="wrap_content" android:id="@+id/scoreWords4" - android:text="@+id/scoreWords4" android:layout_width="fill_parent" - android:paddingLeft="30dip" android:paddingBottom="5dip"></TextView> - - </LinearLayout> - - <LinearLayout android:id="@+id/linearLayout1" - android:layout_weight="1" android:layout_height="wrap_content" - android:layout_width="fill_parent" android:gravity="center_horizontal" - android:paddingTop="20dip"> - <Button android:id="@+id/saw" android:text="J'ai vu !" - android:layout_height="wrap_content" android:layout_gravity="top" - android:layout_width="150dip"></Button> - </LinearLayout> - - -</LinearLayout> diff --git a/code/PtiClic/src/org/pticlic/BaseScore.java b/code/PtiClic/src/org/pticlic/BaseScore.java @@ -1,149 +0,0 @@ -package org.pticlic; - -import org.pticlic.R.string; -import org.pticlic.exception.PtiClicException; -import org.pticlic.model.Constant; -import org.pticlic.model.DownloadedBaseGame; -import org.pticlic.model.Match; -import org.pticlic.model.Network; -import org.pticlic.model.Network.Mode; -import org.pticlic.model.Network.ScoreResponse; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.TextView; - -/** - * @author John CHARRON - * - * Permet l'affichage du score obtenu par le joueur lors de sa partie. - */ -public class BaseScore extends Activity implements OnClickListener{ - - private Match gamePlayed; - private ScoreResponse sr = null; - - private void networkStuff() { - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - String id = sp.getString(Constant.USER_ID, "joueur"); - String passwd = sp.getString(Constant.USER_PASSWD, ""); - String serverURL = sp.getString(Constant.SERVER_URL, Constant.SERVER); - Mode mode = null; - - if (getIntent().getExtras() != null) { - // GamePlayed contient toutes les infos sur la partie jouee - this.gamePlayed = (Match) getIntent().getExtras().get(Constant.SCORE_GAMEPLAYED); - mode = (Mode) getIntent().getExtras().get(Constant.SCORE_MODE); - } - - // TODO : factoriser le serverUrl dans Network - sp.edit().remove(Constant.NEW_BASE_GAME).commit(); - Network network = new Network(serverURL, mode, id, passwd); - try { - sr = network.sendBaseGame(gamePlayed); - sp.edit().putString(Constant.NEW_BASE_GAME, sr.getNewGame()).commit(); - } catch (PtiClicException e) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.app_name)) - .setIcon(android.R.drawable.ic_dialog_alert) - .setMessage(e.getMessage()) - .setCancelable(false) - .setNegativeButton("Ok", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - finish(); - } - }); - AlertDialog alert = builder.create(); - alert.show(); - } catch (Exception e) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.app_name)) - .setIcon(android.R.drawable.ic_dialog_alert) - .setMessage(R.string.server_down) - .setCancelable(false) - .setNegativeButton("Ok", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - finish(); - } - }); - AlertDialog alert = builder.create(); - alert.show(); - } - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.score); - - this.networkStuff(); - this.networkStuff(); - - // TODO : Attention, le cast en (BaseGame) n'est pas sûr ! - DownloadedBaseGame bg = (DownloadedBaseGame)gamePlayed.getGame(); - ((TextView)findViewById(R.id.total)).setText(String.valueOf(sr.getScoreTotal())); - ((TextView)findViewById(R.id.scoreRel1)).setText(bg.getCatString(1)); - ((TextView)findViewById(R.id.scoreRel2)).setText(bg.getCatString(2)); - ((TextView)findViewById(R.id.scoreRel3)).setText(bg.getCatString(3)); - ((TextView)findViewById(R.id.scoreRel4)).setText(bg.getCatString(4)); - - String res; - String noAnswers = getString(string.score_no_answers); - res = ""; - for (int i : gamePlayed.getRelation1()) { - res += bg.getWordInCloud(i).getName(); - res += " (" + String.valueOf(sr.getScoreOfWord(i)) + "), "; - } - ((TextView)findViewById(R.id.scoreWords1)).setText(res.length() < 1 ? noAnswers : res); - - res = ""; - for (int i : gamePlayed.getRelation2()) { - res += bg.getWordInCloud(i).getName(); - res += " (" + String.valueOf(sr.getScoreOfWord(i)) + "), "; - } - ((TextView)findViewById(R.id.scoreWords2)).setText(res.length() < 1 ? noAnswers : res); - - res = ""; - for (int i : gamePlayed.getRelation3()) { - res += bg.getWordInCloud(i).getName(); - res += " (" + String.valueOf(sr.getScoreOfWord(i)) + "), "; - } - ((TextView)findViewById(R.id.scoreWords3)).setText(res.length() < 1 ? noAnswers : res); - - res = ""; - for (int i : gamePlayed.getRelation4()) { - res += bg.getWordInCloud(i).getName(); - res += " (" + String.valueOf(sr.getScoreOfWord(i)) + "), "; - } - ((TextView)findViewById(R.id.scoreWords4)).setText(res.length() < 1 ? noAnswers : res); - - ((Button)findViewById(R.id.saw)).setOnClickListener(this); - } - - @Override - public void onBackPressed() { - super.onBackPressed(); - - finish(); - } - - protected double calculateTotal(){ - throw new UnsupportedOperationException(); - } - - @Override - public void onClick(View v) { - if (v.getId()==R.id.saw) { - finish(); - } - } -} diff --git a/code/PtiClic/src/org/pticlic/FrontPage.java b/code/PtiClic/src/org/pticlic/FrontPage.java @@ -1,25 +1,15 @@ package org.pticlic; -import org.pticlic.games.BaseGame; import org.pticlic.model.Constant; -import org.pticlic.model.Network; import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.net.Uri; import android.os.Bundle; -import android.preference.PreferenceManager; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.ImageView; -import android.widget.TextView; +import android.webkit.WebSettings; +import android.webkit.WebView; -public class FrontPage extends Activity implements OnClickListener{ +public class FrontPage extends Activity { - private Uri uri = null; + private WebView webView; /** Called when the activity is first created. */ @Override @@ -27,83 +17,11 @@ public class FrontPage extends Activity implements OnClickListener{ super.onCreate(savedInstanceState); setContentView(R.layout.frontpage); - // Écoute des clics sur les différents boutons - ((ImageView)findViewById(R.id.prefs)).setOnClickListener(this); - ((ImageView)findViewById(R.id.play)).setOnClickListener(this); - ((ImageView)findViewById(R.id.infoButton)).setOnClickListener(this); - - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - String serverURL = sp.getString(Constant.SERVER_URL, Constant.SERVER); - Uri.parse(serverURL + "/signup.php"); - } - - @Override - protected void onStart() { - super.onStart(); - - // On récupère le nom du joueur des préférences. - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - Boolean connected = sp.getBoolean(Constant.SERVER_AUTH, false); - if (connected) { - ((TextView)findViewById(R.id.login)).setText(R.string.frontpage_user_connected); - } else { - ((TextView)findViewById(R.id.login)).setText(R.string.frontpage_user_notconnected); - } - } - - /* (non-Javadoc) - * @see android.view.View.OnClickListener#onClick(android.view.View) - */ - @Override - public void onClick(View v) { - switch (v.getId()) { - case (R.id.prefs) : startActivity(new Intent(this, Preference.class)); break; - case (R.id.play) : checkAllIsOk(BaseGame.class); break; - case (R.id.infoButton) : startActivity(new Intent(this, Information.class)); break; - } - } - - @SuppressWarnings("rawtypes") - private void checkAllIsOk(Class c) { - if (Network.isConnected(this)) { - if (Network.isLoginCorrect(this)) { - startActivity(new Intent(this, c)); - } else { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.app_name)) - .setIcon(android.R.drawable.ic_dialog_alert) - .setMessage(getString(R.string.frontpage_bad_loginmdp)) - .setCancelable(false) - .setNeutralButton(getString(R.string.frontpage_inscription_button), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.dismiss(); - // TODO : Essayer de trouver comment mettre l'url qui est dans les preferences. - startActivity(new Intent(Intent.ACTION_VIEW, uri)); - } - }) - .setPositiveButton(getString(R.string.frontpage_preference_button), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.dismiss(); - startActivity(new Intent(getApplicationContext(), Preference.class)); - } - }); - AlertDialog alert = builder.create(); - alert.show(); - } - } else { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.app_name)) - .setIcon(android.R.drawable.ic_dialog_alert) - .setMessage(getString(R.string.frontpage_no_connection)) - .setCancelable(false) - .setNegativeButton("Ok", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); - AlertDialog alert = builder.create(); - alert.show(); - } + webView = (WebView) findViewById(R.id.webview); + WebSettings webSettings = webView.getSettings(); + webSettings.setJavaScriptEnabled(true); + + webView.loadUrl(Constant.SERVER + Constant.SERVER_URL); } @Override diff --git a/code/PtiClic/src/org/pticlic/Information.java b/code/PtiClic/src/org/pticlic/Information.java @@ -8,6 +8,7 @@ import java.io.InputStreamReader; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; +import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.TextView; @@ -21,8 +22,10 @@ public class Information extends Activity { ((TextView)findViewById(R.id.infoVersion)).setText("version : " + getString(R.string.version)); InputStream in = getResources().openRawResource(R.raw.info); WebView webview = (WebView)findViewById(R.id.textContent); - webview.setBackgroundColor(Color.BLACK); + webview.setBackgroundColor(Color.WHITE); webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); + WebSettings webSettings = webview.getSettings(); + webSettings.setJavaScriptEnabled(true); if (in != null) { @@ -37,7 +40,7 @@ public class Information extends Activity { } in.close(); - webview.loadData(buf.toString(), "text/html", "UTF-8"); + webview.loadData(html, "text/html", "UTF-8"); } catch (IOException e) { //TODO : Ajouter un boite de dialog indiquant qu'une erreur est arrivee. diff --git a/code/PtiClic/src/org/pticlic/games/BaseGame.java b/code/PtiClic/src/org/pticlic/games/BaseGame.java @@ -1,433 +0,0 @@ -package org.pticlic.games; - -import org.pticlic.R; -import org.pticlic.BaseScore; -import org.pticlic.exception.PtiClicException; -import org.pticlic.model.Constant; -import org.pticlic.model.DownloadedBaseGame; -import org.pticlic.model.Match; -import org.pticlic.model.Network; -import org.pticlic.model.Network.Mode; -import org.pticlic.model.Relation; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.view.Display; -import android.view.Gravity; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.animation.AlphaAnimation; -import android.view.animation.AnimationSet; -import android.view.animation.TranslateAnimation; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.LinearLayout.LayoutParams; -import android.widget.TextView; - -import com.google.gson.Gson; - -/** - * @author Bertrand BRUN et Georges DUPÉRON - * - * Cette classe est le controlleur du premier jeu. - * - * Ce premier jeu appeler "Jeux de Base", permet de creer des relations en selectionnant - * le type de relation d'un mot du nuage de mot par rapport au mot central. - * - * La vue de ce jeu se presente sous la forme d'un fenetre presentant en haut le mot central, - * et les mots du nuage descende en partant du mot central vers le centre du mobile. - * Une fois le mot du nuage afficher, l'utilisateur peut selectionner, parmis les relations - * proposer celle qui lui semble le mieux approprier. - * - */ - -public class BaseGame extends Activity implements OnClickListener { - private int currentWord = 0; - private TextView currentWordTextView; - private TextView wordRemaining; - private int nbWord = 0; - private DownloadedBaseGame game; - private Match match; - private Network network; - private boolean help = false; - private String gameJson; - - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.basegame); - - // On recupere du PreferenceManager les differentes information dont on a besoin - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - String serverURL = sp.getString(Constant.SERVER_URL, Constant.SERVER); - String id = sp.getString(Constant.USER_ID, "joueur"); - String passwd = sp.getString(Constant.USER_PASSWD, ""); - gameJson = sp.getString(Constant.NEW_BASE_GAME, null); - - // On initialise la classe permettant la communication avec le serveur. - network = new Network(serverURL, Mode.SIMPLE_GAME, id, passwd); - } - - - - /* (non-Javadoc) - * @see android.app.Activity#onStart() - */ - @Override - protected void onStart() { - super.onStart(); - try { - Gson gson = new Gson(); - if (gameJson == null) game = (DownloadedBaseGame)network.getGames(1); - else game = gson.fromJson(gameJson, DownloadedBaseGame.class); - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - Boolean first = sp.getBoolean(Constant.FIRST_TIME, true); - if (first) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.basegame_title)) - .setIcon(android.R.drawable.ic_dialog_info) - .setMessage(getString(R.string.basegame_explication)) - .setCancelable(false) - .setNegativeButton("Fermez", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - runMatch(); - start(); - } - }) - .setPositiveButton("Ne plus afficher", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); - sp.edit().putBoolean(Constant.FIRST_TIME, false).commit(); - dialog.cancel(); - runMatch(); - start(); - } - }); - AlertDialog alert = builder.create(); - alert.show(); - } else { - runMatch(); - start(); - } - } catch (PtiClicException e) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.app_name)) - .setIcon(android.R.drawable.ic_dialog_alert) - .setMessage(e.getMessage()) - .setCancelable(false) - .setNegativeButton("Ok", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - finish(); - } - }); - AlertDialog alert = builder.create(); - alert.show(); - } catch (Exception e) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.app_name)) - .setIcon(android.R.drawable.ic_dialog_alert) - .setMessage(getString(R.string.server_down)) - .setCancelable(false) - .setNegativeButton("Ok", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - finish(); - } - }); - AlertDialog alert = builder.create(); - alert.show(); - } - - } - - private void runMatch() { - nbWord = game.getNbWord(); - - wordRemaining = (TextView)findViewById(R.id.wordRemaining); - wordRemaining.setText((currentWord + 1) + "/" + nbWord); - - // On initialise la partie. - match = new Match(); - match.setGame(game); - - // Boutons des relations - ImageView r1 = ((ImageView)findViewById(R.id.relation1)); - ImageView r2 = ((ImageView)findViewById(R.id.relation2)); - ImageView r3 = ((ImageView)findViewById(R.id.relation3)); - ImageView r4 = ((ImageView)findViewById(R.id.relation4)); - - - // TextView des relations - TextView rn1 = ((TextView)findViewById(R.id.relation1Name)); - TextView rn2 = ((TextView)findViewById(R.id.relation2Name)); - TextView rn3 = ((TextView)findViewById(R.id.relation3Name)); - TextView rn4 = ((TextView)findViewById(R.id.relation4Name)); - - // Bouton d'aide - ImageView aide = ((ImageView)findViewById(R.id.aideBaseGame)); - aide.setOnClickListener(this); - - // On met set le nom du mot central - ((TextView)findViewById(R.id.mainWord)).setText(DownloadedBaseGame.getName(game.getCentre())); - - Relation r = Relation.getInstance(); - - // Écoute des clics sur les relations - // TODO : A enlever lorsque l'on aura toutes les images des relations. - try { - r1.setOnClickListener(this); - rn1.setText(String.format(r.getRelationName(game.getCat1()), ((TextView)findViewById(R.id.mainWord)).getText())); - r1.setImageResource(r.getRelationImage(game.getCat1())); - } catch (Exception e) { - r1.setImageResource(R.drawable.icon); - } - // TODO : A enlever lorsque l'on aura toutes les images des relations. - try { - r2.setOnClickListener(this); - rn2.setText(String.format(r.getRelationName(game.getCat2()), ((TextView)findViewById(R.id.mainWord)).getText())); - r2.setImageResource(r.getRelationImage(game.getCat2())); - } catch (Exception e) { - r2.setImageResource(R.drawable.icon); - } - // TODO : A enlever lorsque l'on aura toutes les images des relations. - try { - r3.setOnClickListener(this); - rn3.setText(String.format(r.getRelationName(game.getCat3()), ((TextView)findViewById(R.id.mainWord)).getText())); - r3.setImageResource(r.getRelationImage(game.getCat3())); - } catch (Exception e) { - r3.setImageResource(R.drawable.icon); - } - // TODO : A enlever lorsque l'on aura toutes les images des relations. - try { - r4.setOnClickListener(this); - rn4.setText(String.format(r.getRelationName(game.getCat4()), ((TextView)findViewById(R.id.mainWord)).getText())); - r4.setImageResource(r.getRelationImage(game.getCat4())); - } catch (Exception e) { - r4.setImageResource(R.drawable.icon); - } - - this.helpMode(); - } - - /* (non-Javadoc) - * @see android.app.Activity#onActivityResult(int, int, android.content.Intent) - */ - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - finish(); - } - - /** - * Cette methode permet au mot courant de partir du mot central vers le centre de l'appareil. - */ - private void arrivalView() { - //On recupere la largueur de l'ecran. - Display display = getWindowManager().getDefaultDisplay(); - int width = display.getWidth(); - - // On recupere le centre de mainWord pour l'animation de translation. - TextView mainWord = (TextView)findViewById(R.id.mainWord); - currentWordTextView = (TextView)findViewById(R.id.currentWord); - - // On defini un ensemble d'animation - AnimationSet set = new AnimationSet(true); - set.setDuration(1000); - set.setFillAfter(true); - - TranslateAnimation translate; - if (isInHelpMode()) - translate = new TranslateAnimation(mainWord.getScrollX() / 2, mainWord.getScrollX() / 2, mainWord.getScrollY() / 2, width / 8); - else - translate = new TranslateAnimation(mainWord.getScrollX() / 2, mainWord.getScrollX() / 2, mainWord.getScrollY() / 2, width / 4); - translate.setDuration(500); - set.addAnimation(translate); - - AlphaAnimation alpha = new AlphaAnimation(0, 1); - alpha.setDuration(1000); - set.addAnimation(alpha); - - // Que l'on rajoute a notre vue. - currentWordTextView.startAnimation(set); - } - - /** - * - */ - private void leaveView() { - currentWordTextView.clearAnimation(); - } - - /** - * Cette methode permet de passer au mot courant suivant et de lancer l'animation. - */ - private void start() { - ((TextView)findViewById(R.id.currentWord)).setText(DownloadedBaseGame.getName(game.getWordInCloud(currentWord))); - arrivalView(); - } - - /** - * Permet de verifier si la partie est fini auquel cas on lance l'activite Score, sinon on passe au mot suivant. - */ - private void next() { - if (++currentWord < nbWord) { - wordRemaining.setText((currentWord + 1) + "/" + nbWord); - leaveView(); - start(); - } else { - Intent intent = new Intent(this, BaseScore.class); - intent.putExtra(Constant.SCORE_GAMEPLAYED, match); - intent.putExtra(Constant.SCORE_MODE, Mode.SIMPLE_GAME); - - startActivityForResult(intent, 0x100); - } - } - - /** - * Cette methode est appeler lorsque l'utilisateur appuie sur le bouton d'aide. - * Elle change la disposition des elements de maniere a afficher la description - * de l'icone a cote de l'icone. - */ - private void helpMode() { - if (!isInHelpMode()) { - help = true; - - LayoutParams layoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 2); - - // On modifie l'affichage du layout - LinearLayout menuLayout = ((LinearLayout)findViewById(R.id.menuLayout)); - menuLayout.setOrientation(LinearLayout.VERTICAL); - menuLayout.setLayoutParams(layoutParams); - - // Puis on modifie l'affichage des relations - //relation1 - LinearLayout relationLayout = ((LinearLayout)findViewById(R.id.relation1Layout)); - relationLayout.setGravity(Gravity.LEFT); - - TextView relationName = ((TextView)findViewById(R.id.relation1Name)); - relationName.setVisibility(View.VISIBLE); - - //relation2 - relationLayout = ((LinearLayout)findViewById(R.id.relation2Layout)); - relationLayout.setGravity(Gravity.LEFT); - - relationName = ((TextView)findViewById(R.id.relation2Name)); - relationName.setVisibility(View.VISIBLE); - - //relation3 - relationLayout = ((LinearLayout)findViewById(R.id.relation3Layout)); - relationLayout.setGravity(Gravity.LEFT); - - relationName = ((TextView)findViewById(R.id.relation3Name)); - relationName.setVisibility(View.VISIBLE); - - //relation4 - relationLayout = ((LinearLayout)findViewById(R.id.relation4Layout)); - relationLayout.setGravity(Gravity.LEFT); - - relationName = ((TextView)findViewById(R.id.relation4Name)); - relationName.setVisibility(View.VISIBLE); - - - // On met le mot courant au bon endroit dans la fenetre - // On recupere la largueur de l'ecran. - Display display = getWindowManager().getDefaultDisplay(); - int width = display.getWidth(); - - //On recupere le centre de mainWord pour l'animation de translation. - TextView mainWord = (TextView)findViewById(R.id.mainWord); - currentWordTextView = (TextView)findViewById(R.id.currentWord); - - TranslateAnimation translate = new TranslateAnimation(mainWord.getScrollX() / 2, mainWord.getScrollX() / 2, mainWord.getScrollY() / 2, width / 8); - translate.setDuration(0); - translate.setFillAfter(true); - - currentWordTextView.setAnimation(translate); - - } else { - help = false; - - LayoutParams layoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 10); - - // On modifie l'affichage du layout - LinearLayout menuLayout = ((LinearLayout)findViewById(R.id.menuLayout)); - menuLayout.setOrientation(LinearLayout.HORIZONTAL); - menuLayout.setLayoutParams(layoutParams); - - // Puis on modifie l'affichage des relations - //relation1 - LinearLayout relationLayout = ((LinearLayout)findViewById(R.id.relation1Layout)); - relationLayout.setGravity(Gravity.CENTER); - - TextView relationName = ((TextView)findViewById(R.id.relation1Name)); - relationName.setVisibility(View.GONE); - - //relation2 - relationLayout = ((LinearLayout)findViewById(R.id.relation2Layout)); - relationLayout.setGravity(Gravity.CENTER); - - relationName = ((TextView)findViewById(R.id.relation2Name)); - relationName.setVisibility(View.GONE); - - //relation3 - relationLayout = ((LinearLayout)findViewById(R.id.relation3Layout)); - relationLayout.setGravity(Gravity.CENTER); - - relationName = ((TextView)findViewById(R.id.relation3Name)); - relationName.setVisibility(View.GONE); - - //relation4 - relationLayout = ((LinearLayout)findViewById(R.id.relation4Layout)); - relationLayout.setGravity(Gravity.CENTER); - - relationName = ((TextView)findViewById(R.id.relation4Name)); - relationName.setVisibility(View.GONE); - - // On met le mot courant au bon endroit dans la fenetre - // On recupere la largueur de l'ecran. - Display display = getWindowManager().getDefaultDisplay(); - int width = display.getWidth(); - - //On recupere le centre de mainWord pour l'animation de translation. - TextView mainWord = (TextView)findViewById(R.id.mainWord); - currentWordTextView = (TextView)findViewById(R.id.currentWord); - - TranslateAnimation translate = new TranslateAnimation(mainWord.getScrollX() / 2, mainWord.getScrollX() / 2, mainWord.getScrollY() / 2, width / 4); - translate.setDuration(0); - translate.setFillAfter(true); - - currentWordTextView.setAnimation(translate); - } - } - - /** - * Permet de savoir si l'on se trouve ou non dans le mode d'aide - * - * @return <code>true</code> si l'on ce trouve dans le mode d'aide <code>false</code> sinon - */ - private boolean isInHelpMode() { - return help; - } - - /* (non-Javadoc) - * @see android.view.View.OnClickListener#onClick(android.view.View) - */ - @Override - public void onClick(View v) { - switch (v.getId()) { - case (R.id.relation1) : match.add(1, currentWord); next(); break; - case (R.id.relation2) : match.add(2, currentWord); next(); break; - case (R.id.relation3) : match.add(3, currentWord); next(); break; - case (R.id.relation4) : match.add(4, currentWord); next(); break; - case (R.id.aideBaseGame) : helpMode(); break; - } - } -} -\ No newline at end of file diff --git a/code/PtiClic/src/org/pticlic/model/Constant.java b/code/PtiClic/src/org/pticlic/model/Constant.java @@ -1,7 +1,7 @@ package org.pticlic.model; public class Constant { - public static final String SERVER_URL = "server"; + public static final String SERVER_URL = "html5/code/html5/"; public static final String SERVER_AUTH = "SERVER_AUTH"; public static final String SERVER = "http://www.pticlic.fr/"; diff --git a/code/PtiClic/src/org/pticlic/model/DownloadedBaseGame.java b/code/PtiClic/src/org/pticlic/model/DownloadedBaseGame.java @@ -1,144 +0,0 @@ -package org.pticlic.model; - -import java.io.Serializable; -import java.util.Arrays; - -/** - * @author Bertrand BRUN - * - * Classe metier reprensentant une parti "Normal" telecharge. - */ -public class DownloadedBaseGame extends DownloadedGame { - - private static final long serialVersionUID = 1L; - - public static class Word implements Serializable { - - private static final long serialVersionUID = 1L; - private int id; - private String name; - - public Word() {} - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } - - private int cat1; - private int cat2; - private int cat3; - private int cat4; - private Word center; - private Word[] cloud; - - public DownloadedBaseGame() { - super(); - this.cat1 = -1; - this.cat2 = -1; - this.cat3 = -1; - this.cat4 = -1; - this.center = null; - this.cloud = null; - } - - public DownloadedBaseGame(int id, int gid, int pgid, int cat1, int cat2, - int cat3, int cat4, Word center, Word[] cloud) { - super(id, gid, pgid); - this.cat1 = cat1; - this.cat2 = cat2; - this.cat3 = cat3; - this.cat4 = cat4; - this.center = center; - this.cloud = cloud; - } - - public static String getName(Word word) { - return word.getName(); - } - - public int getCat(int numCat) { - switch (numCat) { - case 1: return getCat1(); - case 2: return getCat2(); - case 3: return getCat3(); - default: return getCat4(); - } - } - - public String getCatString(int numCat) { - return String.format( - Relation.getInstance().getRelationName(this.getCat(numCat)), - center.getName()); - } - - public int getCat1() { - return cat1; - } - - public void setCat1(int cat1) { - this.cat1 = cat1; - } - - public int getCat2() { - return cat2; - } - - public void setCat2(int cat2) { - this.cat2 = cat2; - } - - public int getCat3() { - return cat3; - } - - public void setCat3(int cat3) { - this.cat3 = cat3; - } - - public int getCat4() { - return cat4; - } - - public void setCat4(int cat4) { - this.cat4 = cat4; - } - - public Word getCentre() { - return center; - } - - public void setCentre(Word center) { - this.center = center; - } - - public int getNbWord() { - return cloud.length; - } - - public Word getWordInCloud(int index) { - return cloud[index]; - } - - - @Override - public String toString() { - return "DownloadedBaseGame [gid=" + gid + ", pgid=" + pgid + ", id=" + id - + ", cat1=" + cat1 + ", cat2=" + cat2 + ", cat3=" + cat3 - + ", cat4=" + cat4 + ", center=" + center + ", cloud=" - + Arrays.toString(cloud) + "]"; - } - -} diff --git a/code/PtiClic/src/org/pticlic/model/DownloadedGame.java b/code/PtiClic/src/org/pticlic/model/DownloadedGame.java @@ -1,57 +0,0 @@ -package org.pticlic.model; - -import java.io.Serializable; - - -/** - * @author Bertrand BRUN - * - * Classe metier reprensentant n'importe quel le jeu telecharger du serveur. - * - */ -public abstract class DownloadedGame implements Serializable { - - private static final long serialVersionUID = 1L; - - protected int gid; - protected int pgid; - protected int id; - - public DownloadedGame() { - this.id = -1; - this.gid = -1; - this.pgid = -1; - } - - public DownloadedGame(int id, int gid, int pgid) { - super(); - this.id = id; - this.gid = gid; - this.pgid = pgid; - } - - public int getGid() { - return gid; - } - - public void setGid(int gid) { - this.gid = gid; - } - - public int getPgid() { - return pgid; - } - - public void setPgid(int pgid) { - this.pgid = pgid; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - -} diff --git a/code/PtiClic/src/org/pticlic/model/Match.java b/code/PtiClic/src/org/pticlic/model/Match.java @@ -1,74 +0,0 @@ -package org.pticlic.model; - -import java.io.Serializable; -import java.util.ArrayList; - -/** - * @author Bertrand BRUN - * - * Cette classe represente une partie joue. - * Elle sera envoyer au serveur pour que celui-ci - * puisse calculer le score obtenue. - * - */ -public class Match implements Serializable { - - private static final long serialVersionUID = 1L; - private ArrayList<Integer> relation1; - private ArrayList<Integer> relation2; - private ArrayList<Integer> relation3; - private ArrayList<Integer> relation4; - private DownloadedGame game; - - public Match() { - relation1 = new ArrayList<Integer>(); - relation2 = new ArrayList<Integer>(); - relation3 = new ArrayList<Integer>(); - relation4 = new ArrayList<Integer>(); - } - - public void setGame(DownloadedGame game) { - this.game = game; - } - - public DownloadedGame getGame() { - return game; - } - - public void add(int relation, int word) { - switch (relation) { - case 1: relation1.add(word); break; - case 2: relation2.add(word); break; - case 3: relation3.add(word); break; - case 4: relation4.add(word); break; - } - } - - /** - * @return the relation1 - */ - public ArrayList<Integer> getRelation1() { - return relation1; - } - - /** - * @return the relation2 - */ - public ArrayList<Integer> getRelation2() { - return relation2; - } - - /** - * @return the relation3 - */ - public ArrayList<Integer> getRelation3() { - return relation3; - } - - /** - * @return the relation4 - */ - public ArrayList<Integer> getRelation4() { - return relation4; - } -} diff --git a/code/PtiClic/src/org/pticlic/model/Network.java b/code/PtiClic/src/org/pticlic/model/Network.java @@ -1,13 +1,6 @@ package org.pticlic.model; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.io.Serializable; -import java.io.UnsupportedEncodingException; - -import org.pticlic.exception.PtiClicException; import android.content.Context; import android.content.SharedPreferences; @@ -15,7 +8,6 @@ import android.net.ConnectivityManager; import android.preference.PreferenceManager; import com.google.gson.Gson; -import com.google.gson.stream.JsonReader; /** @@ -175,179 +167,4 @@ public class Network { return res; } - - /** - * Cette méthode permet de récupérer du serveur un certain nombre de parties. - * @param nbGames Le nombre de parties que l'on veut récupérer. - * @return - */ - public DownloadedGame getGames(int nbGames) throws PtiClicException, Exception { - switch (mode) { - case SIMPLE_GAME: - return DownloadBaseGame(nbGames); - default: - return null; - } - } - - private DownloadedBaseGame DownloadBaseGame(int nbGames) throws PtiClicException, Exception { - Gson gson = null; - String json = null; - DownloadedBaseGame game = null; - - // URLConnection connection = url.openConnection(); - // connection.addRequestProperty("action", Action.GET_GAMES.value()); - // connection.addRequestProperty("user", this.id); - // connection.addRequestProperty("passwd", this.passwd); - // connection.addRequestProperty("nb", String.valueOf(nbGames)); - // connection.addRequestProperty("mode", mode.value()); - - String urlS = this.serverURL - + "?action=" + Action.GET_GAMES.value() - + "&user=" + this.id - + "&passwd=" + this.passwd - + "&nb=" + String.valueOf(nbGames) - + "&mode="+mode.value(); - - gson = new Gson(); - json = HttpClient.SendHttpPost(urlS); - - try { - - //JsonReader reader = new JsonReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); - InputStream in = new ByteArrayInputStream(json.getBytes("UTF-8")); - JsonReader jsonReader = new JsonReader(new InputStreamReader(in)); - - // FIXME : Attention lorsque l'on pourra vraiment recupere plusieur partie, il faudra changer ce qui suit. - jsonReader.beginArray(); - while (jsonReader.hasNext()) { - game = makeBaseGame(jsonReader, gson); - } - jsonReader.endArray(); - jsonReader.close(); - } catch (UnsupportedEncodingException e1) { - throw new PtiClicException(0, "Impossible de recuperer l'erreur, nous avons pris note de cette erreur.\n Merci"); - } catch (IOException e1) { - throw new PtiClicException(0, "Impossible de recuperer l'erreur, nous avons pris note de cette erreur.\n Merci"); - } catch (Exception e) { - throw new PtiClicException(json); - } - - return game; - } - - /** - * Permet la transformation du Json en une instance de Game. - * - * @param reader Le Json sous forme d'un flux. - * @param gson Une instance de Gson. - * @return Une nouvelle instance de Game. - * @throws IOException - */ - private DownloadedBaseGame makeBaseGame(JsonReader reader, Gson gson) throws IOException { - int gid = -1; - int pgid = -1; - int id = -1; - int cat1 = -1; - int cat2 = -1; - int cat3 = -1; - int cat4 = -1; - DownloadedBaseGame.Word center = null; - DownloadedBaseGame.Word[] cloud = null; - - reader.beginObject(); - while (reader.hasNext()) { - String name = reader.nextName(); - if (name.equals("id")) { - id = reader.nextInt(); - } else if (name.equals("gid")) { - gid = reader.nextInt(); - } else if (name.equals("pgid")) { - pgid = reader.nextInt(); - } else if (name.equals("cat1")) { - cat1 = reader.nextInt(); - } else if (name.equals("cat2")) { - cat2 = reader.nextInt(); - } else if (name.equals("cat3")) { - cat3 = reader.nextInt(); - } else if (name.equals("cat4")) { - cat4 = reader.nextInt(); - } else if (name.equals("center")) { - center = gson.fromJson(reader, DownloadedBaseGame.Word.class); - } else if (name.equals("cloud")) { - cloud = gson.fromJson(reader, DownloadedBaseGame.Word[].class); - } else { - reader.skipValue(); - } - } - reader.endObject(); - return new DownloadedBaseGame(id, gid, pgid, cat1, cat2, cat3, cat4, center, cloud); - } - - /** - * Cette méthode permet d'envoyer les parties au serveur pour qu'il puisse les - * rajouter à la base de données, et calculer le score. - * @param game La partie jouee par l'utilisateur - * @return Le score sous forme JSON. - */ - public ScoreResponse sendGame(Match game) throws PtiClicException, Exception { - switch (mode) { - case SIMPLE_GAME: - return sendBaseGame(game); - default: - return null; - } - } - - public ScoreResponse sendBaseGame(Match game) throws PtiClicException, Exception { - Gson gson = null; - String json = null; - - // TODO : ne restera le temps que les requete du serveur passe du GET au POST - String urlS = this.serverURL - + "?action=" + Action.SEND_GAME.value() - + "&user=" + this.id - + "&passwd=" + this.passwd - + "&pgid=" + game.getGame().getPgid() - + "&gid=" + game.getGame().getGid() - + "&mode="+mode.value() - + "&nb="+((DownloadedBaseGame)(game.getGame())).getNbWord(); - - // TODO : faut gere le mode - for (Integer i : game.getRelation1()) { - urlS += "&" + i + "=" + ((DownloadedBaseGame)game.getGame()).getCat1() ; - } - for (Integer i : game.getRelation2()) { - urlS += "&" + i + "=" + ((DownloadedBaseGame)game.getGame()).getCat2(); - } - for (Integer i : game.getRelation3()) { - urlS += "&" + i + "=" + ((DownloadedBaseGame)game.getGame()).getCat3(); - } - for (Integer i : game.getRelation4()) { - urlS += "&" + i + "=" + ((DownloadedBaseGame)game.getGame()).getCat4(); - } - - // URL url = new URL(this.serverURL); // Attention ! this.serverURL contient "/server.php" - // URLConnection connection = url.openConnection(); - // connection.addRequestProperty("action", Action.SEND_GAME.value()); - // connection.addRequestProperty("user", this.id); - // connection.addRequestProperty("passwd", this.passwd); - // connection.addRequestProperty("mode", mode.value()); - // connection.addRequestProperty("pgid", String.valueOf(game.getGame().getId())); - - gson = new Gson(); - json = HttpClient.SendHttpPost(urlS); - - // Comme gson ne renvoie pas une erreur si l'objet qui recupere ne correspond pas a la classe qu'il attends. - // On creer tout d'abord une objet error et si celui-ci est vide on creer l'objet score, sinon on lance - // une exception. - int foo = 42; - ScoreResponse sr = gson.fromJson(json, ScoreResponse.class); - foo = foo + 1; - if (sr.getNewGame() == null) { - throw new PtiClicException(gson.fromJson(json, PtiClicException.Error.class)); - } else { - return sr; - } - } } diff --git a/code/PtiClic/src/org/pticlic/model/Relation.java b/code/PtiClic/src/org/pticlic/model/Relation.java @@ -1,88 +0,0 @@ -package org.pticlic.model; - -import java.util.HashMap; - -import org.pticlic.R; - -/** - * @author Bertrand BRUN - * - * Cette classe permet de recuperer le noms ou l'image d'un relation en fonction du numero de son id. - * - */ -public class Relation { - // TODO : Penser a peut etre remplacer les HashMap par une BDD. - - private static Relation instance = null; - - HashMap<Integer, String> stringRelations; - HashMap<Integer, Integer> imageRelations; - - private Relation() { - imageRelations = new HashMap<Integer, Integer>(); - imageRelations.put(-1, R.drawable.corbeille); - imageRelations.put(0, R.drawable.rapport); - imageRelations.put(5, R.drawable.synonyme); - imageRelations.put(7, R.drawable.contraire); - imageRelations.put(9, R.drawable.contenu); - imageRelations.put(10, R.drawable.contenant); - - // ATTENTION ! Tout ce qui est ci-dessous est en double dans relations.php . - stringRelations = new HashMap<Integer, String>(); - stringRelations.put(-1, "Mot non lié à '%s'"); - stringRelations.put(0, "'%s' est en rapport avec..."); - stringRelations.put(1, "raffinement sémantique"); // pas utilisé - stringRelations.put(2, "raffinement morphologique"); // pas utilisé - stringRelations.put(3, "domaine"); // pas utilisé - stringRelations.put(4, "r_pos"); // pas utilisé - stringRelations.put(5, "'%s' est un synonyme de..."); - stringRelations.put(6, "'%s' est une sorte de..."); - stringRelations.put(7, "Un contraire de '%s' est..."); - stringRelations.put(8, "Un spécifique de '%s' est..."); - stringRelations.put(9, "... est une partie de '%s'"); - stringRelations.put(10, "'%s' fait partie de..."); - stringRelations.put(11, "locution"); // pas utilisé - stringRelations.put(12, "potentiel de FL"); // pas utilisé - stringRelations.put(13, "Quoi/Qui pourrait '%s'"); - stringRelations.put(14, "action>patient"); // pas utilisé - stringRelations.put(15, "Le lieu pour '%s' est..."); - stringRelations.put(16, "Un instrument pour '%s' est..."); - stringRelations.put(17, "Un caractéristique de '%s' est..."); - stringRelations.put(18, "r_data"); // pas utilisé - stringRelations.put(19, "r_lemma"); // pas utilisé - stringRelations.put(20, "magn"); // pas utilisé - stringRelations.put(21, "antimagn"); // pas utilisé - stringRelations.put(22, "'%s' est de la même famille que..."); - stringRelations.put(29, "predicat"); // pas utilisé - stringRelations.put(30, "lieu>action"); // pas utilisé - stringRelations.put(31, "action>lieu"); // pas utilisé - stringRelations.put(32, "sentiment"); // pas utilisé - stringRelations.put(33, "erreur"); // pas utilisé - stringRelations.put(34, "manière"); // pas utilisé - stringRelations.put(35, "sens/signification"); // pas utilisé - stringRelations.put(36, "information potentielle"); // pas utilisé - stringRelations.put(37, "rôle télique"); // pas utilisé - stringRelations.put(38, "rôle agentif"); // pas utilisé - stringRelations.put(41, "conséquence"); // pas utilisé - stringRelations.put(42, "cause"); // pas utilisé - stringRelations.put(52, "succession"); // pas utilisé - stringRelations.put(53, "produit"); // pas utilisé - stringRelations.put(54, "est le produit de"); // pas utilisé - stringRelations.put(55, "s'oppose à"); // pas utilisé - } - - public synchronized static Relation getInstance() { - if (instance == null) { - instance = new Relation(); - } - return instance; - } - - public String getRelationName(int id) { - return stringRelations.get(id); - } - - public Integer getRelationImage(int id) { - return imageRelations.get(id); - } -} diff --git a/code/html5/img/aide.png b/code/html5/img/aide.png Binary files differ. diff --git a/code/html5/img/config.png b/code/html5/img/config.png Binary files differ. diff --git a/code/html5/img/icon.png b/code/html5/img/icon.png Binary files differ. diff --git a/code/html5/img/mode_chrono.png b/code/html5/img/mode_chrono.png Binary files differ. diff --git a/code/html5/img/mode_marathon.png b/code/html5/img/mode_marathon.png Binary files differ. diff --git a/code/html5/img/mode_normal.png b/code/html5/img/mode_normal.png Binary files differ. diff --git a/code/html5/img/mode_ombre.png b/code/html5/img/mode_ombre.png Binary files differ. diff --git a/code/html5/img/rel/-1.png b/code/html5/img/rel/-1.png Binary files differ. diff --git a/code/html5/img/rel/0.png b/code/html5/img/rel/0.png Binary files differ. diff --git a/code/html5/img/rel/10.png b/code/html5/img/rel/10.png Binary files differ. diff --git a/code/html5/img/rel/5.png b/code/html5/img/rel/5.png Binary files differ. diff --git a/code/html5/img/rel/7.png b/code/html5/img/rel/7.png Binary files differ. diff --git a/code/html5/img/rel/9.png b/code/html5/img/rel/9.png Binary files differ. diff --git a/code/html5/img/rel/default.png b/code/html5/img/rel/default.png Binary files differ. diff --git a/code/html5/img/splash.png b/code/html5/img/splash.png Binary files differ. diff --git a/code/html5/index.html b/code/html5/index.html @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<html> +<head> + <title>PtiClic pre-alpha 0.2</title> + <meta charset="utf-8" /> + <style> +body { + background-color: black; +} + +#screen { + background-color : #FFFFE0; +} + +#mc-caption { + color: #8b4; +} + +#mn-caption { + color: #4a4; +} + +#mn-caption-block { + border-top: medium solid #44AA44; + border-bottom: medium solid #44AA44; + background-color: #F0F8D0; +} + +.relationBox { + background-color: #F0F8D0; + border: thin solid #44AA44; +} + +.relations .hot { + background-color: yellow; +} + +.clearboth { + clear: both; +} + </style> + <script src="jquery-1.5.1.min.js"></script> + <script src="jquery-ui-1.8.11.custom.min.js"></script> + <script src="pticlic.js"></script> + <script src="my-extensions.js"></script> +</head> +<body> +<div id="screen"> + <div id="mc-caption-block"></div> + <div id="mn-caption-block"></div> + <div id="mc-caption" class="mc"></div> + <div id="mn-caption" class="mn"></div> + <div class="relations"></div> + <div id="templates" style="display: none;"> + <div class="relationBox"> + <div class="relation"><img class="icon" alt="" src="img/rel/default.png" /><span class="text"></span></div> + <div class="clearboth"></div> + </div> + </div> +</div> +</body> +</html> diff --git a/code/html5/jquery-1.5.1.min.js b/code/html5/jquery-1.5.1.min.js @@ -0,0 +1,16 @@ +/*! + * jQuery JavaScript Library v1.5.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Wed Feb 23 13:55:29 2011 -0500 + */ +(function(a,b){function cg(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cd(a){if(!bZ[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";bZ[a]=c}return bZ[a]}function cc(a,b){var c={};d.each(cb.concat.apply([],cb.slice(0,b)),function(){c[this]=a});return c}function bY(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bX(){try{return new a.XMLHttpRequest}catch(b){}}function bW(){d(a).unload(function(){for(var a in bU)bU[a](0,1)})}function bQ(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bP(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bO(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bq.test(a)?e(a,f):bO(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bO(a+"["+f+"]",b[f],c,e)}function bN(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bH,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bN(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bN(a,c,d,e,"*",g));return l}function bM(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bB),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bo(a,b,c){var e=b==="width"?bi:bj,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function ba(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function _(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function $(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function Z(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function Y(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function O(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(J.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function N(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function F(a,b){return(a&&a!=="*"?a+".":"")+b.replace(r,"`").replace(s,"&")}function E(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,q=[],r=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(p,"")===a.type?r.push(g.selector):t.splice(i--,1);f=d(a.target).closest(r,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&q.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=q.length;j<k;j++){f=q[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function C(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function w(){return!0}function v(){return!1}function g(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function f(a,c,f){if(f===b&&a.nodeType===1){f=a.getAttribute("data-"+c);if(typeof f==="string"){try{f=f==="true"?!0:f==="false"?!1:f==="null"?null:d.isNaN(f)?e.test(f)?d.parseJSON(f):f:parseFloat(f)}catch(g){}d.data(a,c,f)}else f=b}return f}var c=a.document,d=function(){function I(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(I,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x=!1,y,z="then done fail isResolved isRejected promise".split(" "),A,B=Object.prototype.toString,C=Object.prototype.hasOwnProperty,D=Array.prototype.push,E=Array.prototype.slice,F=String.prototype.trim,G=Array.prototype.indexOf,H={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.1",length:0,size:function(){return this.length},toArray:function(){return E.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?D.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),y.done(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(E.apply(this,arguments),"slice",E.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:D,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;y.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=!0;if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",A,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",A),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&I()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):H[B.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!C.call(a,"constructor")&&!C.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||C.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:F?function(a){return a==null?"":F.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?D.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){c=1;try{while(a[0])a.shift().apply(d,f)}catch(g){throw g}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(d.isFunction(this.promise)?this.promise():this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),e;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(e)return e;e=a={}}var c=z.length;while(c--)a[z[c]]=b[z[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){var b=arguments.length,c=b<=1&&a&&d.isFunction(a.promise)?a:d.Deferred(),e=c.promise();if(b>1){var f=E.call(arguments,0),g=b,h=function(a){return function(b){f[a]=arguments.length>1?E.call(arguments,0):b,--g||c.resolveWith(e,f)}};while(b--)a=f[b],a&&d.isFunction(a.promise)?a.promise().then(h(b),c.reject):--g;g||c.resolveWith(e,f)}else c!==a&&c.resolve(a);return e},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),y=d._Deferred(),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){H["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),G&&(d.inArray=function(a,b){return G.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?A=function(){c.removeEventListener("DOMContentLoaded",A,!1),d.ready()}:c.attachEvent&&(A=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",A),d.ready())});return d}();(function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e),b=e=f=null}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function"),b=null;return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}})();var e=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!g(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,h=b.nodeType,i=h?d.cache:b,j=h?b[d.expando]:d.expando;if(!i[j])return;if(c){var k=e?i[j][f]:i[j];if(k){delete k[c];if(!g(k))return}}if(e){delete i[j][f];if(!g(i[j]))return}var l=i[j][f];d.support.deleteExpando||i!=a?delete i[j]:i[j]=null,l?(i[j]={},h||(i[j].toJSON=d.noop),i[j][f]=l):h&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var g=this[0].attributes,h;for(var i=0,j=g.length;i<j;i++)h=g[i].name,h.indexOf("data-")===0&&(h=h.substr(5),f(this[0],h,e[h]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=f(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var h=/[\n\t\r]/g,i=/\s+/,j=/\r/g,k=/^(?:href|src|style)$/,l=/^(?:button|input)$/i,m=/^(?:button|input|object|select|textarea)$/i,n=/^a(?:rea)?$/i,o=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(i);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var j=0,k=b.length;j<k;j++)g.indexOf(" "+b[j]+" ")<0&&(h+=" "+b[j]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(i);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var j=(" "+g.className+" ").replace(h," ");for(var k=0,l=c.length;k<l;k++)j=j.replace(" "+c[k]+" "," ");g.className=d.trim(j)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),j=b,k=a.split(i);while(f=k[g++])j=e?j:!h.hasClass(f),h[j?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(h," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var k=i?f:0,l=i?f+1:h.length;k<l;k++){var m=h[k];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(o.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(j,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&o.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=k.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&l.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var o=a.getAttributeNode("tabIndex");return o&&o.specified?o.value:m.test(a.nodeName)||n.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var p=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return p===null?b:p}h&&(a[c]=e);return a[c]}});var p=/\.(.*)$/,q=/^(?:textarea|input|select)$/i,r=/\./g,s=/ /g,t=/[^\w\s.|`]/g,u=function(a){return a.replace(t,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=v;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(){return typeof d!=="undefined"&&!d.event.triggered?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=v);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),u).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var w=s.handle;w&&(w.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(p,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=!0,l[m]())}catch(q){}k&&(l["on"+m]=k),d.event.triggered=!1}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.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 pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,F(a.origType,a.selector),d.extend({},a,{handler:E,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,F(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?w:v):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=w;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=w;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=w,this.stopPropagation()},isDefaultPrevented:v,isPropagationStopped:v,isImmediatePropagationStopped:v};var x=function(a){var b=a.relatedTarget;try{if(b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},y=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?y:x,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?y:x)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&C("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&C("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var z,A=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},B=function B(a){var c=a.target,e,f;if(q.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=A(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:B,beforedeactivate:B,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&B.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&B.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",A(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in z)d.event.add(this,c+".specialChange",z[c]);return q.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return q.test(this.nodeName)}},z=d.event.special.change.filters,z.focus=z.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function c(a){a=d.event.fix(a),a.type=b;return d.event.handle.call(this,a)}d.event.special[b]={setup:function(){this.addEventListener(a,c,!0)},teardown:function(){this.removeEventListener(a,c,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var D={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=p.exec(h),k="",j&&(k=j[0],h=h.replace(p,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(D[h]+k),h=h+k):h=(D[h]||h)+k;if(c==="live")for(var q=0,r=n.length;q<r;q++)d.event.add(n[q],"live."+F(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+F(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){return"text"===a.getAttribute("type")},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector,d=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(e){d=!0}b&&(k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(d||!l.match.PSEUDO.test(c)&&!/!=/.test(c))return b.call(a,c)}catch(e){}return k(c,null,null,[a]).length>0})}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var G=/Until$/,H=/^(?:parents|prevUntil|prevAll)/,I=/,/,J=/^.[^:#\[\.,]*$/,K=Array.prototype.slice,L=d.expr.match.POS,M={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(O(this,a,!1),"not",a)},filter:function(a){return this.pushStack(O(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=L.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(N(c[0])||N(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=K.call(arguments);G.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!M[a]?d.unique(f):f,(this.length>1||I.test(e))&&H.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var P=/ jQuery\d+="(?:\d+|null)"/g,Q=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,S=/<([\w:]+)/,T=/<tbody/i,U=/<|&#?\w+;/,V=/<(?:script|object|embed|option|style)/i,W=/checked\s*(?:[^=]|=\s*.checked.)/i,X={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};X.optgroup=X.option,X.tbody=X.tfoot=X.colgroup=X.caption=X.thead,X.th=X.td,d.support.htmlSerialize||(X._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(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,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(P,""):null;if(typeof a!=="string"||V.test(a)||!d.support.leadingWhitespace&&Q.test(a)||X[(S.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(R,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&W.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?Y(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,ba)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!V.test(a[0])&&(d.support.checkClone||!W.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){$(a,e),f=_(a),g=_(e);for(h=0;f[h];++h)$(f[h],g[h])}if(b){Z(a,e);if(c){f=_(a),g=_(e);for(h=0;f[h];++h)Z(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||U.test(i)){if(typeof i==="string"){i=i.replace(R,"<$1></$2>");var j=(S.exec(i)||["",""])[1].toLowerCase(),k=X[j]||X._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=T.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&Q.test(i)&&m.insertBefore(b.createTextNode(Q.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bb=/alpha\([^)]*\)/i,bc=/opacity=([^)]*)/,bd=/-([a-z])/ig,be=/([A-Z])/g,bf=/^-?\d+(?:px)?$/i,bg=/^-?\d/,bh={position:"absolute",visibility:"hidden",display:"block"},bi=["Left","Right"],bj=["Top","Bottom"],bk,bl,bm,bn=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bk(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bk)return bk(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bd,bn)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bo(a,b,e):d.swap(a,bh,function(){f=bo(a,b,e)});if(f<=0){f=bk(a,b,b),f==="0px"&&bm&&(f=bm(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bf.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return bc.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bb.test(f)?f.replace(bb,e):c.filter+" "+e}}),c.defaultView&&c.defaultView.getComputedStyle&&(bl=function(a,c,e){var f,g,h;e=e.replace(be,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bm=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bf.test(d)&&bg.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bk=bl||bm,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var bp=/%20/g,bq=/\[\]$/,br=/\r?\n/g,bs=/#.*$/,bt=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bu=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bv=/(?:^file|^widget|\-extension):$/,bw=/^(?:GET|HEAD)$/,bx=/^\/\//,by=/\?/,bz=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bA=/^(?:select|textarea)/i,bB=/\s+/,bC=/([?&])_=[^&]*/,bD=/(^|\-)([a-z])/g,bE=function(a,b,c){return b+c.toUpperCase()},bF=/^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,bG=d.fn.load,bH={},bI={},bJ,bK;try{bJ=c.location.href}catch(bL){bJ=c.createElement("a"),bJ.href="",bJ=bJ.href}bK=bF.exec(bJ.toLowerCase()),d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bG)return bG.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bz,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bA.test(this.nodeName)||bu.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(br,"\r\n")}}):{name:b.name,value:c.replace(br,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bJ,isLocal:bv.test(bK[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bM(bH),ajaxTransport:bM(bI),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bP(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bQ(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bD,bE)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bt.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bs,"").replace(bx,bK[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bB),e.crossDomain||(q=bF.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bK[1]||q[2]!=bK[2]||(q[3]||(q[1]==="http:"?80:443))!=(bK[3]||(bK[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bN(bH,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!bw.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(by.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bC,"$1_="+w);e.url=x+(x===e.url?(by.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bN(bI,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bO(g,a[g],c,f);return e.join("&").replace(bp,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bR=d.now(),bS=/(\=)\?(&|$)|()\?\?()/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bR++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bS.test(b.url)||f&&bS.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bS,l),b.url===j&&(f&&(k=k.replace(bS,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bT=d.now(),bU,bV;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bX()||bY()}:bX,bV=d.ajaxSettings.xhr(),d.support.ajax=!!bV,d.support.cors=bV&&"withCredentials"in bV,bV=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),(!a.crossDomain||a.hasContent)&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bU[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bU||(bU={},bW()),h=bT++,g.onreadystatechange=bU[h]=c):c()},abort:function(){c&&c(0,1)}}}});var bZ={},b$=/^(?:toggle|show|hide)$/,b_=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,ca,cb=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(cc("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cd(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cc("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(cc("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cd(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(b$.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=b_.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:cc("show",1),slideUp:cc("hide",1),slideToggle:cc("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.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,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!ca&&(ca=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(ca),ca=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var ce=/^t(?:able|d|h)$/i,cf=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=cg(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!ce.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),a=b=e=f=g=h=null,d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=e==="absolute"&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=cf.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!cf.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=cg(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=cg(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window); +\ No newline at end of file diff --git a/code/html5/jquery-ui-1.8.11.custom.min.js b/code/html5/jquery-ui-1.8.11.custom.min.js @@ -0,0 +1,62 @@ +/*! + * jQuery UI 1.8.11 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.11",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106, +NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this, +"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position"); +if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f, +"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h, +d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}}); +c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&& +b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery); +;/* + * jQuery UI Effects 1.8.11 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||function(f,j){function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return o.transparent;return o[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return n(b)}function p(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, +a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= +a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", +"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var o={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, +0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, +211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, +d){if(f.isFunction(b)){d=b;b=null}return this.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=h.splice(h.length-1,1)[0]; +h.splice(1,0,l);f.dequeue(this)})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c, +a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.11",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c, +a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent", +border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c); +return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments); +else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(m(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(m(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c), +b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c, +a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c, +a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a== +e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c= +g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/ +h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c, +a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery); +;/* + * jQuery UI Effects Highlight 1.8.11 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +; +\ No newline at end of file diff --git a/code/html5/my-extensions.js b/code/html5/my-extensions.js @@ -0,0 +1,113 @@ +Number.prototype.clip = function(min, max, floor) { + return Math.min(Math.max(floor ? Math.floor(this) : this, min), max); +}; + +function dichotomy(start, isBigger) { + var i = 0, min = 0, max, half; + + for (max = start || 1; ++i < 10 && !isBigger(max); max *= 2); + for (half = start; Math.abs(min-max) > 0.1; half = (min + max) / 2) { + if (!isBigger(half)) min = half; + else max = half; + } + while (half > 1 && isBigger(half)) { --half; } + return half; +} + +$.fn.maxWidth = function() { + max = 0; + this.each(function(i,e){ max = Math.max(max, $(e).width()); }); + return max; +} +$.fn.maxHeight = function() { + max = 0; + this.each(function(i,e){ max = Math.max(max, $(e).height()); }); + return max; +} + +$.fn.fitFont = function(w, h, minFont, maxFont) { + var oldpos = this.css("position"); + this.css({ + position: "absolute", + maxWidth: w + }); + var wrappers = this.wrapInner("<span/>").children(); + + var that = this; + this.css("font-size", dichotomy(parseInt(this.css("font-size"), 10), function(x) { + that.css("fontSize", x); + return (wrappers.maxHeight() > h || wrappers.maxWidth() > w); + }).clip(minFont || 0, maxFont || Infinity)); + + // Restore stuff + this.css("position", oldpos); + wrappers.children().unwrap(); + return this; +} + +$.fn.fitIn = function(e, t, r, b, l) { + e = $(e); + if (isNaN(+t)) t = 0; + if (isNaN(+r)) r = t; + if (isNaN(+b)) b = t; + if (isNaN(+l)) l = r; + var w = e.width(); + var h = e.height(); + t *= h; + r *= w; + b *= h; + l *= w; + this.fitFont(w - r - l, h - t - b, 20).center(e.center()); +} + +function queueize(method) { + return function() { + var $this = this; + return this.queue(function(next) { + $this[method].apply($this,arguments); + next(); + }); + }; +} + +$.fn.qAddClass = queueize("addClass"); +$.fn.qRemoveClass = queueize("removeClass"); + +$.fn.wh = function(w, h) { + return this.width(w).height(h); +} + +$.fn.relativePos = function(xAnchor, yAnchor, to, justCss) { + if (to) this.css("position", "absolute"); + var deltaX = this.outerWidth() * xAnchor; + var deltaY = this.outerHeight() * yAnchor; + + if (to) { + var css = { + left: to.left - deltaX, + top: to.top - deltaY + }; + return (justCss ? css : this.offset(css)); + } else { + var pos = this.offset(); + pos.left += deltaX; + pos.top += deltaY; + return pos; + } +}; + +$.each({ + center: {x:0.5, y:0.5}, + north: {x:0.5, y:0}, + northEast: {x:1, y:0}, + east: {x:1, y:0.5}, + southEast: {x:1, y:1}, + south: {x:0.5, y:1}, + southWest: {x:0, y:1}, + west: {x:0, y:0.5}, + northWest: {x:0, y:0}, +}, function(i,e) { + var x = e.x; + var y = e.y; + $.fn[i] = function(to, justCss) { return this.relativePos(x, y, to, justCss); }; +}); diff --git a/code/html5/pticlic.js b/code/html5/pticlic.js @@ -0,0 +1,129 @@ +function jss() { + // TODO : réduire le nombre de fitIn ou fitFont, ou bien les précalculer. + var w, h; + w = $(window).width(); + h = $(window).height(); + + var mch = h/8, mnh = h*0.075; + + $("body, html") + .css({ + padding: 0, + margin: 0, + overflow: "hidden", + textAlign: "left" + }); + + $("#screen") + .wh(w, h) + .north($("body").north()); // TODO : par rapport à la fenêtre entière. + + $("#mc-caption-block") + .wh(w, mch) + .north($("#screen").north()); + + $("#mc-caption") + .fitIn("#mc-caption-block", 0.1); + + $("#mn-caption-block") + .css({borderWidth: h/100}) + .wh(w, mnh) + .north($("#mc-caption-block").south()); + + $("#mn-caption") + .css({zIndex: 10}) + .fitIn("#mn-caption-block"); + + $(".relationBox:visible") + .css({ + margin: 10, + padding: 10, + MozBorderRadius: 10, + WebkitBorderRadius: 10 + }); + + $(".relationBox:visible .icon") + .wh(72,72) + .css({ + float: "left", + marginRight: $(".relationBox").css("padding-left") + }); + + $(".relations") + .width(w); + + $(".relation:visible").fitFont($(".relationBox:visible").width(), 72, 10); + + $(".relations") + .south($("#screen").south()); +} + +$(function () { + var url = "tmp.json"; + $.getJSON(url, function(data) { + var game = data[0]; + var currentWordNb = 0; + var answers = []; + + var updateText = function() { + $(".mn").text(game.cloud[currentWordNb].name); + $(".mc").text(game.center.name); + jss(); + } + + var nextWord = function(click, button) { + answers[currentWordNb++] = $(button).data("rid"); + if (currentWordNb < game.cloud.length) { + animateNext(click, button); + } else { + $(".relations").empty(); + alert("Partie terminée !"); + } + } + + function animateNext(click, button) { + var duration = 700; + + var mn = $("#mn-caption"); + + $(button).addClass("hot").removeClass("hot", duration); + + (mn) + .stop() // Attention : stop() et clearQueue() ont aussi un effet + .clearQueue() // sur la 2e utilisation de mn (ci-dessous). + .clone() + .removeClass("mn") // Pour que le texte animé ne soit pas modifié. + .appendTo("body") // Append to body so we can animate the offset (instead of top/left). + .offset(mn.offset()) + .animate({left:click.left, top:click.top, fontSize: 0}, duration) + .queue(function() { $(this).remove(); }); + + updateText(); + var fs = mn.css("fontSize"); + var mncbCenter = $("#mn-caption-block").center(); + + (mn) + .css("fontSize", 0) + .animate({fontSize: fs}, {duration:duration, step:function(){mn.center(mncbCenter);}}); + } + + $.each(game.relations, function(i, relation) { + $('#templates .relationBox') + .clone() + .data("rid", relation.id) + .find(".text") + .html(relation.name.replace(/%(m[cn])/g, '<span class="$1"/>')) + .end() + .find(".icon") + .attr("src", "img/rel/"+relation.id+".png") + .end() + .click(function(e) { + nextWord({left:e.pageX, top:e.pageY}, this); + }) + .appendTo(".relations"); + }); + + $(window).resize(jss); + updateText(); + }); +}); diff --git a/code/html5/score.html b/code/html5/score.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html> +<head> + <title>PtiClic pre-alpha 0.2</title> + <meta charset="utf-8" /> + <style> +body { + background-color: black; +} + +#screen { + background-color : #FFFFE0; +} + </style> + <script src="jquery-1.5.1.min.js"></script> + <script src="jquery-ui-1.8.11.custom.min.js"></script> + <script src="score.js"></script> + <script src="my-extensions.js"></script> +</head> +<body> +<div id="screen"> + <h1>Score total : <span class="scoreTotal"></span></h1> + <div class="scores"></div> + <div id="templates" style="display: none;"> + <div class="scoreLine"> + <span class="word"></span> (<span class="score"></span>) + </div> + </div> +</div> +</body> +</html> diff --git a/code/html5/score.js b/code/html5/score.js @@ -0,0 +1,39 @@ +function jss() { + var w, h; + w = $(window).width(); + h = $(window).height(); + + var mch = h/8, mnh = h*0.075; + + $("body, html") + .css({ + padding: 0, + margin: 0, + overflow: "hidden", + textAlign: "left" + }); + + $("#screen") + .wh(w, h) + .north($("body").north()); // TODO : par rapport à la fenêtre entière. +} + +$(function () { + var url = "score.json"; + $.getJSON(url, function(data) { + console.log(data); + $.each(data.scores, function(i,e) { + var percentScore = (e.score - data.minScore) / (data.maxScore - data.minScore); + $("#templates .scoreLine") + .clone() + .find(".word").text(e.name).end() + .find(".score") + .text(e.score) + .css("color","rgb("+(255 - 255*percentScore).clip(0,255)+","+(191*percentScore).clip(0,255,true)+",0)") + .end() + .appendTo(".scores"); + jss(); + }); + }); + jss(); +}); +\ No newline at end of file diff --git a/code/html5/score.json b/code/html5/score.json @@ -0,0 +1 @@ +{"minScore":-5,"maxScore":10,"scores":[{"id":84632,"name":"camion","score":3},{"id":61939,"name":"transbahutage","score":10},{"id":104263,"name":"trimbaler","score":4},{"id":44654,"name":"transporter","score":-2},{"id":38285,"name":"d\u00e9m\u00e9nageur","score":5},{"id":43404,"name":"porter","score":5},{"id":63192,"name":"transports","score":-1},{"id":130473,"name":"enthousiasmer","score":0},{"id":90461,"name":"se trimbaler","score":6},{"id":134609,"name":"baguenauder","score":9}]} +\ No newline at end of file diff --git a/code/html5/tmp.json b/code/html5/tmp.json @@ -0,0 +1 @@ +[{"gid":22,"pgid":512,"relations":[{"id":10,"name":"%mc fait partie de %mn"},{"id":9,"name":"%mn est une partie de %mc"},{"id":0,"name":"%mc est en rapport avec %mn"},{"id":-1,"name":"%mn n'est pas lié à %mc"}],"center":{"id":28282,"name":"transbahuter"},"cloudsize":10,"cloud":[{"id":84632,"name":"camion"},{"id":61939,"name":"transbahutage"},{"id":104263,"name":"trimbaler"},{"id":44654,"name":"transporter"},{"id":38285,"name":"d\u00e9m\u00e9nageur"},{"id":43404,"name":"porter"},{"id":63192,"name":"transports"},{"id":130473,"name":"enthousiasmer"},{"id":90461,"name":"se trimbaler"},{"id":134609,"name":"baguenauder"}]}] +\ No newline at end of file diff --git a/code/serveur/php/pticlic.php b/code/serveur/php/pticlic.php @@ -2,6 +2,7 @@ require_once("relations.php"); require_once("db.php"); +require_once("ressources/errors.inc") /* Les prototypes des fonctions : * ===============================> @@ -40,7 +41,7 @@ require_once("db.php"); function checkLogin($user, $passwd) { $db = getDB(); $hashPasswd = md5($passwd); - $loginIsOk = ($hashPasswd == $db->querySingle("SELECT hash_passwd FROM user WHERE login='".$user."';")); + $loginIsOk = ($hashPasswd == $db->querySingle(sqlGetPassword($user))); return $loginIsOk; } @@ -50,7 +51,7 @@ function checkLogin($user, $passwd) { function randomCenterNode() { $db = getDB(); - return $db->querySingle("select eid from random_center_node where rowid = (abs(random()) % (select max(rowid) from random_center_node))+1;"); + return $db->querySingle(sqlGetEIDCenterNode()); } /** Selectionne aléatoirement un noeud d'un nuage. @@ -59,7 +60,7 @@ function randomCenterNode() function randomCloudNode() { $db = getDB(); - return $db->querySingle("select eid from random_cloud_node where rowid = (abs(random()) % (select max(rowid) from random_cloud_node))+1;"); + return $db->querySingle(sqlGetEIRCloudNode()); } /** @@ -75,32 +76,16 @@ function cgBuildResultSets($cloudSize, $centerEid, $r1, $r2) // Le select doit ranvoyer trois colonnes : // eid => l'eid du mot à mettre dans le nuage, // r1 => la probabilité pour que le mot soit dans r1, entre -1 et 1 (négatif = ne devrait pas y être, positif = devrait y être à coup sûr, 0 = on sait pas). - $typer1r2 = "type in ($r1, $r2)"; - $banned_types = "4, 12, 36, 18, 29, 45, 46, 47, 48, 1000, 1001"; $sources = array( - // Voisins 1 saut du bon type (= relations déjà existantes) - array('w'=>40, 'd'=>1, 's'=>"select end as eid, type = $r1 as r1, type = $r2 as r2, 0 as r0, 0 as trash from relation where start = $centerEid and $typer1r2 order by random();"), - // Voisins 1 saut via r_associated (0), donc qu'on voudrait spécifier si possible. - array('w'=>40, 'd'=>2, 's'=>"select end as eid, 0.25 as r1, 0.25 as r2, 0.5 as r0, 0 as trash from relation where start = $centerEid and type = 0 order by random();"), - // Voisins 1 saut via les autres relations - array('w'=>20, 'd'=>3.1, 's'=>"select end as eid, 0.1 as r1, 0.1 as r2, 0.8 as r0, 0 as trash from relation where start = $centerEid and type not in (0, $r1, $r2, $banned_types) order by random();"), - // Voisins 2 sauts, avec un mix de R1 et R2 pour les liens. Par ex [ A -R1-> B -R2-> C ] ou bien [ A -R2-> B -R2-> C ] - // Version optimisée de : "select end as eid from relation where $typer1r2 and start in oneHopWithType order by random();" - array('w'=>30, 'd'=>3.2, 's'=>"select B.end as eid, ((A.type = $r1) + (B.type = $r1)) / 3. as r1, ((A.type = $r2) + (B.type = $r2)) / 3. as r2, 1/6. as r0, 1/6. as trash from relation as A, relation as B where A.start = $centerEid and A.$typer1r2 and B.start = A.end and B.$typer1r2 order by random();"), - // Voisins 1 saut r1/r2 + 1 saut synonyme - // Version optimisée de : "select end as eid from relation where start in oneHopWithType and type = 5 order by random()"; - array('w'=>20, 'd'=>5, 's'=>"select B.end as eid, (A.type = $r1) * 0.75 as r1, (A.type = $r2) * 0.75 as r2, 0.25 as r0, 0 as trash from relation as A, relation as B where A.start = $centerEid and A.$typer1r2 and B.start = A.end and B.type = 5 order by random();"), - // Version optimisée de : "select end as eid from relation where start in (select end from relation where start = $centerEid and type = 5) and $typer1r2 order by random();" - array('w'=>20, 'd'=>6, 's'=>"select B.end as eid, (B.type = $r1) * 0.75 as r1, (B.type = $r2) * 0.75 as r2, 0.25 as r0, 0 as trash from relation as A, relation as B where A.start = $centerEid and A.type = 5 and B.start = A.end and B.$typer1r2 order by random();"), - // Voisins 2 sauts (tous) - // Version optimisée de : "select end as eid, 0.1 as r1, 0.1 as r2, 0.3 as r0, 0.5 as trash from relation where start in (select end from relation where start = $centerEid and type not in ($banned_types)) and type not in ($banned_types) order by random();" - array('w'=>10, 'd'=>8, 's'=>"select x as eid, 0.1 as r1, 0.1 as r2, 0.3 as r0, 0.5 as trash from (select x from (select X.eid + Y.dumb as x from (select B.end as eid from relation as A, relation as B where A.type not in ($banned_types) and A.start = $centerEid and B.type not in ($banned_types) and B.start = A.end limit ".($cloudSize*4).") as X, (select 0 as dumb) as Y)) order by random();"), - // Centre pointe vers X, M pointe vers X aussi, on prend M. - // Version optimisée de : "select start as eid from relation where end in (select end from relation where start = $centerEid) and type not in ($banned_types) order by random();" - // Ce n'est toujours pas ça… : "select eid from (select B.start as eid from relation as A, relation as B where A.type not in ($banned_types) and A.start = $centerEid and B.type not in ($banned_types) and B.end = A.end limit 1) order by random();" - // Tordu, mais ça marche \o/ . En fait il faut empêcher l'optimiseur de ramener le random avant le limit (et l'optimiseur est malin… :) - array('w'=>10, 'd'=>8, 's'=>"select x as eid, 0.1 as r1, 0.1 as r2, 0.2 as r0, 0.6 as trash from (select x from (select X.eid + Y.dumb as x from (select B.start as eid from relation as A, relation as B where A.type not in ($banned_types) and A.start = $centerEid and B.type not in ($banned_types) and B.end = A.end limit ".($cloudSize*4).") as X, (select 0 as dumb) as Y)) order by random();"), + array('w'=>40, 'd'=>1, 's'=>sql1JumpGoodType($r1, $r2, $centerEid)), + array('w'=>40, 'd'=>2, 's'=>sql1JumpViaRAssociated0($centerEid)), + array('w'=>20, 'd'=>3.1, 's'=>sql1JumpViaOtherRelation($centerEid, $r1, $r2, $banned_types)), + array('w'=>30, 'd'=>3.2, 's'=>sql2JumpWithMixR1R2ForLinks($r1, $r2, $centerEid)), + array('w'=>20, 'd'=>5, 's'=>sql1JumpR1DivR2Plus1JumpSynonymOneHopWithType($r1, $r2, $centerEid)), + array('w'=>20, 'd'=>6, 's'=>sql1JumpR1DivR2Plus1JumpSynonym($r1, $r2, $centerEid)), + array('w'=>10, 'd'=>8, 's'=>sql2JumpAll($centerEid, $cloudSize)), + array('w'=>10, 'd'=>8, 's'=>sqlXPointsToMMPointsToXTakeM($cloudSize)), 'rand' => array('w'=>5, 'd'=>10, 's'=>false) // random. Le r1 et r2 de random sont juste en-dessous ); @@ -216,7 +201,7 @@ function cgBuildCloud($centerEid, $cloudSize, $sources, $sumWeights) $rejected = false; // Ne pas mettre le mot central dans le nuage. if ($res['eid'] == $centerEid) { continue; } - $nodeName = $db->querySingle("select name from node where eid=".$res['eid'].";"); + $nodeName = $db->querySingle(sqlGetNameFromNode($res)); if (substr($nodeName, 0, 2) == "::") { continue; } foreach ($cloud as $c) { if ($c['eid'] == $res['eid']) { @@ -302,7 +287,7 @@ function cgInsert($centerEid, $cloud, $r1, $r2, $totalDifficulty) */ function randomGameCore() { $db = getDB(); - return $db->querySingle("select gid from game where gid = (abs(random()) % (select max(gid) from game))+1 or gid = (select max(gid) from game where gid > 0) order by gid limit 1;"); + return $db->querySingle(sqlGetGidFromGame()); } /** Sélection aléatoire d'une partie de la base de données parmis les parties à jouer. @@ -320,7 +305,7 @@ function randomGame() $gid = randomGameCore(); if ($gid === null) - throw new Exception("Erreur lors de la récupération de la partie. Vérifiez qu'il y a au moins une partie.", 6); + errGetGame(); } return $gid; } @@ -337,11 +322,11 @@ function formatWord($word) { while (($pos = strpos($word, ">")) !== false) { $res .= substr($word,0,$pos) . " ("; $eid = intval(substr($word,$pos+1)); - if ($eid == 0) { throw new Exception("Erreur lors du suivi des pointeurs de spécialisation du mot $word.", 7); } - if (in_array($eid, $stack)) { throw new Exception("Boucle rencontrée lors du suivi des pointeurs de spécialisation du mot $word.", 8); } - if (count($stack) > 10) { throw new Exception("Trop de niveaux de récursions lors du suivi des pointeurs de spécialisation du mot $word.", 9); } + if ($eid == 0) { errFollowingPointer($word); } + if (in_array($eid, $stack)) { errLoopDetected($word); } + if (count($stack) > 10) { errTooMuchRecursion($word); } $stack[] = $eid; - $word = $db->querySingle("select name from node where eid = $eid"); + $word = $db->querySingle(sqlGetNameFromNodeWithEid($eid)); } $res .= $word; @@ -364,8 +349,7 @@ function game2json($user, $gameId) $db->exec("INSERT INTO played_game(pgid, gid, login, timestamp) VALUES (null, ".$gameId.", '$user', -1);"); $pgid = $db->lastInsertRowID(); - // TODO Yoann : faire des tests d'erreur pour ces select ? - $game = $db->query("select gid, (select name from node where eid = eid_central_word) as name_central_word, eid_central_word, relation_1, relation_2 from game where gid = ".$gameId.";"); + $game = $db->query(sqlGetGamesForId($gameId)); $game = $game->fetchArray(); $retstr = ""; @@ -373,7 +357,7 @@ function game2json($user, $gameId) $retstr .= '"center":{"id":'.$game['eid_central_word'].',"name":'.json_encode(''.formatWord($game['name_central_word'])).'},'; $retstr .= '"cloudsize":10,"cloud":['; // TODO ! compter dynamiquement. - $res = $db->query("select eid_word,(select name from node where eid=eid_word) as name_word from game_cloud where gid = ".$gameId.";"); + $res = $db->query(sqlGetWordEidAndName($gameId)); $notfirst = false; while ($x = $res->fetchArray()) @@ -403,7 +387,7 @@ function game2array($user, $gameId) $pgid = $db->lastInsertRowID(); // TODO Yoann : faire des tests d'erreur pour ces select ? - $game = $db->query("select gid, (select name from node where eid = eid_central_word) as name_central_word, eid_central_word, relation_1, relation_2 from game where gid = ".$gameId.";"); + $game = $db->query(sqlGetGamesForId($gameId)); $game = $game->fetchArray(); $ret = array(); @@ -416,7 +400,7 @@ function game2array($user, $gameId) $ret['center'] = array('id' => $game['eid_central_word'], 'name' => formatWord($game['name_central_word'])); $ret['cloud'] = array(); // TODO ! compter dynamiquement. - $res = $db->query("select eid_word,(select name from node where eid=eid_word) as name_word, num, difficulty, totalWeight, probaR1, probaR2, probaR0, probaTrash from game_cloud where gid = ".$gameId.";"); + $res = $db->query(sqlGetInformationAboutGame($gameId)); while ($x = $res->fetchArray()) { @@ -533,11 +517,11 @@ function normalizeProbas($row) { function setGame($user, $pgid, $gid, $answers) { $db = getDB(); - if ('ok' !== $db->querySingle("SELECT 'ok' FROM played_game WHERE pgid = $pgid and $gid = $gid and login = '$user' and timestamp = -1;")) { + if ('ok' !== $db->querySingle(sqlGameIsOK($pgid, $gid, $user))) { return getGameScores($user, $pgid, $gid); } - $userReputation = computeUserReputation($db->querySingle("SELECT score FROM user WHERE login='".$user."';")); + $userReputation = computeUserReputation($db->querySingle(sqlGetScoreForUser($user))); $db->exec("begin transaction;"); $db->exec("update played_game set timestamp = ".time()." where pgid = $pgid;"); @@ -557,7 +541,7 @@ function setGame($user, $pgid, $gid, $answers) $num = intval($row['num']); $nbScores++; if (!isset($answers[$num])) { - throw new Exception("Cette requête \"Set partie\" ne donne pas de réponse (une relation) pour le mot numéro $num de la partie.", 5); + errSetPartiNoRelation($num); } $relanswer = intval($answers[$num]); @@ -567,7 +551,7 @@ function setGame($user, $pgid, $gid, $answers) case $r2: $answer = 1; $probaRx = "probaR2"; break; case $r0: $answer = 2; $probaRx = "probaR0"; break; case $trash: $answer = 3; $probaRx = "probaTrash"; break; - default: throw new Exception("Réponse ($relanswer) invalide pour le mot $num. Les réponses possibles sont : $r1, $r2, $r0, $trash", 5); + default: errAnswerInvalidForWord($r1, $r2, $r0, $trash); } $wordScore = computeScore(normalizeProbas($row), $row['difficulty'], $answer, $userReputation); @@ -589,17 +573,17 @@ function setGame($user, $pgid, $gid, $answers) function getGameScores($user, $pgid, $gid) { $db = getDB(); - $timestamp = $db->querySingle("SELECT timestamp FROM played_game WHERE pgid = $pgid and $gid = $gid and login = '$user';"); + $timestamp = $db->querySingle(sqlGetPlayedGameTime($pgid, $gid, $user)); if ($timestamp == -1) { - throw new Exception("Cette partie n'a jamais été jouée.", 4); // TODO : code d'erreur en doublon avec celui ci-dessous. + errGameNeverPlayed(); } else if ($timestamp == null) { - throw new Exception("Cette partie n'est associée à votre nom d'utilisateur.", 4); + errGameNotAssociatedWithUser(); } $gameScore = 0; $scores = array(); $nbScores = 0; - $res = $db->query("SELECT num,score from played_game_cloud where pgid = $pgid and gid = $gid;"); + $res = $db->query(sqlGetNumAndScoreFromGame($pgid, $gid)); while ($row = $res->fetchArray()) { $nbScores++; @@ -665,7 +649,7 @@ function setGameGetScore($user, $pgid, $gid, $answers) { function insertNode($node) { $db = getDB(); - if($db->querySingle("SELECT eid FROM node WHERE name='".SQLite3::escapeString($node)."'") == null) { + if($db->querySingle(sqlGetEidFromNode($node)) == null) { $db->exec("INSERT INTO node(name,type,weight) VALUES('".SQLite3::escapeString($node)."',1,50);"); return true; } @@ -681,7 +665,7 @@ function insertNode($node) { function getNodeEid($node) { $db = getDB(); - return $db->querySingle("SELECT eid FROM node WHERE name='".SQLite3::escapeString($node)."';"); + return $db->querySingle(sqlGetEidFromNode($node)); } function wordExist($node) { diff --git a/code/serveur/php/relations.php b/code/serveur/php/relations.php @@ -1,45 +1,46 @@ <?php $stringRelations = array( - -1 => "Mot non lié à 'mot central'", - 0 => "'mot central' est en rapport avec...", - //1 => "raffinement sémantique", // pas utilisé - //2 => "raffinement morphologique", // pas utilisé - //3 => "domaine", // pas utilisé - //4 => "r_pos", // pas utilisé - 5 => "'mot central' est un synonyme de...", - 6 => "'mot central' est une sorte de...", - 7 => "Un contraire de 'mot central' est...", - 8 => "Un spécifique de 'mot central' est...", - 9 => "... est une partie de 'mot central'", - 10 => "'mot central' fait partie de...", - //11 => "locution", // pas utilisé - //12 => "potentiel de FL", // pas utilisé - 13 => "Quoi/Qui pourrait 'mot central'", - //14 => "action>patient", // pas utilisé - 15 => "Le lieu pour 'mot central' est...", - 16 => "Un instrument pour 'mot central' est...", - 17 => "Un caractéristique de 'mot central' est...", - //18 => "r_data", // pas utilisé - //19 => "r_lemma", // pas utilisé - //20 => "magn", // pas utilisé - //21 => "antimagn", // pas utilisé - 22 => "'mot central' est de la même famille que...", - //29 => "predicat", // pas utilisé - //30 => "lieu>action", // pas utilisé - //31 => "action>lieu", // pas utilisé - //32 => "sentiment", // pas utilisé - //33 => "erreur", // pas utilisé - //34 => "manière", // pas utilisé - //35 => "sens/signification", // pas utilisé - //36 => "information potentielle", // pas utilisé - //37 => "rôle télique", // pas utilisé - //38 => "rôle agentif", // pas utilisé - //41 => "conséquence", // pas utilisé - //42 => "cause", // pas utilisé - //52 => "succession", // pas utilisé - //53 => "produit", // pas utilisé - //54 => "est le produit de", // pas utilisé - //55 => "s'oppose à" - ); + -1 => "%mn n'est pas lié à %mc", + 0 => "%mc est en rapport avec %mn", + //1 => "raffinement sémantique", // pas utilisé + //2 => "raffinement morphologique", // pas utilisé + //3 => "domaine", // pas utilisé + //4 => "r_pos", // pas utilisé + 5 => "%mc est un synonyme de %mn", + 6 => "%mc est une sorte de %mn", + 7 => "Un contraire de %mc est %mn", + 8 => "Un spécifique de %mc est %mn", + 9 => "%mn est une partie de %mc", + 10 => "%mc fait partie de %mn", + //11 => "locution", // pas utilisé + //12 => "potentiel de FL", // pas utilisé + 13 => "Quoi/Qui pourrait %mc", + //14 => "action>patient", // pas utilisé + 15 => "Le lieu pour %mc est %mn", + 16 => "Un instrument pour %mc est %mn", + 17 => "Un caractéristique de %mc est %mn", + //18 => "r_data", // pas utilisé + //19 => "r_lemma", // pas utilisé + //20 => "magn", // pas utilisé + //21 => "antimagn", // pas utilisé + 22 => "%mc est de la même famille que %mn", + //29 => "predicat", // pas utilisé + //30 => "lieu>action", // pas utilisé + //31 => "action>lieu", // pas utilisé + //32 => "sentiment", // pas utilisé + //33 => "erreur", // pas utilisé + //34 => "manière", // pas utilisé + //35 => "sens/signification", // pas utilisé + //36 => "information potentielle", // pas utilisé + //37 => "rôle télique", // pas utilisé + //38 => "rôle agentif", // pas utilisé + //41 => "conséquence", // pas utilisé + //42 => "cause", // pas utilisé + //52 => "succession", // pas utilisé + //53 => "produit", // pas utilisé + //54 => "est le produit de", // pas utilisé + //55 => "s'oppose à" +); + ?> \ No newline at end of file diff --git a/code/serveur/php/ressources/errors.inc b/code/serveur/php/ressources/errors.inc @@ -0,0 +1,43 @@ +function errRequestIncomplete() { + throw new Exception("La requête est incomplète", 1); +} + +function errUserUnknownOrBadPassword() { + throw new Exception("Utilisateur non enregistré ou mauvais mot de passe", 2); +} + +function errGameNeverPlayed() { + throw new Exception("Cette partie n'a jamais été jouée.", 3); // TODO : code d'erreur en doublon avec celui ci-dessous. +} + +function errGameNotAssociatedWithUser() { + throw new Exception("Cette partie n'est pas associée à votre nom d'utilisateur.", 4); +} + +function errAnswerInvalidForWord($r1, $r2, $r0, $trash) { + throw new Exception("Réponse ($relanswer) invalide pour le mot $num. Les réponses possibles sont : $r1, $r2, $r0, $trash", 5); +} + +function errSetPartiNoRelation($num) { + throw new Exception("Cette requête \"Set partie\" ne donne pas de réponse (une relation) pour le mot numéro $num de la partie.", 6); +} + +function errGetGame() { + throw new Exception("Erreur lors de la récupération de la partie. Vérifiez qu'il y a au moins une partie.", 7); +} + +function errFollowingPointer($word) { + throw new Exception("Erreur lors du suivi des pointeurs de spécialisation du mot $word.", 8); } +} + +function errLoopDetected($word) { + throw new Exception("Boucle rencontrée lors du suivi des pointeurs de spécialisation du mot $word.", 9); } +} + +function errTooMuchRecursion($word) { + throw new Exception("Trop de niveaux de récursions lors du suivi des pointeurs de spécialisation du mot $word.", 10); } +} + +function errUnknownCommand() { + throw new Exception("Commande inconnue", 11); +} diff --git a/code/serveur/php/ressources/sql.inc b/code/serveur/php/ressources/sql.inc @@ -0,0 +1,119 @@ +$typer1r2 = "type in ($r1, $r2)"; +$banned_types = "4, 12, 36, 18, 29, 45, 46, 47, 48, 1000, 1001"; + +function sqlGetPassword($user) { + return "SELECT hash_passwd FROM user WHERE login='".$user."';"; +} + +function sqlGetEIDCenterNode() { + return "select eid from random_center_node where rowid = (abs(random()) % (select max(rowid) from random_center_node))+1;"; +} + +function sqlGetEIRCloudNode() { + return "select eid from random_cloud_node where rowid = (abs(random()) % (select max(rowid) from random_cloud_node))+1;"; +} + +// Voisins 1 saut du bon type (= relations déjà existantes) +function sql1JumpGoodType($r1, $r2, $centerEid) { + global $typer1r2; + + return "select end as eid, type = $r1 as r1, type = $r2 as r2, 0 as r0, 0 as trash from relation where start = $centerEid and $typer1r2 order by random();"; +} + +// Voisins 1 saut via r_associated (0), donc qu'on voudrait spécifier si possible. +function sql1JumpViaRAssociated0($centerEid) { + return "select end as eid, 0.25 as r1, 0.25 as r2, 0.5 as r0, 0 as trash from relation where start = $centerEid and type = 0 order by random();"; +} + +// Voisins 1 saut via les autres relations +function sql1JumpViaOtherRelation($centerEid, $r1, $r2) { + global $banned_types; + + return "select end as eid, 0.1 as r1, 0.1 as r2, 0.8 as r0, 0 as trash from relation where start = $centerEid and type not in (0, $r1, $r2, $banned_types) order by random();"; +} + +// Voisins 2 sauts, avec un mix de R1 et R2 pour les liens. Par ex [ A -R1-> B -R2-> C ] ou bien [ A -R2-> B -R2-> C ] +// Version optimisée de : "select end as eid from relation where $typer1r2 and start in oneHopWithType order by random();" +function sql2JumpWithMixR1R2ForLinks($r1, $r2, $centerEid) { + global $typer1r2; + + return "select B.end as eid, ((A.type = $r1) + (B.type = $r1)) / 3. as r1, ((A.type = $r2) + (B.type = $r2)) / 3. as r2, 1/6. as r0, 1/6. as trash from relation as A, relation as B where A.start = $centerEid and A.$typer1r2 and B.start = A.end and B.$typer1r2 order by random();"; +} + +// Voisins 1 saut r1/r2 + 1 saut synonyme +// Version optimisée de : "select end as eid from relation where start in oneHopWithType and type = 5 order by random()"; +function sql1JumpR1DivR2Plus1JumpSynonymOneHopWithType($r1, $r2, $centerEid) { + global $typer1r2; + + return "select B.end as eid, (A.type = $r1) * 0.75 as r1, (A.type = $r2) * 0.75 as r2, 0.25 as r0, 0 as trash from relation as A, relation as B where A.start = $centerEid and A.$typer1r2 and B.start = A.end and B.type = 5 order by random();"; +} + +// Version optimisée de : "select end as eid from relation where start in (select end from relation where start = $centerEid and type = 5) and $typer1r2 order by random();" +function sql1JumpR1DivR2Plus1JumpSynonym($r1, $r2, $centerEid) { + global $typer1r2; + + return "select B.end as eid, (B.type = $r1) * 0.75 as r1, (B.type = $r2) * 0.75 as r2, 0.25 as r0, 0 as trash from relation as A, relation as B where A.start = $centerEid and A.type = 5 and B.start = A.end and B.$typer1r2 order by random();"; +} + +// Voisins 2 sauts (tous) +// Version optimisée de : "select end as eid, 0.1 as r1, 0.1 as r2, 0.3 as r0, 0.5 as trash from relation where start in (select end from relation where start = $centerEid and type not in ($banned_types)) and type not in ($banned_types) order by random();" +function sql2JumpAll($centerEid, $cloudSize) { + global $banned_types; + + return "select x as eid, 0.1 as r1, 0.1 as r2, 0.3 as r0, 0.5 as trash from (select x from (select X.eid + Y.dumb as x from (select B.end as eid from relation as A, relation as B where A.type not in ($banned_types) and A.start = $centerEid and B.type not in ($banned_types) and B.start = A.end limit ".($cloudSize*4).") as X, (select 0 as dumb) as Y)) order by random();"; +} + +// Centre pointe vers X, M pointe vers X aussi, on prend M. +// Version optimisée de : "select start as eid from relation where end in (select end from relation where start = $centerEid) and type not in ($banned_types) order by random();" +// Ce n'est toujours pas ça… : "select eid from (select B.start as eid from relation as A, relation as B where A.type not in ($banned_types) and A.start = $centerEid and B.type not in ($banned_types) and B.end = A.end limit 1) order by random();" +// Tordu, mais ça marche \o/ . En fait il faut empêcher l'optimiseur de ramener le random avant le limit (et l'optimiseur est malin… :) +function sqlXPointsToMMPointsToXTakeM($cloudSize) { + global $banned_types; + + return "select x as eid, 0.1 as r1, 0.1 as r2, 0.2 as r0, 0.6 as trash from (select x from (select X.eid + Y.dumb as x from (select B.start as eid from relation as A, relation as B where A.type not in ($banned_types) and A.start = $centerEid and B.type not in ($banned_types) and B.end = A.end limit ".($cloudSize*4).") as X, (select 0 as dumb) as Y)) order by random();"; +} + +function sqlGetNameFromNode($res) { + return "select name from node where eid=".$res['eid'].";"; +} + +function sqlGetGidFromGame() { + return "select gid from game where gid = (abs(random()) % (select max(gid) from game))+1 or gid = (select max(gid) from game where gid > 0) order by gid limit 1;"; +} + +function sqlGetNameFromNodeWithEid($eid) { + return "select name from node where eid = $eid"; +} + +// TODO Yoann : faire des tests d'erreur pour ces select ? +function sqlGetGamesForId($gameId) { + return "select gid, (select name from node where eid = eid_central_word) as name_central_word, eid_central_word, relation_1, relation_2 from game where gid = ".$gameId.";"; +} + +function sqlGetWordEidAndName($gameId) { + return "select eid_word,(select name from node where eid=eid_word) as name_word from game_cloud where gid = ".$gameId.";"; +} + +function sqlGetInformationAboutGame($gameId) { + return "select eid_word,(select name from node where eid=eid_word) as name_word, num, difficulty, totalWeight, probaR1, probaR2, probaR0, probaTrash from game_cloud where gid = ".$gameId.";"; +} + +function sqlGameIsOK($pgid, $gid, $user) { + return "SELECT 'ok' FROM played_game WHERE pgid = $pgid and $gid = $gid and login = '$user' and timestamp = -1;"; +} + +function sqlGetScoreForUser($user) { + return "SELECT score FROM user WHERE login='".$user."';"; +} + +function sqlGetPlayedGameTime($pgid, $gid, $user) { + return "SELECT timestamp FROM played_game WHERE pgid = $pgid and $gid = $gid and login = '$user';"; +} + +function sqlGetNumAndScoreFromGame($pgid, $gid) { + return "SELECT num,score from played_game_cloud where pgid = $pgid and gid = $gid;"; +} + +function sqlGetEidFromNode($node) { + return "SELECT eid FROM node WHERE name='".SQLite3::escapeString($node)."'"; +} +\ No newline at end of file diff --git a/code/serveur/php/server.php b/code/serveur/php/server.php @@ -31,7 +31,7 @@ function logError($errNum, $msg, $other="") function main() { if(!isset($_GET['action']) || !isset($_GET['user']) || !isset($_GET['passwd'])) { - throw new Exception("La requête est incomplète", 2); + errRequestIncomplete(); } // Login @@ -39,7 +39,7 @@ function main() $user = SQLite3::escapeString($_GET['user']); $loginIsOk = checkLogin($user, $_GET['passwd']); if ($action != 3 && (!$loginIsOk)) { - throw new Exception("Utilisateur non enregistré ou mauvais mot de passe", 3); + errUserUnknownOrBadPassword(); } if ($action == 3) { echo '{"login_ok":' . ($loginIsOk ? 'true' : 'false') . '}'; @@ -53,7 +53,7 @@ function main() if ($action == 2) { // "Create partie" // Requête POST : http://serveur/server.php?action=2&nb=2&mode=normal&user=foo&passwd=bar if (!isset($_GET['nb']) || !isset($_GET['mode'])) { - throw new Exception("La requête est incomplète", 2); + errRequestIncomplete(); } createGame(intval($_GET['nb']), $_GET['mode']); echo '{"success":1}'; @@ -61,14 +61,14 @@ function main() else if($action == 0) { // "Get partie" // Requête POST : http://serveur/server.php?action=0&nb=2&mode=normal&user=foo&passwd=bar if(!isset($_GET['nb']) || !isset($_GET['mode'])) { - throw new Exception("La requête est incomplète", 2); + errRequestIncomplete(); } getGame($user, intval($_GET['nb']), $_GET['mode']); } else if($action == 1) { // "Set partie" // Requête POST : http://serveur/server.php?action=1&mode=normal&user=foo&passwd=bar&gid=1234&pgid=12357&0=0&1=-1&2=22&3=13&9=-1 if (!isset($_GET['pgid']) || !isset($_GET['gid'])) { - throw new Exception("La requête est incomplète", 2); + errRequestIncomplete(); } // TODO : il faudrait filtrer les paramètres qui correspondent à une réponse // au lieu d'envoyer $_GET en entier, mais on ne connaît pas leur nom à l'avance. @@ -76,7 +76,7 @@ function main() } else if($action == 4) { // CheckWord if (!isset($_GET['word'])) - throw new Exception("La requête est incomplète", 2); + errRequestIncomplete(); if(wordExist($_GET['word'])) echo true; @@ -87,10 +87,8 @@ function main() echo getGameRelationsJSON(); } else { - throw new Exception("Commande inconnue", 2); - } - - + errUnknownCommand(); + } } function server() { diff --git a/organisation/notes b/organisation/notes @@ -1,3 +1,5 @@ +2010-03-29 : TODO : s'assurer dans le serveur que les mots du nuage sont envoyés dans l'ordre, et que les num sont *toujours* entre 0..n + NOTES DES PREMIERES REUNIONS (IL ME SEMBLE) GEORGES'S NOTEBOOK (en vrac) @@ -68,7 +70,6 @@ version glisser-déposer le mot sur relation ****************** - BUG : dans les parties qu'on génère, la somme des poids doit toujours être 2, or il y en a certaines où c'est 0 !?!