diff --git a/resources/library/applications/GraphMe.wgt/Grapheur.html b/resources/library/applications/GraphMe.wgt/Grapheur.html
new file mode 100644
index 00000000..23232fff
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/Grapheur.html
@@ -0,0 +1,921 @@
+
+
+
+
+
+
+
+ GraphMe
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GraphMe
+
+
+
+
+ Functions
+
+
+
+
+ Display
+
+
+
+
+ Help
+
+
+
+
+
+
+ 3D
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/library/applications/GraphMe.wgt/Grapheur.xhtml b/resources/library/applications/GraphMe.wgt/Grapheur.xhtml
deleted file mode 100644
index bfca757c..00000000
--- a/resources/library/applications/GraphMe.wgt/Grapheur.xhtml
+++ /dev/null
@@ -1,1586 +0,0 @@
-
-
-
-
-
-
-
-
- Graphics
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Function:
-
-
-
- ^
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ▲
- ◀
- ▼
- ▶
-
-
-
- o
-
-
-
- 3D
-
-
-
-
diff --git a/resources/library/applications/GraphMe.wgt/Guide_Utilisateur.html b/resources/library/applications/GraphMe.wgt/Guide_Utilisateur.html
index 2caf6a23..a6e2d64e 100644
--- a/resources/library/applications/GraphMe.wgt/Guide_Utilisateur.html
+++ b/resources/library/applications/GraphMe.wgt/Guide_Utilisateur.html
@@ -2,199 +2,200 @@
- GraphMe - User's guide.
+ GraphMe - Guide utilisateur
GraphMe
- User's guide
+ Guide d'utilisation
Introduction
Installation
- Review widget
- View presentation
- Drawing the function
- Offset function
- The options menu
- the tools menu
- Drawing some functions
- GraphMe update
+ Afficher le widget
+ Présentation de l'affichage
+ Dessiner une fonction
+ Se déplacer à travers la fonction
+ Le menu des options
+ Le menu des outils
+ Dessiner plusieurs fonctions
+ Mettre à jour GraphMe
Contact
1. Introduction
- GraphMe is a app that is developed using html, javascript and css. It can be used for drawing graphs. This document must explain how to use GraphMe. This app have a different functions and some useful advices for users.
+ GraphMe est un traceur de fonctions mathématiques que j'ai programmé dans le cadre du travail de maturité gymnasiale. Il est codé en HTML, CSS et JavaScript. Ce grapheur est disponible sur un cd-rom accompagnant mon travail de maturité ainsi que sur internet à la page http://gyb.educanet2.ch/tm-widgets/.ws_gen/?15 . Ce document a pour but d'expliquer comment utiliser GraphMe. Il présente ses différentes fonctions ainsi que quelques astuces utiles à l'utilisateur.
2. Installation
- This widget can be downloaded from the Internet in a packed format. Before using it must be unpacked. GraphMe was developed for using in web-browsers and integration in Sankore. To add this app in Sankore you should copy folder named "GraphMe.wgt" in "../library/interactive/". For example, on "windows OS" GraphMe must be in folder with following path: "C: / Program Files / Sankore 4/library/interactive/GraphMe.wgt". If you have no Sankore then you can get it on http://getuniboard.com/ .
-
+ Le widget que vous pouvez télécharger sur internet est compressé au format zip. Avant de l'utiliser, il est nécessaire de le décompresser. Si vous n'avez aucuns programmes permettant d'ouvrir les fichiers zip, vous pouvez télécharger 7zip sur http://www.7-zip.org/ . GraphMe a été conçu pour s'utiliser dans un navigateur internet ou s'intégrer à Uniboard. Pour l'ajouter aux widgets d'Uniboard, il faut copier le dossier « GraphMe.wgt » dans « library/interactive/ ». Par exemple, sous Windows, le widget doit être dans : « C:/Program Files/Uniboard 4/library/interactive/GraphMe.wgt ». Si vous n'avez pas Uniboard, vous pouvez l'obtenir sur http://getuniboard.com/ .
+
-
- Display GraphMe in browsers
+
+ Image de GraphMe dans un navigateur internet
- A) To display this app in browser just enough to open the file named "Grapheur.xhtml" (it's in root folder) with your browser. But some browsers can not display app correctly. Below is the list of browsers that are able to display app:
+ A) Pour afficher le widget dans un navigateur, il faut simplement ouvrir le fichier « Grapheur.xhtml » qui se trouve dans le dossier « GraphMe.wgt » avec votre navigateur internet. Toutefois, certains navigateurs n'arrivent pas à afficher le widget. La liste suivante contient les navigateurs sur lesquels le widget a été testé :
- Mozilla Firefox (3.5) : Everything works fine.
- Internet Explorer (8.0) : Cannot open a widget, because .xhtml format is not recognized.
- Internet Explorer (pré-version 9.0) : Widget works but just using SVG. Canvas not supported yet.
- Konqueror (4.3.4) : Widget can be opened but there is some problems with displaying. It still occur when choosed display method "canvas".
- Opera (10.51) : Widget quite useful.
- Google Chrome (4.1) : Everything works very nice! 3D-display is faster as compared with other browsers.
+ Mozilla Firefox (3.5) : tout fonctionne très bien.
+ Internet Explorer (8.0) : impossible d'ouvrir le widget, le format .xhtml n'est pas reconnu.
+ Internet Explorer (pré-version 9.0) : le widget est ouvrable mais seul l'affichage utilisant SVG fonctionne, « canvas » n'est toujours pas supporté.
+ Konqueror (4.3.4) : le widget s'ouvre mais il y a quelques problèmes d'affichage. Il est quand même utilisable en sélectionnant la méthode d'affichage « canvas » dans les options.
+ Rekonq (0.5) : le widget fonctionne très bien avec « canvas » mais est un peut lent en utilisant SVG.
+ Opera (10.51) : le widget est parfaitement utilisable
+ Google Chrome (4.1) : tout fonctionne également. L'affichage 3D est même très rapide comparé à d'autres navigateurs.
- B) To open widget in Sankore you should first open folder "Application" that is at the left of the screen. Then you must find this app and add it to the page.
+ B) Pour ouvrir le widget dans Uniboard, il faut tout d'abord cliquer sur le bouton « Bibliothèque » en haut de la fenêtre. Ensuite, allez dans l'onglet « Interactif » ou autrement, selon les version d'Uniboard, dans l'onglet « Applications ». Cliquez sur l'icône correspondant à « Traceur de fonctions mathématiques » et finalement sur « Ajouter à la page ».
- Display GraphMe in Sankore
+ Image de GraphMe dans Uniboard
- 4. View presentation
+ 4. Présentation de l'affichage
- Place for functions display.
- Button for beginning the work.
- Button for adding new function or for getting access to functions history.
- Display.
- Parameters that define the part of graph that will be displayed.
- Buttons for zoom.
- Button for color changing.
- Buttons for access to menu.
- Tab-button that toggles 2D and 3D modes.
- Button for maximize the widget.
+ Champ permettant de définir la fonction à afficher.
+ Bouton affichant la fonction.
+ Bouton servant à ajouter une nouvelle fonction ou à accéder à l'historique des fonctions.
+ Zone d'affichage.
+ Options d'affichage permettant de définir la partie de la fonction à afficher.
+ Boutons de zoom.
+ Bouton servant à changer la couleur.
+ Boutons accédant aux différents menus.
+ Onglet choisissant entre les fonctions 2D et 3D.
+ Bouton de maximisation du widget.
- 5. Drawing the function
+ 5. Dessiner une fonction
- To draw mathematical function just enter it at the top of widget and press button "Display". You can use different functions and predefined constants.
+ Pour dessiner une fonction mathématique, il suffit d'entrer celle-ci dans le champ en haut du widget et de cliquer sur le bouton « Afficher ». On peut utiliser différentes fonctions et constantes prédéfinies:
- Basic operations:
+ Les opérations de base
- Addition → +
- Subtraction → -
- Multiplication → *
- Division → /
- Mod → %
+ l'addition → +
+ la soustraction → -
+ la multiplication → *
+ la division → /
+ le modulo → %
- Trigonometric functions
+ Les fonctions trigonométriques
sin(x), cos(x), tan(x), cot(x)
asin(x), acos(x), atan(x), acot(x) ( ou arcsin(x), arccos(x), arctan(x), arccot(x) )
- Square roots and degrees
+ Les racines et les puissances
- sqrt(x) is square root from x
- pow(x, y). Variable x to the power y. For examle: x² → pow(x, 2) (x+3)⁵ → pow((x+3), 5)
- root(x, y). Root y of x
+ sqrt(x) fait la racine carrée de x
+ pow(x, y) élève un nombre x à une puissance y, par exemple : x² → pow(x, 2) (x+3)⁵ → pow((x+3), 5)
+ root(x, y) fait la racine yème d'un nombre x
- Exponential and logarithm
+ Les exponentielles et logarithmes
exp(x)
- ln(x) is natural logarithm.
- log(x) is decimal logarithm.
+ ln(x) est le logarithme naturel
+ log(x) est le logarithme de base 10
- Rounding
+ Les arrondis
- round(x) → rounding to the nearest whole number
- ceil(x) → rounding to the nearest whole number in a big way
- floor(x) → rounding to the nearest whole number the smaller side
+ round(x) → arrondit à l'entier le plus proche
+ ceil(x) → arrondit à l'entier supérieur
+ floor(x) → arrondit à l'entier inférieur
- Other predefined function
+ Autres fonctions prédéfinies
- abs(x) → Absolute number value
- random() → Return random number between 0 and 1
+ abs(x) → la valeur absolue d'un nombre
+ random() → retourne un nombre aléatoire entre 0 et 1
- Also are available some constants:
+ Les constantes
pi = 4 * atan(1) ≈ 3.141592653589793
e = exp(1) ≈ 2.718281828459045
- Not always it's easy to understand how to record a required function. Really if anywhere you err then graph will not displayed. Also do not forget about "*" (multiply) to multiply and "." (decimal point) to write point.
+ Il n'est pas toujours facile de comprendre comment écrire la fonction désirée. En effet, une petite faute et elle ne s'affichera pas. De plus, il ne faut pas oublier de mettre un « * » entre les thermes à multiplier et d'utiliser le point « . » pour écrire des nombres à virgule.
- The two-dimensional function must be written as y=[...] and the three-dimensional function nust be written as z=[...]. Other examples are available to use in menu "Help" if you have some difficulties with function definition.
+ Les fonctions en deux dimensions s'écrivent sous la forme : y=[...] et les fonctions en trois dimensions sous la forme : z=[...]. D'autres exemples sont disponibles dans le menu « aide » du widget si vous avez de la peine à entrer une fonction.
- 6. Offset function
+ 6. Se déplacer à travers la fonction
- Sometimes when you draw the function you don't see all necessary information about this function. In this case you can change position of graph.
+ Parfois, lorsqu'on dessine une fonction, la zone visible n'est pas très intéressante. Pour cela, il est utile de déplacer l'affichage ou de définir soi-même la zone à afficher.
- To move the function graph just use a navigation arrows that are in the four edges of the display or mouse move tool (menu Service).
+ Pour déplacer la fonction, il suffit d'utiliser les flèches de navigation situées dans les quatre bords de l'affichage ou l'outil de déplacement à la souris (dans le menu « Outils »).
- To define place to display you should enter a custom values in the left side of the widget. The left value must be less than the right value. In other case graph will not displayed.
+ Pour définir la zone à afficher, il faut entrer des valeurs personnalisées dans les champs à gauche du widget. La valeur de gauche doit obligatoirement être plus petite que la valeur de droite. Dans le cas contraire, la fonction ne se dessinera pas.
- You can increase or decrease the scale of displaying using buttons that are in the left menu. So you'll see more information about function. Zoom can be reset in options.
+ Il est possible de zoomer ou dé-zoomer l'affichage en utilisant les boutons du menu de gauche pour voir une plus grande partie de la fonction. Le zoom peut être réinitialisé dans les options. On peut également cliquer deux fois sur le graphique pour zoomer ainsi que dé-zoomer en maintenant la touche « ctrl » appuyée et en cliquant deux fois.
-
+
- To open the menu you should click a button "Options" that is in the left of the widget. If you click on this button again then menu will close. There are some buttons for navigation between options. Their short description:
+ Cliquez sur le bouton « Options » à gauche du widget pour ouvrir ce menu. En cliquant à nouveau sur le bouton, cela ferme le menu. Plusieurs onglets permettent de naviguer entre les différentes options. Description des options :
- Changing a background image and color. In Sankore changing background theme used for displaying widget on black and white background.
- Display-method used for defining displaying function. There are 6 possibilities:
+ Le thème du widget change l'image de fond ainsi que différentes couleurs. Dans Uniboard, changer le thème permet de rendre le widget plus visible selon qu'il se trouve sur un fond noir ou un fond blanc.
+ La méthode d'affichage permet de définir la façon dont le graphique de la fonction sera dessiné. Il y a le choix entre six possibilités :
- SVG is a vector format of image and it can be built in HTML-page. It's compatible in most of browsers and Sankore support it very well so is it selected default.
- There is a big difference between SVG (image) and display method SVG. If you have a compatibility problems then you should not use this method.
- "Canvas" is a new tag that used in HTML 5.0. It define a area in which you can place some images. This display-method is faster than SVG-method, but Sankore does not fully support it. It's desirable to choose this method when you use no Sankore widget.
- "Canvas" (point) also uses a canvas but draws a points instead of lines.
- XPM format is little known so it's compatible just with a minority of browsers.
- Display method "Uniboard" allows to draw directly on the page using Sankore drawing.
+ SVG est un format d'image vectoriel qui peut être intégré dans une page HTML. Il est compatible dans la plupart des navigateurs Internet et est très bien supporté par Uniboard, c'est pourquoi il est choisi par défaut.
+ « SVG (une image) » ne présente que peu de différence avec la méthode d'affichage « SVG ». A moins d'un problème de compatibilité, il n'est pas très utile de la choisir.
+ Canvas est une nouvelle balise présente depuis HTML 5.0. Elle permet de définir une zone dans laquelle on peut faire des dessins. Cette méthode d'affichage est plus rapide que d'utiliser du SVG, cependant, elle n'est pas complètement compatible dans Uniboard. Il est conseillé de choisir cette option si vous utilisez le widget ailleurs que dans Uniboard.
+ Canvas (point) utilise aussi canvas, mais dessine des points à la place de lignes.
+ XPM est un format d'image très peu connu. De ce fait, il est compatible qu'avec une minorité de navigateur.
+ La méthode d'affichage « Uniboard » permet de dessiner directement sur la page d'Uniboard avec les outils de dessins.
- Default zoom button returns display into original state. It helps alsoto return to the origin.
- Display options allow to display or not a grid, axis and scale. They make a mapping more readable. Also you can change the thickness of function line.
- Offset of graph not used usually. But if you use it then you can move a mapping in any direction when a center isn't in the right place. It's avaliable in some browsers.
- The accuracy of calculations of the graph will increase or decrease the number of points calculated. The higher the number, the more accuracy. It is useful to set this value to "0.01" if you draw functions like 0.5 * sin (10 * x * x).
- Options in 3D, the display style to choose how the function is designed: with small points or polygons (areas). Most functions are prettier drawing surface between the points calculated. However, it is better to draw points for functions such as the hemisphere: sqrt (12 - x*x - y*y).
- In the last tab you can change such options 3D, as the accuracy of the calculations and the color of the function.
+ Le zoom par défaut ainsi que le bouton « réinitialiser le zoom » permettent de remettre l'affichage à l'état qu'il était à l'ouverture du widget. Cela permet aussi de centrer l'affichage sur l'origine.
+ Les options d'affichage permettent d'afficher ou non la grille, les axes ainsi que l'échelle. Elles sont utiles pour rendre l'affichage plus lisible. Il est également possible de modifier l'épaisseur du trait de la fonction.
+ Le décalage du graphique n'a en principe pas besoin d'être utilisé. Il permet de déplacer tout l'affichage dans un sens ou dans l'autre, s'il n'est pas centré à la bonne place. Cela peut arriver avec certains navigateurs Internet.
+ La précision des calculs du graphique permet d'augmenter ou de diminuer le nombre de points calculés. Plus le nombre est petit, plus la précision est grande. Il est utile de mettre cette valeur à « 0.01 » si vous dessinez des fonctions ressemblant à 0.5*sin(10*x*x).
+ Dans les options 3D, le style d'affichage permet de choisir comment la fonction est dessinée : avec des petits points ou avec des polygones (surfaces). La plupart des fonctions sont plus jolies en dessinant la surface entre les points calculés. Toutefois, c'est mieux de dessiner des points pour des fonctions comme la demi-sphère : sqrt(12-x*x-y*y).
+ Dans le dernier onglet, vous pouvez modifier d'autres options 3D, comme la précision des calculs ainsi que la couleur de la fonction.
-
+
- This menu allows you to choose first action of the mouse on the graph. There is a choice of three options:
+ Ce menu permet tout d'abord de choisir l'action de la souris sur le graphique. Il y a le choix entre trois possibilités :
- The selected tool is the default. By moving the mouse, a point moves on the function and the coordinates of this point are shown in the top left of the display.
- The second tool is moving. It allows you to move the chart with the mouse. Just keep clicking on the display and move the mouse. Unfortunately, this tool can be slow on some browsers.
- The third tool is the tangent. This tool draws the tangent to the function at the point where is a mouse cursor.
+ L'outil sélectionné par défaut est le point. En bougeant la souris, un point se déplace sur la fonction et les coordonnées de ce point sont indiquées en haut à gauche de l'affichage.
+ Le deuxième outil est le déplacement. Il permet de déplacer le graphique avec la souris. Il suffit de tenir cliqué sur l'affichage et de bouger la souris. Malheureusement, cet outil peut être lent sur certains navigateurs.
+ Le troisième outil est la tangente. Cet outil dessine la tangente à la fonction au point où se trouve la souris.
- Then, this menu also allows to calculate a point of the function. Simply enter the coordinate "x" from the point where we want to find the coordinate "y" and press the "Evaluate". For example, if the function is "x * x" and that defined "x = 2", then the point whose coordinate on the X axis is "2" will be to coordinate on the Y axis "4".
+ Ensuite, ce menu permet aussi de calculer un point de la fonction. Il faut simplement entrer la coordonnée « x » du point dont on veut trouver la coordonnée « y », et appuyer sur le bouton « Évaluer ». Par exemple, si la fonction est « x*x » et qu'on défini « x=2 », alors le point dont la coordonnée sur l'axe des X est « 2 » aura comme coordonnée sur l'axe des Y « 4 ».
- Another useful tool is the analysis of function. To analyse the function click on "start the analysis". Analyses based on this widget are not 100% reliable, but are complementary to a analysis of function that you are doing yourself. It may be that this tool will be improved in a future version of the widget.
+ Un autre outil très utile est l'étude de fonction. Pour étudier la fonction entrée dans le champ en haut du widget, cliquez sur « démarrer l'étude ». Les études de fonction de ce widget ne sont pas fiables à 100% mais servent de complément à une étude de fonction que l'on fait soi-même. Il se peut que cet outil soit amélioré dans une prochaine version du widget.
- In this menu there are also tests the display. They can try different methods to display and see if they work on the browser used.
+ Dans ce menu, on trouve également des tests d'affichage. Ils permettent d'essayer les différentes méthodes d'affichage et de voir si elles fonctionnent sur le navigateur internet utilisé.
- 9. Drawing some functions
+ 9. Dessiner plusieurs fonctions
- To draw multiple functions simultaneously, click the small "+" button which is located to the right of "View" (point 1). Then, a menu appears.
+ Pour dessiner plusieurs fonctions simultanément, cliquez sur le petit bouton « + » qui se situe à droite du bouton « Afficher » (point 1). Ensuite, un menu apparaît.
- The tabs in this menu can go to the history or the additional features (point 2). To add a function click the button to the right of the current function (point 3). Below is a list that contains all the displayed functions (point 4). To remove a function, just click on the "-" button next to it. It is also possible to change the color of each function separately.
+ Dans ce menu, des onglets permettent d'aller à l'historique ou aux fonctions supplémentaires (point 2). Pour ajouter une fonction, cliquez sur le bouton à droite de la fonction actuelle (point 3). En dessous, une liste contient toutes les fonctions affichées (point 4). Pour supprimer une fonction, il faut simplement cliquer sur le bouton « - » à coté de celle-ci. Il est également possible de modifier la couleur de chaque fonction séparément.
- History can review all the functions that have already been drawn. When you click on a function of history current function replaced by the function of history.
+ L'historique permet de revoir toutes les fonctions qui ont déjà été dessinées. Lorsque l'on clique sur une fonction de l'historique, celle qui est dessinée actuellement est remplacée par la fonction de l'historique.
- "Drawing several functions simultaneously" mode is only possible with the display method "canvas" in two dimensions, but the history can be used with all methods of display.
+ Dessiner plusieurs fonctions simultanément est uniquement possible avec la méthode d'affichage « canvas » en deux dimensions. Par contre, l'historique est utilisable avec toutes les méthodes d'affichage.
- 10. GraphMe update
+ 10. Mettre à jour GraphMe
- The latest version of the widget can be downloaded from the following page: http://gyb.educanet2.ch/tm-widgets/.ws_gen/?15 . To update GraphMe, you can also click on "Update" in the options menu.
+ La dernière version du widget est téléchargeable sur la page suivante : http://gyb.educanet2.ch/tm-widgets/.ws_gen/?15 . Pour mettre à jour GraphMe, vous pouvez aussi cliquer sur le bouton "Mise à jour" dans le menu des options.
- If you want to report a bug, have a suggestion from the widget or just want to ask a question, please contact me by e-mail at: yannick.vessaz@gmail.com .
+ Si vous voulez rapporter un bug, avez une suggestion par rapport au widget ou voulez simplement poser une question, merci de me contacter par e-mail à l'adresse : yannick.vessaz@gmail.com .
\ No newline at end of file
diff --git a/resources/library/applications/GraphMe.wgt/Images/black/bottom-left.png b/resources/library/applications/GraphMe.wgt/Images/black/bottom-left.png
new file mode 100644
index 00000000..8423b59b
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/black/bottom-left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/black/bottom-right.png b/resources/library/applications/GraphMe.wgt/Images/black/bottom-right.png
new file mode 100644
index 00000000..915abc13
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/black/bottom-right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/black/bottom.png b/resources/library/applications/GraphMe.wgt/Images/black/bottom.png
new file mode 100644
index 00000000..d61623c7
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/black/bottom.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/black/center.png b/resources/library/applications/GraphMe.wgt/Images/black/center.png
new file mode 100644
index 00000000..8ce90552
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/black/center.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/black/left.png b/resources/library/applications/GraphMe.wgt/Images/black/left.png
new file mode 100644
index 00000000..eeb45738
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/black/left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/black/right.png b/resources/library/applications/GraphMe.wgt/Images/black/right.png
new file mode 100644
index 00000000..ca19f467
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/black/right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/black/top-left.png b/resources/library/applications/GraphMe.wgt/Images/black/top-left.png
new file mode 100644
index 00000000..01fa7a62
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/black/top-left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/black/top-right.png b/resources/library/applications/GraphMe.wgt/Images/black/top-right.png
new file mode 100644
index 00000000..0fd81158
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/black/top-right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/black/top.png b/resources/library/applications/GraphMe.wgt/Images/black/top.png
new file mode 100644
index 00000000..1b2978ff
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/black/top.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/blue/bottom-left.png b/resources/library/applications/GraphMe.wgt/Images/blue/bottom-left.png
new file mode 100644
index 00000000..59bd3d46
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/blue/bottom-left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/blue/bottom-right.png b/resources/library/applications/GraphMe.wgt/Images/blue/bottom-right.png
new file mode 100644
index 00000000..850fb3cf
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/blue/bottom-right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/blue/bottom.png b/resources/library/applications/GraphMe.wgt/Images/blue/bottom.png
new file mode 100644
index 00000000..0ff3f4a5
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/blue/bottom.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/blue/center.png b/resources/library/applications/GraphMe.wgt/Images/blue/center.png
new file mode 100644
index 00000000..6b984a2f
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/blue/center.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/blue/left.png b/resources/library/applications/GraphMe.wgt/Images/blue/left.png
new file mode 100644
index 00000000..81b692b1
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/blue/left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/blue/right.png b/resources/library/applications/GraphMe.wgt/Images/blue/right.png
new file mode 100644
index 00000000..db5ed624
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/blue/right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/blue/top-left.png b/resources/library/applications/GraphMe.wgt/Images/blue/top-left.png
new file mode 100644
index 00000000..e5f38e7d
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/blue/top-left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/blue/top-right.png b/resources/library/applications/GraphMe.wgt/Images/blue/top-right.png
new file mode 100644
index 00000000..b27b6ec9
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/blue/top-right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/blue/top.png b/resources/library/applications/GraphMe.wgt/Images/blue/top.png
new file mode 100644
index 00000000..9538dd53
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/blue/top.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/cursor.png b/resources/library/applications/GraphMe.wgt/Images/cursor.png
new file mode 100644
index 00000000..3170b04a
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/cursor.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/darkblue/bottom-left.png b/resources/library/applications/GraphMe.wgt/Images/darkblue/bottom-left.png
new file mode 100644
index 00000000..cd121e50
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/darkblue/bottom-left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/darkblue/bottom-right.png b/resources/library/applications/GraphMe.wgt/Images/darkblue/bottom-right.png
new file mode 100644
index 00000000..7c32bb8a
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/darkblue/bottom-right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/darkblue/bottom.png b/resources/library/applications/GraphMe.wgt/Images/darkblue/bottom.png
new file mode 100644
index 00000000..c9e7b15f
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/darkblue/bottom.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/darkblue/center.png b/resources/library/applications/GraphMe.wgt/Images/darkblue/center.png
new file mode 100644
index 00000000..20e73707
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/darkblue/center.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/darkblue/left.png b/resources/library/applications/GraphMe.wgt/Images/darkblue/left.png
new file mode 100644
index 00000000..d88f7bea
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/darkblue/left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/darkblue/right.png b/resources/library/applications/GraphMe.wgt/Images/darkblue/right.png
new file mode 100644
index 00000000..c3994ad0
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/darkblue/right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/darkblue/top-left.png b/resources/library/applications/GraphMe.wgt/Images/darkblue/top-left.png
new file mode 100644
index 00000000..8b03ecca
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/darkblue/top-left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/darkblue/top-right.png b/resources/library/applications/GraphMe.wgt/Images/darkblue/top-right.png
new file mode 100644
index 00000000..9db3c018
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/darkblue/top-right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/darkblue/top.png b/resources/library/applications/GraphMe.wgt/Images/darkblue/top.png
new file mode 100644
index 00000000..7b068448
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/darkblue/top.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/fond1.png b/resources/library/applications/GraphMe.wgt/Images/fond1.png
deleted file mode 100644
index 8084981e..00000000
Binary files a/resources/library/applications/GraphMe.wgt/Images/fond1.png and /dev/null differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/fond2.png b/resources/library/applications/GraphMe.wgt/Images/fond2.png
deleted file mode 100644
index b6e1e839..00000000
Binary files a/resources/library/applications/GraphMe.wgt/Images/fond2.png and /dev/null differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/fond3.png b/resources/library/applications/GraphMe.wgt/Images/fond3.png
deleted file mode 100644
index fb2b708e..00000000
Binary files a/resources/library/applications/GraphMe.wgt/Images/fond3.png and /dev/null differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/fond4.png b/resources/library/applications/GraphMe.wgt/Images/fond4.png
deleted file mode 100644
index 0b945c39..00000000
Binary files a/resources/library/applications/GraphMe.wgt/Images/fond4.png and /dev/null differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/fond5.png b/resources/library/applications/GraphMe.wgt/Images/fond5.png
deleted file mode 100644
index 740163a9..00000000
Binary files a/resources/library/applications/GraphMe.wgt/Images/fond5.png and /dev/null differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/gauche1.png b/resources/library/applications/GraphMe.wgt/Images/gauche1.png
deleted file mode 100644
index ef1fb6ed..00000000
Binary files a/resources/library/applications/GraphMe.wgt/Images/gauche1.png and /dev/null differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/gauche2.png b/resources/library/applications/GraphMe.wgt/Images/gauche2.png
deleted file mode 100644
index 080a17f7..00000000
Binary files a/resources/library/applications/GraphMe.wgt/Images/gauche2.png and /dev/null differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/gauche3.png b/resources/library/applications/GraphMe.wgt/Images/gauche3.png
deleted file mode 100644
index 2fd7dedc..00000000
Binary files a/resources/library/applications/GraphMe.wgt/Images/gauche3.png and /dev/null differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/gradient.png b/resources/library/applications/GraphMe.wgt/Images/gradient.png
new file mode 100755
index 00000000..5fceffec
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/gradient.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/gradient1.png b/resources/library/applications/GraphMe.wgt/Images/gradient1.png
new file mode 100755
index 00000000..2b4ba137
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/gradient1.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/gradient2.png b/resources/library/applications/GraphMe.wgt/Images/gradient2.png
new file mode 100644
index 00000000..57d0779c
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/gradient2.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/gradient3.png b/resources/library/applications/GraphMe.wgt/Images/gradient3.png
new file mode 100644
index 00000000..441ccf51
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/gradient3.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/gradient4.png b/resources/library/applications/GraphMe.wgt/Images/gradient4.png
new file mode 100644
index 00000000..c3449f77
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/gradient4.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/mini_icon.png b/resources/library/applications/GraphMe.wgt/Images/mini_icon.png
new file mode 100644
index 00000000..bddfac5d
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/mini_icon.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/move.png b/resources/library/applications/GraphMe.wgt/Images/move.png
new file mode 100644
index 00000000..045554aa
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/move.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/tangent.png b/resources/library/applications/GraphMe.wgt/Images/tangent.png
new file mode 100644
index 00000000..f08c37d8
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/tangent.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/white/bottom-left.png b/resources/library/applications/GraphMe.wgt/Images/white/bottom-left.png
new file mode 100644
index 00000000..8e8312e3
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/white/bottom-left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/white/bottom-right.png b/resources/library/applications/GraphMe.wgt/Images/white/bottom-right.png
new file mode 100644
index 00000000..4e691af1
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/white/bottom-right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/white/bottom.png b/resources/library/applications/GraphMe.wgt/Images/white/bottom.png
new file mode 100644
index 00000000..43ddff4f
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/white/bottom.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/white/center.png b/resources/library/applications/GraphMe.wgt/Images/white/center.png
new file mode 100644
index 00000000..4068e6f1
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/white/center.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/white/left.png b/resources/library/applications/GraphMe.wgt/Images/white/left.png
new file mode 100644
index 00000000..b2116a17
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/white/left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/white/right.png b/resources/library/applications/GraphMe.wgt/Images/white/right.png
new file mode 100644
index 00000000..c6e32ad4
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/white/right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/white/top-left.png b/resources/library/applications/GraphMe.wgt/Images/white/top-left.png
new file mode 100644
index 00000000..7c3a5766
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/white/top-left.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/white/top-right.png b/resources/library/applications/GraphMe.wgt/Images/white/top-right.png
new file mode 100644
index 00000000..037ffc80
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/white/top-right.png differ
diff --git a/resources/library/applications/GraphMe.wgt/Images/white/top.png b/resources/library/applications/GraphMe.wgt/Images/white/top.png
new file mode 100644
index 00000000..1bd3bf4d
Binary files /dev/null and b/resources/library/applications/GraphMe.wgt/Images/white/top.png differ
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Affichage.js b/resources/library/applications/GraphMe.wgt/JavaScript/Affichage.js
new file mode 100644
index 00000000..9407063d
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/Affichage.js
@@ -0,0 +1,386 @@
+
+// Convertir une coordonnée sur le graphique en position relative à l'affichage (ou à l'écran si ecran = true)
+function coordToPosX(x, ecran){
+ if(ecran){
+ return coordToPosX(x, false)+affichage.offsetLeft;
+ }
+ else{
+ return (x - affichage.xGauche) * affichage.multX;
+ }
+}
+function coordToPosY(y, ecran){
+ if(ecran){
+ return coordToPosY(y, false)+affichage.offsetTop;
+ }
+ else{
+ return affichage.hauteur - (y - affichage.yBas) * affichage.multY;
+ }
+}
+
+var affichage = {
+ // Options
+ id : "affichage",
+ largeur : 640, // Set by init
+ hauteur : 430, // Set by init
+ couleurFond : "rgba(0,0,0,0)",
+
+ // Bornes (zone d'affichage)
+ xGauche : -5.5, // Set by init
+ xDroite : 5.5, // Set by init
+ yBas : -3.7,
+ yHaut : 3.7,
+
+ multX : 1,
+ multY : 1,
+
+ // Axes
+ axes : true,
+ couleurAxes : "rgba(0,0,0,0.5)",
+ widthAxes : 2,
+ // Grille
+ grille : true,
+ couleurGrille : "rgba(255,255,255,0.1)",
+ widthGrille : 2,
+ // Echelle
+ echelle : true,
+ couleurEchelle : "rgba(255,255,255,1)",
+
+ // Précision
+ precision : 100,
+ precisionAmelioree : true, // false = fonction plus jolie lorsqu'on dé-zoom, true = affichage plus rapide lors du dé-zoom.
+
+ // Méthode et style
+ methode : "canvas",
+ style : "continu",
+
+ // Variable définies lors de l'initialisation
+ canvas : null,
+ ctx : null,
+ object : null,
+ offsetTop : null, // Position de l'affichage par rapport à la page
+ offsetLeft : null,
+
+ init : function(element, width, height){
+ this.setBornes();
+
+ // Supprimer le contenu de l'affichage
+ if(!element){
+ element = document.getElementById(this.id);
+ }
+ if(element.hasChildNodes()){
+ while(element.childNodes.length >= 1 ){
+ element.removeChild(element.firstChild);
+ }
+ }
+
+ // Définir la taille
+ this.largeur = width || element.clientWidth;
+ this.hauteur = height || element.clientHeight;
+
+ // Set left and right proportionally to width, height, top and bottom
+ var centerX = this.xGauche + (this.xDroite - this.xGauche)/2;
+ var centerY = this.yBas + (this.yHaut - this.yBas)/2;
+ var dx = ((this.yHaut - this.yBas) / 2) * this.largeur / this.hauteur;
+ this.xGauche = Math.round((centerX - dx)*100)/100;
+ this.xDroite= Math.round((centerX + dx)*100)/100;
+ this.setBornes();
+
+ // Récupérer la position
+ var boundingClientRect = element.getBoundingClientRect();
+ this.offsetTop = boundingClientRect.top;
+ this.offsetLeft = boundingClientRect.left;
+
+ // Sélectionner la méthode d'affichage
+ if(this.methode == "svg"){
+// this.object = document.createElement("embed");
+// this.object.type = "image/svg+xml";
+// this.object.src = "AffichageSVG.svg";
+ this.object = document.getElementById("embedSVG");
+ this.object.width = this.largeur;
+ this.object.height = this.hauteur;
+ this.object.style.top = this.offsetTop +1 +"px";
+ this.object.style.left = this.offsetLeft +1 +"px";
+ this.object.style.display = "block";
+// element.appendChild(this.object);
+
+// affichage.ctx = svg;
+// affichage.dessiner();
+// // Exécuter this.dessiner() maintenant ne va pas car svg n'est pas
+// // encore défini dans cette fonction, il faut en lancer un nouvelle...
+ setTimeout("affichage.ctx = svg", 50);
+ setTimeout("affichage.dessiner()", 100);
+ }
+ else if(this.methode == "uniboard"){
+ if(window.uniboard || window.sankore){
+ try{
+ initUniboard();
+ this.ctx = uniboard;
+ this.dessiner();
+ }
+ catch(err){
+ alert(err.message);
+ }
+ }
+ else{
+ this.methode = "canvas";
+ this.setOptions();
+ this.init();
+ }
+ }
+ else{
+ document.getElementById("embedSVG").style.display = "none";
+
+ this.canvas = document.createElement("canvas");
+ this.canvas.width = this.largeur;
+ this.canvas.height = this.hauteur;
+ element.appendChild(this.canvas);
+
+ this.ctx = this.canvas.getContext("2d");
+
+ this.dessiner();
+ }
+
+ // Événements
+ if(window.addEventListener){
+ element = document.getElementById("eventAffichage");
+ element.addEventListener('DOMMouseScroll', souris.wheel, false);
+ element.onmousewheel = souris.wheel;
+ element.oncontextmenu = ctxMenu.ouvrir;
+ }
+ },
+
+ calculer : function(){
+ this.getBornes();
+ this.getOptions();
+ if(fonction3D){
+ display3D.draw()
+ }
+ else{
+ this.dessiner();
+ }
+ saveOptions();
+ },
+
+ dessiner : function(){
+ try{
+// var ti = new Date().getTime();
+ var precision;
+ if(this.precisionAmelioree){
+ precision = 10/this.precision;
+ }
+ else{
+ precision = Math.abs(this.xDroite - this.xGauche)/this.precision;
+ }
+ this.multX = this.largeur/Math.abs(this.xDroite - this.xGauche);
+ this.multY = this.hauteur/Math.abs(this.yHaut - this.yBas);
+
+ var ctx = new Object();
+ ctx = this.ctx;
+ ctx.clearRect(0,0,this.largeur,this.hauteur);
+
+ ctx.fillStyle = this.couleurFond;
+ ctx.fillRect(0,0,this.largeur,this.hauteur);
+
+ ctx.strokeOpacity = 1; // svg
+
+ // Couleur pour l'aire sous la fonction
+ ctx.fillStyle = "rgba(0,180,255,0.3)";
+
+ // Fonctions
+ for(var i=0; i x : ajouter = 0.5")
+ }
+
+ this.xGauche -= ajouter;
+ this.xDroite += ajouter;
+
+ // Vertical
+ diffBornes = Math.abs(this.yHaut - this.yBas);
+ ajouter = Math.round(diffBornes * (facteur-1)*2)/4;
+ if(ajouter == 0){
+ ajouter = 0.25;
+// log("affichage.zoom -> y : ajouter = 0.5")
+ }
+
+ this.yBas -= ajouter;
+ this.yHaut += ajouter;
+
+ this.dessiner();
+ this.setBornes();
+
+ saveOptions();
+ }
+};
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Affichage3D.js b/resources/library/applications/GraphMe.wgt/JavaScript/Affichage3D.js
old mode 100644
new mode 100755
index b6ff0e70..9cf88b63
--- a/resources/library/applications/GraphMe.wgt/JavaScript/Affichage3D.js
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/Affichage3D.js
@@ -1,332 +1,407 @@
-var ctx
-var centreX, centreY
-var echelle3D = 50
-var precisionDroite3D = 0.02
-var precisionFonction3D = 0.2
-var fonction3D = false
-var angle = Math.PI/8
-var valeurZoom3D = 1
-var gauche3D = -6.5
-var droite3D = 6.5
-var outilPrecedent = ""
-var rouge3D = 0
-var vert3D = 1
-var bleu3D = 2
-var couleurGenerale = 0
-function activer3D(){
- if(fonction3D){ // Si activé alors on le désative
- fonction3D = false
- choixOutil(outilPrecedent)
- document.getElementById('onglet3D').innerHTML = "3D"
- largeur = 500
- document.getElementById("affichage").style.width = largeur+"px"
- document.getElementById("affichage").style.left = "129px"
- document.getElementById("flecheGauche").style.left = "137px"
- document.getElementById("flecheHaut").style.left = "345px"
- document.getElementById("flecheBas").style.left = "345px"
- document.getElementById("gauche").style.display = "block"
- document.getElementById("gauche3D").style.display = "none"
- var elements = document.getElementsByClassName("menu")
- for(var i=0; i'
- ctx = document.getElementById('canvas').getContext('2d')
- ctx.clearRect(0, 0, 640, 480)
- ctx.fillStyle = "rgba(0, 0, 0, 0.5)"
- ctx.fillRect(0,0,640,480)
- axes()
-}
+var fonction3D = false;
+var outilPrecedent = "";
-function dessiner3D(eq){
- initialise3D()
- if(document.getElementById("selectAffichage3D").value == "points"){
- var coordX, coordY, coordZ
- for(var x=gauche3D; x 1){
- opacity = 1
- }
- if(opacity < 0){
- opacity = 0
- }
- if(couleur[0] > 255){
- couleur[0] = 255
- }
- if(couleur[0] < 0){
- couleur[0] = 0
- }
- if(couleur[1] > 255){
- couleur[1] = 255
- }
- if(couleur[1] < 0){
- couleur[1] = 0
- }
+var display3D = {
+ canvas: null,
+ ctx: null,
+ width: 0,
+ height: 0,
+ centerX: 0,
+ centerY: 0,
+ scale: 50,
+ linePrecision: 0.02,
+ functionPrecision: 0.2,
+ angle: Math.PI/8,
+ zoomValue: 1,
+ left: -6.5,
+ right: 6.5,
+ rouge3D: 0,
+ vert3D: 1,
+ bleu3D: 2,
+ couleurGenerale: 0,
+ background: "rgba(0, 0, 0, 0.5)",
+
+ init: function(width, height){
+ var displayElement = document.getElementById("affichage");
+
+ // Clear displayElement content
+ if(displayElement.hasChildNodes()){
+ while(displayElement.childNodes.length >= 1 ){
+ displayElement.removeChild(displayElement.firstChild);
+ }
+ }
+
+ // Setup sizes
+ this.width = width || displayElement.clientWidth;
+ this.height = height || displayElement.clientHeight;
+ this.centerX = this.width / 2;
+ this.centerY = this.height / 2;
+
+ // Create canvas
+ this.canvas = document.createElement("canvas");
+ this.canvas.width = this.width;
+ this.canvas.height = this.height;
+ displayElement.appendChild(this.canvas);
+
+ this.ctx = this.canvas.getContext('2d');
+ this.clear();
+ },
+
+ clear: function(){
+ var ctx = this.ctx;
+ ctx.clearRect(0, 0, this.width, this.height);
+ ctx.fillStyle = this.background;
+ ctx.fillRect(0, 0, this.width, this.height);
+ this.axes();
+ },
+
+ draw: function(){
+ // var ti = new Date().getTime();
+ // this.init();
+ this.clear();
+
+ var txtFct = fct.remplacer(fct.verifier(document.getElementById("input3D").value));
+ if(txtFct == ""){
+ return;
+ }
+
+ var func = new CartesianFunction(txtFct);
+
+ if(document.getElementById("selectAffichage3D").value == "points"){
+ var coordX, coordY, coordZ;
+ for(var x=this.left; xthis.left; x1-=this.functionPrecision){
+ for(var y1=this.right; y1>this.left; y1-=this.functionPrecision){
+ x = x1;
+ y = y1;
+ z1 = func.f(x,y);
+ x2 = x1 - this.functionPrecision;
+ y2 = y1;
+ x = x2;
+ //y = y2;
+ z2 = func.f(x,y);
+ x3 = x2;
+ y3 = y2 - this.functionPrecision;
+ //x = x3;
+ y = y3;
+ z3 = func.f(x,y);
+ x4 = x3 + this.functionPrecision;
+ y4 = y3;
+ x = x4;
+ //y = y4;
+ z4 = func.f(x,y);
+ if(isNaN(z1)||isNaN(z2)||isNaN(z3)||isNaN(z4)){
+ continue;
+ }
+ this.polygone3D(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4);
+ }
+ }
+ }
+ }
+ // var tf = new Date().getTime();
+ // window.console.log(tf-ti);
+ },
+
+ // Dessine un point à la position (x, y, z)
+ point3D: function(x, y, z){
+ var posX = (Math.sin(this.angle)*x + Math.cos(this.angle)*y)*this.scale;
+ var posZ = -(z - Math.cos(this.angle)*x/2.6 + Math.sin(this.angle)*y/2.6)*this.scale;
- ctx.save()
- ctx.translate(centreX, centreY)
- ctx.scale(valeurZoom3D, valeurZoom3D)
- ctx.fillStyle = "rgba("+couleur[rouge3D]+","+couleur[vert3D]+", "+couleur[bleu3D]+", "+opacity+")"
- ctx.fillRect(posX-1, posZ-1, 2, 2)
- ctx.restore()
-}
-
-// Dessine un polygone qui a comme sommets : (x1, y1, z1) , (x2, y2, z2), (x3, y3, z3) et (x4, y4, z4)
-function polygone3D(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4){
- ctx.save()
- ctx.translate(centreX, centreY)
- ctx.scale(valeurZoom3D, valeurZoom3D)
- ctx.beginPath()
- ctx.moveTo((Math.sin(angle)*x1 + Math.cos(angle)*y1)*echelle3D , -(z1 - Math.cos(angle)*x1/2.6 + Math.sin(angle)*y1/2.6)*echelle3D)
- ctx.lineTo((Math.sin(angle)*x2 + Math.cos(angle)*y2)*echelle3D , -(z2 - Math.cos(angle)*x2/2.6 + Math.sin(angle)*y2/2.6)*echelle3D)
- ctx.lineTo((Math.sin(angle)*x3 + Math.cos(angle)*y3)*echelle3D , -(z3 - Math.cos(angle)*x3/2.6 + Math.sin(angle)*y3/2.6)*echelle3D)
- ctx.lineTo((Math.sin(angle)*x4 + Math.cos(angle)*y4)*echelle3D , -(z4 - Math.cos(angle)*x4/2.6 + Math.sin(angle)*y4/2.6)*echelle3D)
+ var opacity = Math.round((1-((5+y*Math.sin(this.angle)-x*Math.cos(this.angle)) / 450)*this.scale)*1000)/1000;
+ var couleur = new Array();
+ couleur[0] = Math.round((5+z)*this.scale);
+ couleur[1] = Math.round(510 - (5+z)*this.scale);
+ couleur[2] = this.couleurGenerale;
+ if(opacity > 1){ opacity = 1; }
+ if(opacity < 0){ opacity = 0; }
+ if(couleur[0] > 255){ couleur[0] = 255; }
+ if(couleur[0] < 0){ couleur[0] = 0; }
+ if(couleur[1] > 255){ couleur[1] = 255; }
+ if(couleur[1] < 0){ couleur[1] = 0; }
- var opacity = Math.round((1-((5+y1*Math.sin(angle)-x1*Math.cos(angle)) / 450)*echelle3D)*1000)/1000
- var couleur = new Array()
- couleur[0] = Math.round((5+z1)*echelle3D)
- couleur[1] = Math.round(510 - (5+z1)*echelle3D)
- couleur[2] = couleurGenerale
- if(opacity > 1){
- opacity = 1
- }
- if(opacity < 0){
- opacity = 0
- }
- if(couleur[0] > 255){
- couleur[0] = 255
- }
- if(couleur[0] < 0){
- couleur[0] = 0
- }
- if(couleur[1] > 255){
- couleur[1] = 255
- }
- if(couleur[1] < 0){
- couleur[1] = 0
- }
+ var ctx = this.ctx;
+ ctx.save();
+ ctx.translate(this.centerX, this.centerY);
+ ctx.scale(this.zoomValue, this.zoomValue);
+ ctx.fillStyle = "rgba("+couleur[this.rouge3D]+","+couleur[this.vert3D]+", "+couleur[this.bleu3D]+", "+opacity+")";
+ ctx.fillRect(posX-1, posZ-1, 2, 2);
+ ctx.restore();
+ },
+
+ // Dessine un polygone qui a comme sommets : (x1, y1, z1) , (x2, y2, z2), (x3, y3, z3) et (x4, y4, z4)
+ polygone3D: function(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4){
+ var ctx = this.ctx;
+ ctx.save();
+ ctx.translate(this.centerX, this.centerY);
+ ctx.scale(this.zoomValue, this.zoomValue);
+ ctx.beginPath();
+ ctx.moveTo((Math.sin(this.angle)*x1 + Math.cos(this.angle)*y1)*this.scale , -(z1 - Math.cos(this.angle)*x1/2.6 + Math.sin(this.angle)*y1/2.6)*this.scale);
+ ctx.lineTo((Math.sin(this.angle)*x2 + Math.cos(this.angle)*y2)*this.scale , -(z2 - Math.cos(this.angle)*x2/2.6 + Math.sin(this.angle)*y2/2.6)*this.scale);
+ ctx.lineTo((Math.sin(this.angle)*x3 + Math.cos(this.angle)*y3)*this.scale , -(z3 - Math.cos(this.angle)*x3/2.6 + Math.sin(this.angle)*y3/2.6)*this.scale);
+ ctx.lineTo((Math.sin(this.angle)*x4 + Math.cos(this.angle)*y4)*this.scale , -(z4 - Math.cos(this.angle)*x4/2.6 + Math.sin(this.angle)*y4/2.6)*this.scale);
- ctx.fillStyle = "rgba("+couleur[rouge3D]+","+couleur[vert3D]+", "+couleur[bleu3D]+", "+opacity+")"
- ctx.closePath()
- ctx.fill()
- ctx.restore()
-}
+ var opacity = Math.round((1-((5+y1*Math.sin(this.angle)-x1*Math.cos(this.angle)) / 450)*this.scale)*1000)/1000;
+ var couleur = new Array();
+ couleur[0] = Math.round((5+z1)*this.scale);
+ couleur[1] = Math.round(510 - (5+z1)*this.scale);
+ couleur[2] = this.couleurGenerale;
+ if(opacity > 1){ opacity = 1; }
+ if(opacity < 0){ opacity = 0; }
+
+ // for(var i=0; i 255){ couleur[0] = 255; }
+ if(couleur[0] < 0){ couleur[0] = 0; }
+ if(couleur[1] > 255){ couleur[1] = 255; }
+ if(couleur[1] < 0){ couleur[1] = 0; }
-// Dessine les axes
-function axes(){
- for(var i=-5; i<5; i+=precisionDroite3D){
- point3D(0, 0, i)
- }
- for(var i=-5.5; i<5.5; i+=precisionDroite3D){
- point3D(i, 0, 0)
- }
- for(var i=-5.5; i<5.5; i+=precisionDroite3D){
- point3D(0, i, 0)
- }
-}
+ ctx.fillStyle = "rgba("+couleur[this.rouge3D]+","+couleur[this.vert3D]+", "+couleur[this.bleu3D]+", "+opacity+")";
+ ctx.strokeStyle = "rgba(0,0,0,0.1)";
+ ctx.closePath();
+ ctx.fill();
+ ctx.stroke();
+ ctx.restore();
+ },
-function cube(x, y, z, r){
- // Face de devant
- for(var i=0; i 255){
- couleurGenerale = 255
- }
- switch(document.getElementById("selectRouge3D").value){
- case "plus":
- rouge3D = 0
- rouge = 255
- sensRouge = -1
- break
- case "moins":
- rouge3D = 1
- rouge = 0
- sensRouge = 1
- break
- case "tout":
- rouge3D = 2
- rouge = couleurGenerale
- sensRouge = 0
- break
- }
- switch(document.getElementById("selectVert3D").value){
- case "plus":
- vert3D = 0
- vert = 255
- sensVert = -1
- break
- case "moins":
- vert3D = 1
- vert = 0
- sensVert = 1
- break
- case "tout":
- vert3D = 2
- vert = couleurGenerale
- sensVert = 0
- break
- }
- switch(document.getElementById("selectBleu3D").value){
- case "plus":
- bleu3D = 0
- bleu = 255
- sensBleu = -1
- break
- case "moins":
- bleu3D = 1
- bleu = 0
- sensBleu = 1
- break
- case "tout":
- bleu3D = 2
- bleu = couleurGenerale
- sensBleu = 0
- break
- }
- document.getElementById("apercuCouleur3D").innerHTML = ". "
- for(var i=0; i."
- }
-}
+ cube: function(x, y, z, r){
+ // Face de devant
+ for(var i=0; i 255){
+ this.couleurGenerale = 255;
+ }
+ switch(document.getElementById("selectRouge3D").value){
+ case "plus":
+ this.rouge3D = 0;
+ rouge = 255;
+ sensRouge = -1;
+ break;
+ case "moins":
+ this.rouge3D = 1;
+ rouge = 0;
+ sensRouge = 1;
+ break;
+ case "tout":
+ this.rouge3D = 2;
+ rouge = this.couleurGenerale;
+ sensRouge = 0;
+ break;
+ }
+ switch(document.getElementById("selectVert3D").value){
+ case "plus":
+ this.vert3D = 0;
+ vert = 255;
+ sensVert = -1;
+ break;
+ case "moins":
+ this.vert3D = 1;
+ vert = 0;
+ sensVert = 1;
+ break;
+ case "tout":
+ this.vert3D = 2;
+ vert = this.couleurGenerale;
+ sensVert = 0;
+ break;
+ }
+ switch(document.getElementById("selectBleu3D").value){
+ case "plus":
+ this.bleu3D = 0;
+ bleu = 255;
+ sensBleu = -1;
+ break;
+ case "moins":
+ this.bleu3D = 1;
+ bleu = 0;
+ sensBleu = 1;
+ break;
+ case "tout":
+ this.bleu3D = 2;
+ bleu = this.couleurGenerale;
+ sensBleu = 0;
+ break;
+ }
+ document.getElementById("apercuCouleur3D").innerHTML = ". ";
+ for(var i=0; i.";
+ }
+ if(this.ctx){
+ this.draw();
+ }
+ },
+
+ zoom: function(value){
+ if(!fonction3D){
+ return;
+ }
+ this.zoomValue *= value;
+ this.left /= value;
+ this.right /= value;
+ this.functionPrecision /= value;
+ this.linePrecision /= value;
+ //alert(this.zoomValue+" ; "+this.left+" ; "+this.right+" ; "+this.functionPrecision+" ; "+this.linePrecision);
+ this.draw();
+ },
+
+ move: function(value){
+ this.angle += Math.PI/32 * value;
+ this.draw();
+ },
+
+ initZoom: function(){
+ this.angle = Math.PI/8;
+ this.zoomValue = 1;
+ this.left = -6.5;
+ this.right = 6.5;
+ this.draw();
+ }
+};
-function zoom3D(valeur){
- valeurZoom3D *= valeur
- gauche3D /= valeur
- droite3D /= valeur
- precisionFonction3D /= valeur
- precisionDroite3D /= valeur
- //alert(valeurZoom3D+" ; "+gauche3D+" ; "+droite3D+" ; "+precisionFonction3D+" ; "+precisionDroite3D)
- actualiserGraph()
-}
\ No newline at end of file
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/AffichageSVG.svg b/resources/library/applications/GraphMe.wgt/JavaScript/AffichageSVG.svg
new file mode 100644
index 00000000..ac73b17a
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/AffichageSVG.svg
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/AffichageStandard.js b/resources/library/applications/GraphMe.wgt/JavaScript/AffichageStandard.js
deleted file mode 100644
index b5ab2aad..00000000
--- a/resources/library/applications/GraphMe.wgt/JavaScript/AffichageStandard.js
+++ /dev/null
@@ -1,432 +0,0 @@
-// ------------------ SVG et canvas ------------------
-
-// Cette fonction calcule tous les points de la fonction mathématique.
-// Elle place chaque coordonnée "x" et "y" dans les tableaux "pointX" et "pointY"
-// A la fin, elle choisi la méthode d'affichage entre :
-// 1) une seule image SVG
-// 2) plusieurs images SVG
- function evaluerSVG(eq) {
- borneXGauche = parseFloat(document.getElementById("borneXGauche").value)
- borneXDroite = parseFloat(document.getElementById("borneXDroite").value)
- borneYGauche = parseFloat(document.getElementById("borneYGauche").value)
- borneYDroite = parseFloat(document.getElementById("borneYDroite").value)
- multiplicateurX = largeur/Math.abs(borneXDroite - borneXGauche)
- multiplicateurY = hauteur/Math.abs(borneYDroite - borneYGauche)
- lineWidth = document.getElementById("inputTaille").value
- var i = 0
- var y1, p1
-
- for(x=borneXGauche; x<=(borneXDroite+5*precision); x=x+precision){
- y = eval(eq)
- if(!isNaN(y)){
- i++
- pointX[i] = (x - borneXGauche) * multiplicateurX
- pointY[i] = hauteur - ((y - borneYGauche) * multiplicateurY)
- pente[i] = hauteur - (((y-y1)/precision - borneYGauche)* multiplicateurY)
- pente2[i] = hauteur - ((((y-y1)/precision-p1)/precision - borneYGauche)* multiplicateurY)
- p1 = (y-y1)/precision
- y1 = y
- }
- }
- pente[1]=pente[2]
- pente2[2]=pente2[3]
- pente2[1]=pente2[2]
-
- //alert(pointX+'\n'+pointY)
- if(document.getElementById("selectMethodeAffichage").value == "svg2"){
- calculerGraphSVG2(i)
- }
- else{
- calculerGraphSVG(i)
- }
- }
-
-// Même fonction mais pour dessiner à l'aide de canvas
- function evaluerCanvas(eq) {
- borneXGauche = parseFloat(document.getElementById("borneXGauche").value)
- borneXDroite = parseFloat(document.getElementById("borneXDroite").value)
- borneYGauche = parseFloat(document.getElementById("borneYGauche").value)
- borneYDroite = parseFloat(document.getElementById("borneYDroite").value)
- multiplicateurX = largeur/Math.abs(borneXDroite - borneXGauche)
- multiplicateurY = hauteur/Math.abs(borneYDroite - borneYGauche)
- lineWidth = document.getElementById("inputTaille").value
- var i = 0
- var y1, p1
-
- for(x=borneXGauche; x<=(borneXDroite+5*precision); x=x+precision){
- y = eval(eq)
- i++
- if(!isNaN(y)){
- pointX[i] = (x - borneXGauche) * multiplicateurX
- pointY[i] = hauteur - ((y - borneYGauche) * multiplicateurY)
- pente[i] = hauteur - (((y-y1)/precision - borneYGauche)* multiplicateurY)
- pente2[i] = hauteur - ((((y-y1)/precision-p1)/precision - borneYGauche)* multiplicateurY)
- p1 = (y-y1)/precision
- y1 = y
- }
- else{
- pointX[i] = "undefined"
- pointY[i] = "undefined"
- pente[i] = "undefined"
- pente2[i] = "undefined"
- }
- }
- pente[1]=pente[2]
- pente2[2]=pente2[3]
- pente2[1]=pente2[2]
-
- calculerGraphCanevas(i)
- }
-
-
-// ---- SVG (une image) ----
-// Génère le code HTML qui permet d'afficher le graphique et le place dans la div "affichage"
- function calculerGraphSVG2(fin){
- image = ""
- for (i=1; i '
- }
- graphique = ' '
- graphique = graphique + ' '
- image = ''+image+graphique+' '
- document.getElementById("affichage").innerHTML = image
- //alert(image)
- }
-
-// ---- SVG (images multiples) ----
-// Créé les différents éléments pour dessiner la fonction mathématique
-// et les place dans la div "affichage"
- function calculerGraphSVG(fin){
- document.getElementById("affichage").innerHTML = ""
- svg = document.createElementNS("http://www.w3.org/2000/svg", "svg")
- svg.setAttribute("width", "100%")
- svg.setAttribute("height", "100%")
- for (i=1; ihauteur)){
- i++
- }
- if ((pointY[i]>hauteur) && (pointY[i+1]<0)){
- i++
- }
- var ligne = document.createElementNS("http://www.w3.org/2000/svg", "line")
- ligne.setAttribute("x1", pointX[i]+decalageX)
- ligne.setAttribute("x2", pointX[i+1]+decalageX)
- ligne.setAttribute("y1", pointY[i]+decalageY)
- ligne.setAttribute("y2", pointY[i+1]+decalageY)
- ligne.setAttribute("stroke", couleurFonction)
- ligne.setAttribute("stroke-width", lineWidth)
- svg.appendChild(ligne)
- }
-
- // dérivée
- if(document.getElementById("checkDerivee").checked){
- for (i=1; i'
- ctx = document.getElementById('canvas').getContext('2d')
- var undefined = true
- // Autres fonctions
- for(var i=0; ihauteur)){
- sankore.moveTo(pointX[i+1]+decalageX,pointY[i+1]+decalageY)
- continue
- }
- sankore.drawLineTo(pointX[i]+decalageX, pointY[i]+decalageY, lineWidth)
- }
-
- //dessiner le cadre
- sankore.moveTo(0+decalageX,0+decalageY)
- sankore.drawLineTo(largeur+decalageX, 0+decalageY, lineWidth)
- sankore.drawLineTo(largeur+decalageX, hauteur+decalageY, lineWidth)
- sankore.drawLineTo(0+decalageX, hauteur+decalageY, lineWidth)
- sankore.drawLineTo(0+decalageX, 0+decalageY, lineWidth)
-
- //dessiner les axes
- sankore.moveTo((-borneXGauche*multiplicateurX)+decalageX, 0+decalageY)
- sankore.drawLineTo((-borneXGauche*multiplicateurX)+decalageX, hauteur+decalageY, lineWidth)
- sankore.moveTo(0+decalageX, (hauteur-(-borneYGauche*multiplicateurY))+decalageY)
- sankore.drawLineTo(largeur+decalageX, (hauteur-(-borneYGauche*multiplicateurY))+decalageY, lineWidth)
-
- decalageX += 250
- decalageY += 200
- largeur -= 100
- hauteur -= 100
- sankore.setTool('arrow')
+function initUniboard(){
+ if(!window.uniboard && window.sankore){
+ uniboard = sankore;
}
-
\ No newline at end of file
+ uniboard.centerOn(337,245);
+// uniboard.setTool("pen");
+
+ // Paramètres par défaut
+ uniboard.lineWidth = 1;
+ uniboard.fillStyle = "black";
+ uniboard.strokeStyle = "black";
+
+ // Position du curseur pour écrire des nombres
+ uniboard.cursorX = 0;
+ uniboard.cursorY = 0;
+
+ // Fonctions
+ uniboard.strokeColor = function(){
+ this.setPenColor(colorToHex(this.strokeStyle));
+ };
+
+ uniboard.fillColor = function(){
+ this.setPenColor(colorToHex(this.fillStyle));
+ };
+
+ uniboard.lineTo = function(x, y){
+ if(y>-20 && yhauteur-1){ break BoucleFor }
- tableau[y][x] = 1
- }
- tableau.reverse()
- graphique = ""
- calculerGraphXPM()
- }
-
-// Permet de remplir le tableau avec uniquement des 1 ou des 0.
-// (pour que l'image soit toute blanche ou toute noir)
- function tableauUni(valeurCouleur){
- for (i=0; i "
- document.getElementById("affichage").innerHTML = image
- }
\ No newline at end of file
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/CartesianFunction.js b/resources/library/applications/GraphMe.wgt/JavaScript/CartesianFunction.js
new file mode 100644
index 00000000..8ea53c78
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/CartesianFunction.js
@@ -0,0 +1,337 @@
+
+function CartesianFunction(txtFct){
+
+ this.setFct = function(txt){
+ this.fct = txt;
+ this.f = new Function("x", "y", "return "+this.fct);
+ }
+
+ if(txtFct){
+ this.setFct(txtFct);
+ }
+ this.couleur = fct.couleur;
+ this.width = document.getElementById("inputTaille").value;
+ this.aire = document.getElementById("checkAire").checked ? true : false;
+ this.derivee1 = document.getElementById("checkDerivee1").checked ? true : false;
+ this.couleurDerivee1 = "rgba(255,128,0,1)";
+ this.derivee2 = document.getElementById("checkDerivee2").checked ? true : false;
+ this.couleurDerivee2 = "rgba(255,255,0,1)";
+ this.primitive1 = document.getElementById("checkPrimitive1").checked ? true : false;
+ this.couleurPrimitive1 = "rgba(255,50,0,1)";
+ this.conditionInitiale = 0;
+ this.style = document.getElementById("selectStyle").value;
+
+ this.getX = function(x){
+ return x;
+ };
+
+ this.getY = function(x){
+ return this.f(x);
+ };
+
+ this.set = function(f){
+ this.setFct(fct.remplacer(fct.verifier(f.fct)));
+ this.couleur = f.couleur;
+ this.couleurDerivee1 = f.couleurD1;
+ this.couleurDerivee2 = f.couleurD2;
+ this.couleurPrimitive1 = f.couleurP1;
+ this.width = f.width;
+ this.style = f.style;
+ this.aire = f.aire;
+ this.derivee1 = f.derivee1;
+ this.derivee2 = f.derivee2;
+ this.primitive1 = f.primitive1;
+ this.conditionInitiale = f.conditionInitiale;
+ return this;
+ };
+
+ this.get = function(){
+ var f = {};
+ f.type = "cartesian";
+ f.fct = this.fct;
+ f.couleur = this.couleur;
+ f.couleurD1 = this.couleurDerivee1;
+ f.couleurD2 = this.couleurDerivee2;
+ f.couleurP1 = this.couleurPrimitive1;
+ f.width = this.width;
+ f.style = this.style;
+ f.aire = this.aire;
+ f.derivee1 = this.derivee1;
+ f.derivee2 = this.derivee2;
+ f.primitive1 = this.primitive1;
+ f.conditionInitiale = this.conditionInitiale;
+ return f;
+ };
+
+ this.readableText = function(){
+ return "f(x) = " + this.fct;
+ };
+
+ this.plot = function(ctx, precision, affichage){
+ var x, y;
+ var pointX, pointY;
+ var nonDefini;
+
+ if(this.style == "points"){
+ precision *= 2;
+ }
+
+ // Dérivée première
+ if(this.derivee1){
+ ctx.beginPath();
+ ctx.strokeStyle = this.couleurDerivee1;
+ ctx.fillStyle = this.couleurDerivee1;
+ ctx.moveTo(-100,-100);
+ nonDefini = 1;
+ var pente;
+ var x0 = affichage.xGauche-precision;
+ var y0 = this.f(x0);
+
+ for(x = affichage.xGauche-precision*2; x <= affichage.xDroite+precision; x+=precision){
+ // Evaluer la valeur y du point x
+ y = this.f(x);
+ if(!isNaN(y)){
+ // Transformation des coordonnées
+ pente = (y-y0)/precision;
+ pointX = (x-precision/2 - affichage.xGauche) * affichage.multX;
+ pointY = affichage.hauteur - (pente - affichage.yBas) * affichage.multY;
+ y0 = y;
+
+ // Dessiner la dérivée
+ if(nonDefini>0){
+ nonDefini--;
+ ctx.moveTo(pointX, pointY);
+ }
+ else{
+ if(this.style == "continu"){
+ ctx.lineTo(pointX, pointY);
+ }
+ else if(this.style == "points"){
+ ctx.beginPath();
+ ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
+ ctx.fill();
+ }
+ else{
+ ctx.lineTo(pointX, pointY);
+ nonDefini = 1;
+ }
+ }
+ }
+ else{
+ nonDefini = 2;
+ }
+ }
+ if(this.style != "points"){
+ ctx.stroke();
+ }
+ }
+
+ // Dérivée seconde
+ if(this.derivee2){
+ ctx.beginPath();
+ ctx.strokeStyle = this.couleurDerivee2;
+ ctx.fillStyle = this.couleurDerivee2;
+ ctx.moveTo(-100,-100);
+ nonDefini = 1;
+ var pente, pente2;
+ var x0 = affichage.xGauche-precision;
+ var y0 = this.f(x0);
+ var p0 = 0;
+
+ for(x = affichage.xGauche-precision*3; x <= affichage.xDroite+precision; x+=precision){
+ // Evaluer la valeur y du point x
+ y = this.f(x);
+ if(!isNaN(y)){
+ // Transformation des coordonnées
+ p = (y-y0)/precision;
+ pente = (p-p0)/precision;
+ pointX = (x-precision/2 - affichage.xGauche) * affichage.multX;
+ pointY = affichage.hauteur - (pente - affichage.yBas) * affichage.multY;
+ y0 = y;
+ p0 = p;
+
+ // Dessiner la dérivée seconde
+ if(nonDefini>0){
+ nonDefini--;
+ ctx.moveTo(pointX, pointY);
+ }
+ else{
+ if(this.style == "continu"){
+ ctx.lineTo(pointX, pointY);
+ }
+ else if(this.style == "points"){
+ ctx.beginPath();
+ ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
+ ctx.fill();
+ }
+ else{
+ ctx.lineTo(pointX, pointY);
+ nonDefini = 1;
+ }
+ }
+ }
+ else{
+ nonDefini = 3;
+ }
+ }
+ if(this.style != "points"){
+ ctx.stroke();
+ }
+ }
+
+ // Primitive première
+ if(this.primitive1){
+ ctx.beginPath();
+ ctx.strokeStyle = this.couleurPrimitive1;
+ ctx.fillStyle = this.couleurPrimitive1;
+ ctx.moveTo(-affichage.xGauche*affichage.multX,affichage.hauteur-(this.conditionInitiale-affichage.yBas)*affichage.multY);
+ nonDefini = 0;
+ var pente, y0;
+ var conditionInitiale = this.conditionInitiale;
+// precision /= 4;
+
+ // Partie droite
+ y0 = conditionInitiale;
+ for(x = precision; x <= affichage.xDroite+precision; x+=precision){
+ // Evaluer la valeur y du point x
+ pente = this.f(x);
+ if(!isNaN(pente)){
+ // Transformation des coordonnées
+ y = y0 + pente * precision;
+
+ pointX = (x - affichage.xGauche) * affichage.multX;
+ pointY = affichage.hauteur - (y - affichage.yBas) * affichage.multY;
+ y0 = y;
+
+ // Dessiner la primitive
+ if(nonDefini>0){
+ nonDefini--;
+ ctx.moveTo(pointX, pointY);
+ }
+ else{
+ if(this.style == "continu"){
+ ctx.lineTo(pointX, pointY);
+ }
+ else if(this.style == "points"){
+ ctx.beginPath();
+ ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
+ ctx.fill();
+ }
+ else{
+ ctx.lineTo(pointX, pointY);
+ nonDefini = 1;
+ }
+ }
+ }
+ else{
+ nonDefini = 2;
+ }
+ }
+ if(this.style != "points"){
+ ctx.stroke();
+ }
+ // Partie gauche
+ ctx.beginPath();
+ ctx.moveTo(-affichage.xGauche*affichage.multX,affichage.hauteur-(this.conditionInitiale-affichage.yBas)*affichage.multY);
+ nonDefini = 0;
+ y0 = conditionInitiale;
+ for(x = -precision; x >= affichage.xGauche-precision; x-=precision){
+ // Evaluer la valeur y du point x
+ pente = this.f(x);
+ if(!isNaN(pente)){
+ // Transformation des coordonnées
+ y = y0 - pente * precision;
+
+ pointX = (x - affichage.xGauche) * affichage.multX;
+ pointY = affichage.hauteur - (y - affichage.yBas) * affichage.multY;
+ y0 = y;
+
+ // Dessiner la primitive
+ if(nonDefini>0){
+ nonDefini--;
+ ctx.moveTo(pointX, pointY);
+ }
+ else{
+ if(this.style == "continu"){
+ ctx.lineTo(pointX, pointY);
+ }
+ else if(this.style == "points"){
+ ctx.beginPath();
+ ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
+ ctx.fill();
+ }
+ else{
+ ctx.lineTo(pointX, pointY);
+ nonDefini = 1;
+ }
+ }
+ }
+ else{
+ nonDefini = 2;
+ }
+ }
+ if(this.style != "points"){
+ ctx.stroke();
+ }
+ }
+
+ // Fonction
+ ctx.beginPath();
+ ctx.lineWidth = this.width;
+ if(affichage.methode == "uniboard"){
+ ctx.lineWidth *= 3;
+ }
+ ctx.strokeStyle = this.couleur;
+ ctx.fillStyle = this.couleur;
+ ctx.moveTo(-100,-100);
+ nonDefini = true;
+ for(x = affichage.xGauche-precision; x <= affichage.xDroite+precision; x+=precision){
+ // Evaluer la valeur y du point x
+ y = this.f(x);
+ if(!isNaN(y) && y <= affichage.yHaut+Math.abs(affichage.yHaut) && y >= affichage.yBas-Math.abs(affichage.yBas)){
+ // Transformation des coordonnées
+ pointX = (x - affichage.xGauche) * affichage.multX;
+ pointY = affichage.hauteur - (y - affichage.yBas) * affichage.multY;
+
+ // Dessiner la fonction
+ if(nonDefini){
+ nonDefini = false;
+ ctx.moveTo(pointX, pointY);
+ }
+ else{
+ if(this.style == "continu"){
+ ctx.lineTo(pointX, pointY);
+ }
+ else if(this.style == "points"){
+ ctx.beginPath();
+ ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
+ ctx.fill();
+ }
+ else{
+ ctx.lineTo(pointX, pointY);
+ nonDefini = true;
+ }
+ }
+
+ // Dessiner l'aire sous la fonction
+ if(this.aire){
+ var zero = affichage.hauteur + affichage.yBas * affichage.multY;
+ var l = precision*affichage.multX;
+ ctx.fillStyle = "rgba(0,180,255,0.3)";
+ ctx.fillRect(pointX-l/2, zero, l , pointY-zero);
+ ctx.fillStyle = this.couleur;
+ }
+ }
+ else{
+ nonDefini = true;
+ }
+ }
+ if(this.style != "points"){
+ ctx.stroke();
+ }
+
+ if(this.style == "points"){
+ precision /= 2;
+ }
+ };
+}
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/ColorPicker.js b/resources/library/applications/GraphMe.wgt/JavaScript/ColorPicker.js
index a90b82e6..ac4383ef 100644
--- a/resources/library/applications/GraphMe.wgt/JavaScript/ColorPicker.js
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/ColorPicker.js
@@ -1,108 +1,580 @@
// -------------------- Color Picker --------------------
-var idColor = ""
+var idColor = "";
// Différentes fonctions nécessaire au Color Picker (menu du choix de la couleur)
-function colorSV(e){
- var element = document.getElementById('colorSV')
- var posDivY = 0
- var posDivX = 0
- while(element){
- posDivY = posDivY + element.offsetTop
- posDivX = posDivX + element.offsetLeft
- element = element.offsetParent
- }
- document.getElementById("info").innerHTML = posDivX+" ; "+posDivY
- S = 100-Math.round((e.clientY - posDivY -0)/255*100)
- V = Math.round((e.clientX - posDivX -0)/255*100)
- document.getElementById("inputValeur").value = V
- document.getElementById("inputSaturation").value = S
- document.getElementById("ligneValeur").setAttribute("x1", e.clientX-posDivX)
- document.getElementById("ligneValeur").setAttribute("x2", e.clientX-posDivX)
- document.getElementById("ligneSaturation").setAttribute("y1", e.clientY-posDivY)
- document.getElementById("ligneSaturation").setAttribute("y2", e.clientY-posDivY)
- colorRGB()
-}
-function colorT(e){
- var element = document.getElementById('colorT')
- var posDiv = 0
- while(element){
- posDiv = posDiv + element.offsetTop
- element = element.offsetParent
- }
- T = (e.clientY - posDiv -0) / 256*360
- r,g,b = 0
- while (true){
+var colorPicker = {
+ // Configuration
+ idSV : "canvasSV", // id du canvas affichant la saturation et la valeur
+ idT : "canvasT", // id du canvas affichant la teinte
+ idO : "canvasO", // id du canvas affichant l'opacité
+ width : 250, // largeur
+ height : 250, // hauteur
+ rayonRonds : 5, // rayon des ronds
+ ombreActive : "0px 0px 3px rgba(150,200,255,1), 0px 0px 8px rgba(64,190,255,1)",
+ ombreInactive : "0px 0px 5px rgba(64,64,64,0.4)",
+
+ // Variables définies lors de l'initialisation
+ canvasSV : null,
+ canvasT : null,
+ canvasO : null,
+ ctxSV : null,
+ ctxT : null,
+ ctxO : null,
+ lingradS : null,
+ lingradV : null,
+ lingradT : null,
+
+ // Couleurs
+ backgroundColor : "rgb(193,255,0)",
+ saturation : 100,
+ valeur : 100,
+ teinte : 75,
+ rouge : 193,
+ vert : 255,
+ bleu : 0,
+ opacity: 1,
+ // Couleurs RGB sans application de la saturation et de la valeur
+ r : 255,
+ g : 0,
+ b : 0,
+
+ // Autres variables
+ sourisDown : false, // Indique si on clique sur le colorPicker ou pas
+ sourisDehors : true, // Indique si la souris est en-dehors du colorPicker lors d'un clique
+ idColor : null,
+
+ // Fonction d'initialisation
+ init : function(id){
+ // Récupérer les éléments
+ this.canvasSV = document.getElementById(this.idSV);
+ this.canvasT = document.getElementById(this.idT);
+ this.canvasO = document.getElementById(this.idO);
+
+ // Définir la taille
+ this.canvasSV.width = this.width;
+ this.canvasSV.height = this.height;
+ this.canvasSV.style.width = this.width + "px";
+ this.canvasSV.style.height = this.height + "px";
+
+ this.canvasT.width = this.width/10;
+ this.canvasT.height = this.height;
+ this.canvasT.style.width = this.width/10 + "px";
+ this.canvasT.style.height = this.height + "px";
+
+ this.canvasO.width = this.width*1.15;
+ this.canvasO.height = this.height/10;
+ this.canvasO.style.width = this.width*1.15 + "px";
+ this.canvasO.style.height = this.height/10 + "px";
+
+ // Initialisation canvas
+ this.ctxSV = this.canvasSV.getContext("2d");
+ this.ctxT = this.canvasT.getContext("2d");
+ this.ctxO = this.canvasO.getContext("2d");
+
+ // Création des dégradés
+ this.lingradV = this.ctxSV.createLinearGradient(0, 0, 0, this.height);
+ this.lingradV.addColorStop(0, 'rgba(255,255,255,0)');
+ this.lingradV.addColorStop(1, 'rgba(255,255,255,1)');
+
+ this.lingradS = this.ctxSV.createLinearGradient(0, 0, this.width, 0);
+ this.lingradS.addColorStop(0, 'rgba(0,0,0,1)');
+ this.lingradS.addColorStop(1, 'rgba(0,0,0,0)');
+
+ this.lingradT = this.ctxT.createLinearGradient(0, 0, 0, this.height);
+ this.lingradT.addColorStop(0, 'rgb(255,0,0)');
+ this.lingradT.addColorStop(1/6, 'rgb(255,255,0)');
+ this.lingradT.addColorStop(2/6, 'rgb(0,255,0)');
+ this.lingradT.addColorStop(3/6, 'rgb(0,255,255)');
+ this.lingradT.addColorStop(4/6, 'rgb(0,0,255)');
+ this.lingradT.addColorStop(5/6, 'rgb(255,0,255)');
+ this.lingradT.addColorStop(1, 'rgb(255,0,0)');
+
+ // Événements roulette (initialisé seulement une fois)
+ if(window.addEventListener && !this.idColor){
+ this.canvasSV.addEventListener('DOMMouseScroll', function(event){colorPicker.eventWheel(event, colorPicker.idSV)}, false);
+ this.canvasSV.onmousewheel = function(event){colorPicker.eventWheel(event, colorPicker.idSV)};
+ this.canvasT.addEventListener('DOMMouseScroll', function(event){colorPicker.eventWheel(event, colorPicker.idT)}, false);
+ this.canvasT.onmousewheel = function(event){colorPicker.eventWheel(event, colorPicker.idT)};
+ this.canvasO.addEventListener('DOMMouseScroll', function(event){colorPicker.eventWheel(event, colorPicker.idO)}, false);
+ this.canvasO.onmousewheel = function(event){colorPicker.eventWheel(event, colorPicker.idO)};
+ }
+
+ // Définir la couleur
+ this.idColor = id;
+ var couleur = eval(document.getElementById(this.idColor).title);
+// alert(id+" ; "+couleur)
+ document.getElementById("apercuCouleur").style.backgroundColor = couleur;
+ document.getElementById("apercuCouleur2").style.backgroundColor = couleur;
+ this.definirCouleur(couleur);
+
+ // Dessiner
+ this.dessiner();
+ this.dessinerApercu();
+
+ // Définir les valeurs des inputs
+ this.definirInputs();
+
+ // Définir le style de l'ombre
+ this.sourisOut();
+
+ },
+
+ definirCouleur : function(colorRGB){
+ var table = /(.*?)rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/.exec(colorRGB);
+ if (table == null){
+ table = /(.*?)rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/.exec(colorRGB);
+ }
+ if(table == null){
+ return "";
+ }
+ this.rouge = parseInt(table[2]);
+ this.vert = parseInt(table[3]);
+ this.bleu = parseInt(table[4]);
+ this.RGB_SVT();
+ },
+
+ sourisClick : function(id){
+ this.sourisDown = id;
+ if(id != this.idO){
+ document.getElementById(id).style.boxShadow = this.ombreActive;
+ }
+ },
+
+ sourisOut : function(){
+ this.canvasSV.style.boxShadow = this.ombreInactive;
+ this.canvasT.style.boxShadow = this.ombreInactive;
+ },
+
+ sourisOver : function(id){
+ if(this.sourisDown == id && id != this.idO){
+ document.getElementById(id).style.boxShadow = this.ombreActive;
+ }
+ },
+
+ sourisUp : function(){
+ this.sourisDown = false;
+ this.canvasSV.style.boxShadow = this.ombreInactive;
+ this.canvasT.style.boxShadow = this.ombreInactive;
+ this.dessinerO();
+ },
+
+ eventWheel : function(event, id){
+ if(!event) event = window.event;
+ if(event.wheelDelta){
+ if(event.wheelDelta < 0){
+ colorPicker.sourisWheelUp(id);
+ }
+ else{
+ colorPicker.sourisWheelDown(id);
+ }
+ }
+ else if(event.detail){
+ if(event.detail > 0){
+ colorPicker.sourisWheelUp(id);
+ }
+ else{
+ colorPicker.sourisWheelDown(id);
+ }
+ }
+ },
+
+ sourisWheelUp : function(id){
+ switch(id){
+ case this.idT:
+ colorPicker.ajouterT(5);
+ break;
+ case this.idO:
+ colorPicker.ajouterO(0.1);
+ break;
+ case this.idSV:
+ colorPicker.ajouterS(-5);
+ break;
+ }
+ },
+
+ sourisWheelDown : function(id){
+ switch(id){
+ case this.idT:
+ colorPicker.ajouterT(-5);
+ break;
+ case this.idO:
+ colorPicker.ajouterO(-0.1);
+ break;
+ case this.idSV:
+ colorPicker.ajouterS(5);
+ break;
+ }
+ },
+
+ ajouterT : function(nbr){
+ this.teinte += nbr;
+ if(this.teinte < 0){
+ this.teinte = 0;
+ }
+ else if(this.teinte > 360){
+ this.teinte = 360;
+ }
+ this.SVT_RGB();
+ },
+
+ ajouterO : function(nbr){
+ this.opacity = Math.round((this.opacity+nbr)*100)/100;
+ if(this.opacity < 0){
+ this.opacity = 0;
+ }
+ else if(this.opacity > 1){
+ this.opacity = 1;
+ }
+ this.SVT_RGB();
+ },
+
+ ajouterS : function(nbr){
+ this.saturation += nbr;
+ if(this.saturation < 0){
+ this.saturation = 0;
+ }
+ else if(this.saturation > 100){
+ this.saturation = 100;
+ }
+ this.SVT_RGB();
+ },
+
+ // Lors du déplacement de la souris
+ moveSV : function(event){
+ // Vérifie si on appuie sur la souris
+ if(this.sourisDown != this.idSV){
+ return 0;
+ }
+
+ var element = this.canvasSV;
+ var posDivY = 0;
+ var posDivX = 0;
+
+ // Récupérer la position du canvas par rapport à la page
+ while(element){
+ posDivY = posDivY + element.offsetTop;
+ posDivX = posDivX + element.offsetLeft;
+ element = element.offsetParent;
+ }
+
+ // Définir la saturation et la valeur à partir de la position de la souris
+ this.saturation = 100-Math.round((event.clientY - posDivY -1)/(this.height+1)*100);
+ this.valeur = Math.round((event.clientX - posDivX -1)/(this.width+1)*100);
+
+ this.SVT_RGB();
+ },
+ moveT : function(event){
+ if(this.sourisDown != this.idT){
+ return 0;
+ }
+ var element = this.canvasT;
+ var posDivY = 0;
+
+ while(element){
+ posDivY = posDivY + element.offsetTop;
+ element = element.offsetParent;
+ }
+
+ this.teinte = Math.round( (event.clientY - posDivY -0) / (this.height+1)*360);
+
+ this.SVT_RGB();
+ },
+
+ SVT_RGB : function(){
+ this.T_rgb();
+ this.rouge = Math.round((this.r + (255-this.r) * (-1) * (this.saturation-100) / 100 )* this.valeur / 100);
+ this.vert = Math.round((this.g + (255-this.g) * (-1) * (this.saturation-100) / 100 )* this.valeur / 100);
+ this.bleu = Math.round((this.b + (255-this.b) * (-1) * (this.saturation-100) / 100 )* this.valeur / 100);
+
+ this.definirInputs();
+ this.dessinerApercu();
+ this.dessiner();
+ },
+
+ T_rgb : function(){
+ var r,g,b = 0;
+ var T = this.teinte;
+
if (T<60){
- r = 255
- g = T/60*255
- b = 0
- break
- }
- if (T<=120){
- r = (255-(T%60/60*255))%256
- g = 255
- b = 0
- break
- }
- if (T<180){
- r = 0
- g = 255
- b = T%60/60*255
- break
- }
- if (T<=240){
- r = 0
- g = (255-(T%60/60*255))%256
- b = 255
- break
- }
- if (T<300){
- r = T%60/60*255
- g = 0
- b = 255
- break
- }
- if (T<360){
- r = 255
- g = 0
- b = (255-(T%60/60*255))%256
- break
- }
- r = 255
- g = 0
- b = 0
- break
+ r = 255;
+ g = T/60*255;
+ b = 0;
+ }
+ else if (T<120){
+ r = (255-(T%60/60*255))%256;
+ g = 255;
+ b = 0;
+ }
+ else if (T<180){
+ r = 0;
+ g = 255;
+ b = T%60/60*255;
+ }
+ else if (T<240){
+ r = 0;
+ g = (255-(T%60/60*255))%256;
+ b = 255;
+ }
+ else if (T<300){
+ r = T%60/60*255;
+ g = 0;
+ b = 255;
+ }
+ else if (T<360){
+ r = 255;
+ g = 0;
+ b = (255-(T%60/60*255))%256;
+ }
+ else{
+ r = 255;
+ g = 0;
+ b = 0;
+ }
+
+ this.r = Math.round(r);
+ this.g = Math.round(g);
+ this.b = Math.round(b);
+ },
+
+ RGB_SVT : function(){
+ // Voir http://fr.wikipedia.org/wiki/Teinte_Saturation_Valeur#Conversion_de_RVB_vers_TSV
+ var r = this.rouge/255;
+ var g = this.vert/255;
+ var b = this.bleu/255;
+ if(!isFinite(r)){
+ r = 0;
+ }
+ if(!isFinite(g)){
+ g = 0;
+ }
+ if(!isFinite(b)){
+ b = 0;
+ }
+ var max = Math.max(r,g,b);
+ var min = Math.min(r,g,b);
+ var s, v, t;
+ // Teinte
+ switch(max){
+ case r:
+ t = (60 * (g-b)/(max-min) + 360) % 360;
+ break;
+ case g:
+ t = 60 * (b-r)/(max-min) + 120;
+ break;
+ case b:
+ t = 60 * (r-g)/(max-min) + 240;
+ break;
+ default: /* case min: */
+ t = 0;
+ break;
+ }
+
+ // Saturation
+ if(max == 0){
+ s = 0;
+ }
+ else{
+ s = 1-(min/max);
+ }
+
+ // Valeur
+ v = max;
+
+ // Définir les variables
+ this.saturation = s*100;
+ this.valeur = v*100;
+ this.teinte = Math.round(t);
+ this.T_rgb();
+ },
+
+ dessiner : function(){
+ var ctxSV = this.ctxSV;
+ var ctxT = this.ctxT;
+ // Fond
+ ctxSV.fillStyle = "rgb("+this.r+","+this.g+","+this.b+")";
+ ctxSV.fillRect(0, 0, this.width, this.height);
+ // Dégradés
+ ctxSV.fillStyle = this.lingradV;
+ ctxSV.fillRect(0, 0, this.width, this.height);
+ ctxSV.fillStyle = this.lingradS;
+ ctxSV.fillRect(0, 0, this.width, this.height);
+ // Souris
+ var x = Math.round(this.width*this.valeur/100);
+ var y = Math.round(this.height-this.height*this.saturation/100);
+ ctxSV.beginPath();
+ ctxSV.arc(x, y, this.rayonRonds, 0, 2*Math.PI, true);
+ ctxSV.strokeStyle = "rgba(255,255,255,0.8)";
+ ctxSV.shadowOffsetX = 1;
+ ctxSV.shadowOffsetY = 1;
+ ctxSV.shadowColor = "rgba(0,0,0,1)";
+ ctxSV.shadowBlur = 2;
+ ctxSV.lineWidth = 1.5;
+ ctxSV.stroke();
+
+ // Fond Teinte
+ ctxT.fillStyle = this.lingradT;
+ ctxT.fillRect(0, 0, this.width/10, this.height);
+ // Souris Teinte
+ var pos = Math.round(0.99*this.height*this.teinte/360);
+ ctxT.fillStyle = "rgba(255,255,255,0.8)";
+ ctxT.shadowOffsetX = 0;
+ ctxT.shadowOffsetY = 0;
+ ctxT.shadowColor = "rgba(0,0,0,1)";
+ ctxT.shadowBlur = 3;
+ ctxT.fillRect(0, pos, this.width/10, 2);
+
+ // Désactiver les ombres
+ ctxSV.shadowColor = "rgba(0,0,0,0)";
+ ctxT.shadowColor = "rgba(0,0,0,0)";
+
+ this.dessinerO();
+ },
+
+ dessinerApercu : function(){
+ document.getElementById("apercuCouleur").style.backgroundColor = "rgba("+this.rouge+","+this.vert+","+this.bleu+","+this.opacity+")";
+ },
+
+ definirInputs : function(){
+ document.getElementById("inputValeur").value = this.valeur;
+ document.getElementById("inputSaturation").value = this.saturation;
+ document.getElementById("inputTeinte").value = this.teinte;
+ document.getElementById("inputRouge").value = this.rouge;
+ document.getElementById("inputVert").value = this.vert;
+ document.getElementById("inputBleu").value = this.bleu;
+ document.getElementById("inputOpacity").value = this.opacity;
+ },
+
+ recupererInputs : function(){
+ this.valeur = parseInt(document.getElementById("inputValeur").value);
+ this.saturation = parseInt(document.getElementById("inputSaturation").value);
+ this.teinte = parseInt(document.getElementById("inputTeinte").value);
+ this.opacity = parseFloat(document.getElementById("inputOpacity").value);
+ this.SVT_RGB();
+
+ this.definirInputs();
+ this.dessinerApercu();
+ this.dessiner();
+ },
+ recupererInputs2 : function(){
+ this.rouge = parseInt(document.getElementById("inputRouge").value);
+ this.vert = parseInt(document.getElementById("inputVert").value);
+ this.bleu = parseInt(document.getElementById("inputBleu").value);
+ this.RGB_SVT();
+
+ this.definirInputs();
+ this.dessinerApercu();
+ this.dessiner();
+ },
+
+ moveO : function(event){
+ if(this.sourisDown != this.idO){
+ return 0;
+ }
+
+ var element = this.canvasO;
+ var posDivX = 0;
+ while(element){
+ posDivX = posDivX + element.offsetLeft;
+ element = element.offsetParent;
+ }
+
+ this.opacity = Math.round( (event.clientX - posDivX -this.width/10) / (this.width*0.9)*100)/100;
+ if(this.opacity < 0){
+ this.opacity = 0;
+ }
+ else if(this.opacity > 1){
+ this.opacity = 1;
+ }
+ this.dessinerO();
+ this.definirInputs();
+ this.dessinerApercu();
+ },
+
+ dessinerO : function(){
+ var ctx = this.ctxO;
+
+ ctx.shadowBlur = 2;
+
+ // Ligne
+ if(this.sourisDown == this.idO){
+ ctx.shadowColor = "rgba(0,50,100,1)";
+ }
+ else{
+ ctx.shadowColor = "rgba(0,0,0,1)";
+ }
+ ctx.globalAlpha = 1;
+ ctx.shadowOffsetX = 0;
+ ctx.shadowOffsetY = 0;
+ ctx.fillStyle = "rgba("+this.rouge+","+this.vert+","+this.bleu+",1)";
+ ctx.clearRect(0,0,this.width*1.15,this.height);
+ ctx.fillRect(this.width/10, this.height/20-1, this.width*0.9, 3);
+
+ // Rond
+ var x = this.width/10 + this.width*0.9*this.opacity-1;
+ var y = this.height/20;
+ if(this.sourisDown == this.idO){
+ ctx.fillStyle = "rgba(0,40,80,1)";
+ ctx.strokeStyle = "rgba(230,250,255,0.8)";
+ }
+ else{
+ ctx.fillStyle = "rgba(0,0,0,1)";
+ ctx.strokeStyle = "rgba(255,255,255,0.8)";
+ }
+ ctx.globalAlpha = 0.1+this.opacity*0.9;
+ ctx.beginPath();
+ ctx.arc(x, y, this.rayonRonds+1, 0, 2*Math.PI, true);
+ ctx.shadowColor = "rgba(0,0,0,1)";
+ ctx.shadowOffsetX = 1;
+ ctx.shadowOffsetY = 1;
+ ctx.lineWidth = 1;
+ ctx.fill();
+ ctx.stroke();
+
+ // Petits ronds
+ ctx.globalAlpha = 1;
+ ctx.shadowColor = "rgba(0,0,0,1)";
+
+ ctx.beginPath();
+ ctx.arc(8, this.height/20+0.5, this.rayonRonds, 0, 2*Math.PI, true);
+ ctx.strokeStyle = "rgba(0,0,0,0.5)";
+ ctx.shadowOffsetX = 0;
+ ctx.shadowOffsetY = 0;
+ ctx.lineWidth = 1;
+ ctx.stroke();
+
+ ctx.beginPath();
+ ctx.arc(this.width*1.08, this.height/20+0.5, this.rayonRonds, 0, 2*Math.PI, true);
+ ctx.strokeStyle = "rgba(0,0,0,0.8)";
+ ctx.fillStyle = "rgba(0,0,0,0.6)";
+ ctx.shadowOffsetX = 0;
+ ctx.shadowOffsetY = 0;
+ ctx.lineWidth = 1;
+ ctx.stroke();
+ ctx.fill();
+ },
+
+ exporterCouleur : function(){
+ eval(document.getElementById(this.idColor).title+' = "rgba(" + this.rouge +", " + this.vert + ", " + this.bleu +", "+this.opacity+")"');
+ document.getElementById(this.idColor).style.backgroundColor = eval(document.getElementById(this.idColor).title);
+ },
+
+ fermer : function(){
+ colorPicker.exporterCouleur();
+ if(colorPicker.idColor == 'buttonColor'){
+ cacherMenu();
+ }
+ else if(dernierMenu == "menuFonctions"){
+ editeur.getOptions();
+ afficherMenu(dernierMenu);
+ }
+ else{
+ cacherMenu();
+ }
+ actualiserGraph();
}
- T = Math.round(T)
- r = Math.round(r)
- g = Math.round(g)
- b = Math.round(b)
- document.getElementById("inputTeinte").value = T
- document.getElementById("colorSV").style.backgroundColor = "rgb("+r+","+g+","+b+")"
- document.getElementById("ligneTeinte").setAttribute("y2", e.clientY-posDiv)
- document.getElementById("ligneTeinte").setAttribute("y1", e.clientY-posDiv)
- colorRGB()
-}
+};
-function colorRGB(){
- var S = document.getElementById("inputSaturation").value
- var V = document.getElementById("inputValeur").value
- var rouge = Math.round((r + (255-r) * (-1) * (S-100) / 100 )* V / 100)
- var vert = Math.round((g + (255-g) * (-1) * (S-100) / 100 )* V / 100)
- var bleu = Math.round((b + (255-b) * (-1) * (S-100) / 100 )* V / 100)
- document.getElementById("inputRouge").value = rouge
- document.getElementById("inputVert").value = vert
- document.getElementById("inputBleu").value = bleu
- eval(document.getElementById(idColor).title+' = "rgba(" + rouge +", " + vert + ", " + bleu +", "+document.getElementById("inputOpacity").value+")"')
- document.getElementById(idColor).style.backgroundColor = eval(document.getElementById(idColor).title)
- document.getElementById("apercuCouleur").style.backgroundColor = eval(document.getElementById(idColor).title)
-}
-function colorPicker(id){
- idColor = id
- document.getElementById("apercuCouleur").style.backgroundColor = eval(document.getElementById(idColor).title)
- document.getElementById("apercuCouleur2").style.backgroundColor = eval(document.getElementById(idColor).title)
-}
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Editeur.js b/resources/library/applications/GraphMe.wgt/JavaScript/Editeur.js
new file mode 100644
index 00000000..ee9017d0
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/Editeur.js
@@ -0,0 +1,216 @@
+
+var editeur = {
+ idFct : 0,
+ fct : {
+ fct : "",
+ fctX : "",
+ fctY : "",
+ from : 0,
+ to : 2*Math.PI,
+ couleur : "",
+ couleurD1 : "",
+ couleurD2 : "",
+ couleurP1 : "",
+ width : 2,
+ style : "continu",
+ aire : false,
+ derivee1 : false,
+ derivee2 : false,
+ primitive1 : false,
+ conditionInitiale : 0
+ },
+ editer : function(id){
+ this.idFct = id;
+ if(fct.list[this.idFct]){
+ document.getElementById("editeurFonction").style.visibility = "visible";
+ this.setOptions();
+ }
+ else{
+ document.getElementById("editeurFonction").style.visibility = "hidden";
+ }
+ fct.updateList();
+ },
+ couleur : function(id){
+ colorPicker.init(id);
+ afficherMenu('menuCouleur');
+ },
+ getOptions : function(){
+ this.fct.fct = document.getElementById("editeurInput").value;
+ this.fct.fctX = document.getElementById("editeurFctX").value;
+ this.fct.fctY = document.getElementById("editeurFctY").value;
+ this.fct.from = document.getElementById("editeurFrom").value;
+ this.fct.to = document.getElementById("editeurTo").value;
+ this.fct.width = document.getElementById("editeurWidth").value;
+ this.fct.style = document.getElementById("editeurStyle").value;
+ this.fct.aire = document.getElementById("editeurAire").checked ? true : false;
+ this.fct.derivee1 = document.getElementById("editeurD1").checked ? true : false;
+ this.fct.derivee2 = document.getElementById("editeurD2").checked ? true : false;
+ this.fct.primitive1 = document.getElementById("editeurP1").checked ? true : false;
+ if(this.fct.primitive1){
+ document.getElementById("editeurConditionInitiale").disabled = "";
+ document.getElementById("editeurTexteConditionInitiale").style.color = "rgb(0,0,0)"
+ }
+ else{
+ document.getElementById("editeurConditionInitiale").disabled = "disabled";
+ document.getElementById("editeurTexteConditionInitiale").style.color = "rgb(128,128,128)"
+ }
+ this.fct.conditionInitiale = parseFloat(document.getElementById("editeurConditionInitiale").value);
+
+ fct.list[this.idFct].set(this.fct);
+
+ fct.updateList();
+ historique.ajouter(fct.list[this.idFct]);
+ this.apercu();
+ },
+ setOptions : function(){
+ var f = fct.list[this.idFct].get();
+ for(var i in f){
+ this.fct[i] = f[i];
+ }
+
+ this.setDisplayStyle();
+
+ document.getElementById("editeurInput").value = this.fct.fct;
+ document.getElementById("editeurFctX").value = this.fct.fctX;
+ document.getElementById("editeurFctY").value = this.fct.fctY;
+ document.getElementById("editeurFrom").value = this.fct.from;
+ document.getElementById("editeurTo").value = this.fct.to;
+ document.getElementById("editeurCouleur").style.backgroundColor = this.fct.couleur;
+ document.getElementById("editeurCouleurD1").style.backgroundColor = this.fct.couleurD1;
+ document.getElementById("editeurCouleurD2").style.backgroundColor = this.fct.couleurD2;
+ document.getElementById("editeurCouleurP1").style.backgroundColor = this.fct.couleurP1;
+ document.getElementById("editeurWidth").value = this.fct.width;
+ document.getElementById("editeurStyle").value = this.fct.style;
+ document.getElementById("editeurAire").checked = this.fct.aire ? "checked" : "";
+ document.getElementById("editeurD1").checked = this.fct.derivee1 ? "checked" : "";
+ document.getElementById("editeurD2").checked = this.fct.derivee2 ? "checked" : "";
+ document.getElementById("editeurP1").checked = this.fct.primitive1 ? "checked" : "";
+ if(this.fct.primitive1){
+ document.getElementById("editeurConditionInitiale").disabled = "";
+ document.getElementById("editeurTexteConditionInitiale").style.color = "rgb(0,0,0)"
+ }
+ else{
+ document.getElementById("editeurConditionInitiale").disabled = "disabled";
+ document.getElementById("editeurTexteConditionInitiale").style.color = "rgb(128,128,128)"
+ }
+ document.getElementById("editeurConditionInitiale").value = this.fct.conditionInitiale;
+
+ document.getElementById("outputX").innerHTML = " ";
+ document.getElementById("outputAire").innerHTML = " ";
+ this.apercu();
+ },
+ setDisplayStyle : function(){
+ if(fct.list[this.idFct] instanceof CartesianFunction){
+ document.getElementById("editeurFctPrefix").textContent = "f(x) = ";
+ document.getElementById("editeurFctDiv").style.display = "block";
+ document.getElementById("editeurFctXYDiv").style.display = "none";
+ document.getElementById("editeurRangeDiv").style.display = "none";
+ document.getElementById("editeurDeriveesDiv").style.display = "block";
+ document.getElementById("editeurStyleDiv").style.display = "block";
+ document.getElementById("editeurAireDiv").style.display = "block";
+ }
+ else if(fct.list[this.idFct] instanceof ImplicitFunction){
+ document.getElementById("editeurFctPrefix").textContent = "";
+ document.getElementById("editeurFctDiv").style.display = "block";
+ document.getElementById("editeurFctXYDiv").style.display = "none";
+ document.getElementById("editeurRangeDiv").style.display = "none";
+ document.getElementById("editeurDeriveesDiv").style.display = "none";
+ document.getElementById("editeurStyleDiv").style.display = "none";
+ document.getElementById("editeurAireDiv").style.display = "none";
+ }
+ else if(fct.list[this.idFct] instanceof PolarFunction){
+ document.getElementById("editeurFctPrefix").textContent = "r(t) = ";
+ document.getElementById("editeurFctDiv").style.display = "block";
+ document.getElementById("editeurFctXYDiv").style.display = "none";
+ document.getElementById("editeurRangeDiv").style.display = "block";
+ document.getElementById("editeurDeriveesDiv").style.display = "none";
+ document.getElementById("editeurStyleDiv").style.display = "block";
+ document.getElementById("editeurAireDiv").style.display = "none";
+ }
+ else if(fct.list[this.idFct] instanceof ParametricFunction){
+ document.getElementById("editeurFctDiv").style.display = "none";
+ document.getElementById("editeurFctXYDiv").style.display = "block";
+ document.getElementById("editeurRangeDiv").style.display = "block";
+ document.getElementById("editeurDeriveesDiv").style.display = "none";
+ document.getElementById("editeurStyleDiv").style.display = "block";
+ document.getElementById("editeurAireDiv").style.display = "none";
+ }
+ },
+ etudier : function(){
+ fct.etudier(this.idFct);
+ },
+ supprimer : function(){
+ fct.enlever(this.idFct);
+ if(!fct.list[this.idFct]){
+ this.editer(this.idFct - 1);
+ }
+ else{
+ this.editer(this.idFct);
+ }
+ },
+ dupliquer : function(){
+ fct.dupliquer(this.idFct);
+ this.editer(this.idFct + 1);
+ },
+ apercu : function(){
+ editorPreview.drawFunction(fct.list[this.idFct]);
+ }
+};
+
+
+var editorPreview = {
+ id : "editeurApercu",
+
+ xGauche : -5,
+ xDroite : 5,
+ yBas : -4,
+ yHaut : 4,
+
+ largeur : 0,
+ hauteur : 0,
+ multX : 1,
+ multY : 1,
+
+ ctx: null,
+
+ init : function(){
+ var canvas = document.getElementById("editeurApercu");
+ this.ctx = canvas.getContext("2d");
+ this.largeur = canvas.width;
+ this.hauteur = canvas.height;
+ this.multX = this.largeur/Math.abs(this.xDroite - this.xGauche);
+ this.multY = this.hauteur/Math.abs(this.yHaut - this.yBas);
+ this.precision = Math.abs(this.xDroite - this.xGauche)/50;
+ },
+
+ drawFunction : function(func){
+ var x, y, pointX, pointY;
+ var ctx = this.ctx;
+ ctx.clearRect(0,0,100,80);
+ ctx.globalAlpha = 0.7;
+ ctx.fillStyle = "rgba(0,0,0,0.5)"
+ ctx.fillRect(0,39.5, 100, 1);
+ ctx.fillRect(49.5,0, 1, 80);
+ ctx.beginPath();
+// ctx.lineWidth = func.width/1.8;
+// ctx.strokeStyle = func.couleur;
+// ctx.moveTo(-100,-100);
+// for(x = -5; x <= 5; x+=0.2){
+// // Evaluer la valeur y du point x
+// try{
+// y = func.f(x);
+// }
+// catch(e){}
+// if(!isNaN(y)){
+// // Transformation des coordonnées
+// pointX = x * 10 + 50;
+// pointY = 40 - y * 10;
+//
+// // Dessiner la fonction
+// ctx.lineTo(pointX, pointY);
+// }
+// }
+ func.plot(ctx, this.precision, this);
+// ctx.stroke();
+ }
+};
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Etude.js b/resources/library/applications/GraphMe.wgt/JavaScript/Etude.js
deleted file mode 100644
index fea7d280..00000000
--- a/resources/library/applications/GraphMe.wgt/JavaScript/Etude.js
+++ /dev/null
@@ -1,356 +0,0 @@
-
-// -------------------- Etude de fonctions --------------------
-
-var etudeX = new Array()
-var etudeY = new Array()
-var etudeD = new Array()
-var limGauche = new Array()
-var limDroite = new Array()
-var listeIndefini = new Array()
-var listeZeros = new Array()
-var intervalEtudeGauche = -50
-var intervalEtudeDroite = 50
-var precisionEtude = 0.001
-
-function etudier(fct){
- if(check(fct)){
- prepareEtude(fct)
- pariteFct()
- signeFct(fct)
- asymptotes()
- courbure()
- ensembleDefinition()
- }
-}
-
-// Préparation à l'étude de fonction
-function prepareEtude(fct){
- listeIndefini = new Array()
- var f = function(x){
- return eval(fct)
- }
- // Calcul de tous les points de la fonction
- var i = 0
- for(var x=intervalEtudeGauche; x<=intervalEtudeDroite; x+=precisionEtude){
- etudeX[i] = x
- etudeY[i] = Math.round(f(x)*10000)/10000
- etudeD[i] = Math.round(1000000*(f(x+0.0001)-f(x-0.0001))/(2*0.0001))/1000000
- i++
- }
- // Calcul des extrémités de la fonction
- var x = -100000
- limGauche[0] = f(x)
- x = -10000
- limGauche[1] = f(x)
- x = 100000
- limDroite[0] = f(x)
- x = 10000
- limDroite[1] = f(x)
-}
-
-// Recherche de l'ensemble de définition
-function ensembleDefinition(){
- var fctDefinie = false
- var dejaDefinie = false
- var EDF = ""
- if(!isNaN(limGauche[0])){
- fctDefinie = true
- dejaDefinie = true
- EDF += "]-∞;"
- }
- if(!isNaN(limGauche[1]) && !fctDefinie){
- fctDefinie = true
- dejaDefinie = true
- EDF += "]-∞;"
- }
- for(var i=0; i0){
- positif = Math.floor(etudeY[posZero+i])
- }
- else{
- positif = Math.ceil(etudeY[posZero+i])
- }
- if(etudeY[posZero-i]>0){
- negatif = Math.floor(etudeY[posZero-i])
- }
- else{
- negatif = Math.ceil(etudeY[posZero-i])
- }
-
- if(positif<25000 && positif>-25000){
- if(positif != negatif){
- paire = false
- //alert(i+" ; "+posZero+" ; "+etudeX.length+" ; "+positif+" ; "+negatif)
- }
- if(positif != (-negatif)){
- impaire = false
- }
- }
- }
- if(paire){
- document.getElementById("etudeParite").innerHTML = sankoreLang[lang].ev;
- }
- else if(impaire){
- document.getElementById("etudeParite").innerHTML = sankoreLang[lang].unev;
- }
- else{
- document.getElementById("etudeParite").innerHTML = sankoreLang[lang].na;
- }
-}
-
-function zeroFct(){
- listeZeros = new Array()
- var listeZerosArr = new Array()
- var precZeros = 5
- for(var i=0; i0){
- signe[0] = "+"
- signePlus[0] = limGauche[1]
- signeMoins[0] = limGauche[0]
- }
- else{
- signe[0] = "-"
- signePlus[0] = limGauche[1]
- signeMoins[0] = limGauche[0]
- }
- for(var i=0; i0){
- dernier = i
- }
- }
- if(signe[signe.length-1]=="-"){
- if(etudeY[i]>0){
- signe.push("+")
- signePlus.push(etudeX[i])
- signeMoins.push(etudeX[dernier])
- //alert(signe+" ; "+signePlus+'\n'+etudeY[i+1]+" ; "+etudeY[i]+" ; "+etudeY[i-1]+" ; "+etudeY[i-2]+'\n'+etudeX[i+1]+" ; "+etudeX[i]+" ; "+etudeX[i-1]+" ; "+etudeX[i-2])
- }
- else if(etudeY[i]<0){
- dernier = i
- }
- }
- }
- var valeurPlus, valeurMoins, millieu, precisionZero
- listeZeros = new Array()
- for(var i=1; i0){
- x = millieu
- if(eval(fct)>0){
- valeurPlus=millieu
- }
- else if(eval(fct)<0){
- valeurMoins=millieu
- }
- else{
- break
- }
- }
- else if(eval(fct)<0){
- x = millieu
- if(eval(fct)<0){
- valeurPlus=millieu
- }
- else if(eval(fct)>0){
- valeurMoins=millieu
- }
- else{
- break
- }
- }
- else{
- millieu = valeurPlus
- break
- }
- x = valeurPlus
- precisionZero = eval(fct)
- x = valeurMoins
- precisionZero -= eval(fct)
- if(precisionZero>0.0001){
- break
- }
- }
- listeZeros.push(Math.round(millieu*100)/100)
- }
- var texteZeros = ""
- if(listeZeros==""){
- zeroFct()
- texteZeros = "~ "
- }
- var texte = sankoreLang[lang].signe;
- var aSupprimer = new Array()
- for(var i=0; i"+signe[i]+""
- if(listeZeros[i]!=undefined){
- x = listeZeros[i]
- if(isFinite(eval(fct))){
- texte += ""+listeZeros[i]+" "
- }
- else{
- texte += ""+listeZeros[i]+" "
- listeIndefini.push(listeZeros[i])
- aSupprimer.push(i)
- }
- }
- }
- document.getElementById("etudeSigne").innerHTML = texte
- for(var i=0; i" + sankoreLang[lang].curve_higher + ""
- }
- else if(limGauche[0]>limRound){
- document.getElementById("etudeAHG").innerHTML = "y = "+limRound +" " + sankoreLang[lang].curve_lower + " "
- }
- else{
- document.getElementById("etudeAHG").innerHTML = "y = "+limRound
- }
- }
- else{
- document.getElementById("etudeAHG").innerHTML = sankoreLang[lang].na;
- }
- if(Math.abs(limDroite[0])<1000){
- var limRound = Math.round(limDroite[0]*100)/100
- if(limDroite[0]" + sankoreLang[lang].curve_lower + ""
- }
- else if(limDroite[0]>limRound){
- document.getElementById("etudeAHD").innerHTML = "y = "+limRound +" " + sankoreLang[lang].curve_higher + " "
- }
- else{
- document.getElementById("etudeAHD").innerHTML = "y = "+limRound
- }
- }
- else{
- document.getElementById("etudeAHD").innerHTML = sankoreLang[lang].na;
- }
- // Verticales
- var texteAV = ""
- for(var i=0; i "
- }
- document.getElementById("etudeAV").innerHTML = texteAV
-}
-
-function courbure(){
- var texteMin = "";
- var texteMax = "";
- var texteI = "";
- var nbrI = 0;
- var i;
- for(i=0; i0){
- texteMin += " " + sankoreLang[lang].min + "("+Math.round(etudeX[i]*10000)/10000+";"+etudeY[i]+")";
- }
- else if(etudeD[i-1]>0 && etudeD[i+1]<0){
- texteMax += " " + sankoreLang[lang].max + "("+Math.round(etudeX[i]*10000)/10000+";"+etudeY[i]+")";
- }
- else{
- nbrI++;
- texteI += ' I'+nbrI+" ("+Math.round(etudeX[i]*10000)/10000+";"+etudeY[i]+")";
- }
- }
- }
- if(texteMin==""){
- texteMin = " " + sankoreLang[lang].no_min;
- }
- if(texteMax==""){
- texteMax = " " + sankoreLang[lang].no_max;
- }
- if(texteI==""){
- texteI = " Aucun I";
- }
- document.getElementById("etudeMin").innerHTML = texteMin;
- document.getElementById("etudeMax").innerHTML = texteMax;
-}
\ No newline at end of file
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Etudes.js b/resources/library/applications/GraphMe.wgt/JavaScript/Etudes.js
new file mode 100644
index 00000000..ade1cf4f
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/Etudes.js
@@ -0,0 +1,520 @@
+
+// -------------------- Etudes de fonctions --------------------
+
+function consoleInfos(){
+ var table = [];
+ for(var i in arguments){
+ table.push(arguments[i]);
+ }
+ document.getElementById("infos").innerHTML += table +" ";
+}
+
+Array.prototype.first = function(){
+ return this[0];
+}
+Array.prototype.last = function(){
+ return this[this.length-1];
+}
+Array.prototype.removeDoubles = function(){
+ // Sort numerically
+ this.sort(function(nbr1,nbr2){return nbr1-nbr2});
+ // Remove doubles
+ for(var i=1; i-100000){
+ if(yPositif != yNegatif){
+ paire = false
+ }
+ if(yPositif != (-yNegatif)){
+ impaire = false
+ }
+ }
+ }
+
+ if(paire){
+ var text = "even";
+ try{
+ text = languages.getText("even");
+ }
+ catch(e){}
+ document.getElementById("etudeParite").textContent = text;
+ }
+ else if(impaire){
+ var text = "odd";
+ try{
+ text = languages.getText("odd");
+ }
+ catch(e){}
+ document.getElementById("etudeParite").textContent = text;
+ }
+ else{
+ var text = "odd";
+ try{
+ text = languages.getText("none_f");
+ }
+ catch(e){}
+ document.getElementById("etudeParite").textContent = text;
+ }
+// consoleInfos("paire = "+paire);
+// consoleInfos("impaire = "+impaire);
+ },
+
+ zerosNum : function(){
+ var f = this.f;
+ // Rechercher des zéros dans les points calculés
+ var listeZerosA = [];
+ for(var i=0; i-";
+ dernierSigne = "-";
+ break;
+ case 1:
+ txtSigne += "+ ";
+ dernierSigne = "+";
+ break;
+ }
+ for(var i=0; i-";
+ }
+ break;
+ case 1:
+ if(dernierSigne != "+"){
+ txtSigne += "+ ";
+ }
+ break;
+ }
+ if(listeNbr[i][1]){
+ txtSigne += ''+listeNbr[i][0]+' '
+ }
+ else{
+ txtSigne += ''+listeNbr[i][0]+' '
+ }
+ switch(b){
+ case -1:
+ txtSigne += "- ";
+ dernierSigne = "-";
+ break;
+ case 1:
+ txtSigne += "+ ";
+ dernierSigne = "+";
+ break;
+ }
+ }
+ document.getElementById("etudeSigneRow").innerHTML = txtSigne;
+// consoleInfos("");
+ },
+
+ asymptotesNum : function(){
+ var f = this.f;
+ // Verticales
+ var texteA = "";
+ for(var i=0; i ";
+ }
+ texteA += "AHG : y="+lim1;
+ }
+ else{
+ pente1 = this.round(lim3-lim1);
+ pente2 = this.round(lim4-lim2);
+// consoleInfos(pente1, pente2);
+ if(pente1 == pente2 && pente1!=0){
+// consoleInfos("AOG : y="+pente1+"x+"+(lim1+pente1*val1));
+ if(texteA!=""){
+ texteA += " ";
+ }
+ texteA += "AOG : y="+pente1+"x+"+(lim1+pente1*val1);
+ }
+ }
+ // Droite
+ lim1 = this.round(f(val1));
+ lim2 = this.round(f(val2));
+ lim3 = this.round(f(val1+1));
+ lim4 = this.round(f(val2+1));
+// consoleInfos(lim1, lim2, lim3, lim4)
+ if(lim1==lim2 && isFinite(lim1)){
+// consoleInfos("AHD : y="+lim1);
+ if(texteA!=""){
+ texteA += " ";
+ }
+ texteA += "AHD : y="+lim1;
+ }
+ else{
+ pente1 = this.round(lim3-lim1);
+ pente2 = this.round(lim4-lim2);
+// consoleInfos(pente1, pente2);
+ if(pente1 == pente2 && pente1!=0){
+// consoleInfos("AOD : y="+pente1+"x+"+(lim1-pente1*val1));
+ if(texteA!=""){
+ texteA += " ";
+ }
+ texteA += "AOD : y="+pente1+"x+"+(lim1-pente1*val1);
+ }
+ }
+
+ if(texteA == ""){
+ texteA = "none";
+ try{
+ texteA = languages.getText("none_f");
+ }
+ catch(e){}
+ }
+ document.getElementById("etudeA").innerHTML = texteA;
+ },
+
+ extremumsNum : function(){
+ // Rechercher des zéros dans les points calculés
+ var listeID = [];
+ for(var i=1; i0){
+ if(txtMinMax != ""){
+ txtMinMax += " ";
+ }
+ txtMinMax += "Min("+this.listeX[i]+";"+this.round(this.listeY[i])+")";
+ }
+ else if(a>0 && b<0){
+ if(txtMinMax != ""){
+ txtMinMax += " ";
+ }
+ txtMinMax += "Max("+this.listeX[i]+";"+this.round(this.listeY[i])+")";
+ }
+ }
+// consoleInfos(txtMinMax);
+ if(txtMinMax == ""){
+ txtMinMax = "none";
+ try{
+ txtMinMax = languages.getText("none_m");
+ }
+ catch(e){}
+ }
+ document.getElementById("etudeMinMax").innerHTML = txtMinMax;
+ },
+
+ pointI : function(){
+ // Rechercher des zéros dans les points calculés
+ var listeID = [];
+// for(var i=1; i ";
+ }
+ txtI += 'I'+(j+1)+" ("+this.listeX[i]+";"+this.round(this.listeY[i])+")";
+ }
+// consoleInfos(txtI);
+ if(txtI == ""){
+ txtI = "none";
+ try{
+ txtI = languages.getText("none_m");
+ }
+ catch(e){}
+ }
+ document.getElementById("etudeI").innerHTML = txtI;
+ },
+
+}
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Fonction.js b/resources/library/applications/GraphMe.wgt/JavaScript/Fonction.js
new file mode 100644
index 00000000..91e65de5
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/Fonction.js
@@ -0,0 +1,226 @@
+
+var fct = {
+ list : [],
+ couleur : "rgba(193,255,0,1)",
+ colorsList : ["rgba(255,0,0,1)","rgba(255,128,0,1)","rgba(255,255,0,1)","rgba(128,255,0,1)","rgba(0,255,0,1)","rgba(0,255,128,1)","rgba(0,255,255,1)","rgba(0,128,255,1)","rgba(0,0,255,1)","rgba(128,0,255,1)","rgba(255,0,255,1)","rgba(255,0,128,1)"],
+ interdit : [";", "interdit", "'", '"', "eval", "new", "uniboard", "sankore", "=", "document", "window", "alert", "fct", "affichage", "colorPicker", "languages"],
+
+ functionFromObject: function(f){
+ if(f.type == "cartesian"){
+ return new CartesianFunction().set(f);
+ }
+ else if(f.type == "implicit"){
+ return new ImplicitFunction().set(f);
+ }
+ else if(f.type == "polar"){
+ return new PolarFunction().set(f);
+ }
+ else if(f.type == "parametric"){
+ return new ParametricFunction().set(f);
+ }
+ console.err("Unknown function:", f);
+ },
+
+ addCartesian : function(txt){
+ var txtFct = this.remplacer(this.verifier(txt));
+ if(txtFct == ""){
+ return false;
+ }
+
+ var f = new CartesianFunction(txtFct);
+ this.add(f, true);
+
+ return true;
+ },
+
+ addImplicit : function(txtFct){
+ var equalPos = txtFct.indexOf("=");
+ if(equalPos >= 0){
+ txtFct = txtFct.replace("=", "-(") + ")";
+ }
+ txtFct = this.remplacer(this.verifier(txtFct));
+ if(txtFct == ""){
+ return false;
+ }
+
+ var f = new ImplicitFunction(txtFct);
+ this.add(f, true);
+
+ return true;
+ },
+
+ addPolar : function(txt){
+ var txtFct = this.remplacer(this.verifier(txt));
+ if(txtFct == ""){
+ return false;
+ }
+
+ var f = new PolarFunction(txtFct);
+ this.add(f, true);
+
+ return true;
+ },
+
+ addParametric : function(txtX, txtY){
+ var fctX = this.remplacer(this.verifier(txtX));
+ var fctY = this.remplacer(this.verifier(txtY));
+ if(fctX == "" || fctY == ""){
+ return false;
+ }
+
+ var f = new ParametricFunction(fctX, fctY);
+ this.add(f, true);
+
+ return true;
+ },
+
+ add : function(f, useRandomColor){
+ this.list.unshift(f);
+ if(useRandomColor){
+ f.couleur = this.colorsList[alea(0,this.colorsList.length-1)];
+ }
+ historique.ajouter(f);
+ this.updateList();
+ editeur.editer(0);
+ },
+
+ ajouter : function(){
+ var type = document.getElementById("functionType").value;
+ if(type == "cartesian"){
+ var input = document.getElementById("input");
+ if(this.addCartesian(input.value)){
+ input.value = "";
+ }
+ }
+ else if(type == "implicit"){
+ var input = document.getElementById("implicitInput");
+ if(this.addImplicit(input.value)){
+ input.value = "";
+ }
+ }
+ else if(type == "polar"){
+ var input = document.getElementById("polarInput");
+ if(this.addPolar(input.value)){
+ input.value = "";
+ }
+ }
+ else if(type == "parametric"){
+ var inputX = document.getElementById("parametricInputX");
+ var inputY = document.getElementById("parametricInputY");
+ if(this.addParametric(inputX.value, inputY.value)){
+ inputX.value = "";
+ inputY.value = "";
+ }
+ }
+ },
+
+ changeType : function(type){
+ document.getElementById("cartesianDiv").style.display = "none";
+ document.getElementById("implicitDiv").style.display = "none";
+ document.getElementById("polarDiv").style.display = "none";
+ document.getElementById("parametricDiv").style.display = "none";
+ document.getElementById(type+"Div").style.display = "initial";
+ },
+
+ enlever : function(id){
+ this.list.splice(id, 1);
+ this.updateList();
+ },
+
+ dupliquer : function(id){
+ var newFct = this.functionFromObject(this.list[id].get());
+ newFct.couleur = this.colorsList[alea(0,this.colorsList.length-1)];
+ this.list.splice(id+1, 0, newFct);
+ this.updateList();
+ },
+
+ etudier : function(id){
+ etude.etudier(this.list[id].fct);
+ afficherMenu("menuEtude");
+ },
+
+ updateList : function(){
+ var texteFctSupp = "";
+ for(var i=0; i'+this.list[i].fct+'';
+ }
+ document.getElementById("fonctionsSupp").innerHTML = texteFctSupp;
+ affichage.dessiner();
+ saveOptions();
+ },
+
+ verifier : function(txtFonction){
+ for(var i=0; i 0){
+ editeur.editer(0);
+ }
+ }
+};
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/ImplicitFunction.js b/resources/library/applications/GraphMe.wgt/JavaScript/ImplicitFunction.js
new file mode 100644
index 00000000..4fcb90b5
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/ImplicitFunction.js
@@ -0,0 +1,79 @@
+
+function ImplicitFunction(txtFct){
+
+ this.setFct = function(txt){
+ this.fct = txt;
+ this.f = new Function("x", "y", "return "+this.fct);
+ }
+
+ if(txtFct){
+ this.setFct(txtFct);
+ }
+ this.couleur = fct.couleur;
+ this.width = document.getElementById("inputTaille").value;
+ this.style = document.getElementById("selectStyle").value;
+
+ this.getX = function(x){
+ return x;
+ };
+
+ this.getY = function(x){
+ return -1000000;
+ };
+
+ this.set = function(f){
+ var equalPos = f.fct.indexOf("=");
+ if(equalPos >= 0){
+ f.fct = f.fct.replace("=", "-(") + ")";
+ }
+ this.setFct(fct.remplacer(fct.verifier(f.fct)));
+ this.couleur = f.couleur;
+ this.width = f.width;
+ this.style = f.style;
+ return this;
+ };
+
+ this.get = function(){
+ var f = {};
+ f.type = "implicit";
+ f.fct = this.fct;
+ f.couleur = this.couleur;
+ f.width = this.width;
+ f.style = this.style;
+ return f;
+ };
+
+ this.readableText = function(){
+ return this.fct + " = 0";
+ };
+
+ this.plot = function(ctx, precision, affichage){
+ var epsilon = 0.01;
+ var width2 = this.width / 2;
+ precision /= 20;
+
+ ctx.beginPath();
+ ctx.lineWidth = this.width;
+ ctx.strokeStyle = this.couleur;
+ ctx.fillStyle = this.couleur;
+ ctx.moveTo(-100,-100);
+ for(var x = affichage.xGauche-precision; x <= affichage.xDroite+precision; x+=precision){
+ for(var y = affichage.yBas-precision; y <= affichage.yHaut+precision; y+=precision){
+ // Compute function for current (x, y) position
+ z = this.f(x, y);
+ // Check condition f(x, y) = 0
+ if(!isNaN(z) && Math.abs(z) < epsilon){
+ // Transform coordinates
+ var pointX = (x - affichage.xGauche) * affichage.multX;
+ var pointY = affichage.hauteur - (y - affichage.yBas) * affichage.multY;
+
+ ctx.fillRect(pointX-width2, pointY-width2, this.width, this.width);
+// ctx.beginPath();
+// ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
+// ctx.fill();
+ }
+ }
+ }
+// ctx.stroke();
+ };
+}
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Interface.js b/resources/library/applications/GraphMe.wgt/JavaScript/Interface.js
index 34a1bef2..e90111e5 100644
--- a/resources/library/applications/GraphMe.wgt/JavaScript/Interface.js
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/Interface.js
@@ -1,6 +1,10 @@
// -------------------- Fonctions de l'interface --------------------
+
+var menuActuel = "divInputRapide"
+var dernierMenu = ""
+
var pleinEcran = false
var maximise = true
var tailleFenetreX = window.innerWidth
@@ -12,23 +16,56 @@ var AncienneMethodeAffichage = 0
function afficherMenu(id){
if (menuActuel == id){
cacherMenu()
+ dernierMenu = false;
}
else {
- if (menuActuel !== ""){
+ if (menuActuel != ""){
+ dernierMenu = menuActuel;
cacherMenu()
}
menuActuel = id
document.getElementById(id).style.display = "block"
+ message.supprimer();
}
}
// Permet de cacher le menu actuellement affiché
function cacherMenu(){
- document.getElementById(menuActuel).style.display = "none"
- menuActuel = ""
+ if(menuActuel != ""){
+ document.getElementById(menuActuel).style.display = "none"
+ menuActuel = ""
+ }
}
-// ---- Minimiser ou Maximiser le widget (pour sankore) ----
+// Affiche un message d'erreur
+function afficherErreur(message){
+ document.getElementById("spanErreurFct").innerHTML = message;
+ afficherMenu("erreurFct");
+}
+
+// Messages d'info
+
+var message = {
+ liste : [],
+ ajouter : function(x, y, contenu){
+ var newDiv = document.createElement("div");
+ newDiv.style.left = x + "px";
+ newDiv.style.top = y + "px";
+
+ var textDiv = document.createElement("span");
+ textDiv.innerHTML = contenu;
+ newDiv.appendChild(textDiv);
+
+ document.getElementById("divMessages").appendChild(newDiv);
+ },
+ supprimer : function(){
+ var div = document.getElementById("divMessages");
+ div.innerHTML = "";
+ }
+};
+
+
+// ---- Minimiser ou Maximiser le widget (pour Uniboard) ----
function miniMax(){
if (maximise){
maximise = false
@@ -49,6 +86,17 @@ function miniMax(){
}
}
+// Affiche le menu +
+function menuFonctions(){
+ if(fonction3D){
+ afficherMenu('menuHistorique');
+ }
+ else{
+ afficherMenu('menuFonctions');
+ editeur.editer(0);
+ }
+}
+
// Action des petits bouton + et - dans les options
function boutonPlus(id, nombre){
var element = document.getElementById(id)
@@ -64,101 +112,73 @@ function boutonMoins(id, nombre){
}
// Changer de thème
-function changerTheme(){
- var theme = document.getElementById("selectTheme").value
- switch(theme){
- case "noir":
- document.body.style.backgroundImage = "url(Images/fond2.png)"
- document.getElementById("gauche").style.backgroundImage = "url(Images/gauche2.png)"
- document.getElementById("onglet3D").style.backgroundImage = "url(Images/onglet1.png)"
- document.getElementById("texteFonction").style.color = "white"
- var couleurEchelle = "rgba(255,255,255,0.8)"
- var couleurGrille = "rgba(255,255,255,0.1)"
- var couleurAxes = "rgba(0,0,0,0.5)"
- break
- case "bleu":
- document.body.style.backgroundImage = "url(Images/fond4.png)"
- document.getElementById("gauche").style.backgroundImage = "url(Images/gauche3.png)"
- document.getElementById("onglet3D").style.backgroundImage = "url(Images/onglet2.png)"
- document.getElementById("texteFonction").style.color = "white"
- var couleurEchelle = "rgba(255,255,255,0.8)"
- var couleurGrille = "rgba(255,255,255,0.1)"
- var couleurAxes = "rgba(0,0,0,0.5)"
- break
- case "blanc":
- document.body.style.backgroundImage = "url(Images/fond5.png)"
- document.getElementById("gauche").style.backgroundImage = "url(Images/gauche3.png)"
- document.getElementById("onglet3D").style.backgroundImage = "url(Images/onglet2.png)"
- document.getElementById("texteFonction").style.color = "black"
- var couleurEchelle = "rgba(0,0,0,0.8)"
- var couleurGrille = "rgba(255,255,255,0.2)"
- var couleurAxes = "rgba(0,0,0,0.5)"
- break
+function changerTheme(theme){
+ var positions = [
+ "top-left",
+ "top",
+ "top-right",
+ "right",
+ "bottom-right",
+ "bottom",
+ "bottom-left",
+ "left",
+ "center"
+ ];
+ for(var i=0; i'
- document.getElementById("newVersion").innerHTML = ' '
+ var txtHTML = "";
+ document.getElementById("thisVersion").innerHTML = ' ';
+ for(var i=0; i ';
+ }
+ txtHTML += ' ';
+// txtHTML += ' ';
+// txtHTML += ' ';
+ }
+ document.getElementById("newVersion").innerHTML = txtHTML;
+
+ afficherMenu("mAj");
}
function checkboxMaJ(){
- if(document.location.href=='http://gyb.educanet2.ch/tm-widgets/yannick/GraphMe.wgt/Grapheur.xhtml'){
+ if(versionOnline()){
afficherMenu('erreurMaJ')
document.getElementById("checkMaJ").checked = false
}
@@ -194,20 +223,52 @@ function checkboxMaJ(){
}
function majAuto(){
- if(document.location.href=='http://gyb.educanet2.ch/tm-widgets/yannick/GraphMe.wgt/Grapheur.xhtml'){
- document.getElementById("cacheMaJ").style.display = "block"
- document.getElementById("checkMaJ").checked = true
+// var audio = new Audio();
+// audio.src = "version.ogg";
+// audio.load();
+// setTimeout(function(){
+// window.console.log(" "+audio.duration);
+// }, 0)
+ if(versionOnline()){
+ document.getElementById("cacheMaJ").style.display = "block";
+ document.getElementById("checkMaJ").disabled = true;
+ document.getElementById("checkMaJ").checked = true;
}
else{
if(document.getElementById("checkMaJ").checked){
- afficherMenu('demandeMaJ')
+ afficherMenu('demandeMaJ');
+ }
+ }
+}
+function majAccept(){
+// document.location.href='http://gyb.educanet2.ch/tm-widgets/yannick/GraphMe.wgt/Grapheur.html';
+ for(var i=0; i'
-}
\ No newline at end of file
+// cacherMenu()
+// document.getElementById("affichage").innerHTML = ' '
+ window.open(lien, "_blank")
+}
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Languages.js b/resources/library/applications/GraphMe.wgt/JavaScript/Languages.js
new file mode 100644
index 00000000..ad5f9f04
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/Languages.js
@@ -0,0 +1,508 @@
+
+var languages = {
+ current: "en",
+
+ init: function(){
+ var lang = this.navigatorLanguage();
+ if(lang){
+ lang = lang.substr(0,2);
+ this.set(lang);
+ }
+ },
+
+ navigatorLanguage: function(){
+ if(window.sankore){
+ return sankore.locale();
+ }
+ return navigator.language || navigator.userLanguage;
+ },
+
+ set: function(lang){
+ if(lang in langTexts){
+ this.current = lang;
+ this.setTexts(langTexts[lang]);
+ }
+ },
+
+ getText: function(id){
+ return langTexts[this.current][id];
+ },
+
+ setTexts: function(texts){
+ this.id("graphMeButton").textContent = texts.widgetName;
+ this.id("functionsButton").textContent = texts.functions;
+ this.id("displayButton").textContent = texts.display;
+ this.id("helpButton").textContent = texts.help;
+
+ this.id("boutonAgrandir").title = texts.fullscreen;
+ this.id("boutonSaveGraph").title = texts.save;
+ this.id("inputRapideButton").value = texts.displayAction;
+
+ this.id("pointTool").title = texts.pointTool;
+ this.id("moveTool").title = texts.moveTool;
+ this.id("tangentTool").title = texts.tangentTool;
+
+ this.id("menuExempleCloseButton").value = texts.close;
+
+ this.id("menuGraphMeOptionsTab").textContent = texts.options;
+ this.id("menuGraphMeAboutTab").textContent = texts.about;
+ this.id("widgetOptions").textContent = texts.widgetOptions;
+ this.id("widgetTheme").textContent = texts.widgetTheme;
+ this.id("selectThemeDarkBlue").textContent = texts.darkBlue;
+ this.id("selectThemeBlack").textContent = texts.black;
+ this.id("selectThemeBlue").textContent = texts.blue;
+ this.id("selectThemeWhite").textContent = texts.white;
+ this.id("resetWidgetButton").value = texts.resetWidget;
+ this.id("checkForUpdateButton").value = texts.checkForUpdate;
+ this.id("menuGraphMeCloseButton").value = texts.close;
+
+ this.id("menuCreditsOptionsTab").textContent = texts.options;
+ this.id("menuCreditsAboutTab").textContent = texts.about;
+ this.id("widgetDevelopedBy").textContent = texts.widgetDevelopedBy;
+ this.id("widgetContactInfo").textContent = texts.widgetContactInfo;
+ this.id("widgetBackgroundSource").textContent = texts.widgetBackgroundSource;
+ this.id("changelogButton").textContent = texts.changelogButton;
+ this.id("menuCreditsCloseButton").value = texts.close;
+
+ this.id("changelogTitle").textContent = texts.changelogTitle;
+ this.id("menuChangelogBackButton").value = texts.back;
+ this.id("menuChangelogCloseButton").value = texts.close;
+
+ this.id("menuAffichageDisplayParametersTab").textContent = texts.displayParameters;
+ this.id("menuAffichageFunctionsParametersTab").textContent = texts.functionsParameters;
+ this.id("plotRange").textContent = texts.plotRange;
+ this.id("xAxis").textContent = texts.xAxis;
+ this.id("yAxis").textContent = texts.yAxis;
+ this.id("xAxisTo").textContent = texts.to;
+ this.id("yAxisTo").textContent = texts.to;
+ this.id("defaultZoom").textContent = texts.defaultZoom;
+ this.id("defaultDisplayParameters").value = texts.defaultDisplayParameters;
+ this.id("displayOptions").textContent = texts.options;
+ this.id("displayMethod").textContent = texts.displayMethod;
+ this.id("showGrid").textContent = texts.showGrid;
+ this.id("showAxis").textContent = texts.showAxis;
+ this.id("showScale").textContent = texts.showScale;
+ this.id("graphAccuracy").textContent = texts.graphAccuracy;
+ this.id("improveAccuracy").textContent = texts.improveAccuracy;
+ this.id("menuAffichageOkButton").value = texts.ok;
+
+ this.id("menuFunctionParametersDisplayParametersTab").textContent = texts.displayParameters;
+ this.id("menuFunctionParametersFunctionsParametersTab").textContent = texts.functionsParameters;
+ this.id("defaultFunctionParameters").textContent = texts.defaultFunctionParameters;
+ this.id("thickness").textContent = texts.thickness;
+ this.id("drawDerivativeAndPrimitive").textContent = texts.drawDerivativeAndPrimitive;
+ this.id("drawArea").textContent = texts.drawArea;
+ this.id("lineStyle").textContent = texts.lineStyle;
+ this.id("selectStyleLine").textContent = texts.styleLine;
+ this.id("selectStyleDotted").textContent = texts.styleDotted;
+ this.id("selectStyleDashed").textContent = texts.styleDashed;
+ this.id("menuFunctionParametersCloseButton").value = texts.close;
+
+ this.id("display3D").textContent = texts.display3D;
+ this.id("displayStyle").textContent = texts.displayStyle;
+ this.id("displayStyleSurfaces").textContent = texts.styleSurfaces;
+ this.id("displayStyleDotted").textContent = texts.styleDotted;
+ this.id("resetDisplay3D").value = texts.resetDisplay;
+ this.id("graphAccuracy3D").textContent = texts.graphAccuracy;
+ this.id("colorsConfig").textContent = texts.colorsConfig;
+ this.id("useRedFor").textContent = texts.useRedFor;
+ this.id("useGreenFor").textContent = texts.useGreenFor;
+ this.id("useBlueFor").textContent = texts.useBlueFor;
+ this.id("redPositive").textContent = texts.positiveValues;
+ this.id("redNegative").textContent = texts.negativeValues;
+ this.id("redAlways").textContent = texts.always;
+ this.id("greenPositive").textContent = texts.positiveValues;
+ this.id("greenNegative").textContent = texts.negativeValues;
+ this.id("greenAlways").textContent = texts.always;
+ this.id("bluePositive").textContent = texts.positiveValues;
+ this.id("blueNegative").textContent = texts.negativeValues;
+ this.id("blueAlways").textContent = texts.always;
+ this.id("globalValue").textContent = texts.globalValue;
+ this.id("globalValueRange").textContent = texts.globalValueRange;
+ this.id("menuAffichage3dOk").value = texts.ok;
+
+ this.id("menuAideUsageTab").textContent = texts.usage;
+ this.id("menuAideExamplesTab").textContent = texts.examples;
+ this.id("howItWorks").textContent = texts.howItWorks;
+ this.id("howItWorksText").textContent = texts.howItWorksText;
+ this.id("availableFunctionsText").textContent = texts.availableFunctionsText;
+ this.id("basicOperations").textContent = texts.basicOperations;
+ this.id("plus").textContent = texts.plus;
+ this.id("minus").textContent = texts.minus;
+ this.id("multiplication").textContent = texts.multiplication;
+ this.id("division").textContent = texts.division;
+ this.id("modulus").textContent = texts.modulus;
+ this.id("trigonometricFunctions").textContent = texts.trigonometricFunctions;
+ this.id("sine").textContent = texts.sine;
+ this.id("cosine").textContent = texts.cosine;
+ this.id("tangent").textContent = texts.tangent;
+ this.id("cotangent").textContent = texts.cotangent;
+ this.id("secant").textContent = texts.secant;
+ this.id("cosecant").textContent = texts.cosecant;
+ this.id("arcSine").textContent = texts.arcSine;
+ this.id("arcCosine").textContent = texts.arcCosine;
+ this.id("arcTangent").textContent = texts.arcTangent;
+ this.id("arcCotangent").textContent = texts.arcCotangent;
+ this.id("hyperbolicFunctions").textContent = texts.hyperbolicFunctions;
+ this.id("hypSine").textContent = texts.hypSine;
+ this.id("hypCosine").textContent = texts.hypCosine;
+ this.id("hypTangent").textContent = texts.hypTangent;
+ this.id("hypCotangent").textContent = texts.hypCotangent;
+ this.id("hypSecant").textContent = texts.hypSecant;
+ this.id("hypCosecant").textContent = texts.hypCosecant;
+ this.id("hypArcSine").textContent = texts.hypArcSine;
+ this.id("hypArcCosine").textContent = texts.hypArcCosine;
+ this.id("hypArcTangent").textContent = texts.hypArcTangent;
+ this.id("hypArcCotangent").textContent = texts.hypArcCotangent;
+ this.id("powerAndRoot").textContent = texts.powerAndRoot;
+ this.id("squareRoot").textContent = texts.squareRoot;
+ this.id("power").textContent = texts.power;
+ this.id("xPowY").textContent = texts.xPowY;
+ this.id("root").textContent = texts.root;
+ this.id("rootText").textContent = texts.rootText;
+ this.id("expAndLog").textContent = texts.expAndLog;
+ this.id("naturalLog").textContent = texts.naturalLog;
+ this.id("decimalLog").textContent = texts.decimalLog;
+ this.id("absValue").textContent = texts.absValue;
+ this.id("rounding").textContent = texts.rounding;
+ this.id("roundText").textContent = texts.roundText;
+ this.id("ceilText").textContent = texts.ceilText;
+ this.id("floorText").textContent = texts.floorText;
+ this.id("constants").textContent = texts.constants;
+ this.id("keyboardShortcuts").textContent = texts.keyboardShortcuts;
+ this.id("moveLeft").textContent = texts.moveLeft;
+ this.id("moveTop").textContent = texts.moveTop;
+ this.id("moveRight").textContent = texts.moveRight;
+ this.id("moveBottom").textContent = texts.moveBottom;
+ this.id("menuAideCloseButton").value = texts.close;
+
+ this.id("menuAideExemplesUsageTab").textContent = texts.usage;
+ this.id("menuAideExemplesExamplesTab").textContent = texts.examples;
+ this.id("examplesText").textContent = texts.examplesText;
+ this.id("functions2d").textContent = texts.functions2d;
+ this.id("functions3d").textContent = texts.functions3d;
+ this.id("menuAideExemplesCloseButton").value = texts.close;
+
+ this.id("functionStudyTitle").textContent = texts.functionStudy;
+ this.id("domainOfDefinition").textContent = texts.domainOfDefinition;
+ this.id("symmetry").textContent = texts.symmetry;
+ this.id("zeros").textContent = texts.zeros;
+ this.id("sign").textContent = texts.sign;
+ this.id("asymptotes").textContent = texts.asymptotes;
+ this.id("extremums").textContent = texts.extremums;
+ this.id("inflexionPoints").textContent = texts.inflexionPoints;
+ this.id("functionStudyText").textContent = texts.functionStudyText;
+ this.id("menuEtudeBackButton").value = texts.back;
+ this.id("menuEtudeCloseButton").value = texts.close;
+
+ this.id("menuFonctionsFunctionsTab").textContent = texts.functions;
+ this.id("menuFonctionsHistoryTab").textContent = texts.history;
+ this.id("newFunction").textContent = texts.newFunction;
+ this.id("functionTypeCartesian").textContent = texts.cartesian;
+ this.id("functionTypeImplicit").textContent = texts.implicit;
+ this.id("functionTypePolar").textContent = texts.polar;
+ this.id("functionTypeParametric").textContent = texts.parametric;
+ this.id("addFunctionButton").value = texts.add;
+ this.id("functionsListText").textContent = texts.functionsListText;
+
+ this.id("editorEditPageEditTab").textContent = texts.edit;
+ this.id("editorEditPageToolsTab").textContent = texts.tools;
+ this.id("editorRangeFrom").textContent = texts.from;
+ this.id("editorRangeTo").textContent = texts.to;
+ this.id("editorThickness").textContent = texts.thickness;
+ this.id("editorColor").textContent = texts.color;
+ this.id("editorDerivatives").textContent = texts.derivatives;
+ this.id("editorPrimitive").textContent = texts.primitive;
+ this.id("editorLineStyle").textContent = texts.lineStyle;
+ this.id("editorStyleLine").textContent = texts.styleLine;
+ this.id("editorStyleDotted").textContent = texts.styleDotted;
+ this.id("editorStyleDashed").textContent = texts.styleDashed;
+ this.id("editorDrawArea").textContent = texts.drawArea;
+ this.id("editorDuplicate").value = texts.duplicate;
+ this.id("editorRemove").value = texts.remove;
+
+ this.id("editorToolsPageEditTab").textContent = texts.edit;
+ this.id("editorToolsPageToolsTab").textContent = texts.tools;
+ this.id("computePoint").textContent = texts.computePoint;
+ this.id("computePointButton").value = texts.compute;
+ this.id("computeArea").textContent = texts.computeArea;
+ this.id("areaFrom").textContent = texts.from;
+ this.id("areaTo").textContent = texts.to;
+ this.id("computeAreaButton").value = texts.compute;
+ this.id("functionStudy").textContent = texts.functionStudy;
+ this.id("functionStudyButton").value = texts.startStudy;
+ this.id("editorToolsDuplicate").value = texts.duplicate;
+ this.id("editorToolsRemove").value = texts.remove;
+ this.id("menuFonctionsCloseButton").value = texts.close;
+
+ this.id("input3dDisplayButton").value = texts.displayAction;
+
+ this.id("menuHistoriqueFunctionsTab").textContent = texts.functions;
+ this.id("menuHistoriqueHistoryTab").textContent = texts.history;
+ this.id("latestDisplayedFunctions").textContent = texts.latestDisplayedFunctions;
+ this.id("menuHistoriqueCloseButton").value = texts.close;
+
+ this.id("chooseColor").textContent = texts.chooseColor;
+ this.id("colorPickerColor").textContent = texts.color;
+ this.id("colorPickerValue").textContent = texts.value;
+ this.id("colorPickerSaturation").textContent = texts.saturation;
+ this.id("colorPickerRed").textContent = texts.red;
+ this.id("colorPickerGreen").textContent = texts.green;
+ this.id("colorPickerBlue").textContent = texts.blue;
+ this.id("inputOpacity").textContent = texts.opacity;
+ this.id("apercuCouleur").title = texts.newColor;
+ this.id("apercuCouleur2").title = texts.oldColor;
+ this.id("colorPickerCancelButton").value = texts.cancel;
+ this.id("colorPickerOkButton").value = texts.ok;
+
+ this.id("blackListError").textContent = texts.error;
+ this.id("cannotDrawFunction").textContent = texts.cannotDrawFunction;
+ this.id("invalidExpression").textContent = texts.invalidExpression;
+ this.id("blackListErrorOkButton").value = texts.ok;
+ this.id("fctError").textContent = texts.error;
+ this.id("checkTheFunction").textContent = texts.checkTheFunction;
+ this.id("errorMessage").textContent = texts.errorMessage;
+ this.id("youCanFindExamples").textContent = texts.youCanFindExamples;
+ this.id("fctErrorHelpButton").value = texts.help;
+ this.id("fctErrorOkButton").value = texts.ok;
+
+ this.id("menuSaveGraphTitle").textContent = texts.saveGraph;
+ this.id("saveWidthText").textContent = texts.width;
+ this.id("saveHeightText").textContent = texts.height;
+ this.id("saveBackgroundColor").textContent = texts.backgroundColor;
+ this.id("imageFormat").textContent = texts.imageFormat;
+ this.id("menuSaveGraphCancelButton").value = texts.cancel;
+ this.id("menuSaveGraphOkButton").value = texts.ok;
+
+ this.id("saveImageTitle").textContent = texts.saveImageTitle;
+ this.id("saveImageText").textContent = texts.saveImageText;
+ this.id("menuSaveImageCloseButton").value = texts.close;
+
+ this.id("updateTitle").textContent = texts.update;
+ this.id("currentVersion").textContent = texts.currentVersion;
+ this.id("latestVersionAvailable").textContent = texts.latestVersionAvailable;
+// this.id("useLatestVersionText").textContent = texts.useLatestVersionText;
+// this.id("useLatestVersion").value = texts.useLatestVersion;
+ this.id("updateBackButton").value = texts.back;
+ this.id("updateOkButton").value = texts.ok;
+
+ this.id("updateErrorTitle").textContent = texts.error;
+ this.id("updateErrorText").textContent = texts.updateErrorText;
+ this.id("updateErrorOkButton").value = texts.ok;
+
+ this.id("ctxMenuDisplay").textContent = texts.display;
+ this.id("ctxMenuAxes").textContent = texts.axes;
+ this.id("ctxMenuScale").textContent = texts.scale;
+ this.id("ctxMenuGrid").textContent = texts.grid;
+ this.id("ctxMenuReset").value = texts.reset;
+ this.id("ctxMenuSave").value = texts.save;
+ },
+
+ class: function(className){
+ return document.getElementsByClassName(className);
+ },
+
+ id: function(id){
+ return document.getElementById(id);
+ }
+};
+
+
+var langTexts = {
+ "fr": {
+ "widgetName": "GraphMe",
+ "functions": "Fonctions",
+ "display": "Affichage",
+ "help": "Aide",
+ "close": "Fermer",
+ "back": "Retour",
+ "ok": "Ok",
+ "fullscreen": "Plein écran",
+ "save": "Sauvegarder",
+ "displayAction": "Afficher",
+ "pointTool": "Outil point",
+ "moveTool": "Outil déplacement",
+ "tangentTool": "Outil tangente",
+ "options": "Options",
+ "about": "À propos",
+ "darkBlue": "Bleu foncé",
+ "black": "Noir",
+ "blue": "Bleu",
+ "white": "Blanc",
+ "widgetOptions": "Options du widget",
+ "widgetTheme": "Thème du widget",
+ "resetWidget": "Réinitialiser le widget",
+ "checkForUpdate": "Vérifier les mises à jour",
+ "widgetDevelopedBy": "Widget réalisé par",
+ "widgetContactInfo": "Si vous voulez rapporter un bug, avez une suggestion par rapport au widget ou voulez simplement poser une question, merci de me contacter par e-mail à l'adresse suivante",
+ "widgetBackgroundSource": "Les images d'arrière-plan viennent de l'environnement de bureau KDE",
+ "changelogButton": "qu'est-ce qui a changé?",
+ "changelogTitle": "Notes de version",
+ "displayParameters": "Paramètres d'affichage",
+ "functionsParameters": "Paramètres des fonctions",
+ "plotRange": "Zone d'affichage",
+ "xAxis": "Axe des X",
+ "yAxis": "Axe des Y",
+ "to": "à",
+ "defaultZoom": "Zoom par défaut",
+ "defaultDisplayParameters": "Réinitialiser l'affichage",
+ "displayMethod": "Méthode d'affichage du graphique",
+ "showGrid": "Afficher la grille",
+ "showAxis": "Afficher les axes",
+ "showScale": "Afficher l'échelle",
+ "graphAccuracy": "Précision du graphique, points calculés",
+ "improveAccuracy": "Améliorer la précision lors d'un zoom arrière (plus lent)",
+ "defaultFunctionParameters": "Paramètres par défaut des fonctions",
+ "thickness": "Épaisseur",
+ "drawDerivativeAndPrimitive": "Dessiner les dérivées et primitives",
+ "drawArea": "Dessiner l'aire sous la fonction",
+ "lineStyle": "Style de ligne",
+ "styleLine": "continu",
+ "styleDotted": "points",
+ "styleDashed": "traits",
+ "display3D": "Affichage 3D",
+ "displayStyle": "Style d'affichage",
+ "styleSurfaces": "surfaces",
+ "resetDisplay": "Réinitialiser l'affichage",
+ "colorsConfig": "Configuration des couleurs",
+ "useRedFor": "utiliser le rouge pour",
+ "useGreenFor": "utiliser le vert pour",
+ "useBlueFor": "utiliser le bleu pour",
+ "positiveValues": "valeur positive",
+ "negativeValues": "valeur négative",
+ "always": "toujours",
+ "globalValue": "Valeur générale",
+ "globalValueRange": "(entre 0 et 255)",
+ "usage": "Utilisation",
+ "examples": "Exemples",
+ "howItWorks": "Fonctionnement",
+ "howItWorksText": "Ce widget vous permet de dessiner des fonctions mathématiques. Entrez une première fonction dans le champ en haut du widget et cliquez sur le bouton \"Afficher\". Ouvrez le menu \"Fonctions\" pour modifier votre fonction ou en ajouter une nouvelle.",
+ "availableFunctionsText": "Vous pouvez saisir les fonctions mathématiques suivantes",
+ "basicOperations": "Les opérations de base",
+ "plus": "Addition",
+ "minus": "Soustraction",
+ "multiplication": "Multiplication",
+ "division": "Division",
+ "modulus": "Modulo",
+ "trigonometricFunctions": "Les fonctions trigonométriques",
+ "sine": "Sinus",
+ "cosine": "Cosinus",
+ "tangent": "Tangente",
+ "cotangent": "Cotangente",
+ "secant": "Secante",
+ "cosecant": "Cosecante",
+ "arcSine": "Arcsinus",
+ "arcCosine": "Arccosinus",
+ "arcTangent": "Arctangente",
+ "arcCotangent": "Arccotangente",
+ "hyperbolicFunctions": "Les fonctions hyperboliques",
+ "hypSine": "Sinus hyp",
+ "hypCosine": "Cosinus hyp",
+ "hypTangent": "Tangente hyp",
+ "hypCotangent": "Cotangente hyp",
+ "hypSecant": "Secante hyp",
+ "hypCosecant": "Cosecante hyp",
+ "hypArcSine": "Arcsinus hyp",
+ "hypArcCosine": "Arccosinus hyp",
+ "hypArcTangent": "Arctangente hyp",
+ "hypArcCotangent": "Arccotangente hyp",
+ "powerAndRoot": "Les racines et les puissances",
+ "squareRoot": "Racine carrée",
+ "power": "Puissances",
+ "xPowY": "Élève x à une puissance y",
+ "root": "Racines",
+ "rootText": "Racine y d'un nombre x",
+ "expAndLog": "Les exponentielles et logarithmes",
+ "naturalLog": "logarithme naturel",
+ "decimalLog": "logarithme de base",
+ "absValue": "La valeur absolue d'un nombre",
+ "rounding": "Les arrondis",
+ "roundText": "arrondit à l'entier le plus proche",
+ "ceilText": "arrondit à l'entier supérieur",
+ "floorText": "arrondit à l'entier inférieur",
+ "constants": "Constantes",
+ "keyboardShortcuts": "Raccourcis clavier",
+ "moveLeft": "déplacer le graphique à gauche",
+ "moveTop": "déplacer le graphique en haut",
+ "moveRight": "déplacer le graphique à droite",
+ "moveBottom": "déplacer le graphique en bas",
+ "examplesText": "(Vous pouvez cliquer sur un exemple pour l'afficher. Pensez à ajuster la précision du graphique dans les options si nécessaire.)",
+ "functions2d": "Fonctions 2D",
+ "functions3d": "Fonctions 3D",
+ "saveGraph": "Enregistrer le graphique",
+ "functionStudy": "Étude de fonction",
+ "domainOfDefinition": "Ensemble de définition",
+ "symmetry": "Parité",
+ "zeros": "Zéros de la fonction",
+ "sign": "Signe",
+ "asymptotes": "Asymptotes",
+ "extremums": "Extremums",
+ "inflexionPoints": "Points d'inflexion",
+ "functionStudyText": "L'outil permettant d'étudier les fonctions n'est pas fiable à 100%. Pensez à vérifier les résultats de l'étude avant d'en faire une quelconque utilisation.",
+ "history": "Historique",
+ "newFunction": "Nouvelle fonction",
+ "cartesian": "Cartésienne",
+ "implicit": "Implicite",
+ "polar": "Polaire",
+ "parametric": "Paramétrique",
+ "add": "Ajouter",
+ "functionsListText": "Fonction dessinées",
+ "edit": "Modifier",
+ "tools": "Outils",
+ "from": "de",
+ "to": "à",
+ "color": "Couleur",
+ "derivatives": "Dérivées",
+ "primitive": "Primitive",
+ "duplicate": "Dupliquer",
+ "remove": "Supprimer",
+ "computePoint": "Calculer un point de la fonction",
+ "compute": "Calculer",
+ "computeArea": "Calculer l'aire sous la fonction",
+ "startStudy": "Démarrer l'étude",
+ "latestDisplayedFunctions": "Dernières fonctions dessinées",
+ "chooseColor": "Choix de la couleur",
+ "value": "Valeur",
+ "saturation": "Saturation",
+ "red": "Rouge",
+ "green": "Vert",
+ "blue": "Bleu",
+ "opacity": "Opacité",
+ "oldColor": "Ancienne Couleur",
+ "newColor": "Nouvelle Couleur",
+ "cancel": "Annuler",
+ "error": "Erreur",
+ "cannotDrawFunction": "Impossible de dessiner la fonction",
+ "invalidExpression": "Expression ou caractère invalide",
+ "checkTheFunction": "Vérifiez la fonction que vous vouliez dessiner",
+ "errorMessage": "Message d'erreur",
+ "youCanFindExamples": "Une description ainsi que des exemples des différentes fonctions que vous pouvez dessiner se trouvent dans l'aide",
+ "width": "Largeur",
+ "height": "Hauteur",
+ "backgroundColor": "Couleur de fond",
+ "imageFormat": "Format de l'image",
+ "update": "Mise à jour",
+ "currentVersion": "Version en cours d'utilisation",
+ "latestVersionAvailable": "Dernière version disponible en ligne",
+ "useLatestVersionText": "Vous pouvez remplacer la version en cours d'utilisation par une version du widget en ligne. Notez que ceci ne met pas à jour le widget. Il faudra réitérer cette procédure la prochaine fois que vous l'utiliserez.",
+ "useLatestVersion": "Utiliser la dernière version",
+ "updateErrorText": "Il est impossible de mettre à jour le widget vers la version en ligne car vous utilisez déjà la version en ligne",
+ "axes": "Axes",
+ "scale": "Échelle",
+ "grid": "Grille",
+ "reset": "Réinitialiser",
+ "saveImageTitle": "Sauvegarder l'image",
+ "saveImageText": "Cliquez avec le bouton de droite sur l'image et sélectionnez \"Enregistrer l'image\". Il est aussi possible de choisir \"Copier l'image\" et ensuite la coller dans une autre application.",
+
+ /* Inside code */
+ "even": "paire",
+ "odd": "impaire",
+ "none_f": "aucune",
+ "none_m": "aucun",
+ "clickHereToModify": "Cliquez ici pour modifier les fonctions ou en ajouter une nouvelle.",
+ "enterFunction": "Entrez une fonction à dessiner",
+ "needHelp": "Consulter l'aide",
+ "unableLoadParameters": "Impossible de charger les paramètres enregistrés..."
+ }
+};
+
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Outils.js b/resources/library/applications/GraphMe.wgt/JavaScript/Outils.js
old mode 100644
new mode 100755
index 0915a333..82f9aa91
--- a/resources/library/applications/GraphMe.wgt/JavaScript/Outils.js
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/Outils.js
@@ -1,252 +1,446 @@
// -------------------- Fonctions des outils --------------------
-var listeFonctions = new Array()
-var listeCouleurs = new Array()
-var historique = new Array()
-var ctxT
-
-// Cette fonction permet d'effectuer un zoom. Elle change la valeur des inputs à gauche
-// qui définnissent la zone à afficher et actualise le graphique.
-function zoom(valeur){
- var diffBornes = Math.abs(parseFloat(document.getElementById("borneXGauche").value) - parseFloat(document.getElementById("borneXDroite").value))
- var ajouter = (diffBornes * valeur - diffBornes)/2
- var nouvelleValeur = parseFloat(document.getElementById("borneXGauche").value) - ajouter
- if (nouvelleValeur < 0){ nouvelleValeur = Math.ceil(nouvelleValeur) }
- if (nouvelleValeur > 0){ nouvelleValeur = Math.floor(nouvelleValeur) }
- if (nouvelleValeur == parseFloat(document.getElementById("borneXGauche").value) && valeur>1){ nouvelleValeur=nouvelleValeur-1 }
- if (nouvelleValeur == parseFloat(document.getElementById("borneXGauche").value) && valeur<1){ nouvelleValeur=nouvelleValeur+1 }
- document.getElementById("borneXGauche").value = nouvelleValeur
- var nouvelleValeur = parseFloat(document.getElementById("borneXDroite").value) + ajouter
- if (nouvelleValeur < 0){ nouvelleValeur = Math.ceil(nouvelleValeur) }
- if (nouvelleValeur > 0){ nouvelleValeur = Math.floor(nouvelleValeur) }
- if (nouvelleValeur == parseFloat(document.getElementById("borneXDroite").value) && valeur>1){ nouvelleValeur=nouvelleValeur+1 }
- if (nouvelleValeur == parseFloat(document.getElementById("borneXDroite").value) && valeur<1){ nouvelleValeur=nouvelleValeur-1 }
- document.getElementById("borneXDroite").value = nouvelleValeur
-
- var diffBornes = Math.abs(parseFloat(document.getElementById("borneYGauche").value) - parseFloat(document.getElementById("borneYDroite").value))
- var ajouter = (diffBornes * valeur - diffBornes)/2
- var nouvelleValeur = parseFloat(document.getElementById("borneYGauche").value) - ajouter
- if (nouvelleValeur < 0){ nouvelleValeur = Math.ceil(nouvelleValeur) }
- if (nouvelleValeur > 0){ nouvelleValeur = Math.floor(nouvelleValeur) }
- if (nouvelleValeur == parseFloat(document.getElementById("borneYGauche").value) && valeur>1){ nouvelleValeur=nouvelleValeur-1 }
- if (nouvelleValeur == parseFloat(document.getElementById("borneYGauche").value) && valeur<1){ nouvelleValeur=nouvelleValeur+1 }
- document.getElementById("borneYGauche").value = nouvelleValeur
- var nouvelleValeur = parseFloat(document.getElementById("borneYDroite").value) + ajouter
- if (nouvelleValeur < 0){ nouvelleValeur = Math.ceil(nouvelleValeur) }
- if (nouvelleValeur > 0){ nouvelleValeur = Math.floor(nouvelleValeur) }
- if (nouvelleValeur == parseFloat(document.getElementById("borneYDroite").value) && valeur>1){ nouvelleValeur=nouvelleValeur+1 }
- if (nouvelleValeur == parseFloat(document.getElementById("borneYDroite").value) && valeur<1){ nouvelleValeur=nouvelleValeur-1 }
- document.getElementById("borneYDroite").value = nouvelleValeur
-
- if(Math.abs(parseFloat(document.getElementById("borneXGauche").value) - parseFloat(document.getElementById("borneXDroite").value)) == 0){reinitialiserZoom(1)}
- if(Math.abs(parseFloat(document.getElementById("borneYGauche").value) - parseFloat(document.getElementById("borneYDroite").value)) == 0){reinitialiserZoom(1)}
- actualiserGraph()
-}
-
-// Permet de réinitialiser le zoom à la valeur donnée.
-function reinitialiserZoom(valeur){
- document.getElementById("borneXGauche").value = -valeur
- document.getElementById("borneXDroite").value = valeur
- document.getElementById("borneYGauche").value = -valeur
- document.getElementById("borneYDroite").value = valeur
- angle = Math.PI/8
- valeurZoom3D = 1
- gauche3D = -6.5
- droite3D = 6.5
- precisionDroite3D = 0.02
- precisionFonction3D = 0.2
- document.getElementById("inputPrecision3D").value = 0.2
- actualiserGraph()
-}
-
-// Ces fonctions permettent de déplacer le graphique sur l'axe "x" et "y"
-// Pour cela, elles redéfinissent la zone à afficher (à gauche dans les inputs)
- function deplacerY(valeur){
- document.getElementById("borneYGauche").value = parseFloat(document.getElementById("borneYGauche").value) + valeur
- document.getElementById("borneYDroite").value = parseFloat(document.getElementById("borneYDroite").value) + valeur
- actualiserGraph()
- }
- function deplacerX(valeur){
- document.getElementById("borneXGauche").value = parseFloat(document.getElementById("borneXGauche").value) + valeur
- document.getElementById("borneXDroite").value = parseFloat(document.getElementById("borneXDroite").value) + valeur
- if(fonction3D){
- angle = angle + valeur * Math.PI/8
- }
- actualiserGraph()
- }
// Permet d'afficher la valeur en "y" pour un point donné en "x"
- function execute(fonction) {
- if(check(fonction)){
- x = document.getElementById("inputX").value
- document.getElementById("outputX").innerHTML = " f(x) = "+eval(fonction)+""
- //alert("Si x = "+x+" \nf(x) = "+eval(fonction)+"")
- }
- }
-
-// Ajoute la fonction mathématique se trouvant dans l'input en haut à une liste.
-// Ceci est utile à l'affichage de plusieurs fonctions simultanées.
-function menuFonctions(){
- if(fonction3D){
- afficherMenu('menuHistorique')
- }
- else{
- afficherMenu('menuFonctions')
- }
+function calculerPoint() {
+ x = document.getElementById("inputX").value;
+ document.getElementById("outputX").innerHTML = " f(x) = "+fct.list[editeur.idFct].f(x)+"";
+ //alert("Si x = "+x+" \nf(x) = "+eval(fonction)+"")
}
-function ajouterFonction(fct){
- listeFonctions.push(fct)
- listeCouleurs.push("rgba(0,171,255,0.9)")
- actualiserListeFonctions()
-}
-function actualiserListeFonctions(){
- var texteFctSupp = ""
- for(var i=0; i '
- texteFctSupp += ' .... '
- }
- document.getElementById("fonctionsSupp").innerHTML = texteFctSupp
- actualiserGraph()
-}
-function actualiserHistorique(){
- var texteHistorique = ""
- for(var i=0; i'+historique[i]+' '
+// Historique
+
+var historique = {
+ liste : [],
+
+ actualiser : function(){
+ var texteHistorique = ""
+ for(var i=0; i';
+ texteHistorique += this.liste[i].readableText();
+ texteHistorique += ' ';
+ }
+ document.getElementById("spanHistorique").innerHTML = texteHistorique
+ document.getElementById("divHistorique").scrollTop = 0
+ },
+
+ use : function(index){
+ fct.add(this.liste[index]);
+ },
+
+ ajouter : function(func){
+ if(func.fct == ""){
+ return;
+ }
+ for(var i=0; i'
- ctxT = document.getElementById('canvasT').getContext('2d')
- }
- else{
- document.getElementById("tangente").innerHTML = ""
- ctxT = null
- }
-}
+var outil = {
+ //
+ idAffichage : "affichageOutils",
+
+ // Outil sélectionné
+ actuel : "point",
+
+ // Canvas
+ canvas : null,
+ ctx : null,
+
+ width: 0,
+ height: 0,
+
+ // Liste des éléments à dessiner
+ liste : [],
+
+ // Fonction d'initialisation
+ init : function(width, height){
+ var element = document.getElementById(this.idAffichage);
+ if(element.hasChildNodes()){
+ while(element.childNodes.length >= 1 ){
+ element.removeChild(element.firstChild);
+ }
+ }
+
+ this.width = width || element.clientWidth;
+ this.height = height || element.clientHeight;
+
+// element.style.width = affichage.largeur +"px";
+// element.style.height = affichage.hauteur +"px";
+// element.style.left = document.getElementById(affichage.id).offsetLeft+1 +"px";
+// element.style.top = document.getElementById(affichage.id).offsetTop+1 +"px";
+
+ this.canvas = document.createElement("canvas");
+ this.canvas.width = this.width;
+ this.canvas.height = this.height;
+ element.appendChild(this.canvas);
+ this.ctx = this.canvas.getContext('2d');
+ },
+
+ // Permet de changer d'outil et de faire différentes actions lors du choix de l'outil
+ choisir : function(nom){
+ document.getElementById("pointTool").className = "toolButton";
+ document.getElementById("moveTool").className = "toolButton";
+ document.getElementById("tangentTool").className = "toolButton";
+ switch(nom){
+ case 'point':
+ document.getElementById("pointTool").className += " selectedTool";
+ break;
+ case 'deplacement':
+ document.getElementById("moveTool").className += " selectedTool";
+ break;
+ case 'tangente':
+ document.getElementById("tangentTool").className += " selectedTool";
+ break;
+ }
+ if(nom == 'deplacement'){
+ document.getElementById("eventAffichage").style.cursor = "move";
+ }
+ else{
+ document.getElementById("eventAffichage").style.cursor = "auto";
+ }
+ this.dessinerListe();
+ this.actuel = nom;
+ saveOptions();
+ },
+
+ // Gestion des événements reçus de l'objet souris
+ move : function(x, y, xInit, yInit, active){
+ switch(this.actuel){
+ case "deplacement":
+ if(active){
+ this.deplacement(x, y, xInit, yInit);
+ }
+ break;
+ case "point":
+ this.point(x, y);
+ break;
+ case "tangente":
+ this.tangente(x, y);
+ break;
+ }
+ },
+
+ down : function(x, y){
+ switch(this.actuel){
+ case "point":
+ this.point(x, y, true)
+ break;
+ case "tangente":
+ this.tangente(x, y, true);
+ break;
+ }
+ },
+
+ // Fonctions des outils
+ deplacement : function(x, y, xInit, yInit){
+ var valeurX = (x-xInit)/affichage.multX;
+ var valeurY = (yInit-y)/affichage.multY;
+ if(Math.round(Math.abs(valeurX)) > 0){
+ if(fonction3D){
+ affichage.deplacerX(Math.round(2*valeurX)/2);
+ }
+ else{
+ affichage.deplacerX(-Math.round(2*valeurX)/2);
+ }
+ souris.xInit = x;
+ }
+ if(Math.round(Math.abs(valeurY)) > 0){
+ affichage.deplacerY(-Math.round(2*valeurY)/2);
+ souris.yInit = y;
+ }
+ },
+
+ point : function(sourisX, sourisY, ajouterDansListe){
+ var ctx = new Object();
+ ctx = this.ctx;
+
+ // Dessiner les points et tangentes supplémentaires
+ this.dessinerListe();
+
+ for(var i=0; i func.endAngle){
+ continue;
+ }
+ }
+ var x = func.getX(t);
+ var y = func.getY(t);
+
+ // Afficher les coordonnées et le point sous la souris
+ if(!isNaN(x) && !isNaN(y)){
+ if(ajouterDansListe){
+ this.ajouterPoint(x, y, func.couleur);
+ }
+ this.dessinerPoint(x, y, func.couleur);
+ }
+ }
+ },
+ dessinerPoint : function(x, y, couleur){
+ var ctx = new Object();
+ ctx = this.ctx;
+
+ // Conversion des coordonnées
+ var posX = coordToPosX(x) + 1;
+ var posY = coordToPosY(y) + 1;
+
+ ctx.shadowColor = couleur;
+ ctx.shadowBlur = 4;
+
+ // Texte
+ var txtPos = "("+Math.round(x*100)/100+";"+Math.round(y*100)/100+")";
+ ctx.fillStyle = "rgba(255,255,255,0.5)";
+ try{
+ ctx.bulle(posX+7, posY-7, txtPos.length*5.5, 20);
+ }
+ catch(err){
+ ctx.fillRect(posX+7, posY-27, txtPos.length*5.5, 20);
+ }
+
+ ctx.fillStyle = "black";
+ ctx.shadowColor = "black";
+ ctx.shadowOffsetX = 1;
+ ctx.shadowOffsetY = 1;
+ ctx.shadowBlur = 2;
+ ctx.fillText(txtPos, posX+8+txtPos.length/4, posY-13);
+
+ // Rond
+ ctx.beginPath();
+ ctx.arc(posX, posY, 4, 0, 2*Math.PI, true);
+
+ ctx.shadowColor = couleur;
+ ctx.shadowOffsetX = 0;
+ ctx.shadowOffsetY = 0;
+ ctx.shadowBlur = 4;
-// Fonctions servant à gérer les événements de la souris
-function sourisDown(){
- mouseDown = true
- posSourisXinit = posSourisX
- posSourisYinit = posSourisY
-}
-function sourisUp(){
- mouseDown = false
-}
-function sourisMove(event){
- posSourisX = event.clientX
- posSourisY = event.clientY
- if(mouseDown){
- if(outil == "deplacement"){
- var valeurX = (posSourisX-posSourisXinit)/multiplicateurX
- var valeurY = (posSourisYinit-posSourisY)/multiplicateurY
- if(Math.round(Math.abs(valeurX)) > 0){
- deplacerX(-Math.round(2*valeurX)/2)
- posSourisXinit = posSourisX
+ ctx.fillStyle = "rgba(0,0,0,1)";
+ ctx.strokeStyle = "rgba(255,255,255,0.8)";
+ ctx.lineWidth = 1;
+ ctx.fill()
+ ctx.stroke();
+ },
+
+ tangente : function(sourisX, sourisY, ajouterDansListe){
+ var delta = 0.001;
+
+ var ctx = new Object();
+ ctx = this.ctx;
+
+ // Dessiner les points et tangentes supplémentaires
+ this.dessinerListe();
+
+ // Dessiner les tangentes des fonctions
+ for(var i=0; i 0){
- deplacerY(-Math.round(2*valeurY)/2)
- posSourisYinit = posSourisY
+
+ // Position de la souris par rapport au coin supérieur gauche de l'affichage
+ var posX = sourisX - affichage.offsetLeft - 2;
+
+ // Valeur de la coordonnée x sous la souris
+ var t = posX / affichage.multX + affichage.xGauche;
+ if("startAngle" in func){
+ if(t < func.startAngle || t > func.endAngle){
+ continue;
+ }
+ }
+ var t1 = t + delta;
+ var x = func.getX(t);
+ var x1 = func.getX(t1);
+ // Calcul de deux valeurs y et de la pente
+ var y = func.getY(t);
+ var y1 = func.getY(t1);
+ var pente;
+ if(x1 != x){
+ pente = (y1-y)/(x1-x);
+ }
+ else{
+ pente = Number.POSITIVE_INFINITY;
+ }
+
+ // Dessiner la pente;
+ if(!isNaN(x) && !isNaN(y) && !isNaN(y1)){
+ if(ajouterDansListe){
+ this.ajouterTangente(x, y, pente, func.couleur);
+ }
+ this.dessinerTangente(x, y, pente, func.couleur);
}
- //decalageX = posSourisX-posSourisXinit
- //decalageY = posSourisY-posSourisYinit
- //actualiserGraph()
}
- }
- if(outil == "point"){
- var position = Math.round((posSourisX-132)*(borneXDroite-borneXGauche)/(precision*500))
- var positionX = pointX[position]
- var positionY = pointY[position]
- if(!isNaN(positionX) && !isNaN(positionY)){
- document.getElementById("info").innerHTML = "("+Math.round((positionX/multiplicateurX+borneXGauche)*100)/100+";"+Math.round(-(positionY/multiplicateurY-borneYDroite)*100)/100+")"
- document.getElementById("point").style.left = (positionX+130-4)+"px"
- document.getElementById("point").style.top = (positionY+53-10)+"px"
+ },
+ dessinerTangente : function(x, y, pente, couleur){
+ var ctx = new Object();
+ ctx = this.ctx;
+
+ // Conversion des coordonnées
+ var posX = coordToPosX(x) + 1;
+ var posY = coordToPosY(y) + 1;
+
+ // Carré
+ ctx.shadowColor = couleur;
+ ctx.shadowBlur = 4;
+
+ ctx.fillStyle = "white";
+ ctx.fillRect(posX-3, posY-3, 6, 6);
+
+ // Pente
+ ctx.strokeStyle = "white";
+ ctx.lineWidth = 2;
+ ctx.beginPath();
+ var pente2 = pente * (affichage.hauteur/affichage.largeur) * (affichage.xDroite-affichage.xGauche)/(affichage.yHaut-affichage.yBas);
+ ctx.moveTo(0, posY+posX*pente2);
+ ctx.lineTo(affichage.largeur, posY+posX*pente2-affichage.largeur*pente2);
+ ctx.stroke();
+
+ // Texte
+ var txtPente;
+ if(isFinite(pente)){
+ txtPente = pente.toFixed(2);
}
- }
- if(outil == "tangente"){
- var position = Math.round((posSourisX-129)/multiplicateurX/precision)
- var positionX = pointX[position]
- var positionY = pointY[position]
- var valeurPente = ((hauteur-pente[position])/multiplicateurY+borneYGauche)
- //hauteur - (((y-y1)/precision - borneYGauche)* multiplicateurY)
- document.getElementById("info").innerHTML = "("+Math.round(valeurPente*100)/100+")"
- ctxT.clearRect(0,0,largeur*2,hauteur*2)
- if(!isNaN(positionX) && !isNaN(positionY)){
- ctxT.fillStyle = "white"
- ctxT.fillRect (positionX-1, positionY-2, 6, 6)
- ctxT.strokeStyle = "white"
- ctxT.lineWidth = 2
- ctxT.beginPath()
- valeurPente = valeurPente * (hauteur/largeur) * (borneXDroite-borneXGauche)/(borneYDroite-borneYGauche)
- ctxT.moveTo(0+4, positionY+positionX*valeurPente+1)
- ctxT.lineTo(largeur+4, positionY+positionX*valeurPente-largeur*valeurPente+1)
- ctxT.stroke()
+ else{
+ txtPente = "∞"
}
+ ctx.fillStyle = "rgba(255,255,255,0.5)";
+ try{
+ ctx.bulle(posX+7, posY-7, txtPente.length*5.5+1, 20);
+ }
+ catch(err){
+ ctx.fillRect(posX+7, posY-27, txtPente.length*5.5, 20);
+ }
+
+ ctx.fillStyle = "black";
+ ctx.shadowColor = "black";
+ ctx.shadowOffsetX = 1;
+ ctx.shadowOffsetY = 1;
+ ctx.shadowBlur = 2;
+ ctx.fillText(txtPente, posX+8+txtPente.length/4, posY-13);
+ },
+
+ ajouterPoint : function(x, y, couleur){
+ var newPoint = {
+ x : x,
+ y : y,
+ couleur : couleur,
+ dessiner : function(){
+ outil.dessinerPoint(this.x, this.y, this.couleur);
+ }
+ };
+ this.liste.push(newPoint);
+ },
+ ajouterTangente : function(x, y, pente, couleur){
+ var newTangente = {
+ x : x,
+ y : y,
+ pente : pente,
+ couleur : couleur,
+ dessiner : function(){
+ outil.dessinerTangente(this.x, this.y, this.pente, this.couleur);
+ }
+ };
+ this.liste.push(newTangente);
+ },
+ dessinerListe : function(){
+ if(!this.ctx){
+ return;
+ }
+ this.ctx.clearRect(0,0,affichage.largeur*2,affichage.hauteur*2);
+ for(var i=0; i affichage.largeur+affichage.offsetLeft || posX < affichage.offsetLeft || posY > affichage.hauteur+affichage.offsetTop || posX < affichage.offsetTop){
+ continue;
+ }
+ var txt = 'x
';
+// alert(txt);
+ element.innerHTML += txt;
+ }
+ },
+ supprimer : function(id){
+ outil.liste.splice(id, 1);
+ outil.dessinerListe();
+// alert(id)
}
- //document.getElementById("info").innerHTML = " "+ (posSourisX-120) + ";" + (posSourisY-43)
-}
-function doubleClick(ctrlKey){
- if(ctrlKey){
- zoom(1.25)
- zoom3D(1.25)
- }
- else{
- zoom(0.8)
- zoom3D(0.8)
- }
-}
-
+};
// Evènements du clavier
function keyPress(event){
switch(event.keyCode){
case 27:
- reset()
+// widget.resetState()
break
case 37:
if(event.ctrlKey){
- deplacerX(-1)
+ affichage.deplacerX(-1)
}
break
case 38:
if(event.ctrlKey){
- deplacerY(1)
+ affichage.deplacerY(1)
}
break
case 39:
if(event.ctrlKey){
- deplacerX(1)
+ affichage.deplacerX(1)
}
break
case 40:
if(event.ctrlKey){
- deplacerY(-1)
+ affichage.deplacerY(-1)
}
break
default:
@@ -255,32 +449,10 @@ function keyPress(event){
}
-// ---- Fonctions de test ----
-function testSVG(){
- document.getElementById("affichage").innerHTML = ' '
-}
-function testCanvas(){
- document.getElementById("affichage").innerHTML = ' '
- ctx = document.getElementById('canvas').getContext('2d')
- var lingrad = ctx.createLinearGradient(100,100,largeur-100,hauteur-100)
- lingrad.addColorStop(0, 'rgba(0,50,255,1)')
- lingrad.addColorStop(1, 'rgba(0,255,255,1)')
- ctx.fillStyle = lingrad
- ctx.textAlign = "center"
- ctx.font = "72px bold"
- ctx.fillText("Canvas", largeur/2, hauteur/2-1)
-}
-function testXPM(){
- document.getElementById("affichage").innerHTML = ' '
-}
-
-
// ---- Aire sous la fonction (intégrale) ----
function AireSousFct(fct, a, b, n){
var aire, largeurRect, gaucheRect, droiteRect, millieuRect, hauteurRect, aireRect;
- var f = function(x){
- return eval(fct);
- };
+ var f = new Function("x", "return "+fct);
aire = 0;
largeurRect = (b-a)/n;
for(var i=0; i ';
+ afficherMenu('menuSaveImage');
+
+ display3D.background = background;
+ setTimeout(function(){
+ display3D.init();
+ display3D.draw();
+ }, 1);
+ }
+ else{
+ if(affichage.methode == "canvas"){
+ var l = affichage.largeur;
+ var h = affichage.hauteur;
+ var c = affichage.couleurFond;
+
+ affichage.largeur = parseInt(document.getElementById("saveWidth").value);
+ affichage.hauteur = parseInt(document.getElementById("saveHeight").value);
+ affichage.couleurFond = backgroundSauvegarde;
+
+ var newDiv = document.createElement("div");
+ affichage.init(newDiv, userWidth, userHeight);
+
+ outil.init();
+ outil.dessinerListe();
+ affichage.ctx.drawImage(outil.canvas,0,0);
+
+ var dataURL;
+ if(document.getElementById("selectSaveType").value == "jpg"){
+ dataURL = affichage.canvas.toDataURL("image/jpeg");
+ }
+ else{
+ dataURL = affichage.canvas.toDataURL();
+ }
+ document.getElementById("saveImageContent").innerHTML = ' ';
+ afficherMenu('menuSaveImage');
+
+ affichage.largeur = l;
+ affichage.hauteur = h;
+ affichage.couleurFond = c;
+ affichage.init();
+ outil.init();
+ }
+ else if(affichage.methode == "svg"){
+ window.open("JavaScript/AffichageSVG.svg");
+ }
+ }
+}
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/ParametricFunction.js b/resources/library/applications/GraphMe.wgt/JavaScript/ParametricFunction.js
new file mode 100644
index 00000000..30ed4271
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/ParametricFunction.js
@@ -0,0 +1,116 @@
+
+
+function ParametricFunction(fctX, fctY){
+
+ this.setFct = function(fctX, fctY){
+ this.fct = "x(t) = " + fctX + " ; y(t) = " + fctY;
+ this.fctX = fctX;
+ this.fctY = fctY;
+ this.fx = new Function("t", "return "+this.fctX);
+ this.fy = new Function("t", "return "+this.fctY);
+ }
+
+ if(fctX && fctY){
+ this.setFct(fctX, fctY);
+ }
+ this.couleur = fct.couleur;
+ this.width = document.getElementById("inputTaille").value;
+ this.startAngle = 0;
+ this.endAngle = 2*Math.PI;
+ this.from = "0";
+ this.to = "2*pi";
+ this.style = document.getElementById("selectStyle").value;
+
+ this.getX = function(t){
+ return this.fx(t);
+ };
+
+ this.getY = function(t){
+ return this.fy(t);
+ };
+
+ this.set = function(f){
+ var fctX = fct.remplacer(fct.verifier(f.fctX));
+ var fctY = fct.remplacer(fct.verifier(f.fctY));
+ this.setFct(fctX, fctY);
+ this.couleur = f.couleur;
+ this.width = f.width;
+ this.style = f.style;
+ this.from = f.from;
+ this.to = f.to;
+ this.startAngle = eval(fct.remplacer(fct.verifier(f.from)));
+ this.endAngle = eval(fct.remplacer(fct.verifier(f.to)));
+ return this;
+ };
+
+ this.get = function(){
+ var f = {};
+ f.type = "parametric";
+ f.fctX = this.fctX;
+ f.fctY = this.fctY;
+ f.couleur = this.couleur;
+ f.width = this.width;
+ f.style = this.style;
+ f.from = this.from;
+ f.to = this.to;
+ return f;
+ };
+
+ this.readableText = function(){
+ return "x(t) = " + this.fctX + "; y(t) = " + this.fctY;
+ };
+
+ this.setStartEnd = function(start, end){
+ if(start > end){
+ var tmp = start;
+ start = end;
+ end = start;
+ }
+ this.startAngle = start;
+ this.endAngle = end;
+ };
+
+ this.plot = function(ctx, precision, affichage){
+ if(this.style == "points"){
+ precision *= 2;
+ }
+
+ ctx.beginPath();
+ ctx.lineWidth = this.width;
+ ctx.strokeStyle = this.couleur;
+ ctx.fillStyle = this.couleur;
+ notDefined = true;
+ for(var t = this.startAngle; t <= this.endAngle; t+=precision){
+ var x = this.fx(t);
+ var y = this.fy(t);
+ if(!isNaN(x) && !isNaN(y)){
+ // Transform coordinates
+ var pointX = (x - affichage.xGauche) * affichage.multX;
+ var pointY = affichage.hauteur - (y - affichage.yBas) * affichage.multY;
+
+ // Draw point
+ if(notDefined){
+ notDefined = false;
+ ctx.moveTo(pointX, pointY);
+ }
+ else{
+ if(this.style == "continu"){
+ ctx.lineTo(pointX, pointY);
+ }
+ else if(this.style == "points"){
+ ctx.beginPath();
+ ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
+ ctx.fill();
+ }
+ else{
+ ctx.lineTo(pointX, pointY);
+ notDefined = true;
+ }
+ }
+ }
+ }
+ if(this.style != "points"){
+ ctx.stroke();
+ }
+ };
+}
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/PolarFunction.js b/resources/library/applications/GraphMe.wgt/JavaScript/PolarFunction.js
new file mode 100644
index 00000000..52dd7e79
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/PolarFunction.js
@@ -0,0 +1,112 @@
+
+function PolarFunction(txtFct){
+
+ this.setFct = function(txt){
+ this.fct = txt;
+ this.f = new Function("t", "return "+this.fct);
+ };
+
+ if(txtFct){
+ this.setFct(txtFct);
+ }
+ this.couleur = fct.couleur;
+ this.width = document.getElementById("inputTaille").value;
+ this.startAngle = 0;
+ this.endAngle = 2*Math.PI;
+ this.from = "0";
+ this.to = "2*pi";
+ this.style = document.getElementById("selectStyle").value;
+
+ this.getX = function(t){
+ var r = this.f(t);
+ return r * Math.cos(t);
+ };
+
+ this.getY = function(t){
+ var r = this.f(t);
+ return r * Math.sin(t);
+ };
+
+ this.set = function(f){
+ this.setFct(fct.remplacer(fct.verifier(f.fct)));
+ this.couleur = f.couleur;
+ this.width = f.width;
+ this.style = f.style;
+ this.from = f.from;
+ this.to = f.to;
+ this.startAngle = eval(fct.remplacer(fct.verifier(f.from)));
+ this.endAngle = eval(fct.remplacer(fct.verifier(f.to)));
+ return this;
+ };
+
+ this.get = function(){
+ var f = {};
+ f.type = "polar";
+ f.fct = this.fct;
+ f.couleur = this.couleur;
+ f.width = this.width;
+ f.style = this.style;
+ f.from = this.from;
+ f.to = this.to;
+ return f;
+ };
+
+ this.readableText = function(){
+ return "r(t) = " + this.fct;
+ };
+
+ this.setStartEnd = function(start, end){
+ if(start > end){
+ var tmp = start;
+ start = end;
+ end = start;
+ }
+ this.startAngle = start;
+ this.endAngle = end;
+ };
+
+ this.plot = function(ctx, precision, affichage){
+ if(this.style == "points"){
+ precision *= 2;
+ }
+
+ ctx.beginPath();
+ ctx.lineWidth = this.width;
+ ctx.strokeStyle = this.couleur;
+ ctx.fillStyle = this.couleur;
+ notDefined = true;
+ for(var t = this.startAngle; t <= this.endAngle; t+=precision){
+ var r = this.f(t);
+ if(!isNaN(r)){
+ // Transform coordinates
+ var x = r * Math.cos(t);
+ var y = r * Math.sin(t);
+ var pointX = (x - affichage.xGauche) * affichage.multX;
+ var pointY = affichage.hauteur - (y - affichage.yBas) * affichage.multY;
+
+ // Draw point
+ if(notDefined){
+ notDefined = false;
+ ctx.moveTo(pointX, pointY);
+ }
+ else{
+ if(this.style == "continu"){
+ ctx.lineTo(pointX, pointY);
+ }
+ else if(this.style == "points"){
+ ctx.beginPath();
+ ctx.arc(pointX, pointY, this.width, 0, 2*Math.PI, true);
+ ctx.fill();
+ }
+ else{
+ ctx.lineTo(pointX, pointY);
+ notDefined = true;
+ }
+ }
+ }
+ }
+ if(this.style != "points"){
+ ctx.stroke();
+ }
+ };
+}
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Sauvegardes.js b/resources/library/applications/GraphMe.wgt/JavaScript/Sauvegardes.js
index 91b3514a..54b3829d 100644
--- a/resources/library/applications/GraphMe.wgt/JavaScript/Sauvegardes.js
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/Sauvegardes.js
@@ -1,4 +1,6 @@
-var listeOptions = ["theme","precision","decalageX","decalageY","epaisseur","grille","axes","echelle","zoom","methode","methode3D","precision3D","maj"];
+// Fonctions permettant de sauvegarder les options
+
+var optionsLoaded = false;
function setCookie(nom,valeur){
var jours = 545; // Durée de validité des cookies
@@ -31,89 +33,74 @@ function delCookie(nom){
}
function saveOptions(){
- setCookie("theme",document.getElementById("selectTheme").value);
- setCookie("precision",document.getElementById("inputPrecision").value);
- setCookie("decalageX",document.getElementById("inputDecalageX").value);
- setCookie("decalageY",document.getElementById("inputDecalageY").value);
- setCookie("epaisseur",document.getElementById("inputTaille").value);
- setCookie("grille",document.getElementById("checkGrille").checked);
- setCookie("axes",document.getElementById("checkAxes").checked);
- setCookie("echelle",document.getElementById("checkEchelle").checked);
- setCookie("zoom",document.getElementById("zoomDefaut").value);
- setCookie("methode",document.getElementById("selectMethodeAffichage").value);
- setCookie("methode3D",document.getElementById("selectAffichage3D").value);
- setCookie("precision3D",document.getElementById("inputPrecision3D").value);
- setCookie("maj",document.getElementById("checkMaJ").checked);
- document.getElementById("infoSauvegarde").style.display = "block"
+ if(!optionsLoaded){
+ return;
+ }
+ var state = JSON.stringify(widget.getState());
+ if(window.sankore){
+ sankore.setPreference("state", state);
+ }
+ else if(navigator.cookieEnabled){
+ setCookie("state", state);
+ }
}
function loadOptions(){
- if(navigator.cookieEnabled){
- if(checkOptions()){
- document.getElementById("selectTheme").value = getCookie("theme");
- changerTheme(document.getElementById("selectTheme").value);
- document.getElementById("inputPrecision").value = getCookie("precision");
- document.getElementById("inputDecalageX").value = getCookie("decalageX");
- document.getElementById("inputDecalageY").value = getCookie("decalageY");
- document.getElementById("inputTaille").value = getCookie("epaisseur");
- if(getCookie("grille")=="true"){
- document.getElementById("checkGrille").checked = true;
- }
- else{
- document.getElementById("checkGrille").checked = false;
- }
- if(getCookie("axes")=="true"){
- document.getElementById("checkAxes").checked = true;
- }
- else{
- document.getElementById("checkAxes").checked = false;
- }
- if(getCookie("echelle")=="true"){
- document.getElementById("checkEchelle").checked = true;
- }
- else{
- document.getElementById("checkEchelle").checked = false;
- }
- document.getElementById("zoomDefaut").value = getCookie("zoom");
- document.getElementById("selectMethodeAffichage").value = getCookie("methode");
- document.getElementById("selectAffichage3D").value = getCookie("methode3D");
- document.getElementById("inputPrecision3D").value = getCookie("precision3D");
- if(getCookie("maj")=="true"){
- document.getElementById("checkMaJ").checked = true;
- }
- else{
- document.getElementById("checkMaJ").checked = false;
- }
- actualiserGraph();
- }
- else{
- if(document.cookie!=""){
- alert("It's can't be downloaded ...");
- }
- }
+ var state;
+ if(window.sankore){
+ state = sankore.preference("state", null);
+ }
+ else if(navigator.cookieEnabled){
+ state = getCookie("state");
+ }
+ if(!state){
+ optionsLoaded = true;
+ return;
}
- else{
- document.getElementById("cacheCookies").style.display = "block";
+ var stateObject = JSON.parse(state);
+ var goodState = widget.getState();
+ if(!checkState(stateObject, goodState)){
+ loadOptionsFailed();
+ }
+ try{
+ widget.setState(stateObject);
+ optionsLoaded = true;
+ }
+ catch(e){
+ loadOptionsFailed();
}
}
-function delOptions(){
- var i;
- for(i=0; i 0){
+ affichage.zoom(1.25);
+ }
+ else{
+ affichage.zoom(0.8);
+ }
+ }
+ },
+ dblClick : function(event){
+ if(event.ctrlKey){
+ affichage.zoom(1.25)
+ display3D.zoom(1.25)
+ }
+ else{
+ affichage.zoom(0.8)
+ display3D.zoom(0.8)
+ }
+ }
+}
+
+var ctxMenu = {
+ id : "ctxMenu",
+ ouvert : false,
+
+ ouvrir : function(){
+ if(!fonction3D){
+ ctxMenu.ouvert = true;
+
+ var element = document.getElementById("ctxMenu");
+ var x = souris.xInit;
+ var y = souris.yInit;
+ // var x = 300;
+ // var y = 300;
+ element.style.display = "block";
+ element.style.left = (x+1)+"px";
+ element.style.top = (y+1)+"px";
+
+ // Désactive le menu du navigateur
+ return false;
+ }
+ },
+
+ fermer : function(){
+ ctxMenu.ouvert = false;
+
+ var element = document.getElementById("ctxMenu");
+ element.style.display = "none";
+ }
+}
+
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Utils.js b/resources/library/applications/GraphMe.wgt/JavaScript/Utils.js
new file mode 100644
index 00000000..f7dcbf7c
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/Utils.js
@@ -0,0 +1,228 @@
+
+// Lance la procédure pour dessiner la fonction qui se trouve dans l'input en haut du widget.
+// Permet aussi d'actualiser le graphique.
+function actualiserGraph(){
+ affichage.calculer();
+}
+
+// Retourne l'index du dernier endroit où se trouve listCharacter dans une chaîne de caractère.
+String.prototype.getLastIndexOf = function(listCharacter, minPos, maxPos){
+ var count = 0;
+ var parenthese = false;
+ if(!maxPos){
+ maxPos = this.length;
+ }
+ for(var i=maxPos; i>=minPos; i--){
+ if(this.charAt(i) == ")"){
+ count++;
+ parenthese = true;
+ }
+ else if(this.charAt(i) == "("){
+ count--;
+ }
+// window.console.log(this.charAt(i)+" ; "+count);
+ for(var j=0; j0){
+ return 1;
+ }
+ else{
+ return undefined;
+ }
+}
+
+function round(valeur){
+ return Math.round(valeur);
+}
+function ceil(valeur){
+ return Math.ceil(valeur);
+}
+function floor(valeur){
+ return Math.floor(valeur);
+}
+function random(){
+ return Math.random();
+}
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/Widget.js b/resources/library/applications/GraphMe.wgt/JavaScript/Widget.js
new file mode 100644
index 00000000..100d109a
--- /dev/null
+++ b/resources/library/applications/GraphMe.wgt/JavaScript/Widget.js
@@ -0,0 +1,186 @@
+var listeServeurs = [
+ 'http://yannick.vessaz.net/GraphMe/GraphMe.wgt/'
+ /*'http://gyb.educanet2.ch/tm-widgets/yannick/GraphMe.wgt/'*/
+];
+
+var widget = {
+ init: function(){
+// try{
+ document.getElementById('inputRapide').value = "";
+ document.getElementById('selectTheme').value = "darkblue";
+ affichage.setOptions();
+ document.getElementById('zoomDefaut').value = "3.7";
+ document.getElementById('functionType').value = "cartesian";
+ document.getElementById('inputTaille').value = "3";
+ document.getElementById('checkDerivee1').checked = false;
+ document.getElementById('checkDerivee2').checked = false;
+ document.getElementById('checkPrimitive1').checked = false;
+ document.getElementById('checkAire').checked = false;
+ document.getElementById('selectStyle').value = "continu";
+ document.getElementById('input3D').value = "";
+ document.getElementById('inputPrecision3D').value = "0.2";
+ document.getElementById('selectAffichage3D').value = "surfaces";
+ document.getElementById('selectRouge3D').value = "plus";
+ document.getElementById('selectVert3D').value = "moins";
+ document.getElementById('selectBleu3D').value = "tout";
+ document.getElementById('couleur3Dgenerale').value = "0";
+
+ affichage.init();
+ outil.init();
+ editorPreview.init();
+ display3D.checkCouleurs3D();
+ loadOptions();
+
+ if(!fonction3D){
+ if(fct.list.length == 0){
+ this.displayStartInput();
+ }
+ else if(!window.sankore){
+ this.displayFunctionsHelp();
+ }
+ }
+// }
+// catch(err){
+// alert(err+'\n'+err.stack);
+// }
+ },
+
+ displayStartInput: function(){
+ document.getElementById('divInputRapide').style.display = "block";
+ var textEnterFunction = "Enter a cartesian function";
+ try{
+ textEnterFunction = languages.getText("enterFunction");
+ }
+ catch(e){}
+ var textNeedHelp = "Need help ?";
+ try{
+ textNeedHelp = languages.getText("needHelp");
+ }
+ catch(e){}
+
+ var text = textEnterFunction + '. '+ textNeedHelp +' '
+
+ message.ajouter(275,75,text);
+ setTimeout(message.supprimer, 15000);
+
+ document.getElementById('inputRapide').focus();
+ },
+
+ addStartFunction: function(){
+ message.supprimer();
+ document.getElementById('divInputRapide').style.display = 'none';
+ document.getElementById('input').value = document.getElementById('inputRapide').value;
+ fct.ajouter();
+ this.displayFunctionsHelp();
+ },
+
+ displayFunctionsHelp: function(){
+ var text = "Click here to modify the functions or add a new function.";
+ try{
+ text = languages.getText("clickHereToModify");
+ }
+ catch(e){}
+ setTimeout(function(){message.ajouter(220,35,text)}, 50);
+ setTimeout(message.supprimer, 5000);
+ },
+
+ resize: function(){
+ if(fonction3D){
+ display3D.init();
+ display3D.draw();
+ }
+ else{
+ affichage.init();
+ }
+ outil.init();
+ },
+
+ reset: function(){
+ delOptions();
+ window.location.reload();
+ },
+
+ getState: function(){
+ var state = {
+ theme: document.getElementById("selectTheme").value,
+ displayMethod: document.getElementById("selectMethodeAffichage").value,
+ defaultZoom: document.getElementById("zoomDefaut").value,
+ displayGrid: document.getElementById("checkGrille").checked,
+ displayAxes: document.getElementById("checkAxes").checked,
+ displayScale: document.getElementById("checkEchelle").checked,
+ accuracy: document.getElementById("inputPrecision").value,
+ improvedAccuracy: document.getElementById("checkPrecision").checked,
+ thickness: document.getElementById("inputTaille").value,
+ lineStyle: document.getElementById("selectStyle").value,
+ derivative1: document.getElementById("checkDerivee1").checked,
+ derivative2: document.getElementById("checkDerivee2").checked,
+ primitive: document.getElementById("checkPrimitive1").checked,
+ drawArea: document.getElementById("checkAire").checked,
+ lineStyle3D: document.getElementById("selectAffichage3D").value,
+ accuracy3D: document.getElementById("inputPrecision3D").value,
+ plotHistory: historique.get(),
+ functions: fct.get(),
+ display3D: fonction3D,
+ input3D: document.getElementById('input3D').value,
+ currentTool: outil.actuel
+ };
+ if(window.sankore){
+ state.fullScreen = pleinEcran;
+ state.displayLeft = affichage.xGauche;
+ state.displayRight = affichage.xDroite;
+ state.displayUp = affichage.yHaut;
+ state.displayDown = affichage.yBas;
+ }
+ return state;
+ },
+
+ setState: function(state){
+ document.getElementById("selectTheme").value = state.theme;
+ document.getElementById("selectMethodeAffichage").value = state.displayMethod;
+ document.getElementById("zoomDefaut").value = state.defaultZoom;
+ document.getElementById("checkGrille").checked = state.displayGrid;
+ document.getElementById("checkAxes").checked = state.displayAxes;
+ document.getElementById("checkEchelle").checked = state.displayScale;
+ document.getElementById("inputPrecision").value = state.accuracy;
+ document.getElementById("checkPrecision").checked = state.improvedAccuracy;
+ document.getElementById("inputTaille").value = state.thickness;
+ document.getElementById("selectStyle").value = state.lineStyle;
+ document.getElementById("checkDerivee1").checked = state.derivative1;
+ document.getElementById("checkDerivee2").checked = state.derivative2;
+ document.getElementById("checkPrimitive1").checked = state.primitive;
+ document.getElementById("checkAire").checked = state.drawArea;
+ document.getElementById("selectAffichage3D").value = state.lineStyle3D;
+ document.getElementById("inputPrecision3D").value = state.accuracy3D;
+ historique.set(state.plotHistory);
+ fct.set(state.functions);
+ document.getElementById('input3D').value = state.input3D || "";
+ if(state.display3D){
+ activer3D();
+ }
+
+ if(window.sankore){
+ if(state.fullScreen){
+ agrandirAffichage();
+ }
+ affichage.xGauche = state.displayLeft;
+ affichage.xDroite = state.displayRight;
+ affichage.yHaut = state.displayUp;
+ affichage.yBas = state.displayDown;
+ affichage.setBornes();
+ }
+
+ affichage.getOptions();
+ if(!window.sankore){
+ affichage.initZoom2(document.getElementById('zoomDefaut').value);
+ }
+ changerTheme(document.getElementById("selectTheme").value);
+ if(state.display3D){
+ display3D.draw();
+ }
+ else{
+ affichage.dessiner();
+ }
+
+ outil.choisir(state.currentTool);
+ }
+};
diff --git a/resources/library/applications/GraphMe.wgt/JavaScript/jquery-1.3.2.min.js b/resources/library/applications/GraphMe.wgt/JavaScript/jquery-1.3.2.min.js
deleted file mode 100644
index b1ae21d8..00000000
--- a/resources/library/applications/GraphMe.wgt/JavaScript/jquery-1.3.2.min.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * jQuery JavaScript Library v1.3.2
- * http://jquery.com/
- *
- * Copyright (c) 2009 John Resig
- * Dual licensed under the MIT and GPL licenses.
- * http://docs.jquery.com/License
- *
- * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
- * Revision: 6246
- */
-(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,""]||!O.indexOf(""," "]||(!O.indexOf(""," "]||!O.indexOf(""," "]||!o.support.htmlSerialize&&[1,"div","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
-/*
- * Sizzle CSS Selector Engine - v0.9.3
- * Copyright 2009, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
-(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V ";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML=" ";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="
";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(Fa text ';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(/