function getBrowser(){if(navigator.userAgent.indexOf("Safari")>0)browser=0;else if(navigator.userAgent.indexOf("Chrome")>0)browser=0;else if(navigator.userAgent.indexOf("MSIE")>0)browser=1;else if(navigator.userAgent.indexOf("Firefox")>0)browser=1}function saveHandArray(){layerSearchResults=document.getElementById("layer_master").innerHTML}
function retrieveHandArray(){document.getElementById("layer_master").innerHTML=layerSearchResults;handArray=[];eval(document.getElementById("script_update_handArray").innerHTML);eval(document.getElementById("script_update_page_links").innerHTML);setTimeout("hideLoadingAnimation();",1E3);startVis(handArray,180)}function loadMeaningsFFIE(a,b,g,c){fadeOutPageLinks();loadXMLData("gestures.php?g="+a+"&depug="+debug,true,loadMeaningsFFIEGestureOnSuccess,c)}
function loadMeaningsFFIEGestureOnSuccess(a,b){document.getElementById("layer_master").innerHTML=a;handArray=[];eval(document.getElementById("script_update_handArray").innerHTML);startVis(hand,180);loadXMLData("meanings.php?gesture="+hand[0][0],true,loadMeaningsOnSuccess,b);document.getElementById("layer_meanings").style.opacity=1;document.getElementById("layer_meanings").style.visibility="visible";document.getElementById("layer_meanings").style.zIndex=100}
function loadPopupLayer(){document.getElementById("layer_popup").style["-webkit-transition-delay"]="200ms, 800ms";document.getElementById("layer_popup").style.opacity=1;document.getElementById("layer_popup").style["z-index"]="100"}
function closePopupLayer(){document.getElementById("layer_popup").style["-webkit-transition-delay"]="500ms, 0ms";document.getElementById("layer_popup").style.opacity=0;setTimeout("document.getElementById('layer_popup').style['z-index'] = '-1'; document.getElementById('layer_popup').innerHTML = '';",600)}var desiredPage=[0,0,0,0,0,0];function setDesiredPage(a,b,g,c,e,h){desiredPage[0]=a;desiredPage[1]=b;desiredPage[2]=g;desiredPage[3]=c;desiredPage[4]=e;desiredPage[5]=h}
function clearDesiredPage(){desiredPage[0]=0;desiredPage[1]=0;desiredPage[2]=0;desiredPage[3]=0;desiredPage[4]=0;desiredPage[5]=0}function loadXMLData(a,b,g){xmlHTTPRequest=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");xmlHTTPRequest.onreadystatechange=function(){xmlHTTPRequest.readyState==4&&xmlHTTPRequest.status==200&&g(xmlHTTPRequest.responseText)};xmlHTTPRequest.open("GET",a,b);xmlHTTPRequest.send()}
function loadXMLDataPOST(a,b,g,c){xmlHTTPRequestPOST=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");xmlHTTPRequestPOST.onreadystatechange=function(){xmlHTTPRequestPOST.readyState==4&&xmlHTTPRequestPOST.status==200&&c(xmlHTTPRequestPOST.responseText)};xmlHTTPRequestPOST.open("POST",a,g);xmlHTTPRequestPOST.setRequestHeader("Content-type","application/x-www-form-urlencoded");xmlHTTPRequestPOST.send(b)}
function initPage(a){gesturePosition[0]=a;if(a==0){document.getElementById("link_page_search").className="link_page";document.getElementById("link_page_latest").className="link_page_selected";document.getElementById("link_page_hottest").className="link_page";document.getElementById("link_page_random").className="link_page";document.getElementById("link_page_create").className="link_page";document.getElementById("link_page_login").className="link_page_login";fadeInPageLinks()}else if(a==1){document.getElementById("link_page_search").className=
"link_page";document.getElementById("link_page_latest").className="link_page";document.getElementById("link_page_hottest").className="link_page_selected";document.getElementById("link_page_random").className="link_page";document.getElementById("link_page_create").className="link_page";document.getElementById("link_page_login").className="link_page_login";fadeInPageLinks()}else if(a==2){document.getElementById("link_page_search").className="link_page";document.getElementById("link_page_latest").className=
"link_page";document.getElementById("link_page_hottest").className="link_page";document.getElementById("link_page_random").className="link_page_selected";document.getElementById("link_page_create").className="link_page";document.getElementById("link_page_login").className="link_page_login";fadeOutPageLinks()}else if(a==3){document.getElementById("link_page_search").className="link_page";document.getElementById("link_page_latest").className="link_page";document.getElementById("link_page_hottest").className=
"link_page";document.getElementById("link_page_random").className="link_page";document.getElementById("link_page_create").className="link_page_selected";document.getElementById("link_page_login").className="link_page_login";fadeOutPageLinks()}else if(a==4){document.getElementById("link_page_search").className="link_page";document.getElementById("link_page_latest").className="link_page";document.getElementById("link_page_hottest").className="link_page";document.getElementById("link_page_random").className=
"link_page";document.getElementById("link_page_create").className="link_page";document.getElementById("link_page_login").className="link_page_login_selected";fadeOutPageLinks();fadeOutMeaningLayer();fadeOutAdvertisingLayer()}else if(a==5){document.getElementById("link_page_search").className="link_page_selected";document.getElementById("link_page_latest").className="link_page";document.getElementById("link_page_hottest").className="link_page";document.getElementById("link_page_random").className=
"link_page";document.getElementById("link_page_create").className="link_page";document.getElementById("link_page_login").className="link_page_login";fadeOutPageLinks();fadeOutMeaningLayer();fadeOutAdvertisingLayer()}}
function updatePageLinks(){document.getElementById("cell_previous_page").innerHTML='<a id="link_footer_previous" onclick="showLoadingAnimation(); loadGestures('+gesturePosition[0]+", "+gesturePosition[2]+')">previous</a>';document.getElementById("cell_next_page").innerHTML='<a id="link_footer_next" onclick="showLoadingAnimation(); loadGestures('+gesturePosition[0]+", "+gesturePosition[1]+')">next</a>';if(totalGestures>12&&(gesturePosition[1]>12||gesturePosition[1]==0)&&gesturePosition[0]<2)document.getElementById("link_footer_previous").style.visibility=
"visible";else document.getElementById("link_footer_previous").style.visibility="hidden";if(gesturePosition[1]>0&&gesturePosition[0]<2)document.getElementById("link_footer_next").style.visibility="visible";else document.getElementById("link_footer_next").style.visibility="hidden"}
function fadeOutPageLinks(){document.getElementById("cell_previous_page").style.opacity=0;document.getElementById("cell_previous_page").style.visibility="hidden";document.getElementById("cell_next_page").style.opacity=0;document.getElementById("cell_next_page").style.visibility="hidden"}
function fadeInPageLinks(){document.getElementById("cell_previous_page").style.opacity=1;document.getElementById("cell_previous_page").style.visibility="visible";document.getElementById("cell_next_page").style.opacity=1;document.getElementById("cell_next_page").style.visibility="visible"}
function disableTextSelection(a){if(typeof a.onselectstart!="undefined")a.onselectstart=function(){return false};else if(typeof a.style.MozUserSelect!="undefined")a.style.MozUserSelect="none";a.style.cursor="default"}function showLoadingAnimation(){document.getElementById("layer_loading").style.opacity=0.5}function hideLoadingAnimation(){document.getElementById("layer_loading").style.opacity=0}
function loadMeanings(a,b,g){setDesiredPage(gesturePosition[0],gesturePosition[1],a,b,g,0);loadXMLData("meanings.php?gesture="+a+"&offset="+b+"&offset_history="+g,false,loadMeaningsOnSuccess)}function loadMeaningsOnSuccess(a){document.getElementById("layer_meanings").innerHTML=a;setTimeout("hideLoadingAnimation();",1E3)}
function fadeInMeaningLayer(){document.getElementById("layer_meanings").style["-webkit-transition-delay"]="200ms, 800ms";document.getElementById("layer_meanings").style.opacity=1;document.getElementById("layer_meanings").style.visibility="visible";document.getElementById("layer_meanings").style["z-index"]="100"}
function fadeOutMeaningLayer(){document.getElementById("layer_meanings").style["-webkit-transition-delay"]="200ms, 0ms";document.getElementById("layer_meanings").style.opacity=0;document.getElementById("layer_meanings").style.visibility="hidden";document.getElementById("layer_meanings").style.zIndex=-1;document.getElementById("layer_meanings").innerHTML=""}function votePositive(a){loadXMLData("submit_vote.php?id="+a+"&d=p",true,votePositiveOnSuccess)}
function votePositiveOnSuccess(a){document.getElementById("meaning_rate_positive_"+a).innerHTML="+"+(parseInt(document.getElementById("meaning_rate_positive_"+a).innerHTML)+1);setTimeout("hideLoadingAnimation();",1E3)}function voteNegative(a){loadXMLData("submit_vote.php?id="+a+"&d=n",true,voteNegativeOnSuccess)}
function voteNegativeOnSuccess(a){document.getElementById("meaning_rate_negative_"+a).innerHTML=parseInt(document.getElementById("meaning_rate_negative_"+a).innerHTML)-1;setTimeout("hideLoadingAnimation();",1E3)}
function loadNewMeaning(a,b,g){saveHandArray();fadeOutPageLinks();fadeOutMeaningLayer();fadeOutAdvertisingLayer();if(username!=null||getCookie("loggedIn")!=null)loadXMLData("new_meaning.php?id="+a,true,loadNewMeaningOnSuccess);else{fadeOutMeaningLayer();fadeOutDefinitionLayer();setDesiredPage(gesturePosition[0],gesturePosition[1],a,b,g,1);loadLogin()}}
function loadNewMeaningOnSuccess(a){document.getElementById("layer_master").innerHTML=a;handArray=[];eval(document.getElementById("script_update_handArray").innerHTML);startVis(hand,400);setTimeout("hideLoadingAnimation()",1E3)}function fadeInDefinitionLayer(){}function fadeOutDefinitionLayer(){document.getElementById("layer_definition").style.opacity=0;document.getElementById("layer_definition").style["z-index"]="-1";document.getElementById("layer_definition").innerHTML=""}
function clearDefinition(){document.getElementById("definition_text").value=""}function clearDefinitionLocation(){document.getElementById("definition_location").value=""}function setCountry(a,b){document.getElementById("definition_location_value").value=a;document.getElementById("definition_location").value=b;document.getElementById("definition_countries").style["z-index"]=-1;document.getElementById("definition_countries").style.opacity=0}
function suggestCountry(){loadXMLData("countries.php?q="+document.getElementById("definition_location").value,false,suggestCountryOnSuccess)}function suggestCountryOnSuccess(a){document.getElementById("definition_countries").style["z-index"]=300;document.getElementById("definition_countries").style.opacity=1;document.getElementById("definition_countries").innerHTML=a}
function submitMeaning(a){if(id_user==-1)id_user=getCookie("loggedInID");loadXMLData("submit_meaning.php?id_user="+id_user+"&id="+a+"&meaning="+document.getElementById("definition_text").value+"&location="+document.getElementById("definition_location_value").value,false,submitMeaningOnSuccess)}function submitMeaningOnSuccess(a){fadeOutDefinitionLayer();setTimeout("loadMeanings("+a+", 0, 0);",500)}
function submitNewMeaning(a){if(document.getElementById("textarea_new_gesture_meaning").value.length>0&&document.getElementById("select_new_gesture_country").value>0){if(id_user==-1)id_user=getCookie("loggedInID");loadXMLData("submit_meaning.php?id_user=0"+id_user+"&id="+a+"&meaning="+document.getElementById("textarea_new_gesture_meaning").value+"&location="+document.getElementById("select_new_gesture_country").value,true,submitNewMeaningOnSuccess)}else document.getElementById("textarea_new_gesture_meaning").value=
"if you don't tell us what it means and where, this gesture will be all alone :-("}
function submitNewMeaningOnSuccess(a){if(a!="error"){document.getElementById("new_gesture_submit_button").innerHTML="sweet";document.getElementById("new_gesture_submit_button").onclick="";document.getElementById("textarea_new_gesture_meaning").disabled="disabled";document.getElementById("select_new_gesture_country").disabled="disabled";document.getElementById("new_gesture_submit_button").innerHTML="sweet";fadeOutNewGestureLayer();loadGestures(0,0);if(browser==0)setTimeout("fadeGestures("+a+")",1E3);
else browser==1&&setTimeout("loadMeaningsFFIE("+a+", 0, 0, 1)",1E3)}else document.getElementById("new_gesture_submit_button").innerHTML="error";setTimeout("hideLoadingAnimation();",1E3)}function switchToLeftHand(){document.getElementById("new_gesture_left_hand_button").className="new_gesture_hand_button_selected";document.getElementById("new_gesture_right_hand_button").className="new_gesture_hand_button"}
function switchToRightHand(){document.getElementById("new_gesture_left_hand_button").className="new_gesture_hand_button";document.getElementById("new_gesture_right_hand_button").className="new_gesture_hand_button_selected"}function clearGesture(){}
function submitGesture(){loadXMLData("submit_gesture.php?angles="+document.getElementById("create_angles").value+"&meaning="+document.getElementById("create_meaning").value+"&location="+document.getElementById("create_location").value,false,submitGestureOnSuccess)}function submitGestureOnSuccess(a){loadGestures(0,0);setTimeout("fadeGestures("+a+")",500)}
function loadGestures(a,b){fadeOutMeaningLayer();fadeOutAdvertisingLayer();fadeOutDefinitionLayer();initPage(a);setDesiredPage(a,b,desiredPage[2],desiredPage[3],desiredPage[4],desiredPage[5]);loadXMLData("gestures.php?s="+a+"&offset="+b+"&depug="+debug,true,loadGesturesOnSuccess)}
function loadGesturesOnSuccess(a){document.getElementById("layer_master").innerHTML=a;handArray=[];eval(document.getElementById("script_update_handArray").innerHTML);eval(document.getElementById("script_update_page_links").innerHTML);updatePageLinks();startVis(handArray,180);setTimeout("hideLoadingAnimation()",1E3)}
function fadeGestures(a){fadeOutPageLinks();fadeOutMeaningLayer();fadeOutAdvertisingLayer();fadeOutDefinitionLayer();fadeOutSearchResultsSubtitle();for(var b=0;b<handArray.length;b++)if(handArray[b][0]!=a)if(document.getElementById(handArray[b][0]).style.opacity==0){document.getElementById(handArray[b][0]).style["-webkit-transition-delay"]="500ms, 0s";document.getElementById(handArray[b][0]).style["-moz-transition-delay"]="500ms, 0s";document.getElementById(handArray[b][0]).style.opacity=1}else{document.getElementById(handArray[b][0]).style["-webkit-transition-delay"]=
"0s, 500ms";document.getElementById(handArray[b][0]).style["-moz-transition-delay"]="0s, 500ms";document.getElementById(handArray[b][0]).style.opacity=0}else if(handArray[b][1]==0){document.getElementById(a).style["-webkit-transition-delay"]="0s, 500ms";document.getElementById(a).style["-moz-transition-delay"]="0s, 500ms";translation=document.getElementById("search_results_subtitle")?"translate("+(0-document.getElementById(a).offsetParent.offsetLeft)+"px,"+(0-document.getElementById("search_results_subtitle").offsetHeight-
document.getElementById(a).offsetParent.offsetTop)+"px)":"translate("+(0-document.getElementById(a).offsetParent.offsetLeft)+"px,"+(0-document.getElementById(a).offsetParent.offsetTop)+"px)";document.getElementById(a).style["-webkit-transform"]=translation;document.getElementById(a).style["-moz-transform"]=translation;handArray[b][1]=1;loadMeanings(a,0,0);fadeInMeaningLayer();fadeInAdvertisingLayer()}else{setDesiredPage(gesturePosition[0],gesturePosition[1],desiredPage[2],desiredPage[3],desiredPage[4],
desiredPage[5]);fadeOutDefinitionLayer();document.getElementById(a).style["-webkit-transition-delay"]="500ms, 200ms";document.getElementById(a).style["-moz-transition-delay"]="500ms, 200ms";document.getElementById(a).style["-webkit-transform"]="translate(0px,0px)";document.getElementById(a).style["-moz-transform"]="translate(0px,0px)";handArray[b][1]=0;fadeOutMeaningLayer();fadeOutAdvertisingLayer();fadeInSearchResultsSubtitle();fadeInPageLinks();setTimeout("hideLoadingAnimation();",1E3)}}
function fadeInAdvertisingLayer(){document.getElementById("layer_advertising").style["-webkit-transition-delay"]="200ms, 800ms";document.getElementById("layer_advertising").style.opacity=1;document.getElementById("layer_meanings").style.visibility="visible";document.getElementById("layer_advertising").style["z-index"]="100";document.getElementById("layer_advertising").innerHTML=""}
function fadeOutAdvertisingLayer(){document.getElementById("layer_advertising").style["-webkit-transition-delay"]="200ms, 0ms";document.getElementById("layer_advertising").style.opacity=0;document.getElementById("layer_meanings").style.visibility="hidden";document.getElementById("layer_advertising").style["z-index"]="-1";document.getElementById("layer_advertising").innerHTML=""}
function loadNewGesture(){fadeOutPageLinks();fadeOutMeaningLayer();fadeOutAdvertisingLayer();fadeOutDefinitionLayer();if(username!=null||getCookie("loggedIn")!=null){initPage(3);loadXMLData("new_gesture.php",true,loadNewGestureOnSuccess)}else{setDesiredPage(3,0,0,0,0,0);loadLogin()}}function loadNewGestureOnSuccess(a){document.getElementById("layer_master").innerHTML=a;startMove();setTimeout("hideLoadingAnimation()",1E3)}
function loadLogin(){initPage(4);loadXMLData("signup.php",true,loadSignupOnSuccess)}function loadSignupOnSuccess(a){document.getElementById("layer_master").innerHTML=a;showRecaptcha();setTimeout("hideLoadingAnimation();",1E3)}
function submitNewGesture(){if(document.getElementById("textarea_new_gesture_meaning").value.length>0&&document.getElementById("select_new_gesture_country").value>0){if(id_user==-1)id_user=getCookie("loggedInID");loadXMLData("submit_gesture.php?id_user=0"+id_user+"&angles="+document.getElementById("input_new_gesture_angles").value+"&meaning="+document.getElementById("textarea_new_gesture_meaning").value+"&country="+document.getElementById("select_new_gesture_country").value,true,submitNewGestureOnSuccess)}else document.getElementById("textarea_new_gesture_meaning").value=
"if you don't tell us what it means and where, this gesture will be all alone :-("}
function submitNewGestureOnSuccess(a){if(a!="error"){document.getElementById("new_gesture_submit_button").innerHTML="sweet";document.getElementById("new_gesture_submit_button").onclick="";document.getElementById("canvas_new_gesture").disabled="disabled";document.getElementById("textarea_new_gesture_meaning").disabled="disabled";document.getElementById("select_new_gesture_country").disabled="disabled";document.getElementById("new_gesture_submit_button").innerHTML="sweet";loadGestures(0,0);fadeOutNewGestureLayer();
if(browser==0)setTimeout("fadeGestures("+a+")",1E3);else browser==1&&setTimeout("loadMeaningsFFIE("+a+", 0, 0, 1)",1E3)}else document.getElementById("new_gesture_submit_button").innerHTML="error";setTimeout("hideLoadingAnimation();",1E3)}function clearInput(a,b){document.getElementById(a).value="";updateCharactersRemaining(a,b)}
function updateCharactersRemaining(a,b){if(document.getElementById(a).value.length>=b){document.getElementById(a).value=document.getElementById(a).value.substring(0,b);document.getElementById(a+"_chars_remaining").innerHTML="0"}else document.getElementById(a+"_chars_remaining").innerHTML=b-document.getElementById(a).value.length}
function submitLogin(){if(document.getElementById("login_email").value.indexOf("@")>0&&document.getElementById("login_email").value.indexOf(".")>0)if(document.getElementById("login_password").value.length>0)loadXMLDataPOST("submit_login.php","email="+document.getElementById("login_email").value+"&password="+SHA1(document.getElementById("login_password").value),true,submitLoginOnSuccess);else{document.getElementById("login_email").value="you've got to put in your password, too";clearInput("login_password",
20)}else{document.getElementById("login_email").value="doesn't look like a real email to me, pardner";clearInput("login_password",20)}}function submitLogout(){id_user=0;username=null;deleteCookie("loggedIn");deleteCookie("loggedInID");fadeOutDefinitionLayer();document.getElementById("layer_header_logged_in").innerHTML="<span id='link_page_login' class='link_page_login'>come back soon!</span>";gesturePosition[0]==3&&loadGestures(0,0);setTimeout("submitLogoutTimeout()",2E3)}
function submitLogoutTimeout(){document.getElementById("layer_header_logged_in").innerHTML="<span id='link_page_login' class='link_page_login' onclick='loadLogin()'>log in</span>"}
function submitLoginOnSuccess(a){if(a.indexOf(",")>0){id_user=a.substring(0,a.indexOf(","));username=a.substring(a.indexOf(",")+1,a.length-1);document.getElementById("login_login_button").innerHTML="hi, "+username;document.getElementById("login_login_button").onclick="";document.getElementById("layer_header_logged_in").innerHTML="hi, "+username+" -<span id='link_page_login' class='link_page_login' onclick='submitLogout()'>logout</span>";if(browser==0)if(desiredPage[0]<3){loadGestures(desiredPage[0],
desiredPage[1]);if(desiredPage[2]>0){setTimeout("fadeGestures("+desiredPage[2]+");",500);desiredPage[5]>0&&setTimeout("loadNewMeaning("+desiredPage[2]+");",1E3)}}else desiredPage[0]==3&&loadNewGesture();else if(browser==1)if(desiredPage[0]<3){loadGestures(desiredPage[0],desiredPage[1]);if(desiredPage[2]>0){setTimeout("loadMeaningsFFIE("+desiredPage[2]+");",500);desiredPage[5]>0&&setTimeout("loadNewMeaning("+desiredPage[2]+");",1E3)}}else desiredPage[0]==3&&loadNewGesture();setTimeout("hideLoadingAnimation();",
1E3)}else{document.getElementById("login_login_button").innerHTML="error";setTimeout("document.getElementById('login_login_button').innerHTML = 'log me in'; hideLoadingAnimation();",2E3)}}function clearSignupPassword(){document.getElementById("signup_password").value="";updateSignupPasswordCharactersRemaining()}function clearSignupVerifyPassword(){document.getElementById("signup_verify_password").value="";updateSignupVerifyPasswordCharactersRemaining()}
function updateSignupPasswordCharactersRemaining(){if(document.getElementById("signup_password").value.length>=20){document.getElementById("signup_password").value=document.getElementById("signup_password").value.substring(0,20);document.getElementById("signup_password_chars_remaining").innerHTML="0"}else{document.getElementById("signup_password_chars_remaining").innerHTML=20-document.getElementById("signup_password").value.length;if(document.getElementById("signup_verify_password").value.length>
0&&document.getElementById("signup_verify_password").value==document.getElementById("signup_password").value)document.getElementById("signup_verify_password").style.background="lightgreen";else document.getElementById("signup_verify_password").style.background="pink"}}
function updateSignupVerifyPasswordCharactersRemaining(){if(document.getElementById("signup_verify_password").value.length>=20){document.getElementById("signup_verify_password").value=document.getElementById("signup_verify_password").value.substring(0,20);document.getElementById("signup_verify_password_chars_remaining").innerHTML="0"}else{document.getElementById("signup_verify_password_chars_remaining").innerHTML=20-document.getElementById("signup_verify_password").value.length;if(document.getElementById("signup_verify_password").value.length>
0&&document.getElementById("signup_password").value==document.getElementById("signup_verify_password").value)document.getElementById("signup_verify_password").style.background="lightgreen";else document.getElementById("signup_verify_password").style.background="pink"}}
function submitSignup(){if(document.getElementById("signup_email").value.indexOf("@")>0&&document.getElementById("signup_email").value.indexOf(".")>0&&document.getElementById("signup_password").value==document.getElementById("signup_verify_password").value){xmlHTTPRequest=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");xmlHTTPRequest.onreadystatechange=function(){if(xmlHTTPRequest.readyState==4&&xmlHTTPRequest.status==200){document.getElementById("signup_submit_button").innerHTML=
xmlHTTPRequest.responseText;document.getElementById("signup_email").disabled="disabled";document.getElementById("signup_name").disabled="disabled";document.getElementById("signup_username").disabled="disabled";document.getElementById("signup_password").disabled="disabled";document.getElementById("signup_verify_password").disabled="disabled";document.getElementById("signup_country").disabled="disabled";document.getElementById("signup_email_digest").disabled="disabled";document.getElementById("signup_submit_button").onclick=
""}};xmlHTTPRequest.open("GET","submit_user.php?email="+document.getElementById("signup_email").value+"&name="+document.getElementById("signup_name").value+"&username="+document.getElementById("signup_username").value+"&password="+SHA1(document.getElementById("signup_password").value)+"&country="+document.getElementById("signup_country").value+"&digest="+document.getElementById("signup_email_digest").value+"&challenge="+Recaptcha.get_challenge()+"&response="+Recaptcha.get_response(),true);Recaptcha.destroy();
document.getElementById("cell_captcha_heading").innerHTML="&nbsp;";xmlHTTPRequest.send()}else{document.getElementById("signup_email").value="doesn't look like a real email to me, pardner";clearSignupPassword();clearSignupVerifyPassword()}}function showRecaptcha(){Recaptcha.create("6Le6OL0SAAAAAB6Ymuu-00yYlFxzKOBwCMzpjwa7","cell_captcha",{theme:"clean"})}function loadSearch(){setDesiredPage(5,0,0,0,0,0);initPage(5);loadXMLData("search.php",true,loadSearchOnSuccess)}
function loadSearchOnSuccess(a){document.getElementById("layer_master").innerHTML=a;setTimeout("hideLoadingAnimation();",1E3);startMove()}function submitSearch(){loadXMLData("gestures.php?s=3&angles="+document.getElementById("input_new_gesture_angles").value,true,submitSearchOnSuccess)}
function submitSearchOnSuccess(a){layerSearchResults=a;document.getElementById("layer_master").innerHTML=a;handArray=[];eval(document.getElementById("script_update_handArray").innerHTML);eval(document.getElementById("script_update_page_links").innerHTML);updatePageLinks();setTimeout("hideLoadingAnimation();",1E3);startVis(handArray,180)}
function fadeInSearchResultsSubtitle(){if(document.getElementById("search_results_subtitle")){document.getElementById("search_results_subtitle").style["-webkit-transition-delay"]="500ms, 500ms";document.getElementById("search_results_subtitle").style.opacity=1}}
function fadeOutSearchResultsSubtitle(){if(document.getElementById("search_results_subtitle")){document.getElementById("search_results_subtitle").style["-webkit-transition-delay"]="500ms, 0ms";document.getElementById("search_results_subtitle").style.opacity=0}}
function fadeInGesturesLayer(){document.getElementById("layer_gestures").style["-webkit-transition-delay"]="200ms, 800ms";document.getElementById("layer_gestures").style.opacity=1;document.getElementById("layer_gestures").style.visibility="visible";document.getElementById("layer_gestures").style["z-index"]="100";document.getElementById("layer_gestures").innerHTML=""}
function fadeOutGesturesLayer(){document.getElementById("layer_gestures").style["-webkit-transition-delay"]="200ms, 0ms";document.getElementById("layer_gestures").style.opacity=0;document.getElementById("layer_gestures").style.visibility="hidden";document.getElementById("layer_gestures").style["z-index"]="-1";document.getElementById("layer_gestures").innerHTML=""}
function fadeInNewGestureLayer(){document.getElementById("layer_new_gesture").style["-webkit-transition-delay"]="200ms, 800ms";document.getElementById("layer_new_gesture").style.opacity=1;document.getElementById("layer_new_gesture").style.visibility="visible";document.getElementById("layer_new_gesture").style["z-index"]="100";document.getElementById("layer_new_gesture").innerHTML=""}
function fadeOutNewGestureLayer(){document.getElementById("layer_new_gesture").style["-webkit-transition-delay"]="200ms, 0ms";document.getElementById("layer_new_gesture").style.opacity=0;document.getElementById("layer_new_gesture").style.visibility="hidden";document.getElementById("layer_new_gesture").style["z-index"]="-1";document.getElementById("layer_new_gesture").innerHTML=""}
function fadeInSignupLayer(){document.getElementById("layer_signup").style["-webkit-transition-delay"]="200ms, 800ms";document.getElementById("layer_signup").style.opacity=1;document.getElementById("layer_signup").style.visibility="visible";document.getElementById("layer_signup").style["z-index"]="100";document.getElementById("layer_signup").innerHTML=""}
function fadeOutSignupLayer(){document.getElementById("layer_signup").style["-webkit-transition-delay"]="200ms, 0ms";document.getElementById("layer_signup").style.opacity=0;document.getElementById("layer_signup").style.visibility="hidden";document.getElementById("layer_signup").style["z-index"]="-1";document.getElementById("layer_signup").innerHTML=""}
function getCookie(a){if(document.cookie.length>0){startPos=document.cookie.indexOf(a+"=");if(startPos!=-1){startPos+=a.length+1;endPos=document.cookie.indexOf(";",startPos);if(endPos==-1)endPos=document.cookie.length;return unescape(document.cookie.substring(startPos,endPos))}else return null}else return null}function deleteCookie(a){var b=new Date;b.setTime(b.getTime()-1);document.cookie=a+("=; expires="+b.toGMTString())}
function SHA1(a){function b(u,w){return u<<w|u>>>32-w}function g(u){var w="",y,x;for(y=7;y>=0;y--){x=u>>>y*4&15;w+=x.toString(16)}return w}var c,e,h=Array(80),i=1732584193,k=4023233417,l=2562383102,n=271733878,t=3285377520,m,o,s,v,q;a=function(u){u=u.replace(/\r\n/g,"\n");for(var w="",y=0;y<u.length;y++){var x=u.charCodeAt(y);if(x<128)w+=String.fromCharCode(x);else{if(x>127&&x<2048)w+=String.fromCharCode(x>>6|192);else{w+=String.fromCharCode(x>>12|224);w+=String.fromCharCode(x>>6&63|128)}w+=String.fromCharCode(x&
63|128)}}return w}(a);m=a.length;var r=[];for(c=0;c<m-3;c+=4){e=a.charCodeAt(c)<<24|a.charCodeAt(c+1)<<16|a.charCodeAt(c+2)<<8|a.charCodeAt(c+3);r.push(e)}switch(m%4){case 0:c=2147483648;break;case 1:c=a.charCodeAt(m-1)<<24|8388608;break;case 2:c=a.charCodeAt(m-2)<<24|a.charCodeAt(m-1)<<16|32768;break;case 3:c=a.charCodeAt(m-3)<<24|a.charCodeAt(m-2)<<16|a.charCodeAt(m-1)<<8|128}for(r.push(c);r.length%16!=14;)r.push(0);r.push(m>>>29);r.push(m<<3&4294967295);for(a=0;a<r.length;a+=16){for(c=0;c<16;c++)h[c]=
r[a+c];for(c=16;c<=79;c++)h[c]=b(h[c-3]^h[c-8]^h[c-14]^h[c-16],1);e=i;m=k;o=l;s=n;v=t;for(c=0;c<=19;c++){q=b(e,5)+(m&o|~m&s)+v+h[c]+1518500249&4294967295;v=s;s=o;o=b(m,30);m=e;e=q}for(c=20;c<=39;c++){q=b(e,5)+(m^o^s)+v+h[c]+1859775393&4294967295;v=s;s=o;o=b(m,30);m=e;e=q}for(c=40;c<=59;c++){q=b(e,5)+(m&o|m&s|o&s)+v+h[c]+2400959708&4294967295;v=s;s=o;o=b(m,30);m=e;e=q}for(c=60;c<=79;c++){q=b(e,5)+(m^o^s)+v+h[c]+3395469782&4294967295;v=s;s=o;o=b(m,30);m=e;e=q}i=i+e&4294967295;k=k+m&4294967295;l=l+o&
4294967295;n=n+s&4294967295;t=t+v&4294967295}q=g(i)+g(k)+g(l)+g(n)+g(t);return q.toLowerCase()}function setAngles(){return[0*Math.PI/180,-30*Math.PI/180,10*Math.PI/180,10*Math.PI/180].concat([0*Math.PI/180,0*Math.PI/180,10*Math.PI/180,10*Math.PI/180],[0*Math.PI/180,0*Math.PI/180,10*Math.PI/180,10*Math.PI/180],[0*Math.PI/180,0*Math.PI/180,10*Math.PI/180,10*Math.PI/180],[0*Math.PI/180,0*Math.PI/180,10*Math.PI/180,10*Math.PI/180],[0,0,Math.PI/2])}
function getAnglesDeg(a,b){for(var g=[],c=0;c<a.length;++c)for(var e=0;e<a[c].jointAngles.length;++e)g.push(Math.round(a[c].jointAngles[e]*180/Math.PI));for(c=0;c<b.length;++c)g.push(Math.round(b[c]*180/Math.PI));g.push(a[0].isLeft);return g}function getAnglesRad(a,b){for(var g=[],c=0;c<a.length;++c)for(var e=0;e<a[c].jointAngles.length;++e)g.push(a[c].jointAngles[e]);for(c=0;c<b.length;++c)g.push(b[c]);return g}
function startMove(){var a=document.getElementById("canvas_new_gesture").getContext("2d");window.Event&&document.captureEvents&&document.captureEvents(Event.MOUSEMOVE);var b=new Vector(380,380,0);guide_coords=createCoords(b,15);var g=-Math.PI/10,c=Math.PI/3,e=[0,g,c],h=new Vector(185,185,0),i=Hand(h,30,1,false);applyRotToAllFingers(i,h,e);var k=rotateCoords(guide_coords,e),l=createPalm(i,h,e);redrawAllMove(a,h,k,i,l,e);var n=false,t=false,m=false,o=false,s=null,v=null,q=null;document.getElementById("new_gesture_left_hand_button").onclick=
function(){document.getElementById("new_gesture_left_hand_button").className="new_gesture_hand_button_selected";document.getElementById("new_gesture_right_hand_button").className="new_gesture_hand_button";e=[e[0],-e[1],e[2]];i=switchHands(i,e,h,30,1,1);k=rotateHand([0,0],guide_coords,i,h,e,t,m);l=createPalm(i,h,e);redrawAllMove(a,h,k,i,l,e)};document.getElementById("new_gesture_right_hand_button").onclick=function(){document.getElementById("new_gesture_left_hand_button").className="new_gesture_hand_button";
document.getElementById("new_gesture_right_hand_button").className="new_gesture_hand_button_selected";e=[e[0],-e[1],e[2]];i=switchHands(i,e,h,30,1,0);k=rotateHand([0,0],guide_coords,i,h,e,t,m);l=createPalm(i,h,e);redrawAllMove(a,h,k,i,l,e)};document.getElementById("new_gesture_reset_button").onclick=function(){for(var r=0;r<i.length;++r)i[r].reset();applyRotToAllFingers(i,h,e);e=[0,g,c];k=rotateHand([0,0],guide_coords,i,h,e,t,m);l=createPalm(i,h,e);redrawAllMove(a,h,k,i,l,e)};document.onmousedown=
function(r){q=getMouseCoords(r);if(q!=null)if(q[0]>370&&q[1]<400&&q[1]>370&&q[1]<400)n=true;else if(q[0]>0&&q[0]<370&&q[1]>370&&q[1]<400)t=true;else if(q[0]>370&&q[0]<400&&q[1]>0&&q[1]<370)m=true;else for(r=0;r<i.length;++r)for(var u=0;u<i[r].visPoints.length;++u)if(i[r].visPoints[u].withinRadiusAroundPoint(10,q)){o=true;s=u;v=i[r]}};document.onmousemove=function(r){r=getMouseCoords(r);if(r!=null){if(q!=null)var u=[r[0]-q[0],r[1]-q[1]];if(o){moveFinger(a,q,r,v,s,h,e,k);l=createPalm(i,h,e);redrawAllMove(a,
h,k,i,l,e)}else if(t||m){k=rotateHand(u,guide_coords,i,h,e,t,m);l=createPalm(i,h,e);redrawAllMove(a,h,k,i,l,e)}q=r}};document.onmouseup=function(r){q=getMouseCoords(r);if(q!=null){if(n){e=[0,g,c];k=rotateHand([0,0],guide_coords,i,h,e,t,m);l=createPalm(i,h,e);redrawAllMove(a,h,k,i,l,e);n=false}o=m=t=false;v=s=null;if(document.getElementById("input_new_gesture_angles"))document.getElementById("input_new_gesture_angles").value=getAnglesDeg(i,e)}}}
function startVis(a,b){for(iterator=0;iterator<a.length;iterator++){var g=document.getElementById("hand_"+a[iterator][0]).getContext("2d"),c=[a[iterator][2]*Math.PI/180,a[iterator][3]*Math.PI/180,a[iterator][4]*Math.PI/180,a[iterator][5]*Math.PI/180],e=[a[iterator][6]*Math.PI/180,a[iterator][7]*Math.PI/180,a[iterator][8]*Math.PI/180,a[iterator][9]*Math.PI/180],h=[a[iterator][10]*Math.PI/180,a[iterator][11]*Math.PI/180,a[iterator][12]*Math.PI/180,a[iterator][13]*Math.PI/180],i=[a[iterator][14]*Math.PI/
180,a[iterator][15]*Math.PI/180,a[iterator][16]*Math.PI/180,a[iterator][17]*Math.PI/180],k=[a[iterator][18]*Math.PI/180,a[iterator][19]*Math.PI/180,a[iterator][20]*Math.PI/180,a[iterator][21]*Math.PI/180],l=[a[iterator][22]*Math.PI/180,a[iterator][23]*Math.PI/180,a[iterator][24]*Math.PI/180],n=a[iterator][25],t=b/400,m=new Vector(b/2,b/2,0);g.fillStyle="rgb(255,255,255)";g.beginPath();g.arc(m.v[0],m.v[1],b/2-5,0,Math.PI*2,0);g.fill();var o=Hand(m,30,t,n);c=c.concat(e,h,i,k,l);applyAngles(c,o,m,n);
applyRotToAllFingers(o,m,c.slice(-3));n=createPalm(o,m,c.slice(-3));maxY=maxX=0;minY=minX=1E3;for(f=centerY=centerX=0;f<o.length;f++)for(j=0;j<o[f].visPoints.length;j++){if(o[f].visPoints[j].v[0]>maxX)maxX=o[f].visPoints[j].v[0];if(o[f].visPoints[j].v[0]<minX)minX=o[f].visPoints[j].v[0];if(o[f].visPoints[j].v[1]>maxY)maxY=o[f].visPoints[j].v[1];if(o[f].visPoints[j].v[1]<minY)minY=o[f].visPoints[j].v[1]}for(p=0;p<n.length;p++){if(n[p].v[0]>maxX)maxX=n[p].v[0];if(n[p].v[0]<minX)minX=n[p].v[0];if(n[p].v[1]>
maxY)maxY=n[p].v[1];if(n[p].v[1]<minY)minY=n[p].v[1]}centerX=b/2-(maxX+minX)/2;centerY=b/2-(maxY+minY)/2;for(f=0;f<o.length;f++)for(j=0;j<o[f].visPoints.length;j++){o[f].visPoints[j].v[0]+=centerX;o[f].visPoints[j].v[1]+=centerY}for(p=0;p<n.length;p++){n[p].v[0]+=centerX;n[p].v[1]+=centerY}redrawAllVis(g,m,o,n,c.slice(-3),t)}}function applyAngles(a,b){for(var g=0;g<b.length;++g){b[g].jointAngles=a.slice(g*4,(g+1)*4);b[g].recalc()}}
function Hand(a,b,g,c){if(c){var e=new Vector(a.v[0]-b*g,a.v[1],-125*g),h=new Vector(a.v[0]-b*g,a.v[1],0),i=new Vector(a.v[0],a.v[1],0),k=new Vector(a.v[0]+b*g,a.v[1],-10*g);a=new Vector(a.v[0]+2*b*g,a.v[1],-20*g)}else{e=new Vector(a.v[0]+b*g,a.v[1],-125*g);h=new Vector(a.v[0]+b*g,a.v[1],0);i=new Vector(a.v[0],a.v[1],0);k=new Vector(a.v[0]-b*g,a.v[1],-10*g);a=new Vector(a.v[0]-2*b*g,a.v[1],-20*g)}var l=[0,73*g,46*g,37*g],n=[0,78*g,52*g,37*g],t=[0,75*g,51*g,37*g];b=[0,60*g,37*g,35*g];g=new Finger(e,
6,4,[0,80*g,53*g,46*g],"thumb",c);h=new Finger(h,6,4,l,"index",c);i=new Finger(i,6,4,n,"middle",c);k=new Finger(k,6,4,t,"ring",c);c=new Finger(a,6,4,b,"pinky",c);return[g,h,i,k,c]}function switchHands(a,b,g,c,e,h){if(h==a[0].isLeft)return a;else{a=getAnglesRad(a,b);c=Hand(g,c,e,h);applyAngles(a,c,h);applyRotToAllFingers(c,g,b);return c}}
function buildFingerZ(a,b,g){for(var c=Array(a.length),e=[],h=0;h<a.length;++h){c[h]=Array(a[h].numPhalanges);for(var i=0;i<a[h].numPhalanges;++i){c[h][i]=a[h].visPoints[i].v[2]+a[h].visPoints[i+1].v[2];c[h][i]/=2;for(var k=true,l=0;l<e.length;++l)if(e[l][0]==c[h][i]){e[l][1].push([h,i]);k=false}if(k){matchArray=[];matchArray.push([h,i]);e.push([c[h][i],matchArray])}}}a=true;for(l=0;l<e.length;++l)if(e[l][0]==b){e[l][1].push([0,"p"]);a=false}if(a){matchArray=[];matchArray.push([0,"p"]);e.push([b,
matchArray])}b=true;for(l=0;l<e.length;++l)if(e[l][0]==g){e[l][1].push([0,"t"]);b=false}if(b){matchArray=[];matchArray.push([0,"t"]);e.push([g,matchArray])}return[c,e]}function calcPalmAvgZ(a){for(var b=0,g=3;g<a.length;++g)b+=a[g].v[2];b/=a.length;return b}function calcThumbAvgZ(a){for(var b=0,g=0;g<=3;++g)b+=a[g].v[2];b/=a.length;return b}
function getDrawingOrder(a){var b=a[0];a=a[1];for(var g=[],c=1E5,e=-1E5;g.length<b.length*b[0].length+2;){for(var h=0;h<a.length;++h){var i=parseFloat(a[h][0]);if(i<c&&i>e){c=i;loc=h}}for(e=0;e<a[loc][1].length;++e)g.push(a[loc][1][e]);e=c;c=1E5}return g}
function redrawAllMove(a,b,g,c,e){a.clearRect(0,0,400,400);b=calcPalmAvgZ(e);var h=calcThumbAvgZ(e),i=buildFingerZ(c,b,h);b=getDrawingOrder(i,b,h);for(d=0;d<b.length;++d){i=b[d];if(i[1]=="p")drawPalm(a,e,1);else if(i[1]=="t")drawThumb(a,e,1);else{h=i[0];i=i[1];if(i!=0){drawPhalanx(a,c[h],i,1,1);drawFingerPoint(a,c[h],i)}}}drawCoords(a,g)}
function redrawAllVis(a,b,g,c,e,h){b=calcPalmAvgZ(c);e=calcThumbAvgZ(c);var i=buildFingerZ(g,b,e);b=getDrawingOrder(i,b,e);for(d=0;d<b.length;++d){i=b[d];if(i[1]=="p")drawPalm(a,c,h);else if(i[1]=="t")drawThumb(a,c,h);else{e=i[0];i=i[1];i!=0&&drawPhalanx(a,g[e],i,h,0)}}}
function createPalm(a,b,g){var c=a[0].points3D,e=a[1].points3D,h=a[4].points3D;a=new Vector(e[0].v[0],e[0].v[1],e[0].v[2]);var i=new Vector(h[0].v[0],h[0].v[1],h[0].v[2]);h=new Vector(h[0].v[0],c[0].v[1],Math.min(c[0].v[2],c[0].v[2]));var k=new Vector(c[0].v[0],c[0].v[1],c[0].v[2]);e=new Vector(e[0].v[0],e[0].v[1],(e[0].v[2]+c[0].v[2])/2);c=[e,c[2],k,e,a,i,h,k];e=Array(c.length);for(a=0;a<c.length;++a){i=RotVectorAboutOrigin(c[a],b,g,true);e[a]=new Vector(i[0],i[1],i[2])}return e}
function drawPalm(a,b,g){a.lineWidth=34*g;a.lineCap="round";a.lineJoin="round";a.strokeStyle="rgba(0,0,0,0.3)";a.beginPath();a.moveTo(b[3].v[0],b[3].v[1]);for(var c=3;c<b.length;++c)a.lineTo(b[c].v[0],b[c].v[1]);a.stroke();a.lineWidth=31*g;a.strokeStyle="rgb(255,203,162)";a.fillStyle="rgb(255,203,162)";a.beginPath();a.moveTo(b[b.length-1].v[0],b[b.length-1].v[1]);for(c=3;c<b.length;++c)a.lineTo(b[c].v[0],b[c].v[1]);a.stroke();a.fill()}
function drawThumb(a,b,g){a.lineWidth=34*g;a.lineCap="round";a.lineJoin="round";a.strokeStyle="rgba(0,0,0,0.3)";a.beginPath();a.moveTo(b[0].v[0],b[0].v[1]);for(var c=0;c<3;++c)a.lineTo(b[c].v[0],b[c].v[1]);a.stroke();a.lineWidth=31*g;a.strokeStyle="rgb(255,203,162)";a.fillStyle="rgb(255,203,162)";a.beginPath();a.moveTo(b[b.length-1].v[0],b[b.length-1].v[1]);for(c=0;c<=3;++c)a.lineTo(b[c].v[0],b[c].v[1]);a.stroke();a.fill()}
function drawPhalanx(a,b,g,c,e){var h=g==1?b.visPoints[0]:b.visPoints[g],i=b.visPoints[g+1];a.lineWidth=b.fingerType=="thumb"?c*(34-1.5*g):c*(27-1.5*g);a.strokeStyle="rgba(0,0,0,0.3)";a.lineJoin="round";a.lineCap="round";a.beginPath();a.moveTo(h.v[0],h.v[1]-2);a.lineTo(i.v[0]+1,i.v[1]+1);a.stroke();a.lineWidth=b.fingerType=="thumb"?c*(31-1.5*g):c*(24-1.5*g);a.strokeStyle="rgb(255,203,162)";a.lineJoin="round";a.lineCap="round";a.beginPath();a.moveTo(h.v[0],h.v[1]);a.lineTo(i.v[0]+1,i.v[1]+1);a.stroke();
e==1&&drawFingerPoint(a,b,g-1)}function drawFingerPoint(a,b,g){b=b.visPoints[g+1];a.fillStyle=["rgb(200, 200, 0)","rgb(0,0,200)","rgb(0,200,0)","rgb(200,0,0)"][g];a.beginPath();a.arc(b.v[0],b.v[1],4,0,Math.PI*2,0);a.fill()}
function moveFinger(a,b,g,c,e,h,i,k){a=c.visPoints[e-1].v;b=[b[0]-a[0],b[1]-a[1]];a=[g[0]-a[0],g[1]-a[1]];g=b[0]*a[1]-b[1]*a[0];b=Math.acos((b[0]*a[0]+b[1]*a[1])/(Math.sqrt(b[0]*b[0]+b[1]*b[1])*Math.sqrt(a[0]*a[0]+a[1]*a[1])));a=[k[1].v[0]-k[0].v[0],k[1].v[1]-k[0].v[1],k[1].v[2]-k[0].v[2]];var l=[k[2].v[0]-k[0].v[0],k[2].v[1]-k[0].v[1],k[2].v[2]-k[0].v[2]],n=[k[3].v[0]-k[0].v[0],k[3].v[1]-k[0].v[1],k[3].v[2]-k[0].v[2]];k=a[0]*l[1]-a[1]*l[0];l=l[0]*n[1]-l[1]*n[0];a=n[0]*a[1]-n[1]*a[0];k=c.fingerType==
"thumb"?e==1?c.isLeft?l:-l:c.isLeft?-k:k:e==1?c.isLeft?-l*a:l*a:l;a=0;if(b)if(g>0)a=k>0?-b:b;else if(g<0)a=k>0?b:-b;c.jointAngles[e-1]+=a;c.recalc();for(g=0;g<c.points3D.length;++g){e=RotVectorAboutOrigin(c.points3D[g],h,i,true);c.visPoints[g]=new Vector(e[0],e[1],e[2])}h=c.visPoints[1].v;i=c.visPoints[2].v;e=[i[0]-h[0],i[1]-h[1],i[2]-h[2]];c.visPoints[1]=new Vector(h[0]+e[0]/3,h[1]+e[1]/3,h[2]+e[2]/3)}
function rotateHand(a,b,g,c,e,h,i){var k=Math.PI/30;if(h){if(a[0]<-1)e[1]-=k;if(a[0]>1)e[1]+=k}if(i){if(a[1]>1)e[2]-=k;if(a[1]<-1)e[2]+=k}a=rotateCoords(b,e);applyRotToAllFingers(g,c,e);return a}
function applyRotToAllFingers(a,b,g){for(var c=0;c<a.length;++c){for(var e=a[c],h=0;h<e.points3D.length;++h){var i=RotVectorAboutOrigin(e.points3D[h],b,g,true);e.visPoints[h]=new Vector(i[0],i[1],i[2])}h=e.visPoints[1].v;i=e.visPoints[2].v;i=[i[0]-h[0],i[1]-h[1],i[2]-h[2]];e.visPoints[1]=new Vector(h[0]+i[0]/3,h[1]+i[1]/3,h[2]+i[2]/3)}}
function calcMinAndMaxJointAngles(a){var b=Array(4),g=Array(4);if(a=="thumb"){b[0]=-10*Math.PI/180;g[0]=70*Math.PI/180;b[1]=-40*Math.PI/180;g[1]=15*Math.PI/180;b[2]=0;g[2]=50*Math.PI/180;b[3]=0;g[3]=80*Math.PI/180}else{if(a=="index"){b[0]=-20*Math.PI/180;g[0]=20*Math.PI/180}else if(a=="middle"){b[0]=-10*Math.PI/180;g[0]=10*Math.PI/180}else if(a=="ring"){b[0]=-5*Math.PI/180;g[0]=15*Math.PI/180}else{b[0]=-5*Math.PI/180;g[0]=20*Math.PI/180}b[1]=-10*Math.PI/180;g[1]=90*Math.PI/180;b[2]=0;g[2]=100*Math.PI/
180;b[3]=-10*Math.PI/180;g[3]=90*Math.PI/180}return[b,g]}
function Finger(a,b,g,c,e,h){this.origin=a;this.numPoints=b;this.numPhalanges=g;this.heights=c;this.fingerType=e;this.isLeft=h;this.jointAngles=Array(g);for(b=0;b<this.jointAngles.length;++b)this.jointAngles[b]=0;if(this.fingerType=="thumb"){this.jointAngles[0]=15*Math.PI/180;this.jointAngles[1]=-20*Math.PI/180;this.manipulator=new ThumbManipulator(a,g,c,h)}else this.manipulator=new Manipulator(a,g,c,h);this.points3D=this.manipulator.recalcManipulator(this.jointAngles);this.visPoints=Array(this.points3D.length);
this.recalc=function(){for(var i=calcMinAndMaxJointAngles(this.fingerType,this.isLeft),k=0;k<this.jointAngles.length;++k)if(this.jointAngles[k]<i[0][k])this.jointAngles[k]=i[0][k];else if(this.jointAngles[k]>i[1][k])this.jointAngles[k]=i[1][k];this.points3D=this.manipulator.recalcManipulator(this.jointAngles)};this.reset=function(){for(var i=0;i<this.jointAngles.length;++i)this.jointAngles[i]=0;if(this.fingerType=="thumb"){this.jointAngles[0]=15*Math.PI/180;this.jointAngles[1]=-20*Math.PI/180}this.recalc()}}
function createCoords(a,b){var g=new Vector(a.v[0]+b,a.v[1],a.v[2]),c=new Vector(a.v[0],a.v[1]+b,a.v[2]),e=new Vector(a.v[0],a.v[1],a.v[2]+b);return[a,g,c,e]}function rotateCoords(a,b){for(var g=Array(a.length),c=1;c<a.length;++c){var e=RotVectorAboutOrigin(a[c],a[0],b,true);g[c]=new Vector(e[0],e[1],e[2])}g[0]=new Vector(a[0].v[0],a[0].v[1],a[0].v[2]);return g}
function drawCoords(a,b){for(var g=["rgb(0,0,0)","rgb(200,0,0)","rgb(0,0,200)","rgb(0,200,0)"],c=b[0].v,e=1;e<b.length;++e){var h=b[e].v;a.fillStyle=g[0];a.fillRect(c[0],c[1],4,4);a.lineWidth=2;a.strokeStyle=g[e];a.fillStyle=g[e];a.beginPath();a.moveTo(c[0]+2,c[1]+2);a.lineTo(h[0]+2,h[1]+2);a.stroke();a.fillStyle=g[e];a.fillRect(h[0],h[1],4,4)}a.beginPath();a.strokeStyle="rgb(128,128,128)";a.moveTo(10,385);a.lineTo(20,390);a.moveTo(10,385);a.lineTo(20,380);a.moveTo(10,385);a.lineTo(360,385);a.moveTo(360,
385);a.lineTo(350,390);a.moveTo(360,385);a.lineTo(350,380);a.moveTo(385,10);a.lineTo(390,20);a.moveTo(385,10);a.lineTo(380,20);a.moveTo(385,10);a.lineTo(385,360);a.moveTo(385,360);a.lineTo(390,350);a.moveTo(385,360);a.lineTo(380,350);a.stroke()}
function getMouseCoords(a){if(a==null){alert("mouse event resulted in null");return null}if(browser==0&&a.offsetX||a.offsetY){a=new Vector(a.offsetX,a.offsetY,0);return a.v}else if(browser==1){var b=sumOffsetLeft=0;for(elementid=document.getElementById("canvas_new_gesture");elementid!=null;){b+=elementid.offsetTop;sumOffsetLeft+=elementid.offsetLeft;elementid=elementid.offsetParent}sumOffsetLeft=a.pageX-sumOffsetLeft;b=a.pageY-b;if(sumOffsetLeft>0&&b>0&&sumOffsetLeft<400&&b<400){a=new Vector(sumOffsetLeft,
b,0);return a.v}}return null}function Vector(a,b,g){this.v=[a,b,g,1];this.withinRadiusAroundPoint=function(c,e){var h=this.v[0]-e[0],i=this.v[1]-e[1];return h*h+i*i<c*c};this.rotateAboutOrigin=function(c,e){for(var h=RotVectorAboutOrigin(this.v,c,e),i=0;i<h.length;++i)this.v[i]=h[i]};this.moveTo=function(c){this.v[0]=c.v[0];this.v[1]=c.v[1];this.v[2]=c.v[2]};this.distanceFrom=function(c){for(var e=0,h=0;h<this.v.length;++h)e+=(this.v[h]-c.v[h])*(this.v[h]-c.v[h]);return Math.sqrt(e)}}
function MultiplyMatrices(a,b){for(var g=a.size,c=new SqMat(g),e=0;e<g;++e)for(var h=0;h<g;++h){for(var i=0,k=0;k<g;++k)i+=a.get(e,k)*b.get(k,h);c.set(e,h,i)}return c}
function SqMat(a){this.size=a;this.A=Array(a);for(var b=0;b<a;++b)this.A[b]=Array(a);this.set=function(g,c,e){this.A[g][c]=e};this.get=function(g,c){return this.A[g][c]};this.getPos=function(){for(var g=new Vector(0,0,0),c=0;c<a-1;++c)g.v[c]=this.A[c][a-1];return g};this.multiplyByMatrix=function(g){this.A=MultiplyMatrices(this,g).A};this.multiplyByVector=function(g){for(var c=Array(a),e=0;e<a;++e)for(var h=c[e]=0;h<a;++h)c[e]+=this.A[e][h]*g[h];return c};this.transpose=function(){for(var g=Array(a),
c=0;c<a;++c){g[c]=Array(a);for(var e=0;e<a;++e)g[c][e]=this.A[e][c]}return g}}function RotX(a){var b=new SqMat(4);b.set(0,0,1);b.set(0,1,0);b.set(0,2,0);b.set(0,3,0);b.set(1,0,0);b.set(1,1,Math.cos(a));b.set(1,2,-Math.sin(a));b.set(1,3,0);b.set(2,0,0);b.set(2,1,Math.sin(a));b.set(2,2,Math.cos(a));b.set(2,3,0);b.set(3,0,0);b.set(3,1,0);b.set(3,2,0);b.set(3,3,1);return b}
function RotY(a){var b=new SqMat(4);b.set(0,0,Math.cos(a));b.set(0,1,0);b.set(0,2,Math.sin(a));b.set(0,3,0);b.set(1,0,0);b.set(1,1,1);b.set(1,2,0);b.set(1,3,0);b.set(2,0,-Math.sin(a));b.set(2,1,0);b.set(2,2,Math.cos(a));b.set(2,3,0);b.set(3,0,0);b.set(3,1,0);b.set(3,2,0);b.set(3,3,1);return b}
function RotZ(a){var b=new SqMat(4);b.set(0,0,Math.cos(a));b.set(0,1,-Math.sin(a));b.set(0,2,0);b.set(0,3,0);b.set(1,0,Math.sin(a));b.set(1,1,Math.cos(a));b.set(1,2,0);b.set(1,3,0);b.set(2,0,0);b.set(2,1,0);b.set(2,2,1);b.set(2,3,0);b.set(3,0,0);b.set(3,1,0);b.set(3,2,0);b.set(3,3,1);return b}function Rot(a,b,g){return MultiplyMatrices(MultiplyMatrices(RotZ(a),RotY(b)),RotX(g))}
function Trans(a,b,g){var c=new SqMat(4);c.set(0,0,1);c.set(0,1,0);c.set(0,2,0);c.set(0,3,a);c.set(1,0,0);c.set(1,1,1);c.set(1,2,0);c.set(1,3,b);c.set(2,0,0);c.set(2,1,0);c.set(2,2,1);c.set(2,3,g);c.set(3,0,0);c.set(3,1,0);c.set(3,2,0);c.set(3,3,1);return c}
function RotVectorAboutOrigin(a,b,g,c){var e=Trans(-b.v[0],-b.v[1],-b.v[2]);g=MultiplyMatrices(MultiplyMatrices(RotZ(g[0]),RotY(g[1])),RotX(g[2]));b=Trans(b.v[0],b.v[1],b.v[2]);e=MultiplyMatrices(b,MultiplyMatrices(g,e));if(c)return e.multiplyByVector(a.v);return e.multiplyByVector(a)}
function Manipulator(a,b,g,c){this.origin=a;this.tipPos=null;this.recalcManipulator=function(e){var h=Array(e+1),i=Trans(this.origin.v[0],this.origin.v[1],this.origin.v[2]);i.multiplyByMatrix(RotY(-Math.PI/2));i.multiplyByMatrix(RotX(-Math.PI/2));c?i.multiplyByMatrix(RotZ(e[0])):i.multiplyByMatrix(RotZ(-e[0]));h[0]=i.getPos();i.multiplyByMatrix(RotX(Math.PI/2));h[1]=i.getPos();for(var k,l=1;l<e.length;++l){k=MultiplyMatrices(RotZ(e[l]),Trans(g[l],0,0));i.multiplyByMatrix(k);h[l+1]=i.getPos()}this.tipPos=
i.getPos();return h};this.getPos=function(){return this.tipPos}}
function ThumbManipulator(a,b,g,c){this.origin=a;this.tipPos=null;this.isLeft=c;this.recalcManipulator=function(e){var h=Array(e+1),i=Trans(this.origin.v[0],this.origin.v[1],this.origin.v[2]);i.multiplyByMatrix(RotY(-Math.PI/2));i.multiplyByMatrix(RotZ(e[0]));h[0]=i.getPos();i.multiplyByMatrix(RotX(-Math.PI/2));var k,l=[0,0,0,0];h[1]=i.getPos();for(var n=1;n<e.length;++n){k=c?MultiplyMatrices(RotZ(e[n]),Trans(0,0,l[n-1])):MultiplyMatrices(RotZ(-e[n]),Trans(0,0,l[n-1]));k.multiplyByMatrix(Trans(g[n],
0,0));i.multiplyByMatrix(k);h[n+1]=i.getPos()}this.tipPos=i.getPos();return h};this.getPos=function(){return this.tipPos}};

