# HG changeset patch # User bastiena # Date 1340977046 -7200 # Node ID d2f735d7763f2642060bb0dcb39a70f9934af6a0 # Parent 0f31ebcc62b7cd11004388f3c5d3f55cf727ab94 Middleware: config by config file Front JS: Examples created (pointers & gestures). Installer that integers now Middleware + Front Processing + Front JS. diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/doc/tutorial front js et wamp.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_js/doc/tutorial front js et wamp.html Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,36 @@ + + + How To : Intégrer le Front JS à Wamp pour pouvoir le tester + + + + +

Bienvenue dans ce tutorial visant à intégrer le Front JS à Wamp.

+

Sommaire

+ + + +

Installation et configuration de WampServer 2.

+ +

Comme vous l'aurez certainement remarqué dans le readme associé à ce Front, il est nécessaire d'acquérir WampServer 2.

+

Normalement, l'installeur intègre un installeur. Néanmoins, vous pouvez aussi le trouver ici.

+

Durant l'installation (par défaut sur le disque C:\), sélectionnez les paramètres par défaut, excepté pour le navigateur par défaut dans Wamp. Choisissez Google Chrome. Si vous ne le possédez pas, il est disponible ici.

+

Une fois Wamp installé (on supposera qu'il est par défaut à C:\wamp), lancez-le. Une icone W devrait apparaître dans la barre des notifications. Clic gauche sur cette icone > Put Online.

+ +

Copie des fichiers pour pouvoir les lancer dans Wamp.

+ +

Afin de pouvoir tester le Front JS, il est nécessaire de copier le Front dans Wamp. Allez sur l'icone de wamp dans la barre des notifications, puis, clic gauche > www directory.

+

C'est le dossier des projets dans wamp.

+

Prenez les dossiers gestures, pointers et lib de Front JS pour les mettre dans www.

+ +

Tester les modules du Front dans Wamp.

+ +

A présent, vous pouvez lancer le Middleware via l'éxecutable MainModule.exe. Une fois allumé, il ne vous reste qu'à tester les Fronts JS en cliquant gauche sur l'icone de wamp > localhost. La fenêtre d'accueil de wamp s'affiche. Sur le menu de gauche, sélectionnez les projets gestures et pointers (l'un ou l'autre, ou les deux). Une fois la ou les fenêtres ouvertes dans chrome, vous pourrez bouger les pointeurs dans le projet pointers, ou bien voir les notifications de gestures envoyées par le Middleware dans le projet gestures.

+ +

Si vous avez des questions ou des recommandations, voici mon adresse : alexandre.bastien@iri.centrepompidou.fr

+ + \ No newline at end of file diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/communication/js/client.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_js/gestures/communication/js/client.js Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,105 @@ +/* +* This file is part of the TraKERS\Front JS package. +* +* (c) IRI +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +/* + * Projet : TraKERS + * Module : Front JS + * Fichier : client.js + * + * Auteur : alexandre.bastien@iri.centrepompidou.fr + * + * Fonctionnalités : Définit le module de communication qui établit la connexion entre ce Front et le Middleware. + */ + +/* + * Un client est défini par une socket, qui permettra de recevoir les données du server websocket du Middleware. + * On accède aussi à la classe des pointeurs. +*/ +function client(host, port, _gestures) +{ + this.socket; + this.gestures = _gestures; + this.showGestureTimeout; + + this.createWebSocket('ws://' + host + ':' + port + '/'); +} + +/* + * Création et Initialisation des sockets et listeners permettant d'écouter le server. +*/ +client.prototype.createWebSocket = function(host) +{ + var _this = this; + + //Initialise la fonctionnalité websocket du naviguateur. + if(window.MozWebSocket) + { + window.WebSocket = window.MozWebSocket; + } + + //Si le naviguateur ne supporte pas les websockets, on s'arrête là. + if(!window.WebSocket) + { + alert('Votre navigateur ne supporte pas les webSocket!'); + return false; + } + //Sinon + else + { + //On initialise la socket. + this.socket = new WebSocket(host); + + //Si elle est ouverte, on notifie le Front. + this.socket.onopen = function() + { + console.log('Socket ouverte.'); + } + //Si elle est fermée, on notifie le Front. + this.socket.onclose = function() + { + console.log('Socket fermée.'); + } + //S'il y a un problème dans la connection, on notifie le Front. + this.socket.onerror = function() + { + console.log('Une erreur est survenue dans le module de Communication.'); + } + //Si on reçoit un message. + this.socket.onmessage = function(msg) + { + _this.processMsg(msg); + } + } +} + +/* + * Traite un message reçu du Middleware. +*/ +client.prototype.processMsg = function(msg) +{ + if(typeof msg === 'undefined' || typeof msg.data === 'undefined') + { + return; + } + + var _this = this; + + //Sinon si ce sont les coordonnées de la main droite. + if(msg.data[0] == '2') + { + var instruction = msg.data.substring(2, msg.data.length); + + //S'il ne s'agit pas d'une gesture relative à la position de l'utilisateur par rapport à la Kinect. + if(instruction != "NO-USER" && instruction.indexOf("INCOMING") == -1 && instruction != "MOSAIC" && instruction != "FILTER") + { + //On affiche la notification de gesture. + this.gestures.showGesture(instruction); + } + } +} \ No newline at end of file diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/gestures/css/gestures.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_js/gestures/gestures/css/gestures.css Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,39 @@ +/* +* This file is part of the TraKERS\Front JS package. +* +* (c) IRI +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +/* + * Projet : TraKERS + * Module : Front JS + * Fichier : gestures.css + * + * Auteur : alexandre.bastien@iri.centrepompidou.fr + * + * Fonctionnalités : Définit les styles de la classe de gestion des gestes. + */ + +body +{ + background-color: #000; + overflow: hidden; +} + +#textPanel +{ + position: relative; + height: 50px; + width: 100%; + color: #fff; + font-size: 40px; + text-align: center; +} + +#imagePanel +{ + position: absolute; +} \ No newline at end of file diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/gestures/js/gestures.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_js/gestures/gestures/js/gestures.js Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,77 @@ +/* +* This file is part of the TraKERS\Front JS package. +* +* (c) IRI +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +/* + * Projet : TraKERS + * Module : Front JS + * Fichier : gestures.js + * + * Auteur : alexandre.bastien@iri.centrepompidou.fr + * + * Fonctionnalités : Définit la "classe" de gestion des gestes et définit des fonctions d'intéraction. + */ + +/* + * Classe définissant les gestes. + */ +function gestures(config) +{ + this.isGestureShown = false; + this.showGestureTimeout; + + this.imgWidth; + this.imgHeight; + + this.config = config; + + var textPanel = "
Aucune gesture n'est détectée.
"; + var imagePanel = ""; + $('body').append(textPanel + imagePanel); + + $('#imagePanel').load(function() + { + this.imgWidth = $('#imagePanel').width(); + this.imgHeight = $('#imagePanel').height(); + + //On positionne l'image au centre de l'écran. + $('#imagePanel').css( + { + top: ($(window).height() - this.imgWidth) / 2, + left: ($(window).width() - this.imgHeight) / 2 + }); + }); + + this.wsClient = new client(this.config["host"], this.config["port"], this); +} + +/* + * Affiche les gestures reçues. +*/ +gestures.prototype.showGesture = function(gesture) +{ + //Si on n'avait aucune gesture, on peut l'afficher. + if(!this.isGestureShown) + { + var _this = this; + + this.isGestureShown = true; + $('#textPanel').html("Gesture de code " + gesture + " détectée."); + //On retrouve le nom du fichier image correspondant dans le code de la gesture. + gesture = gesture.toLowerCase().replace('-', '_'); + $('#imagePanel').attr("src", "./img/" + gesture + ".png"); + + //On supprime l'affichage au bout de N ms. + this.showGestureTimeout = setTimeout(function() + { + _this.isGestureShown = false; + $('#imagePanel').attr("src", "./img/black.png"); + $('#textPanel').html("Aucune gesture n'est détectée."); + }, this.config["timeShowGesture"]); + } +} \ No newline at end of file diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/bend.png Binary file front_js/gestures/img/bend.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/black.png Binary file front_js/gestures/img/black.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/fall.png Binary file front_js/gestures/img/fall.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/hello.png Binary file front_js/gestures/img/hello.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/jump.png Binary file front_js/gestures/img/jump.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/knee_up.png Binary file front_js/gestures/img/knee_up.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/pull_both.png Binary file front_js/gestures/img/pull_both.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/pull_left.png Binary file front_js/gestures/img/pull_left.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/pull_right.png Binary file front_js/gestures/img/pull_right.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/push_both.png Binary file front_js/gestures/img/push_both.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/push_left.png Binary file front_js/gestures/img/push_left.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/push_right.png Binary file front_js/gestures/img/push_right.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/swipe_left.png Binary file front_js/gestures/img/swipe_left.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/img/swipe_right.png Binary file front_js/gestures/img/swipe_right.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/gestures/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_js/gestures/index.html Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,53 @@ + + + + + + + IDILL + + + + + + + + + + + + + \ No newline at end of file diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/lib/jquery.min.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_js/lib/jquery.min.js Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,4 @@ +/*! jQuery v1.7.1 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; +f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() +{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/lib/reset.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_js/lib/reset.css Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,48 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/pointers/communication/js/client.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_js/pointers/communication/js/client.js Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,161 @@ +/* +* This file is part of the TraKERS\Front JS package. +* +* (c) IRI +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +/* + * Projet : TraKERS + * Module : Front JS + * Fichier : index.html + * + * Auteur : alexandre.bastien@iri.centrepompidou.fr + * + * Fonctionnalités : Définit le module de communication qui établit la connexion entre ce Front et le Middleware. + */ + +/* + * Un client est défini par une socket, qui permettra de recevoir les données du server websocket du Middleware. + * On accède aussi à la classe des pointeurs. +*/ +function client(host, port, _pointers) +{ + this.socket; + this.pointers = _pointers; + + this.pointerLeft = false; + this.pointerRight = false; + this.timePointers = 100; + this.pointerLeftTimeout; + this.pointerRightTimeout; + this.isLeftHanded = false; + + this.createWebSocket('ws://' + host + ':' + port + '/'); +} + +/* + * Création et Initialisation des sockets et listeners permettant d'écouter le server. +*/ +client.prototype.createWebSocket = function(host) +{ + var _this = this; + + //Initialise la fonctionnalité websocket du naviguateur. + if(window.MozWebSocket) + { + window.WebSocket = window.MozWebSocket; + } + + //Si le naviguateur ne supporte pas les websockets, on s'arrête là. + if(!window.WebSocket) + { + alert('Votre navigateur ne supporte pas les webSocket!'); + return false; + } + //Sinon + else + { + //On initialise la socket. + this.socket = new WebSocket(host); + + //Si elle est ouverte, on notifie le Front. + this.socket.onopen = function() + { + console.log('Socket ouverte.'); + } + //Si elle est fermée, on notifie le Front. + this.socket.onclose = function() + { + console.log('Socket fermée.'); + } + //S'il y a un problème dans la connection, on notifie le Front. + this.socket.onerror = function() + { + console.log('Une erreur est survenue dans le module de Communication.'); + } + //Si on reçoit un message. + this.socket.onmessage = function(msg) + { + _this.processMsg(msg); + } + } +} + +/* + * Traite un message reçu du Middleware. +*/ +client.prototype.processMsg = function(msg) +{ + if(typeof msg === 'undefined' || typeof msg.data === 'undefined') + { + return; + } + + var _this = this; + + //Sinon si ce sont les coordonnées de la main droite. + if(msg.data[0] == '1') + { + var instruction = msg.data.substring(2, msg.data.length); + pt = instruction.split(';'); + var x = Math.abs(parseFloat(pt[0])), y = Math.abs(parseFloat(pt[1])); + this.pointerLeft = true; + clearTimeout(this.pointerLeftTimeout); + + this.pointers.refreshMainPointer(x, y); + + if(!this.pointers.isMainPointerDisplayed) + { + this.pointers.mainPointerDisplay(true); + this.pointers.isMainPointerDisplayed = true; + } + + this.pointerLeftTimeout = setTimeout(function() + { + _this.pointerLeft = false; + + if(_this.pointers.isMainPointerDisplayed) + { + _this.pointers.isMainPointerDisplayed = false; + _this.pointers.mainPointerDisplay(false); + } + }, this.timePointers); + } + //Sinon si ce sont les coordonnées de la main gauche. + else if(msg.data[0] == '0') + { + var instruction = msg.data.substring(2, msg.data.length); + pt = instruction.split(';'); + var x = Math.abs(parseFloat(pt[0])), y = Math.abs(parseFloat(pt[1])); + + this.pointerRight = true; + clearTimeout(this.pointerRightTimeout); + + this.pointers.refreshSecondPointer(x, y); + + if(!this.pointers.isSecondPointerDisplayed) + { + this.pointers.secondPointerDisplay(true); + this.pointers.isSecondPointerDisplayed = true; + } + + this.pointerRightTimeout = setTimeout(function() + { + _this.pointerRight = false; + + if(_this.pointers.isSecondPointerDisplayed) + { + _this.pointers.isSecondPointerDisplayed = false; + _this.pointers.secondPointerDisplay(false); + } + }, this.timePointers); + } + + if(this.pointerLeft && !this.pointerRight || !this.pointerLeft && this.pointerRight || !this.pointerLeft && !this.pointerRight) + { + this.pointers.areBothPointersHere = false; + } +} \ No newline at end of file diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/pointers/img/pointer.png Binary file front_js/pointers/img/pointer.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/pointers/img/pointer2.png Binary file front_js/pointers/img/pointer2.png has changed diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/pointers/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_js/pointers/index.html Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,46 @@ + + + + + + + IDILL + + + + + + + + + + + + + \ No newline at end of file diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/pointers/pointers/css/pointers.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_js/pointers/pointers/css/pointers.css Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,41 @@ +/* +* This file is part of the TraKERS\Front JS package. +* +* (c) IRI +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +/* + * Projet : TraKERS + * Module : Front JS + * Fichier : pointers.css + * + * Auteur : alexandre.bastien@iri.centrepompidou.fr + * + * Fonctionnalités : Définit les styles de la classe de gestion des pointers. + */ + +body +{ + background-color: #000; +} + +#mainPointer +{ + height: 74px; + width: 74px; + background-image: url("../../img/pointer.png"); + background-repeat: no-repeat; + background-position: 0px 0px; +} + +#secondPointer +{ + height: 74px; + width: 74px; + background-image: url("../../img/pointer2.png"); + background-repeat: no-repeat; + background-position: 0px 0px; +} \ No newline at end of file diff -r 0f31ebcc62b7 -r d2f735d7763f front_js/pointers/pointers/js/pointers.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/front_js/pointers/pointers/js/pointers.js Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,178 @@ +/* +* This file is part of the TraKERS\Front JS package. +* +* (c) IRI +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +/* + * Projet : TraKERS + * Module : Front JS + * Fichier : pointers.js + * + * Auteur : alexandre.bastien@iri.centrepompidou.fr + * + * Fonctionnalités : Définit la "classe" de gestion des pointers et définit des fonctions d'intéraction. + */ + +/* + * Classe définissant les pointers. + */ +function pointers() +{ + this.mainPointerLastX = 0; + this.mainPointerLastY = 0; + this.secondPointerLastX = 0; + this.secondPointerLastY = 0; +} + +/* + * Affiche les pointeurs. +*/ +pointers.prototype.addPointers = function() +{ + var mainPointer = '
'; + var secondPointer = '
'; + $('body').append(mainPointer + secondPointer); + + $('#secondPointer').css( + { + top: $(window).height() / 2 - $('#secondPointer').height() / 2, + left: $(window).width() / 4 - $('#secondPointer').width() / 2 + }); + + this.secondPointerLastX = $(window).width() / 4 - $('#secondPointer').width() / 2; + this.secondPointerLastY = $(window).height() / 2 - $('#secondPointer').height() / 2; + + $('#mainPointer').css( + { + top: $(window).height() / 2 - $('#mainPointer').height() / 2, + left: $(window).width() * 3 / 4 - $('#mainPointer').width() / 2 + }); + + this.mainPointerLastX = $(window).width() * 3 / 4 - $('#mainPointer').width() / 2; + this.mainPointerLastY = $(window).height() / 2 - $('#mainPointer').height() / 2; +} + +/* + * Affiche/Masque le pointeur principal. + * Main est un booléen valant vrai s'il faut afficher le pointeur. +*/ +pointers.prototype.mainPointerDisplay = function(main) +{ + var _this = this; + + //Si le booléen est à vrai, on affiche le pointeur. + if(main) + { + $('#mainPointer').fadeTo(this.config['timeFilling'], '1'); + } + else + { + $('#mainPointer').fadeTo(this.config['timeFilling'], '0'); + } +} +/* + * Affiche/Masque le pointeur secondaire. + * Main est un booléen valant vrai s'il faut afficher le pointeur. +*/ +pointers.prototype.secondPointerDisplay = function(second) +{ + var _this = this; + + //Si le booléen est à vrai, on affiche le pointeur. + if(second) + { + $('#secondPointer').fadeTo(this.config['timeFilling'], '1'); + } + else + { + $('#secondPointer').fadeTo(this.config['timeFilling'], '0'); + } +} + +/* + * Raffraîchit la position des pointeurs. +*/ +pointers.prototype.refreshMainPointer = function(x, y) +{ + x *= 7; + y *= 7; + x -= $(window).width() * 3 / 4; + y -= $(window).height() * 2 / 4; + + //Si le pointeur quitte la fenêtre en X, on ne le change pas. + if(x < 0 || x > $(window).width()) + { + x = this.mainPointerLastX; + } + //Sinon, on le met à jour. + else + { + this.mainPointerLastX = x; + } + + //Si le pointeur quitte la fenêtre en Y, on ne le change pas. + if(y < 0 || y > $(window).height()) + { + y = this.mainPointerLastY; + } + //Sinon, on le met à jour. + else + { + this.mainPointerLastY = y; + } + + var pointerX = x - $('#mainPointer').width()/2, pointerY = y - $('#mainPointer').height()/2; + var _this = this; + + $('#mainPointer').css( + { + top: pointerY, + left: pointerX + }); +} + +pointers.prototype.refreshSecondPointer = function(x, y) +{ + if(!this.mouseInteractions) + { + x *= 7; + y *= 7; + x -= $(window).width() * 3 / 4; + y -= $(window).height() * 2 / 4; + } + + //Si le pointeur quitte la fenêtre en X, on ne le change pas. + if(x < 0 || x > $(window).width()) + { + x = this.secondPointerLastX; + } + //Sinon, on le met à jour. + else + { + this.secondPointerLastX = x; + } + + //Si le pointeur quitte la fenêtre en Y, on ne le change pas. + if(y < 0 || y > $(window).height()) + { + y = this.secondPointerLastY; + } + //Sinon, on le met à jour. + else + { + this.secondPointerLastY = y; + } + + var pointerX = x - $('#secondPointer').width()/2, pointerY = y - $('#secondPointer').height()/2; + var _this = this; + + $('#secondPointer').css( + { + top: pointerY, + left: pointerX + }); +} \ No newline at end of file diff -r 0f31ebcc62b7 -r d2f735d7763f front_processing/doc/tutorial_front_processing.html --- a/front_processing/doc/tutorial_front_processing.html Thu Jun 21 17:51:27 2012 +0200 +++ b/front_processing/doc/tutorial_front_processing.html Fri Jun 29 15:37:26 2012 +0200 @@ -8,7 +8,7 @@ -

TraKERS (Tracking using Kinect and Extracting Robust Skeletons) est une interface basée sur la détection de gestures / positions du squelette envoyé par le SDK Microsoft (1.0) de Kinect. Il est composé d'un Middleware assurant l'interaction avec Kinect, un rendu visuel et l'envoi de notifications sous forme de messages OSC. +

TraKERS (Tracking using Kinect and Extracting Robust Skeletons) est une interface basée sur la détection de gestures / positions du squelette envoyé par le SDK Microsoft (1.5) de Kinect. Il est composé d'un Middleware assurant l'interaction avec Kinect, un rendu visuel et l'envoi de notifications sous forme de messages OSC. Le deuxième module de ce projet est un Front en Processing doté d'un client TUIO et récupérant les messages OSC (sous forme d'objets tels que des Curseurs ou des Strings).

Ce tutoriel concerne ce second module et a pour but d'expliquer le fonctionnement général d'un sketch Processing et la récupération des notifications du Middleware. Il sera agrémenté d'exemples fonctionnels créés pour les besoins de ce tutoriel ou inspirés d'exemples réels disponibles sur le site processing.org.

@@ -251,7 +251,7 @@

Voici quelques liens utiles où se trouvent les dépendances trop lourdes pour être incluses dans cet installeur. Ils vont permettront également d'approfondissant vos connaissances sur Processing ou TUIO. Il vous est possible d'utiliser eclipse pour compiler du Processing.

    -
  • SDK Kinect 1.0 de Microsoft
  • +
  • SDK Kinect 1.5 de Microsoft
  • TUIO
  • Processing.org
  • Autres exemples en Processing
  • diff -r 0f31ebcc62b7 -r d2f735d7763f front_processing/src/Fluid_manipulation/Fluid_manipulation.pde --- a/front_processing/src/Fluid_manipulation/Fluid_manipulation.pde Thu Jun 21 17:51:27 2012 +0200 +++ b/front_processing/src/Fluid_manipulation/Fluid_manipulation.pde Fri Jun 29 15:37:26 2012 +0200 @@ -21,7 +21,7 @@ TuioPoint precPoint; //Port du Client TUIO. -int port = 80; +int port = 8080; //Limites de la zone de recherche pour les mains. float minDistHands = 1; float maxDistHands = 1.5; diff -r 0f31ebcc62b7 -r d2f735d7763f front_processing/src/Interaction_examples/Hand_press/Hand_press.pde --- a/front_processing/src/Interaction_examples/Hand_press/Hand_press.pde Thu Jun 21 17:51:27 2012 +0200 +++ b/front_processing/src/Interaction_examples/Hand_press/Hand_press.pde Fri Jun 29 15:37:26 2012 +0200 @@ -11,7 +11,7 @@ import TUIO.*; TuioProcessing tuioClient; -int port = 80; +int port = 8080; //Taille de la fenêtre int WIDTH = 640, HEIGHT = 480; float minDistHands = 1, maxDistHands = 1.5; diff -r 0f31ebcc62b7 -r d2f735d7763f front_processing/src/Interaction_examples/Hand_signal/Hand_signal.pde --- a/front_processing/src/Interaction_examples/Hand_signal/Hand_signal.pde Thu Jun 21 17:51:27 2012 +0200 +++ b/front_processing/src/Interaction_examples/Hand_signal/Hand_signal.pde Fri Jun 29 15:37:26 2012 +0200 @@ -11,7 +11,7 @@ import TUIO.*; TuioProcessing tuioClient; -int port = 80; +int port = 8080; //Taille de la fenêtre int WIDTH = 640, HEIGHT = 480; diff -r 0f31ebcc62b7 -r d2f735d7763f front_processing/src/Interaction_examples/Hands_1D/Hands_1D.pde --- a/front_processing/src/Interaction_examples/Hands_1D/Hands_1D.pde Thu Jun 21 17:51:27 2012 +0200 +++ b/front_processing/src/Interaction_examples/Hands_1D/Hands_1D.pde Fri Jun 29 15:37:26 2012 +0200 @@ -11,7 +11,7 @@ import TUIO.*; TuioProcessing tuioClient; -int port = 80; +int port = 8080; //Taille de la fenêtre int WIDTH = 640, HEIGHT = 480; diff -r 0f31ebcc62b7 -r d2f735d7763f front_processing/src/Interaction_examples/Hands_2D/Hands_2D.pde --- a/front_processing/src/Interaction_examples/Hands_2D/Hands_2D.pde Thu Jun 21 17:51:27 2012 +0200 +++ b/front_processing/src/Interaction_examples/Hands_2D/Hands_2D.pde Fri Jun 29 15:37:26 2012 +0200 @@ -11,7 +11,7 @@ import TUIO.*; TuioProcessing tuioClient; -int port = 80; +int port = 8080; //Taille de la fenêtre int WIDTH = 640, HEIGHT = 480; diff -r 0f31ebcc62b7 -r d2f735d7763f front_processing/src/Smoke_manipulation/Smoke_manipulation.pde --- a/front_processing/src/Smoke_manipulation/Smoke_manipulation.pde Thu Jun 21 17:51:27 2012 +0200 +++ b/front_processing/src/Smoke_manipulation/Smoke_manipulation.pde Fri Jun 29 15:37:26 2012 +0200 @@ -19,7 +19,7 @@ int HEIGHT = 300; //Port du Client TUIO. -int port = 80; +int port = 8080; //Limites de la zone de recherche pour les mains. float minDistHands = 1; float maxDistHands = 1.5; @@ -132,4 +132,4 @@ { pt1 = _pt1; pt2 = _pt2; -} +} diff -r 0f31ebcc62b7 -r d2f735d7763f front_processing/src/Trakers/Trakers.pde --- a/front_processing/src/Trakers/Trakers.pde Thu Jun 21 17:51:27 2012 +0200 +++ b/front_processing/src/Trakers/Trakers.pde Fri Jun 29 15:37:26 2012 +0200 @@ -16,7 +16,7 @@ int WIDTH = 640, HEIGHT = 480; //Port du Client TUIO -int port = 80; +int port = 8080; float minDistHands = 1; float maxDistHands = 1.5; diff -r 0f31ebcc62b7 -r d2f735d7763f front_processing/src/Trakers_gestures/Trakers_gestures.pde --- a/front_processing/src/Trakers_gestures/Trakers_gestures.pde Thu Jun 21 17:51:27 2012 +0200 +++ b/front_processing/src/Trakers_gestures/Trakers_gestures.pde Fri Jun 29 15:37:26 2012 +0200 @@ -17,7 +17,7 @@ { size (640, 480); showMask(); - tuioClient = new TuioProcessing(this, 80); + tuioClient = new TuioProcessing(this, 8080); textAlign(CENTER); imageMode(CENTER); smooth(); diff -r 0f31ebcc62b7 -r d2f735d7763f middleware/Communication/Communication.csproj --- a/middleware/Communication/Communication.csproj Thu Jun 21 17:51:27 2012 +0200 +++ b/middleware/Communication/Communication.csproj Fri Jun 29 15:37:26 2012 +0200 @@ -53,6 +53,7 @@ + diff -r 0f31ebcc62b7 -r d2f735d7763f middleware/Communication/Server.cs --- a/middleware/Communication/Server.cs Thu Jun 21 17:51:27 2012 +0200 +++ b/middleware/Communication/Server.cs Fri Jun 29 15:37:26 2012 +0200 @@ -33,10 +33,13 @@ private TUIOServer TUIOserver; private WSServer WSserver; - public Server(String host, int port, int _timerElapsing) + /* + * Constructeur. Il prend les paramètres des deux serveurs. + */ + public Server(String tuioHost, int tuioPort, int _tuioTimerElapsing, String wsHost, int wsPort, int _wsTimerElapsing) { - TUIOserver = new TUIOServer(host, 8080, _timerElapsing); - WSserver = new WSServer(host, 8090, _timerElapsing); + TUIOserver = new TUIOServer(wsHost, tuioPort, _tuioTimerElapsing); + WSserver = new WSServer(wsHost, wsPort, _wsTimerElapsing); } /* diff -r 0f31ebcc62b7 -r d2f735d7763f middleware/Communication/WSClient.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/middleware/Communication/WSClient.cs Fri Jun 29 15:37:26 2012 +0200 @@ -0,0 +1,349 @@ +/* +* This file is part of the TraKERS\Middleware package. +* +* (c) IRI +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +/* + * Projet : TraKERS + * Module : MIDDLEWARE + * Sous-Module : Communication + * Classe : WSClient + * + * Auteur : alexandre.bastien@iri.centrepompidou.fr + * + * Fonctionnalités : Reçoit des notifications du Front IDILL. + * Interprète les positions des curseurs dans le temps à partir du top du front. + * + * STATUS : EN DEVELOPPEMENT. + * + */ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Fleck; +using System.Threading; +using System.Timers; +using System.Windows.Media.Media3D; + +namespace Communication +{ + public class WSClient + { + //Server WebSocket. + WebSocketServer server; + List allSockets; + + //Permet de savoir si un curseur pour la main gauche/droite a été créé. + private bool leftHandCursorCreated; + private bool rightHandCursorCreated; + private bool gesturesMessageCreated, modeMessageCreated; + private bool gestureLocked, modLocked; + //Intervalle minimum entre les gestures. + private int timerElapsing; + //Timers. + private System.Timers.Timer _gesturesTimer; + private System.Timers.Timer _userPositionTimer; + //Dernier code envoyé. + private String lastCode; + //Messages envoyés en WS. + private String rightHandMessage, leftHandMessage, gesturesMessage, modeMessage; + //Messages précédents + private String prevRightHandMessage, prevLeftHandMessage, prevGestureMessage, prevModeMessage; + + /* + * Constructeur : On initialise le serveur avec une adresse et un port, au début les curseurs + * ne sont pas créés et on indique au ThreadPool une fonction de callback de manière à vérifier + * s'il reçoit des notifications. + */ + public WSClient(String host, int port, int _timerElapsing) + { + FleckLog.Level = LogLevel.Debug; + allSockets = new List(); + server = new WebSocketServer(port, "ws://" + host + ":" + port); + + //Au départ, aucune main n'est dans le champ de recherche et aucune gesture n'est détectée. + leftHandCursorCreated = false; + rightHandCursorCreated = false; + gesturesMessageCreated = false; + modeMessageCreated = false; + gestureLocked = false; + modLocked = false; + lastCode = ""; + + timerElapsing = 500;// _timerElapsing; + + rightHandMessage = leftHandMessage = gesturesMessage = modeMessage = ""; + + //On démarre le serveur WebSocket. + server.Start(socket => + { + socket.OnOpen = () => + { + Console.WriteLine("Open!"); + allSockets.Add(socket); + }; + socket.OnClose = () => + { + Console.WriteLine("Close!"); + allSockets.Remove(socket); + }; + /*socket.OnMessage = message => + { + Console.WriteLine(message); + allSockets.ToList().ForEach(s => s.Send("Echo: " + message)); + };*/ + }); + + //On initialise le threadPool (appelé toutes les N ms). + ThreadPool.QueueUserWorkItem(ThreadPoolCallback); + + //On instancie le timer à N ms. + _gesturesTimer = new System.Timers.Timer(timerElapsing); + _userPositionTimer = new System.Timers.Timer(timerElapsing/5); + //Dès que le timer est expiré, on appelle _timer_Elapsed. + _gesturesTimer.Elapsed += new ElapsedEventHandler(_gesturesTimer_Elapsed); + _userPositionTimer.Elapsed += new ElapsedEventHandler(_userPositionTimer_Elapsed); + + /*var input = Console.ReadLine(); + while (input != "exit") + { + foreach (var socket in allSockets.ToList()) + { + socket.Send(input); + } + input = Console.ReadLine(); + }*/ + } + + /* + * Méthode appelée à l'expiration du timer pour les gestures et modes. + */ + public void _gesturesTimer_Elapsed(object sender, ElapsedEventArgs e) + { + //On débloque la détection de gesture. + gestureLocked = false; + //On débloque la notification de nouveau mode. + //modLocked = false; + lastCode = ""; + //On arrête le timer. + _gesturesTimer.Stop(); + } + + /* + * Méthode appelée à l'expiration du timer pour les positions d'utilisateur. + */ + public void _userPositionTimer_Elapsed(object sender, ElapsedEventArgs e) + { + //On débloque la détection de gesture. + //gestureLocked = false; + //On débloque la notification de nouveau mode. + modLocked = false; + lastCode = ""; + //On arrête le timer. + _userPositionTimer.Stop(); + } + + /* + * Méthode appelée lors d'une notification de type : main gauche entrée dans le champ. + */ + public void LeftHandTracked(Point3D pt) + { + leftHandMessage = "0-" + pt.X + ";" + pt.Y + ";" + pt.Z; + //Si le curseur de la main gauche n'est pas créé, alors on le crée. + if (!leftHandCursorCreated) + leftHandCursorCreated = true; + } + + /* + * Méthode appelée lors d'une notification de type : main droite entrée dans le champ. + */ + public void RightHandTracked(Point3D pt) + { + rightHandMessage = "1-" + pt.X + ";" + pt.Y + ";" + pt.Z; + //Si le curseur de la main droite n'est pas créé, alors on le crée. + if (!rightHandCursorCreated) + rightHandCursorCreated = true; + } + + /* + * Méthode appelée lors d'une notification de type : main gauche sortie du champ. + */ + public void LeftHandQuit() + { + leftHandMessage = ""; + //Si le curseur de la main gauche existe, alors on le supprime. + if (leftHandCursorCreated) + leftHandCursorCreated = false; + } + + /* + * Méthode appelée lors d'une notification de type : main droite sortie du champ. + */ + public void RightHandQuit() + { + rightHandMessage = ""; + //Si le curseur de la main droite existe, alors on le supprime. + if (rightHandCursorCreated) + rightHandCursorCreated = false; + } + + /* + * Méthode appelée lorsqu'une gesture a été détectée et que l'événement approprié a été lancé. + */ + public void GesturePerformed(String code) + { + //Si le code vient d'être envoyé, on passe. + /*if (lastCode.Equals(code)) + return; + lastCode = code;*/ + //Si une gesture a été effectuée, on bloque un certain temps. + if (!gestureLocked) + { + gestureLocked = true; + + //On crée un message contenant le code à envoyer. + //if (!gesturesMessageCreated) + //{ + gesturesMessageCreated = true; + gesturesMessage = "2-" + code; + + //Console.WriteLine(gesturesMessage); + + foreach (var socket in allSockets.ToList()) + { + socket.Send(gesturesMessage); + } + + //On démarre le timer. + _gesturesTimer.Start(); + + //Console.WriteLine(gestureMessage); + //} + } + } + + /* + * Méthode appelée lorsqu'on doit entrer dans un autre mode. + */ + public void ModeNotification(String code) + { + //Si le code vient d'être envoyé, on passe. + /*if (lastCode.Equals(code)) + return; + lastCode = code;*/ + //Si on a été notifié. + if (!modLocked) + { + modLocked = true; + + //On crée un message contenant le code à envoyer. + //if (!modeMessageCreated) + //{ + modeMessageCreated = true; + modeMessage = "2-" + code; + //On démarre le timer. + + foreach (var socket in allSockets.ToList()) + { + socket.Send(modeMessage); + } + _userPositionTimer.Start(); + + //Console.WriteLine(modeMessage); + //} + } + } + + /* + * Méthode de callback vérifiant toutes les 25 ms les nouvelles notifications. + * Il est à noter que si le temps de rafraîchissement des trop rapide, les messages n'ont pas + * le temps d'être envoyés. + */ + private void ThreadPoolCallback(Object threadContext) + { + while (true) + { + /*//S'il existe un message de gesture. + if (gesturesMessage != null && !gesturesMessage.Equals(""))// && !gesturesMessage.Equals(prevGestureMessage)) + { + //On l'envoie au client (au host et au port spécifiés dans le constructeur). + foreach (var socket in allSockets.ToList()) + { + socket.Send(gesturesMessage); + //prevGestureMessage = gesturesMessage; + } + } + + //S'il existe un message de mode. + if (modeMessage != null && !modeMessage.Equals(""))// && !modeMessage.Equals(prevModeMessage)) + { + //On l'envoie au client (au host et au port spécifiés dans le constructeur). + foreach (var socket in allSockets.ToList()) + { + socket.Send(modeMessage); + //prevModeMessage = modeMessage; + } + }*/ + + //Si la main gauche est détectée. + if (leftHandMessage != null && !leftHandMessage.Equals("") && !leftHandMessage.Equals(prevLeftHandMessage)) + { + //On l'envoie au client (au host et au port spécifiés dans le constructeur). + foreach (var socket in allSockets.ToList()) + { + socket.Send(leftHandMessage); + prevLeftHandMessage = leftHandMessage; + } + } + //Si la main droite est détectée. + if (rightHandMessage != null && !rightHandMessage.Equals("") && !rightHandMessage.Equals(prevRightHandMessage)) + { + //On l'envoie au client (au host et au port spécifiés dans le constructeur). + foreach (var socket in allSockets.ToList()) + { + socket.Send(rightHandMessage); + prevRightHandMessage = rightHandMessage; + } + } + + //On attend 25 ms. + Thread.Sleep(25); + + //Si une gesture a été effectuée et que le délai d'attente est expiré. + if (gesturesMessageCreated && !gestureLocked) + { + //On débloque la détection de gesture et on supprime l'objet envoyant les messages OSC de gesture. + gesturesMessageCreated = false; + gesturesMessage = ""; + } + + //Si un mode a été effectuée et que le délai d'attente est expiré. + if (modeMessageCreated && !modLocked) + { + //On débloque la détection de gesture et on supprime l'objet envoyant les messages OSC de gesture. + modeMessageCreated = false; + modeMessage = ""; + } + } + } + + /* + * Getters et Setters + */ + public void setTimerElapsing(int _timerElapsing) + { + timerElapsing = _timerElapsing; + } + + public int getTimerElapsing() + { + return timerElapsing; + } + } +} diff -r 0f31ebcc62b7 -r d2f735d7763f middleware/Communication/WSServer.cs --- a/middleware/Communication/WSServer.cs Thu Jun 21 17:51:27 2012 +0200 +++ b/middleware/Communication/WSServer.cs Fri Jun 29 15:37:26 2012 +0200 @@ -94,11 +94,6 @@ Console.WriteLine("Close!"); allSockets.Remove(socket); }; - /*socket.OnMessage = message => - { - Console.WriteLine(message); - allSockets.ToList().ForEach(s => s.Send("Echo: " + message)); - };*/ }); //On initialise le threadPool (appelé toutes les N ms). @@ -110,16 +105,6 @@ //Dès que le timer est expiré, on appelle _timer_Elapsed. _gesturesTimer.Elapsed += new ElapsedEventHandler(_gesturesTimer_Elapsed); _userPositionTimer.Elapsed += new ElapsedEventHandler(_userPositionTimer_Elapsed); - - /*var input = Console.ReadLine(); - while (input != "exit") - { - foreach (var socket in allSockets.ToList()) - { - socket.Send(input); - } - input = Console.ReadLine(); - }*/ } /* @@ -141,8 +126,6 @@ */ public void _userPositionTimer_Elapsed(object sender, ElapsedEventArgs e) { - //On débloque la détection de gesture. - //gestureLocked = false; //On débloque la notification de nouveau mode. modLocked = false; lastCode = ""; @@ -199,33 +182,24 @@ */ public void GesturePerformed(String code) { - //Si le code vient d'être envoyé, on passe. - /*if (lastCode.Equals(code)) - return; - lastCode = code;*/ //Si une gesture a été effectuée, on bloque un certain temps. if (!gestureLocked) { gestureLocked = true; //On crée un message contenant le code à envoyer. - //if (!gesturesMessageCreated) - //{ - gesturesMessageCreated = true; - gesturesMessage = "2-" + code; + gesturesMessageCreated = true; + gesturesMessage = "2-" + code; - //Console.WriteLine(gesturesMessage); + //Console.WriteLine(gesturesMessage); - foreach (var socket in allSockets.ToList()) - { - socket.Send(gesturesMessage); - } + foreach (var socket in allSockets.ToList()) + { + socket.Send(gesturesMessage); + } - //On démarre le timer. - _gesturesTimer.Start(); - - //Console.WriteLine(gestureMessage); - //} + //On démarre le timer. + _gesturesTimer.Start(); } } @@ -234,30 +208,21 @@ */ public void ModeNotification(String code) { - //Si le code vient d'être envoyé, on passe. - /*if (lastCode.Equals(code)) - return; - lastCode = code;*/ //Si on a été notifié. if (!modLocked) { modLocked = true; //On crée un message contenant le code à envoyer. - //if (!modeMessageCreated) - //{ - modeMessageCreated = true; - modeMessage = "2-" + code; - //On démarre le timer. + modeMessageCreated = true; + modeMessage = "2-" + code; + //On démarre le timer. - foreach (var socket in allSockets.ToList()) - { - socket.Send(modeMessage); - } - _userPositionTimer.Start(); - - //Console.WriteLine(modeMessage); - //} + foreach (var socket in allSockets.ToList()) + { + socket.Send(modeMessage); + } + _userPositionTimer.Start(); } } @@ -270,28 +235,6 @@ { while (true) { - /*//S'il existe un message de gesture. - if (gesturesMessage != null && !gesturesMessage.Equals(""))// && !gesturesMessage.Equals(prevGestureMessage)) - { - //On l'envoie au client (au host et au port spécifiés dans le constructeur). - foreach (var socket in allSockets.ToList()) - { - socket.Send(gesturesMessage); - //prevGestureMessage = gesturesMessage; - } - } - - //S'il existe un message de mode. - if (modeMessage != null && !modeMessage.Equals(""))// && !modeMessage.Equals(prevModeMessage)) - { - //On l'envoie au client (au host et au port spécifiés dans le constructeur). - foreach (var socket in allSockets.ToList()) - { - socket.Send(modeMessage); - //prevModeMessage = modeMessage; - } - }*/ - //Si la main gauche est détectée. if (leftHandMessage != null && !leftHandMessage.Equals("") && !leftHandMessage.Equals(prevLeftHandMessage)) { diff -r 0f31ebcc62b7 -r d2f735d7763f middleware/Debug/Debug.csproj --- a/middleware/Debug/Debug.csproj Thu Jun 21 17:51:27 2012 +0200 +++ b/middleware/Debug/Debug.csproj Fri Jun 29 15:37:26 2012 +0200 @@ -1,4 +1,4 @@ - + Debug @@ -75,9 +75,6 @@ - - DebugParameters.xaml - DebugWindow.xaml @@ -96,12 +93,6 @@ - - MSBuild:Compile - Designer - - - MSBuild:Compile Designer diff -r 0f31ebcc62b7 -r d2f735d7763f middleware/Debug/DebugParameters.xaml --- a/middleware/Debug/DebugParameters.xaml Thu Jun 21 17:51:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - -