diff options
author | sualko <github@spam.herberth.eu> | 2014-06-27 17:34:27 +0400 |
---|---|---|
committer | sualko <github@spam.herberth.eu> | 2014-06-27 17:34:27 +0400 |
commit | 89bd4cdc48768dcf653d7b4cceb85b8b0dfdad25 (patch) | |
tree | 35757d5470963f83d7c3af982573c95f0a77eaf7 | |
parent | 9d87d90141c4447ff7d87200778fed89497b07e5 (diff) |
build v0.8.0-betav0.8.0-beta
-rw-r--r-- | CHANGELOG.md | 17 | ||||
-rw-r--r-- | Gruntfile.js | 2 | ||||
-rw-r--r-- | build/img/camera_icon_grey.svg | 81 | ||||
-rw-r--r-- | build/img/camera_icon_white.svg | 57 | ||||
-rw-r--r-- | build/img/emotions/thumbsdown.png | bin | 0 -> 1525 bytes | |||
-rw-r--r-- | build/img/padlock_close_green.svg | 40 | ||||
-rw-r--r-- | build/img/padlock_close_grey.svg | 48 | ||||
-rw-r--r-- | build/img/padlock_close_orange.svg | 50 | ||||
-rw-r--r-- | build/img/smiley.png | bin | 0 -> 560 bytes | |||
-rw-r--r-- | build/img/speech_balloon_white.svg | 66 | ||||
-rw-r--r-- | build/jsxc.css | 558 | ||||
-rw-r--r-- | build/jsxc.lib.js | 559 | ||||
-rw-r--r-- | build/jsxc.lib.webrtc.js | 94 | ||||
-rw-r--r-- | build/jsxc.webrtc.css | 23 | ||||
-rw-r--r-- | build/sound/Ping1.mp3 | bin | 0 -> 56841 bytes | |||
-rw-r--r-- | build/sound/Rotary-Phone6.mp3 | bin | 0 -> 114624 bytes | |||
-rw-r--r-- | build/sound/credential | 11 | ||||
-rw-r--r-- | build/sound/incomingMessage.wav | bin | 0 -> 100452 bytes | |||
-rwxr-xr-x | jsxc.lib.js | 2 | ||||
-rw-r--r-- | jsxc.lib.webrtc.js | 4 | ||||
-rw-r--r-- | package.json | 2 |
21 files changed, 1230 insertions, 384 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index be9fd9cd..5f607eac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +v0.8.0 / 2014-??-?? +=== +- add spanish translation +- add vCard view +- add more emoticons +- add grayscale to buddies without subscription +- add settings for priorities +- add hint if roster is empty +- add sound files +- new chat window design +- enhanced roster design +- fix emoticon replacement (XEP-0038) +- fix some ui issues (explanations,...) +- fix issue with password only field + v0.7.2 / 2014-05-28 === - fix login issue @@ -69,4 +84,4 @@ v0.5.1 / 2014-01-27 - handle already attached submit events on login form - style changes - fix webrtc startup -- don't block application on dsa key generation
\ No newline at end of file +- don't block application on dsa key generation diff --git a/Gruntfile.js b/Gruntfile.js index 3f8e9608..7b51af56 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -20,7 +20,7 @@ module.exports = function(grunt) { main: { files: [ { expand: true, - src: [ 'lib/strophe.jingle/*.js', 'lib/otr/build/**', 'lib/otr/lib/dsa-webworker.js', 'lib/otr/lib/sm-webworker.js', 'lib/otr/lib/const.js', 'lib/otr/lib/helpers.js', 'lib/otr/lib/dsa.js', 'lib/otr/vendor/*.js', 'lib/*.js', 'jsxc.lib.js', 'jsxc.lib.webrtc.js', '*.css', 'LICENSE', 'img/**' ], + src: [ 'lib/strophe.jingle/*.js', 'lib/otr/build/**', 'lib/otr/lib/dsa-webworker.js', 'lib/otr/lib/sm-webworker.js', 'lib/otr/lib/const.js', 'lib/otr/lib/helpers.js', 'lib/otr/lib/dsa.js', 'lib/otr/vendor/*.js', 'lib/*.js', 'jsxc.lib.js', 'jsxc.lib.webrtc.js', '*.css', 'LICENSE', 'img/**', 'sound/**' ], dest: 'build/' } ] } diff --git a/build/img/camera_icon_grey.svg b/build/img/camera_icon_grey.svg index f1e578c7..0228619a 100644 --- a/build/img/camera_icon_grey.svg +++ b/build/img/camera_icon_grey.svg @@ -1,97 +1,34 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="535.00458" - height="510.4368" - id="svg3896" version="1.1" - inkscape:version="0.48+devel r" - sodipodi:docname="camera_icon_grey.svg"> - <defs - id="defs3898" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.35" - inkscape:cx="369.28572" - inkscape:cy="50.436783" - inkscape:document-units="px" - inkscape:current-layer="layer1" - showgrid="false" - fit-margin-top="0" - fit-margin-left="0" - fit-margin-right="0" - fit-margin-bottom="0" - inkscape:window-width="954" - inkscape:window-height="711" - inkscape:window-x="129" - inkscape:window-y="144" - inkscape:window-maximized="0" /> + id="svg2" + width="20" + height="20"> <metadata - id="metadata3901"> + id="metadata10"> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> + <dc:title></dc:title> </cc:Work> </rdf:RDF> </metadata> + <defs + id="defs8" /> <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" id="layer1" - transform="translate(-5.7142771,-72.362177)"> - <rect - style="fill:#808080;stroke:none;stroke-width:1.6172694;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" - id="rect3904" - width="290.51404" - height="294.08438" - x="86.054779" - y="292.97778" /> + transform="matrix(0.03788594,0,0,0.03788594,-0.41340793,-2.6310716)"> <path - style="fill:#808080;stroke:none" - d="m 292.28572,420.35915 229.57599,-101.39986 0,232.54576 -233.04644,-102.93271 z" id="path3906" - inkscape:connector-curvature="0" /> - <path - sodipodi:type="arc" - style="fill:#808080;stroke:none" - id="path3908" - sodipodi:cx="242.85715" - sodipodi:cy="315.21933" - sodipodi:rx="117.14286" - sodipodi:ry="117.14286" - d="M 360.00001,315.21933 A 117.14286,117.14286 0 0 1 242.85715,432.36219 117.14286,117.14286 0 0 1 125.71429,315.21933 117.14286,117.14286 0 0 1 242.85715,198.07647 117.14286,117.14286 0 0 1 360.00001,315.21933 Z" - transform="matrix(1.1334136,0,0,1.1663886,-136.76164,-155.82534)" /> - <a - id="a3912" style="fill:#808080;stroke:none" - transform="matrix(0.86859739,0,0,0.89386794,47.913668,10.526572)"> - <path - sodipodi:type="arc" - style="fill:#808080;stroke:none" - id="path3910" - sodipodi:cx="242.85715" - sodipodi:cy="315.21933" - sodipodi:rx="117.14286" - sodipodi:ry="117.14286" - d="M 360.00001,315.21933 A 117.14286,117.14286 0 0 1 242.85715,432.36219 117.14286,117.14286 0 0 1 125.71429,315.21933 117.14286,117.14286 0 0 1 242.85715,198.07647 117.14286,117.14286 0 0 1 360.00001,315.21933 Z" - transform="matrix(1.304878,0,0,1.304878,3.67247,-186.10345)" /> - </a> + d="m 361.65148,313.51768 177.16074,-131.78516 0,302.22999 L 358.97338,350.18517 Z M 10.911922,182.40634 l 378.372678,0 0,302.65582 -378.372678,0 z" /> </g> </svg> diff --git a/build/img/camera_icon_white.svg b/build/img/camera_icon_white.svg index 7d65bb64..da48b07f 100644 --- a/build/img/camera_icon_white.svg +++ b/build/img/camera_icon_white.svg @@ -13,8 +13,8 @@ height="510.4368" id="svg3896" version="1.1" - inkscape:version="0.48.3.1 r9886" - sodipodi:docname="camera_icon.svg"> + inkscape:version="0.48+devel r" + sodipodi:docname="camera_icon_white.svg"> <defs id="defs3898" /> <sodipodi:namedview @@ -24,9 +24,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="0.35" - inkscape:cx="369.28572" - inkscape:cy="50.436783" + inkscape:zoom="0.98994949" + inkscape:cx="353.91934" + inkscape:cy="233.8456" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" @@ -34,11 +34,11 @@ fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" - inkscape:window-width="954" - inkscape:window-height="711" - inkscape:window-x="833" - inkscape:window-y="106" - inkscape:window-maximized="0" /> + inkscape:window-width="1855" + inkscape:window-height="1056" + inkscape:window-x="65" + inkscape:window-y="24" + inkscape:window-maximized="1" /> <metadata id="metadata3901"> <rdf:RDF> @@ -57,41 +57,16 @@ id="layer1" transform="translate(-5.7142771,-72.362177)"> <rect - style="fill:#ffffff;stroke:#ffffff;stroke-width:1.61726940000000008;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + style="fill:#ffffff;stroke:none;stroke-width:1.6172694;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="rect3904" - width="290.51404" - height="294.08438" - x="86.054779" - y="292.97778" /> + width="378.37268" + height="302.65582" + x="10.911922" + y="182.40634" /> <path style="fill:#ffffff;stroke:none" - d="m 292.28572,420.35915 229.57599,-101.39986 0,232.54576 -233.04644,-102.93271 z" + d="m 361.65148,313.51768 177.16074,-131.78516 0,302.22999 -179.83884,-133.77734 z" id="path3906" inkscape:connector-curvature="0" /> - <path - sodipodi:type="arc" - style="fill:#ffffff;stroke:none" - id="path3908" - sodipodi:cx="242.85715" - sodipodi:cy="315.21933" - sodipodi:rx="117.14286" - sodipodi:ry="117.14286" - d="m 360.00001,315.21933 a 117.14286,117.14286 0 1 1 -234.28572,0 117.14286,117.14286 0 1 1 234.28572,0 z" - transform="matrix(1.1334136,0,0,1.1663886,-136.76164,-155.82534)" /> - <a - id="a3912" - style="fill:#ffffff" - transform="matrix(0.86859739,0,0,0.89386794,47.913668,10.526572)"> - <path - sodipodi:type="arc" - style="fill:#ffffff;stroke:none" - id="path3910" - sodipodi:cx="242.85715" - sodipodi:cy="315.21933" - sodipodi:rx="117.14286" - sodipodi:ry="117.14286" - d="m 360.00001,315.21933 c 0,64.69622 -52.44665,117.14286 -117.14286,117.14286 -64.69622,0 -117.14286,-52.44664 -117.14286,-117.14286 0,-64.69622 52.44664,-117.14286 117.14286,-117.14286 64.69621,0 117.14286,52.44664 117.14286,117.14286 z" - transform="matrix(1.304878,0,0,1.304878,3.67247,-186.10345)" /> - </a> </g> </svg> diff --git a/build/img/emotions/thumbsdown.png b/build/img/emotions/thumbsdown.png Binary files differnew file mode 100644 index 00000000..d9809cb7 --- /dev/null +++ b/build/img/emotions/thumbsdown.png diff --git a/build/img/padlock_close_green.svg b/build/img/padlock_close_green.svg index d3d22f6c..8a4ac0ab 100644 --- a/build/img/padlock_close_green.svg +++ b/build/img/padlock_close_green.svg @@ -14,7 +14,7 @@ inkscape:version="0.48+devel r" width="15" height="15" - sodipodi:docname="padlock_open-white.svg"> + sodipodi:docname="padlock_close_green.svg"> <metadata id="metadata3047"> <rdf:RDF> @@ -42,25 +42,45 @@ inkscape:window-height="1056" id="namedview3043" showgrid="false" - inkscape:zoom="44.500587" - inkscape:cx="6.292871" - inkscape:cy="6.4926565" + inkscape:zoom="32" + inkscape:cx="12.823367" + inkscape:cy="8.9449238" inkscape:window-x="65" inkscape:window-y="24" inkscape:window-maximized="1" inkscape:current-layer="svg3041" borderlayer="true" /> <rect - style="fill:#009800;stroke:#009800;stroke-width:0.92522794" + style="fill:#44aa00;stroke:#44aa00;stroke-width:0.92522794" id="rect3051" width="10.232394" height="6.4687548" x="2.5534275" y="8.074255" /> <path - style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-color:currentColor;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill:#009800;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.90384686;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - d="M 7.5078125,2.6797098 C 5.0260054,2.6797098 3.491603,3.472493 2.75,4.621116 2.008397,5.7697391 2.0878906,7.0238438 2.0878906,7.699241 l 1.9042969,0 c 0,-0.7329344 0.013699,-1.5125503 0.3574219,-2.0449218 0.3437231,-0.5323715 1.0433343,-1.0703125 3.1582031,-1.0703125 2.0264219,0 2.9669635,0.6265545 3.4326915,1.3827484 0.465728,0.7561939 0.400333,1.7142789 0.400333,1.7142789 0.04517,1.7732263 -0.06599,4.303173 0.0049,5.535784 l 0.05274,0.898438 0.898437,0 0.945445,-0.0031 0.01,-6.4361369 c 0,0 0.06201,-1.6621328 -0.685321,-2.8754827 C 11.819768,3.587152 10.078064,2.6797098 7.5078125,2.6797098 Z" - id="path3848" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ssccssscccccccs" /> + style="fill:none;fill-opacity:1;stroke:#44aa00;stroke-width:2.08827519;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path4101" + sodipodi:type="arc" + sodipodi:cx="7.6713805" + sodipodi:cy="6.7928491" + sodipodi:rx="4.534133" + sodipodi:ry="4.5301714" + sodipodi:start="3.1415927" + sodipodi:end="0" + d="M 3.1372476,6.7928489 A 4.534133,4.5301714 0 0 1 7.6713806,2.2626777 4.534133,4.5301714 0 0 1 12.205513,6.7928491" + sodipodi:open="true" /> + <rect + style="fill:#44aa00;fill-opacity:1;stroke:none;stroke-width:1.39526081;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect4153" + width="2.0906768" + height="1.0984892" + x="2.0913804" + y="6.7554431" /> + <rect + y="6.7632556" + x="11.157786" + height="1.0984892" + width="2.0906768" + id="rect4155" + style="fill:#44aa00;fill-opacity:1;stroke:none;stroke-width:1.39526081;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> </svg> diff --git a/build/img/padlock_close_grey.svg b/build/img/padlock_close_grey.svg index b28e74c5..a09d4c61 100644 --- a/build/img/padlock_close_grey.svg +++ b/build/img/padlock_close_grey.svg @@ -14,7 +14,7 @@ inkscape:version="0.48+devel r" width="15" height="15" - sodipodi:docname="padlock_open-white.svg"> + sodipodi:docname="padlock_close_grey.svg"> <metadata id="metadata3047"> <rdf:RDF> @@ -42,9 +42,9 @@ inkscape:window-height="1056" id="namedview3043" showgrid="false" - inkscape:zoom="44.500587" - inkscape:cx="6.292871" - inkscape:cy="6.4926565" + inkscape:zoom="32" + inkscape:cx="12.792117" + inkscape:cy="8.9449238" inkscape:window-x="65" inkscape:window-y="24" inkscape:window-maximized="1" @@ -57,10 +57,38 @@ height="6.4687548" x="2.5534275" y="8.074255" /> - <path - style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-color:currentColor;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.90384686;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - d="M 7.5078125,2.6797098 C 5.0260054,2.6797098 3.491603,3.472493 2.75,4.621116 2.008397,5.7697391 2.0878906,7.0238438 2.0878906,7.699241 l 1.9042969,0 c 0,-0.7329344 0.013699,-1.5125503 0.3574219,-2.0449218 0.3437231,-0.5323715 1.0433343,-1.0703125 3.1582031,-1.0703125 2.0264219,0 2.9669635,0.6265545 3.4326915,1.3827484 0.465728,0.7561939 0.400333,1.7142789 0.400333,1.7142789 0.04517,1.7732263 -0.06599,4.303173 0.0049,5.535784 l 0.05274,0.898438 0.898437,0 0.945445,-0.0031 0.01,-6.4361369 c 0,0 0.06201,-1.6621328 -0.685321,-2.8754827 C 11.819768,3.587152 10.078064,2.6797098 7.5078125,2.6797098 Z" - id="path3848" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ssccssscccccccs" /> + <a + id="a4157" + style="fill:none;stroke:#808080"> + <path + sodipodi:open="true" + d="M 3.1372476,6.7928489 A 4.534133,4.5301714 0 0 1 7.6713806,2.2626777 4.534133,4.5301714 0 0 1 12.205513,6.7928491" + sodipodi:end="0" + sodipodi:start="3.1415927" + sodipodi:ry="4.5301714" + sodipodi:rx="4.534133" + sodipodi:cy="6.7928491" + sodipodi:cx="7.6713805" + sodipodi:type="arc" + id="path4101" + style="fill:none;fill-opacity:1;stroke:#808080;stroke-width:2.08827519;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </a> + <g + id="g4170" + style="fill:#808080"> + <rect + y="6.7554431" + x="2.0913804" + height="1.0984892" + width="2.0906768" + id="rect4153" + style="fill:#808080;fill-opacity:1;stroke:none;stroke-width:1.39526081;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <rect + style="fill:#808080;fill-opacity:1;stroke:none;stroke-width:1.39526081;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect4155" + width="2.0906768" + height="1.0984892" + x="11.157786" + y="6.7632556" /> + </g> </svg> diff --git a/build/img/padlock_close_orange.svg b/build/img/padlock_close_orange.svg index 47b72cc7..3338356c 100644 --- a/build/img/padlock_close_orange.svg +++ b/build/img/padlock_close_orange.svg @@ -14,7 +14,7 @@ inkscape:version="0.48+devel r" width="15" height="15" - sodipodi:docname="padlock_open-white.svg"> + sodipodi:docname="padlock_close_orange.svg"> <metadata id="metadata3047"> <rdf:RDF> @@ -42,25 +42,53 @@ inkscape:window-height="1056" id="namedview3043" showgrid="false" - inkscape:zoom="44.500587" - inkscape:cx="6.292871" - inkscape:cy="6.4926565" + inkscape:zoom="32" + inkscape:cx="12.792117" + inkscape:cy="8.9449238" inkscape:window-x="65" inkscape:window-y="24" inkscape:window-maximized="1" inkscape:current-layer="svg3041" borderlayer="true" /> <rect - style="fill:#ff9955;stroke:#ff9955;stroke-width:0.92522794" + style="fill:#ff7f2a;stroke:#ff7f2a;stroke-width:0.92522794" id="rect3051" width="10.232394" height="6.4687548" x="2.5534275" y="8.074255" /> - <path - style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-color:currentColor;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill:#ff9955;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.90384686;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" - d="M 7.5078125,2.6797098 C 5.0260054,2.6797098 3.491603,3.472493 2.75,4.621116 2.008397,5.7697391 2.0878906,7.0238438 2.0878906,7.699241 l 1.9042969,0 c 0,-0.7329344 0.013699,-1.5125503 0.3574219,-2.0449218 0.3437231,-0.5323715 1.0433343,-1.0703125 3.1582031,-1.0703125 2.0264219,0 2.9669635,0.6265545 3.4326915,1.3827484 0.465728,0.7561939 0.400333,1.7142789 0.400333,1.7142789 0.04517,1.7732263 -0.06599,4.303173 0.0049,5.535784 l 0.05274,0.898438 0.898437,0 0.945445,-0.0031 0.01,-6.4361369 c 0,0 0.06201,-1.6621328 -0.685321,-2.8754827 C 11.819768,3.587152 10.078064,2.6797098 7.5078125,2.6797098 Z" - id="path3848" - inkscape:connector-curvature="0" - sodipodi:nodetypes="ssccssscccccccs" /> + <a + id="a4157" + style="fill:none;stroke:#ff7f2a"> + <path + sodipodi:open="true" + d="M 3.1372476,6.7928489 A 4.534133,4.5301714 0 0 1 7.6713806,2.2626777 4.534133,4.5301714 0 0 1 12.205513,6.7928491" + sodipodi:end="0" + sodipodi:start="3.1415927" + sodipodi:ry="4.5301714" + sodipodi:rx="4.534133" + sodipodi:cy="6.7928491" + sodipodi:cx="7.6713805" + sodipodi:type="arc" + id="path4101" + style="fill:none;fill-opacity:1;stroke:#ff7f2a;stroke-width:2.08827519;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + </a> + <g + id="g4170" + style="fill:#ff7f2a"> + <rect + y="6.7554431" + x="2.0913804" + height="1.0984892" + width="2.0906768" + id="rect4153" + style="fill:#ff7f2a;fill-opacity:1;stroke:none;stroke-width:1.39526081;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + <rect + style="fill:#ff7f2a;fill-opacity:1;stroke:none;stroke-width:1.39526081;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect4155" + width="2.0906768" + height="1.0984892" + x="11.157786" + y="6.7632556" /> + </g> </svg> diff --git a/build/img/smiley.png b/build/img/smiley.png Binary files differnew file mode 100644 index 00000000..9a720677 --- /dev/null +++ b/build/img/smiley.png diff --git a/build/img/speech_balloon_white.svg b/build/img/speech_balloon_white.svg new file mode 100644 index 00000000..465f4a84 --- /dev/null +++ b/build/img/speech_balloon_white.svg @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="25" + height="25" + id="svg2" + version="1.1" + inkscape:version="0.48+devel r" + viewBox="0 0 25 25.000001" + sodipodi:docname="speech_balloon_white.svg"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="22.4" + inkscape:cx="25.186628" + inkscape:cy="14.479999" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:window-width="1855" + inkscape:window-height="1056" + inkscape:window-x="65" + inkscape:window-y="24" + inkscape:window-maximized="1" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-228.24219,-320.66798)"> + <path + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 240.77627,324.02578 a 12.489309,7.9254426 0 0 0 -12.48944,7.92538 12.489309,7.9254426 0 0 0 5.26146,6.45637 c -0.17862,1.91196 -1.06119,3.95363 -3.14604,4.64437 2.54121,-0.11444 5.60026,-1.93057 7.47209,-3.40137 a 12.489309,7.9254426 0 0 0 2.90193,0.22616 12.489309,7.9254426 0 0 0 12.48928,-7.92553 12.489309,7.9254426 0 0 0 -12.48928,-7.92538 z" + id="path4101" + inkscape:connector-curvature="0" /> + </g> +</svg> diff --git a/build/jsxc.css b/build/jsxc.css index 2d139c84..29125167 100644 --- a/build/jsxc.css +++ b/build/jsxc.css @@ -38,6 +38,10 @@ p.jsxc_center { min-width: 300px; } +#jsxc_dialog p { + margin-bottom: 1em; +} + #jsxc_dialog h3 { font-size: 120%; font-weight: bold; @@ -48,7 +52,11 @@ p.jsxc_center { #jsxc_dialog p input { margin-bottom: 5px; width: 60%; - outline: none; + outline: none; +} + +#jsxc_dialog p input[type="submit"] { + width: auto; } #jsxc_dialog p label { @@ -63,7 +71,40 @@ p.jsxc_center { } #jsxc_dialog p.jsxc_maxWidth { - max-width: 500px; + max-width: 500px; +} + +#jsxc_dialog fieldset { + border: 2px solid #ccc; +} + +#jsxc_dialog legend { + padding: 0px 10px; + font-weight: bold; +} + +#jsxc_dialog input { + outline: none; +} + +#jsxc_dialog input:invalid { + border:1px solid red; +} + +#jsxc_dialog .jsxc_fieldsetPriority { + width: 200px; + padding: 10px; + border-radius: 3px; +} + +#jsxc_dialog .jsxc_fieldsetPriority label { + display: inline-block; + width: 100px; +} + +#jsxc_dialog .jsxc_fieldsetPriority input[type="Number"] { + display: inline-block; + width: 50px; } /*############################ @@ -76,8 +117,11 @@ li .jsxc_name { text-overflow: ellipsis; white-space: nowrap; } +li .jsxc_name:hover { + color: #FAFAFA; +} -.jsxc_avatar, ul#jsxc_buddylist li:hover .jsxc_avatar { +.jsxc_avatar,ul#jsxc_buddylist li:hover .jsxc_avatar { width: 25px; height: 25px; line-height: 25px; @@ -150,10 +194,11 @@ div#jsxc_roster .jsxc_wait h3 { /** Input field for alias renaming */ #jsxc_roster input { position: absolute; + top: 50%; left: 31px; - top: 2px; width: 157px; - height: 22px; + height: 18px; + margin-top: -11px; padding: 2px; border: 0px; background-image: none; @@ -162,11 +207,22 @@ div#jsxc_roster .jsxc_wait h3 { -moz-box-shadow: inset 0 0 5px #888; -webkit-box-shadow: inset 0 0 5px #888; box-shadow: inner 0 0 5px #888; - outline: none; + outline: none; +} + +#jsxc_roster .jsxc_expand input { + left: 51px; + width: 137px; } div#jsxc_roster p { color: #939393; + padding: 10px; +} + +div#jsxc_roster p a { + color: #b1b1b1; + text-decoration: underline; } div#jsxc_roster>.jsxc_bottom { @@ -219,7 +275,7 @@ div#jsxc_roster>.jsxc_bottom li { white-space: nowrap; } -div#jsxc_roster>.jsxc_bottom li:hover:not(.jsxc_disabled) { +div#jsxc_roster>.jsxc_bottom li:hover:not(.jsxc_disabled ) { color: #fff; background-color: #3F8FBA; } @@ -238,6 +294,7 @@ div#jsxc_roster>.jsxc_bottom ul li:last-child { width: 30px; } +/** own avatar */ #jsxc_avatar { float: left; margin: 0px 2px; @@ -311,61 +368,130 @@ ul#jsxc_buddylist li { line-height: 30px; padding-left: 3px; z-index: 85; + overflow: hidden; +} + +ul#jsxc_buddylist li.jsxc_expand { + height: 54px; +} + +ul#jsxc_buddylist li.jsxc_expand .jsxc_avatar, ul#jsxc_buddylist li.jsxc_expand .jsxc_avatar img { + width: 48px; + height: 48px; +} + +#jsxc_buddylist .jsxc_options { + height: 20px; + float: left; + border-radius:2px; + background-color: rgba(150, 150, 150, 0.5); +} +#jsxc_buddylist .jsxc_options > div { + height: 20px; + width: 20px; + float: left; + margin-right:0px 1px; + background-repeat: no-repeat; + background-position: center center; + opacity: 0.6; + cursor: pointer; +} +#jsxc_buddylist .jsxc_options > div:hover { + opacity: 1; +} +#jsxc_buddylist .jsxc_chaticon { + background-image: url('img/speech_balloon_white.svg'); + background-size: 15px 15px; +} +#jsxc_buddylist .jsxc_videoicon { + background-image: url('img/camera_icon_white.svg'); + background-size: 13px 13px; +} +#jsxc_buddylist .jsxc_vcardicon { + font-size: 15px; + line-height: 20px; + text-align: center; + color: #fff; + font-weight: bold; + font-family: serif; } ul#jsxc_buddylist li:hover { - color: #FAFAFA; + } -ul#jsxc_buddylist li.jsxc_oneway { +ul#jsxc_buddylist .jsxc_oneway { opacity: 0.7; } - -ul#jsxc_buddylist .jsxc_options { - height: 30px; +.jsxc_oneway .jsxc_avatar { + -webkit-filter: grayscale(100%); + -moz-filter: grayscale(100%); + -ms-filter: grayscale(100%); + -o-filter: grayscale(100%); + filter: grayscale(100%); +} +ul#jsxc_buddylist .jsxc_right { + float:left; +} +ul#jsxc_buddylist .jsxc_right { float: right; - overflow: hidden; - transition: width 2s; - width: 0px; - -webkit-transition: width .5s; /* Safari */ - white-space: nowrap; + margin-right: 6px; } -ul#jsxc_buddylist .jsxc_options div { - line-height: 30px; - height: 30px; - width: 20px; - cursor: pointer; - opacity: 0.7; - display: inline-block; +ul#jsxc_buddylist .jsxc_right div { font-weight: bold; text-align: center; - font-size: 17px; - overflow: hidden; + font-size: 13px; + line-height: 20px; + color: #fff; } -ul#jsxc_buddylist li[data-type="chat"]:hover .jsxc_options { - width: 50px; +ul#jsxc_buddylist li[data-type!="chat"] .jsxc_right { + display: none; } -ul#jsxc_buddylist .jsxc_options div:hover { +ul#jsxc_buddylist .jsxc_right div:hover { opacity: 1.0; } ul#jsxc_buddylist .jsxc_rename { - /* background-image: url('../img/edit.png'); */ - /* background-repeat: no-repeat; */ - /* background-position: center center; */ - /* background-size: 15px 15px; */ - transform: scaleX(-1); + } ul#jsxc_buddylist .jsxc_delete { - /* text-transform: lowercase; */ - /* font-weight: bold; */ - /* vertical-align: middle; */ - /* font-size: 17px; */ - + +} + +#jsxc_roster .jsxc_avatar { + position: relative; + cursor: pointer; +} +#jsxc_roster .jsxc_avatar img { + cursor: pointer; +} + +#jsxc_roster .jsxc_avatar:after { + content: '▼'; + display: block; + text-align: center; + width: 10px; + height: 10px; + line-height: 10px; + font-size: 8px; + position: absolute; + bottom: 0px; + right: 0px; + border-radius: 2px; + color:#000; + background-color: #fff; + opacity: 0; +} + +#jsxc_roster .jsxc_avatar:hover:after { + opacity: 1.0 !important; +} +#jsxc_roster li:hover .jsxc_avatar:after { + opacity: 0.6; } div#jsxc_toggleRoster { @@ -409,29 +535,32 @@ div#jsxc_windowList>ul>li { margin: 0px; display: block; float: right; - width: 200px; + width: 250px; background-color: #282323; height: 30px; position: relative; overflow: visible; margin-right: 5px; - box-shadow: 0px 0px 5px #000; cursor: pointer; } +div#jsxc_windowList>ul>li.jsxc_min { + width: 200px; +} + /*############################ *######### Window ########### *############################*/ div.jsxc_bar { + background-color: #282323; cursor: pointer; height: 30px; - line-height: 30px; - margin-left: 2px; + line-height: 26px; + padding: 2px; color: #939393; -} - -div.jsxc_bar:hover { - color: #FAFAFA; + width: 100%; + box-sizing: border-box; + overflow: hidden; } div.jsxc_cycle { @@ -453,64 +582,135 @@ div#jsxc_windowList>ul>li.jsxc_unreadMsg .jsxc_cycle { /** Contains text area */ div.jsxc_window { - display: none; - width: 200px; - height: 255px; position: absolute; - bottom: 30px; + bottom: 0px; + left: 0px; right: 0px; + height: auto; background-color: #A4A4A4; - box-shadow: 0px 0px 5px #000; z-index: 80; - cursor: default; + cursor: default; } -div.jsxc_window .jsxc_tools { +div.jsxc_window .jsxc_emoticons { + height: 30px; + width: 30px; + position: absolute; + top: 240px; + right: 0px; + cursor: pointer; +} + +div.jsxc_window .jsxc_emoticons:after { + content: ' '; + background-image: url('img/smiley.png'); + background-position: center center; + background-repeat: no-repeat; + height: 30px; + width: 30px; + opacity: 0.3; position: absolute; top: 0px; left: 0px; - width: 200px; - height: 23px; - background-color: #282323; - box-shadow: 0px 5px 5px -5px #000; - z-index: 100; } -div.jsxc_window .jsxc_textarea { - width: 200px; - height: 200px; - overflow: hidden; +div.jsxc_window .jsxc_emoticons:hover:after { + opacity: 0.5; } -div.jsxc_window .slimScrollDiv { +div.jsxc_window .jsxc_emoticons ul { + display: none; position: absolute; - top: 22px; + bottom: 33px; + right: 3px; + width: 210px; + background-color: rgba(40, 35, 35, 0.8); + padding: 3px; + border-radius: 3px; + z-index: 200; +} + +div.jsxc_window .jsxc_emoticons ul:after { + content: ''; + position: absolute; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 6px solid rgba(40, 35, 35, 0.8); + display: block; + width: 0; + z-index: 1; + right: 6px; + bottom: -6px; +} + +div.jsxc_window .jsxc_emoticons li { + float: right; + cursor: pointer; +} + +div.jsxc_window .jsxc_emoticons img { + cursor: pointer; + border-radius: 3px; +} + +div.jsxc_window .jsxc_emoticons img:hover { + background-color: rgba(255, 255, 255, 0.8); +} + +/** groups elements, which will be hidden, if the window is minimized. */ +.jsxc_window .jsxc_fade { + position: relative; +} + +.jsxc_window .jsxc_gradient { + position: absolute; + top: 0px; left: 0px; + right: 0px; + height: 15px; + z-index: 100; + background: -moz-linear-gradient(top, rgba(164, 164, 164, 1) 0%, + rgba(40, 35, 35, 0) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(164, + 164, 164, 1)), color-stop(100%, rgba(40, 35, 35, 0))); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(164, 164, 164, 1) 0%, + rgba(40, 35, 35, 0) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(164, 164, 164, 1) 0%, + rgba(40, 35, 35, 0) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(164, 164, 164, 1) 0%, + rgba(40, 35, 35, 0) 100%); /* IE10+ */ + background: linear-gradient(to bottom, #a4a4a4 0%, rgba(40, 35, 35, 0) + 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#a4a4a4', + endColorstr='#00282323', GradientType=0); /* IE6-9 */ +} + +div.jsxc_window .jsxc_avatar { + margin-top: 1px; } -div.jsxc_chatmessage,input.jsxc_chatmessage { - margin: 5px; - border-radius: 5px !important; +div.jsxc_window .jsxc_textarea { + width: 100%; + height: 100%; + overflow: hidden; padding: 3px; - width: 157px; - word-wrap: break-word; - background-color: #fff; - position: relative; - outline: none; } -div.jsxc_chatmessage.jsxc_received { - +div.jsxc_window .slimScrollDiv { + margin: 0px 0px 6px 0px; } -div.jsxc_chatmessage.jsxc_received:before { - content: '✓'; - position: absolute; - bottom: 2px; - left: 4px; - font-size: 10px; - line-height: 10px; - color: green; +div.jsxc_chatmessage { + margin: 3px; + padding: 4px; + padding-right: 10px; + max-width: 76%; + word-wrap: break-word; + background-color: #fff; + position: relative; + outline: none; + clear: both; } div.jsxc_chatmessage a { @@ -524,66 +724,131 @@ div.jsxc_chatmessage img { } /** incoming message */ -div.jsxc_in,input.jsxc_in { - text-align: left; - margin-right: 30px; - border: 1px solid blue; +div.jsxc_in { + float: left; + position: relative; + margin-left: 10px; + background: #f1f7fd; + border: solid 1px #a6b8c9; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +div.jsxc_in:after { + content: ''; + position: absolute; + border-style: solid; + border-width: 5px 6px 5px 0; + border-color: transparent #f1f7fd; + display: block; + width: 0; + z-index: 1; + left: -6px; + bottom: 10px; +} + +div.jsxc_out.jsxc_received:before { + content: '✓'; + position: absolute; + bottom: 2px; + right: 2px; + font-size: 12px; + line-height: 12px; + color: green; } /** outgoing message */ -div.jsxc_out,input.jsxc_out { - text-align: right; - margin-left: 30px; - border: 1px solid green !important; +div.jsxc_out { + float: right; + position: relative; + margin-right: 10px; + background: #e6ffd1; + border: solid 1px #b4d89f; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +div.jsxc_out:after { + content: ''; + position: absolute; + border-style: solid; + border-width: 5px 0 5px 6px; + border-color: transparent #e6ffd1; + display: block; + width: 0; + z-index: 1; + right: -6px; + bottom: 10px; } /** system message */ div.jsxc_sys { - width: 182px; - border: 1px solid black; + width: auto; + max-width: none; + padding-right: 4px; + box-sizing: border-box; + margin-right: 3px; + border-radius: 3px; } .jsxc_window input.jsxc_textinput { - position: absolute; - top: 226px; - left: 30px; - width: 157px; - height: 16px; + width: 100%; + height: 30px; margin: 0px; - line-height: 16px; - outline:none; + padding: 3px; + padding-right: 40px; + outline: none; + border-radius: 0px; + box-sizing: border-box; + text-align: right; } -.jsxc_window .jsxc_close { - text-transform: uppercase; - color: #939393; - font-family: Arial; - font-weight: bold; - line-height: 17px; - cursor: pointer; +.jsxc_window ::-webkit-input-placeholder { + color: #000; + opacity: 0.3; +} + +.jsxc_window ::-moz-placeholder { + color: #000; + opacity: 0.3; +} /* firefox 19+ */ +.jsxc_window :-ms-input-placeholder { + color: rgba(0, 0, 0, 0.4); +} /* ie */ +.jsxc_window input:-moz-placeholder { + color: #000; + opacity: 0.3; +} + +div.jsxc_window .jsxc_tools { + height: 26px; float: right; - padding: 3px; } -.jsxc_window .jsxc_close:hover { - color: #FAFAFA; +.jsxc_min .jsxc_tools { + display: none; +} + +div.jsxc_window .jsxc_tools > div { + width: 17px; + height: 26px; + display: block; + float: left; + color: #939393; + font-family: Arial; + line-height: 26px; + cursor: pointer; + text-align: center; } div.jsxc_settings { - color: #939393; - font-family: Arial; - line-height: 17px; - cursor: pointer; background-image: url('img/gear_grey.svg'); background-size: 15px 15px; background-repeat: no-repeat; background-position: center center; - width: 17px; - height: 17px; - display: block; - float: left; overflow: visible; - padding: 3px; } div.jsxc_settings:hover,div.jsxc_settings.hover { @@ -595,10 +860,10 @@ div.jsxc_settings ul { padding: 0px; margin: 0px; position: absolute; - top: 23px; + top: 30px; left: 0px; box-shadow: 0px 5px 5px -5px #000; - z-index: 90; + z-index: 110; overflow: visible; background-color: #282323; display: none; @@ -610,13 +875,14 @@ div.jsxc_settings li { padding-left: 10px; height: 30px; line-height: 30px; + text-align: left; } div.jsxc_settings li:first-child { border-top: 1px solid #ccc; } -div.jsxc_settings li:hover:not(.jsxc_disabled){ +div.jsxc_settings li:hover:not(.jsxc_disabled ){ color: #fff; background-color: #3F8FBA; } @@ -627,15 +893,14 @@ div.jsxc_settings li.jsxc_disabled { } div.jsxc_transfer { - padding: 3px; - width: 17px; - height: 17px; background-image: url('img/padlock_open_grey.svg'); background-repeat: no-repeat; background-position: center center; - background-size: 15px 15px; - cursor: pointer; - float: left; + background-size: 12px 12px; +} + +div.jsxc_transfer:hover { + background-image: url('img/padlock_open_white.svg'); } div.jsxc_transfer.jsxc_fin { @@ -650,6 +915,39 @@ div.jsxc_transfer.jsxc_enc.jsxc_trust { background-image: url('img/padlock_close_green.svg'); } -#colorbox, #cboxWrapper { - outline: none; +.jsxc_window .jsxc_close { + font-size: 20px; +} + +.jsxc_window .jsxc_close:hover { + color: #FAFAFA; +} + +#colorbox,#cboxWrapper { + outline: none; +} + +/*############################ + *######### Other ############ + *############################*/ +ul.jsxc_vCard { + min-width: 400px; +} + +ul.jsxc_vCard ul { + margin-left: 20px; +} + +ul.jsxc_vCard li { + cursor: default !important; +} + +ul.jsxc_vCard strong { + +} + +img.jsxc_vCard { + float: right; + max-width: 200px; + max-height: 200px; } diff --git a/build/jsxc.lib.js b/build/jsxc.lib.js index 23aea806..eb62e683 100644 --- a/build/jsxc.lib.js +++ b/build/jsxc.lib.js @@ -1,5 +1,5 @@ /** - * jsxc v0.7.2 - 2014-05-28 + * jsxc v0.8.0-beta - 2014-06-27 * * Copyright (c) 2014 Klaus Herberth <klaus@jsxc.org> <br> * Released under the MIT license @@ -7,7 +7,7 @@ * Please see http://www.jsxc.org/ * * @author Klaus Herberth <klaus@jsxc.org> - * @version 0.7.2 + * @version 0.8.0-beta */ var jsxc; @@ -22,7 +22,7 @@ var jsxc; */ jsxc = { /** Version of jsxc */ - version: '0.7.2', + version: '0.8.0-beta', /** True if i'm the master */ master: false, @@ -234,7 +234,7 @@ var jsxc; if (!jsxc.storage.getItem('rid') || !jsxc.storage.getItem('sid') || !jsxc.restore) { // Looking for a login form - if (!jsxc.options.loginForm.form || !jsxc.el_exists(jsxc.options.loginForm.form)) { + if (!jsxc.options.loginForm.form || !(jsxc.el_exists(jsxc.options.loginForm.form) && jsxc.el_exists(jsxc.options.loginForm.jid) && jsxc.el_exists(jsxc.options.loginForm.pass))) { if (jsxc.options.displayRosterMinimized()) { // Show minimized roster @@ -474,8 +474,11 @@ var jsxc; restoreRoster: function() { var buddies = jsxc.storage.getUserItem('buddylist'); - if (!buddies) { + if (!buddies || buddies.length === 0) { jsxc.debug('No saved buddylist.'); + + jsxc.gui.roster.empty(); + return; } @@ -539,6 +542,7 @@ var jsxc; * Escapes some characters to HTML character */ escapeHTML: function(text) { + text = text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); }, @@ -709,7 +713,7 @@ var jsxc; */ jsxc.gui = { /** Smilie token to file mapping */ - emotions: [ [ ':-) :)', 'smile.png' ], [ ':-D :D', 'grin.png' ], [ ':-( :(', 'sad.png' ], [ ';-) ;)', 'wink.png' ], [ ':-P :P', 'tonguesmile.png' ], [ '=-O', 'surprised.png' ], [ ':kiss: :-*', 'kiss.png' ], [ '8-) :cool:', 'sunglassess.png' ], [ ':\'-(', 'crysad.png' ], [ ':-/', 'doubt.png' ], [ 'O:-) O:)', 'angel.png' ], [ ':-X :X', 'zip.png' ], [ '>:o', 'angry.png' ], [ ':yes:', 'thumbsup.png' ], [ ':beer:', 'beer.png' ], [ ':devil:', 'devil.png' ], [ ':kissing:', 'kissing.png' ], [ ':love:', 'love.png' ], [ ':zzz:', 'tired.png' ] ], + emotions: [ [ 'O:-) O:)', 'angel.png' ], [ '>:-( >:( >:-( >:(', 'angry.png' ], [ ':-) :)', 'smile.png' ], [ ':-D :D', 'grin.png' ], [ ':-( :(', 'sad.png' ], [ ';-) ;)', 'wink.png' ], [ ':-P :P', 'tonguesmile.png' ], [ '=-O', 'surprised.png' ], [ ':kiss: :-*', 'kiss.png' ], [ '8-) :cool:', 'sunglassess.png' ], [ ':\'-( :\'( :&apos;-(', 'crysad.png' ], [ ':-/', 'doubt.png' ], [ ':-X :X', 'zip.png' ], [ ':yes:', 'thumbsup.png' ], [ ':no:', 'thumbsdown.png' ], [ ':beer:', 'beer.png' ], [ ':devil:', 'devil.png' ], [ ':kiss: :kissing:', 'kissing.png' ], [ '@->-- :rose: @->--', 'rose.png' ], [ ':music:', 'music.png' ], [ ':love:', 'love.png' ], [ ':zzz:', 'tired.png' ] ], /** * Creates application skeleton. @@ -719,12 +723,15 @@ var jsxc; init: function() { $('body').append($(jsxc.gui.template.get('windowList'))); + jsxc.gui.tooltip('#jsxc_windowList'); + jsxc.gui.roster.init(); // prepare regexp for emotions $.each(jsxc.gui.emotions, function(i, val) { + // escape characters var reg = val[0].replace(/(\/|\||\*|\.|\+|\?|\^|\$|\(|\)|\[|\]|\{|\})/g, '\\$1'); - reg = '(' + reg.split(' ').join(')|(') + ')'; + reg = '(' + reg.split(' ').join('|') + ')'; jsxc.gui.emotions[i][2] = new RegExp(reg, 'g'); }); @@ -734,6 +741,23 @@ var jsxc; }, /** + * Init tooltip plugin for given jQuery selector. + * + * @param {String} selector jQuery selector + * @memberOf jsxc.gui + */ + tooltip: function(selector) { + $(selector).tooltip({ + show: { + delay: 600 + }, + content: function() { + return $(this).attr('title').replace(/\n/g, '<br />'); + } + }); + }, + + /** * Updates Information in roster and chatbar * * @param {String} cid CSS compatible jid @@ -784,14 +808,14 @@ var jsxc; if (data.trust) { we.find('.jsxc_transfer').addClass('jsxc_trust').attr('title', jsxc.l.your_buddy_is_verificated); } else { - we.find('.jsxc_transfer').removeClass('jsxc_trust').attr('title', ''); + we.find('.jsxc_transfer').removeClass('jsxc_trust'); } // update gui according to subscription state if (data.sub && data.sub !== 'both') { - ri.addClass('jsxc_oneway'); + ue.addClass('jsxc_oneway'); } else { - ri.removeClass('jsxc_oneway'); + ue.removeClass('jsxc_oneway'); } var info = '<b>' + Strophe.getBareJidFromJid(data.jid) + '</b>\n'; @@ -967,9 +991,7 @@ var jsxc; return; } - jsxc.gui.dialog.open(jsxc.gui.template.get('authenticationDialog', cid), { - 'noClose': true - }); + jsxc.gui.dialog.open(jsxc.gui.template.get('authenticationDialog', cid)); // Add handler @@ -1112,7 +1134,7 @@ var jsxc; } }); - $('#jsxc_dialog .creation').click(function() { + $('#jsxc_dialog form').submit(function() { var username = $('#jsxc_username').val(); var alias = $('#jsxc_alias').val(); @@ -1133,6 +1155,8 @@ var jsxc; jsxc.xmpp.addBuddy(username, alias); jsxc.gui.dialog.close(); + + return false; }); }, @@ -1269,6 +1293,146 @@ var jsxc; }, /** + * Show vCard of user with the given bar jid. + * + * @memberOf jsxc.gui + * @param {String} bjid Bar jid + */ + showVcard: function(bjid) { + jsxc.gui.dialog.open(jsxc.gui.template.get('vCard', jsxc.jidToCid(bjid))); + + var printProp = function(el, depth) { + var content = ''; + + el.each(function() { + var item = $(this); + var children = $(this).children(); + + content += '<li>'; + + var prop = jsxc.translate('%%' + item[0].tagName + '%%'); + + if (prop !== ' ') { + content += '<strong>' + prop + ':</strong> '; + } + + if (item[0].tagName === 'PHOTO') { + + } else if (children.length > 0) { + content += '<ul>'; + content += printProp(children, depth + 1); + content += '</ul>'; + } else if (item.text() !== '') { + content += jsxc.escapeHTML(item.text()); + } + + content += '</li>'; + + if (depth === 0 && $('#jsxc_dialog ul.jsxc_vCard').length > 0) { + $('#jsxc_dialog ul.jsxc_vCard').append(content); + content = ''; + } + }); + + if (depth > 0) { + return content; + } + }; + + var failedToLoad = function() { + if ($('#jsxc_dialog ul.jsxc_vCard').length === 0) { + return; + } + + $('#jsxc_dialog p').remove(); + + var content = '<p>'; + content += jsxc.translate('%%Sorry, we couldn\'t load any vCard.%%'); + content += '</p>'; + + $('#jsxc_dialog').append(content); + }; + + jsxc.xmpp.conn.vcard.get(function(stanza) { + + if ($('#jsxc_dialog ul.jsxc_vCard').length === 0) { + return; + } + + if ($(stanza).find('vCard').length === 0) { + failedToLoad(); + return; + } + + $('#jsxc_dialog p').remove(); + + var photo = $(stanza).find("vCard > PHOTO"); + + if (photo.length > 0) { + var img = photo.find('BINVAL').text(); + var type = photo.find('TYPE').text(); + var src = 'data:' + type + ';base64,' + img; + + $('#jsxc_dialog h3').prepend('<img class="jsxc_vCard" src="' + src + '" alt="avatar" />'); + } + + printProp($(stanza).find('vcard > *'), 0); + + }, bjid, failedToLoad); + }, + + showSettings: function() { + jsxc.gui.dialog.open(jsxc.gui.template.get('settings')); + + $('#jsxc_dialog form').each(function() { + var self = $(this); + + self.find('input[type!="submit"]').each(function() { + var id = this.id.split("-"); + var prop = id[0]; + var key = id[1]; + + var data = jsxc.options.get(prop); + + if (data && data[key]) { + $(this).val(data[key]); + } + }); + }); + + $('#jsxc_dialog form').submit(function() { + + var self = $(this); + var data = {}; + + self.find('input[type!="submit"]').each(function() { + var id = this.id.split("-"); + var prop = id[0]; + var key = id[1]; + var val = $(this).val(); + + if (!data[prop]) { + data[prop] = {}; + } + + data[prop][key] = val; + }); + + $.each(data, function(key, val) { + jsxc.options.set(key, val); + }); + + setTimeout(function() { + self.find('input[type="submit"]').effect('highlight', { + color: 'green' + }, 4000); + }, 200); + + return false; + }); + }, + + /** * Change own presence to pres. * * @memberOf jsxc.gui @@ -1337,6 +1501,10 @@ var jsxc; $('#jsxc_buddylist').addClass('jsxc_hideOffline'); } + $('#jsxc_menu .jsxc_settings').click(function() { + jsxc.gui.showSettings(); + }); + $('#jsxc_menu .jsxc_hideOffline').click(function() { var hideOffline = !jsxc.options.get('hideOffline'); @@ -1418,14 +1586,7 @@ var jsxc; jsxc.gui.updateAvatar($('#jsxc_avatar'), jsxc.storage.getItem('jid'), 'own'); }); - $('#jsxc_roster').tooltip({ - show: { - delay: 600 - }, - content: function() { - return $(this).attr('title').replace(/\n/g, '<br />'); - } - }); + jsxc.gui.tooltip('#jsxc_roster'); jsxc.notice.load(); @@ -1447,6 +1608,10 @@ var jsxc; jsxc.gui.window.open(cid); }); + bud.find('.jsxc_chaticon').click(function() { + jsxc.gui.window.open(cid); + }); + bud.find('.jsxc_rename').click(function() { jsxc.gui.roster.rename(cid); return false; @@ -1457,12 +1622,28 @@ var jsxc; return false; }); + bud.find('.jsxc_avatar').click(function() { + bud.trigger('extra.jsxc'); + + bud.toggleClass('jsxc_expand'); + + jsxc.gui.updateAvatar(bud, data.jid, data.avatar); + return false; + }); + + bud.find('.jsxc_vcardicon').click(function() { + jsxc.gui.showVcard(data.jid); + return false; + }); + jsxc.gui.update(cid); // update scrollbar $('#jsxc_buddylist').slimScroll({ scrollTo: '0px' }); + + $(document).trigger('add.roster.jsxc', [ cid, data, bud ]); }, /** @@ -1638,9 +1819,27 @@ var jsxc; $('#jsxc_roster .slimScrollDiv').remove(); $('#jsxc_roster > .jsxc_bottom').remove(); - $('#jsxc_roster').append($(document.createElement('p')).text(jsxc.l.no_connection).append($(document.createElement('a')).attr('href', '#').text(jsxc.l.relogin).click(function() { + $('#jsxc_roster').append($('<p>' + jsxc.l.no_connection + '</p>').append(' <a>' + jsxc.l.relogin + '</a>').click(function() { jsxc.gui.showLoginBox(); - }))); + })); + }, + + /** + * Shows a text with link to add a new buddy. + * + * @memberOf jsxc.gui.roster + */ + empty: function() { console.trace(); + var text = $('<p>' + jsxc.l.Your_roster_is_empty_add_a + '</p>'); + var link = $('<a>' + jsxc.l.new_buddy + '</a>'); + + link.click(function() { + jsxc.gui.showContactDialog(); + }); + text.append(link); + text.append('.'); + + $('#jsxc_roster').prepend(text); } }; @@ -1771,6 +1970,10 @@ var jsxc; jsxc.gui.window.clear(cid); }); + win.find('.jsxc_tools').click(function() { + return false; + }); + win.find('.jsxc_textinput').keyup(function(ev) { var body = $(this).val(); @@ -1792,11 +1995,11 @@ var jsxc; }); win.find('.jsxc_textarea').slimScroll({ - height: '200px', + height: '234px', distance: '3px' }); - win.find('.jsxc_window').hide(); + win.find('.jsxc_fade').hide(); win.find('.jsxc_name').disableSelection(); @@ -1820,6 +2023,18 @@ var jsxc; } } + $.each(jsxc.gui.emotions, function(i, val) { + var ins = val[0].split(' ')[0]; + var li = $('<li><img alt="' + ins + '" title="' + ins + '" src="' + jsxc.options.root + '/img/emotions/' + val[1] + '"/></li>'); + li.click(function() { + win.find('input').val(win.find('input').val() + ins); + win.find('input').focus(); + }); + win.find('.jsxc_emoticons ul').append(li); + }); + + jsxc.gui.toggleList.call(win.find('.jsxc_emoticons')); + jsxc.gui.window.restoreChat(cid); jsxc.gui.update(cid); @@ -1886,7 +2101,7 @@ var jsxc; * @param {String} cid CSS compatible jid */ toggle: function(cid) { - if (jsxc.gui.getWindow(cid).find('.jsxc_window').is(':hidden')) { + if (jsxc.gui.getWindow(cid).find('.jsxc_fade').is(':hidden')) { jsxc.gui.window.show(cid); } else { jsxc.gui.window.hide(cid); @@ -1913,7 +2128,8 @@ var jsxc; */ _show: function(cid) { var win = jsxc.gui.getWindow(cid); - $('#jsxc_window_' + cid + ' .jsxc_window').slideDown(); + $('#jsxc_window_' + cid + ' .jsxc_fade').slideDown(); + win.removeClass('jsxc_min'); // remove unread flag win.removeClass('jsxc_unreadMsg'); @@ -1945,7 +2161,9 @@ var jsxc; * @param {String} cid */ _hide: function(cid) { - $('#jsxc_window_' + cid + ' .jsxc_window').slideUp(); + $('#jsxc_window_' + cid + ' .jsxc_fade').slideUp(); + $('#jsxc_window_' + cid).addClass('jsxc_min'); + jsxc.gui.getWindow(cid).trigger('hidden.window.jsxc'); }, @@ -1955,9 +2173,13 @@ var jsxc; * @param {type} cid */ highlight: function(cid) { - $('#jsxc_window_' + cid + ' ').effect('highlight', { - color: 'orange' - }, 2000); + var el = $('#jsxc_window_' + cid + ' .jsxc_bar'); + + if (!el.is(':animated')) { + el.effect('highlight', { + color: 'orange' + }, 2000); + } }, /** @@ -2031,7 +2253,7 @@ var jsxc; } if (direction === 'out' && jsxc.master) { - jsxc.buddyList[cid].sendMsg(msg, uid); + jsxc.buddyList[cid].sendMsg(html_msg, uid); } jsxc.gui.window._postMessage(cid, post); @@ -2070,7 +2292,17 @@ var jsxc; }); $.each(jsxc.gui.emotions, function(i, val) { - msg = msg.replace(val[2], '<img alt="$1" title="$1" src="' + jsxc.options.root + '/img/emotions/' + val[1] + '"/>'); + msg = msg.replace(val[2], function(match, p1) { + + // escape value for alt and title, this prevents double + // replacement + var esc = '', i; + for (i = 0; i < p1.length; i++) { + esc += '&#' + p1.charCodeAt(i) + ';'; + } + + return '<img alt="' + esc + '" title="' + esc + '" src="' + jsxc.options.root + '/img/emotions/' + val[1] + '"/>'; + }); }); var msgDiv = $("<div>"); @@ -2082,12 +2314,16 @@ var jsxc; msgDiv.addClass('jsxc_received'); } + if (direction === 'sys') { + $('#jsxc_window_' + cid + ' .jsxc_textarea').append('<div style="clear:both"/>'); + } + $('#jsxc_window_' + cid + ' .jsxc_textarea').append(msgDiv); jsxc.gui.window.scrollDown(cid); // if window is hidden set unread flag - if (win.find('.jsxc_window').is(':hidden') && jsxc.restoreCompleted && !restore) { + if (win.find('.jsxc_fade').is(':hidden') && jsxc.restoreCompleted && !restore) { win.addClass('jsxc_unreadMsg'); jsxc.storage.updateUserItem('window_' + cid, 'unread', true); } @@ -2219,33 +2455,38 @@ var jsxc; <p class="jsxc_right"><a href="#" class="button jsxc_close">%%Close%%</a> <a href="#" class="button creation">%%Compare%%</a></p>\ </div>', fingerprintsDialog: '<div>\ + <p class="jsxc_maxWidth">%%A_fingerprint_%%</p>\ <p><strong>%%Your_fingerprint%%</strong><br />\ <span style="text-transform:uppercase">{{my_priv_fingerprint}}</span></p>\ <p><strong>%%Buddy_fingerprint%%</strong><br />\ <span style="text-transform:uppercase">{{cid_priv_fingerprint}}</span></p><br />\ <p class="jsxc_right"><a href="#" class="button jsxc_close">%%Close%%</a></p>\ </div>', - chatWindow: '<li>\ - <div class="jsxc_bar">\ - <div class="jsxc_avatar">☺</div>\ - <div class="jsxc_name"/>\ - <div class="jsxc_cycle"/>\ - </div>\ + chatWindow: '<li class="jsxc_min">\ <div class="jsxc_window">\ - <div class="jsxc_tools">\ - <div class="jsxc_settings">\ - <ul>\ - <li class="jsxc_fingerprints">%%Fingerprints%%</li>\ - <li class="jsxc_verification">%%Authentifikation%%</li>\ - <li class="jsxc_transfer">%%start_private%%</li>\ - <li class="jsxc_clear">%%clear_history%%</li>\ - </ul>\ - </div>\ - <div class="jsxc_transfer"/>\ - <div class="jsxc_close">X</div>\ + <div class="jsxc_bar">\ + <div class="jsxc_avatar">☺</div>\ + <div class="jsxc_tools">\ + <div class="jsxc_settings">\ + <ul>\ + <li class="jsxc_fingerprints">%%Fingerprints%%</li>\ + <li class="jsxc_verification">%%Authentifikation%%</li>\ + <li class="jsxc_transfer">%%start_private%%</li>\ + <li class="jsxc_clear">%%clear_history%%</li>\ + </ul>\ + </div>\ + <div class="jsxc_transfer"/>\ + <div class="jsxc_close">×</div>\ + </div>\ + <div class="jsxc_name"/>\ + <div class="jsxc_cycle"/>\ + </div>\ + <div class="jsxc_fade">\ + <div class="jsxc_gradient"/>\ + <div class="jsxc_textarea"/>\ + <div class="jsxc_emoticons"><ul/></div>\ + <input type="text" class="jsxc_textinput" placeholder="...%%Message%%" />\ </div>\ - <div class="jsxc_textarea"/>\ - <input type="text" class="jsxc_textinput jsxc_chatmessage jsxc_out" placeholder="...%%Message%%"/>\ </div>\ </li>', roster: '<div id="jsxc_roster">\ @@ -2257,6 +2498,7 @@ var jsxc; <div id="jsxc_menu">\ <span></span>\ <ul>\ + <li class="jsxc_settings">%%Settings%%</li>\ <li class="jsxc_muteNotification">%%Mute%%</li>\ <li class="jsxc_addBuddy">%%Add_buddy%%</li>\ <li class="jsxc_hideOffline">%%Hide offline%%</li>\ @@ -2287,11 +2529,15 @@ var jsxc; </div>', rosterBuddy: '<li>\ <div class="jsxc_avatar">☺</div>\ - <div class="jsxc_options">\ + <div class="jsxc_name"/>\ + <div class="jsxc_options jsxc_right">\ <div class="jsxc_rename" title="%%rename_buddy%%">✎</div>\ <div class="jsxc_delete" title="%%delete_buddy%%">✘</div>\ </div>\ - <div class="jsxc_name"/>\ + <div class="jsxc_options jsxc_left">\ + <div class="jsxc_chaticon" title="%%send_message%%"/>\ + <div class="jsxc_vcardicon" title="%%get_info%%">i</div>\ + </div>\ </li>', loginBox: '<h3>%%Login%%</h3>\ <form method="get">\ @@ -2306,13 +2552,15 @@ var jsxc; </form>', contactDialog: '<h3>%%Add_buddy%%</h3>\ <p class=".jsxc_explanation">%%Type_in_the_full_username_%%</p>\ + <form>\ <p><label for="jsxc_username">* %%Username%%:</label>\ - <input type="text" name="username" id="jsxc_username" required="required" /></p>\ + <input type="email" name="username" id="jsxc_username" required="required" /></p>\ <p><label for="jsxc_alias">%%Alias%%:</label>\ <input type="text" name="alias" id="jsxc_alias" /></p>\ <p class="jsxc_right">\ - <a href="#" class="button jsxc_close">%%Close%%</a> <a href="#" class="button creation">%%Add%%</a>\ - </p>', + <input class="button" type="submit" value="%%Add%%" />\ + </p>\ + <form>', approveDialog: '<h3>%%Subscription_request%%</h3>\ <p>%%You_have_a_request_from%% <b class="jsxc_their_jid"></b>.</p>\ <p class="jsxc_right"><a href="#" class="button jsxc_deny">%%Deny%%</a> <a href="#" class="button creation jsxc_approve">%%Approve%%</a></p>', @@ -2347,7 +2595,23 @@ var jsxc; <br />\ <b>Credential: </b> <a href="http://www.beepzoid.com/old-phones/" target="_blank">David English (Ringtone)</a>,\ <a href="https://soundcloud.com/freefilmandgamemusic/ping-1?in=freefilmandgamemusic/sets/free-notification-sounds-and" target="_blank">CameronMusic (Ping)</a></p>\ - <p class="jsxc_right"><a class="button jsxc_debuglog" href="#">Show debug log</a></p>' + <p class="jsxc_right"><a class="button jsxc_debuglog" href="#">Show debug log</a></p>', + vCard: '<h3>vCard %%from%% {{cid_name}}</h3>\ + <ul class="jsxc_vCard"></ul>\ + <p><img src="{{root}}/img/loading.gif" alt="wait" width="32px" height="32px" /> %%Please_wait%%...</p>', + settings: '<h3>%%User_settings%%</h3>\ + <p></p>\ + <form>\ + <fieldset class="jsxc_fieldsetPriority">\ + <legend>%%Priority%%</legend>\ + <label for="priority-online">%%Online%%</label><input type="number" value="0" id="priority-online" min="-128" max="127" step="1" required="required"/>\ + <label for="priority-chat">%%Chatty%%</label><input type="number" value="0" id="priority-chat" min="-128" max="127" step="1" required="required"/>\ + <label for="priority-away">%%Away%%</label><input type="number" value="0" id="priority-away" min="-128" max="127" step="1" required="required"/>\ + <label for="priority-xa">%%Extended_away%%</label><input type="number" value="0" id="priority-xa" min="-128" max="127" step="1" required="required"/>\ + <label for="priority-dnd">%%dnd%%</label><input type="number" value="0" id="priority-dnd" min="-128" max="127" step="1" required="required"/>\ + <input type="submit" value="%%Save%%"/>\ + </fieldset>\ + </form>' }; /** @@ -2530,6 +2794,8 @@ var jsxc; // pres first after roster is ready $(document).one('cloaded.roster.jsxc', jsxc.xmpp.sendPres); + $('#jsxc_roster > p:first').remove(); + var iq = $iq({ type: 'get' }).c('query', { @@ -2579,8 +2845,8 @@ var jsxc; pres.c('show').t(presState).up(); } - var priority = jsxc.storage.getUserItem('priority'); - if (priority !== null) { + var priority = jsxc.options.get('priority'); + if (priority && typeof priority[presState] !== 'undefined' && parseInt(priority[presState]) !== 0) { pres.c('priority').t(priority[presState]).up(); } @@ -2683,6 +2949,10 @@ var jsxc; jsxc.gui.roster.add(cid); }); + if(buddies.length === 0) { + jsxc.gui.roster.empty(); + } + jsxc.storage.setUserItem('buddylist', buddies); jsxc.debug('Roster loaded'); @@ -2756,6 +3026,12 @@ var jsxc; } } }); + + if (!jsxc.storage.getUserItem('buddylist') || jsxc.storage.getUserItem('buddylist').length === 0) { + jsxc.gui.roster.empty(); + } else { + $('#jsxc_roster > p:first').remove(); + } // preserve handler return true; @@ -3603,7 +3879,7 @@ var jsxc; data.fingerprint = jsxc.buddyList[cid].their_priv_pk.fingerprint(); data.msgstate = OTR.CONST.MSGSTATE_ENCRYPTED; - var msg = (jsxc.buddyList[cid].trust ? jsxc.l.Verified : jsxc.l.Unverified) + ' ' + jsxc.l.private_conversation_started + data.jid; + var msg = (jsxc.buddyList[cid].trust ? jsxc.l.Verified : jsxc.l.Unverified) + ' ' + jsxc.l.private_conversation_started; jsxc.gui.window.postMessage(cid, 'sys', msg); break; case OTR.CONST.STATUS_END_OTR: @@ -3856,7 +4132,7 @@ var jsxc; // try to create web-worker try { - worker = new Worker(jsxc.options.root + '/js/jsxc/lib/otr/build/dsa-webworker.js'); + worker = new Worker(jsxc.options.root + '/lib/otr/build/dsa-webworker.js'); } catch (err) { jsxc.warn('Couldn\'t create web-worker.', err); } @@ -3882,7 +4158,7 @@ var jsxc; // start worker worker.postMessage({ - imports: [ jsxc.options.root + '/js/jsxc/lib/otr/vendor/salsa20.js', jsxc.options.root + '/js/jsxc/lib/otr/vendor/bigint.js', jsxc.options.root + '/js/jsxc/lib/otr/vendor/crypto.js', jsxc.options.root + '/js/jsxc/lib/otr/vendor/eventemitter.js', jsxc.options.root + '/js/jsxc/lib/otr/lib/const.js', jsxc.options.root + '/js/jsxc/lib/otr/lib/helpers.js', jsxc.options.root + '/js/jsxc/lib/otr/lib/dsa.js' ], + imports: [ jsxc.options.root + '/lib/otr/vendor/salsa20.js', jsxc.options.root + '/lib/otr/vendor/bigint.js', jsxc.options.root + '/lib/otr/vendor/crypto.js', jsxc.options.root + '/lib/otr/vendor/eventemitter.js', jsxc.options.root + '/lib/otr/lib/const.js', jsxc.options.root + '/lib/otr/lib/helpers.js', jsxc.options.root + '/lib/otr/lib/dsa.js' ], seed: BigInt.getSeed(), debug: true }); @@ -4314,7 +4590,7 @@ var jsxc; trying_to_start_private_conversation: 'Trying to start private conversation!', Verified: 'Verified', Unverified: 'Unverified', - private_conversation_started: 'private conversation started with ', + private_conversation_started: 'private conversation started.', private_conversation_aborted: 'Private conversation aborted!', your_buddy_closed_the_private_conversation_you_should_do_the_same: 'Your buddy closed the private conversation! You should do the same.', conversation_is_now_verified: 'Conversation is now verified.', @@ -4368,6 +4644,9 @@ var jsxc; New_message_from: 'New message from', Should_we_notify_you_: 'Should we notify you about new messages in the future?', Please_accept_: 'Please click the "Allow" button at the top.', + Hide_offline: 'Hide offline', + Show_offline: 'Show offline', + About: 'About', dnd: 'Do Not Disturb', Mute: 'Mute', Unmute: 'Unmute', @@ -4392,7 +4671,41 @@ var jsxc; Confirm: 'Confirm', Dismiss: 'Dismiss', Remove: 'Remove', - Online_help: 'Online help' + Online_help: 'Online help', + FN: 'Full Name', + N: ' ', + FAMILY: 'Family Name', + GIVEN: 'Given Name', + NICKNAME: 'Nickname', + URL: 'URL', + ADR: 'Address', + STREET: 'Street Address', + EXTADD: 'Extended Address', + LOCALITY: 'Locality', + REGION: 'Region', + PCODE: 'Postal Code', + CTRY: 'Country', + TEL: 'Telephone', + NUMBER: 'Number', + EMAIL: 'Email', + USERID: ' ', + ORG: 'Organization', + ORGNAME: 'Name', + ORGUNIT: 'Unit', + TITLE: 'Job Title', + ROLE: 'Role', + BDAY: 'Birthday', + DESC: 'Description', + PHOTO: ' ', + send_message: 'send message', + get_info: 'get info', + Settings: 'Settings', + Priority: 'Priority', + Save: 'Save', + User_settings: 'User settings', + A_fingerprint_: 'A fingerprint is used to make sure that the person you are talking to is who he or she is saying.', + Your_roster_is_empty_add_a: 'Your roster is empty, add a ', + new_buddy: 'new buddy' }, de: { please_wait_until_we_logged_you_in: 'Bitte warte bis wir dich eingeloggt haben.', @@ -4413,7 +4726,7 @@ var jsxc; trying_to_start_private_conversation: 'Versuche private Konversation zu starten.', Verified: 'Verifiziert', Unverified: 'Unverifiziert', - private_conversation_started: 'Private Konversation gestartet mit ', + private_conversation_started: 'Private Konversation gestartet.', private_conversation_aborted: 'Private Konversation abgebrochen.', your_buddy_closed_the_private_conversation_you_should_do_the_same: 'Dein Freund hat die private Konversation beendet. Das solltest du auch tun!', conversation_is_now_verified: 'Konversation ist jetzt verifiziert', @@ -4495,7 +4808,115 @@ var jsxc; Confirm: 'Bestätigen', Dismiss: 'Ablehnen', Remove: 'Löschen', - Online_help: 'Online Hilfe' + Online_help: 'Online Hilfe', + Settings: 'Einstellungen', + Priority: 'Priorität', + Save: 'Speichern', + User_settings: 'Benutzereinstellungen', + A_fingerprint_: 'Ein Fingerabdruck wird dazu benutzt deinen Gesprächspartner zu identifizieren.' + }, + es: { + please_wait_until_we_logged_you_in: 'Por favor, espere...', + your_connection_is_unencrypted: 'Su conexión no está cifrada.', + your_connection_is_encrypted: 'Su conexión está cifrada.', + your_buddy_closed_the_private_connection: 'Su amigo ha cerrado la conexión privada.', + start_private: 'Iniciar privado', + close_private: 'Cerrar privado', + your_buddy_is_verificated: 'Tu amigo está verificado.', + you_have_only_a_subscription_in_one_way: 'Sólo tienes una suscripción de un modo.', + verification_query_sent: 'Consulta de verificación enviada.', + your_message_wasnt_send_please_end_your_private_conversation: 'Su mensaje no fue enviado. Por favor, termine su conversación privada.', + unencrypted_message_received: 'Mensaje no cifrado recibido:', + your_message_wasnt_send_because_you_have_no_valid_subscription: 'Su mensaje no se ha enviado, porque usted no tiene suscripción válida.', + no_available: 'No disponible', + no_connection: 'Sin conexión!', + relogin: 'iniciar sesión nuevamente', + trying_to_start_private_conversation: 'Intentando iniciar una conversación privada!', + Verified: 'Verificado', + Unverified: 'No verificado', + private_conversation_started: 'se inició una conversación privada.', + private_conversation_aborted: 'Conversación privada abortada!', + your_buddy_closed_the_private_conversation_you_should_do_the_same: 'Su amigo cerró la conversación privada! Usted debería hacer lo mismo.', + conversation_is_now_verified: 'La conversación es ahora verificada.', + verification_fails: 'Fallo la verificación.', + your_buddy_is_attempting_to_determine_: 'Tu amigo está tratando de determinar si él o ella está realmente hablando con usted.', + to_authenticate_to_your_buddy: 'Para autenticar a su amigo, ', + enter_the_answer_and_click_answer: 'introduce la respuesta y haga clic en Contestar.', + enter_the_secret: 'especifique el secreto.', + now_we_will_create_your_private_key_: 'Ahora vamos a crear su clave privada. Esto puede tomar algún tiempo.', + Authenticating_a_buddy_helps_: 'Autenticación de un amigo ayuda a garantizar que la persona que está hablando es quien él o ella está diciendo.', + How_do_you_want_to_authenticate_your_buddy: '¿Cómo desea autenticar {{cid_name}} (<b>{{cid_jid}}</b>)?', + Select_method: 'Escoja un método...', + Manual: 'Manual', + Question: 'Pregunta', + Secret: 'Secreto', + To_verify_the_fingerprint_: 'Para verificar la firma digital, póngase en contacto con su amigo a través de algún otro canal autenticado, como el teléfono.', + Your_fingerprint: 'Tu firma digital', + Buddy_fingerprint: 'firma digital de tu amigo', + Close: 'Cerrar', + Compared: 'Comparado', + To_authenticate_using_a_question_: 'Para autenticar mediante una pregunta, elegir una pregunta cuya respuesta se conoce sólo usted y su amigo.', + Ask: 'Preguntar', + To_authenticate_pick_a_secret_: 'Para autenticar, elija un secreto conocido sólo por usted y su amigo.', + Compare: 'Comparar', + Fingerprints: 'Firmas digitales', + Authentifikation: 'Autenticación', + Message: 'Mensaje', + Add_buddy: 'Añadir amigo', + rename_buddy: 'renombrar amigo', + delete_buddy: 'eliminar amigo', + Login: 'Iniciar Sesión', + Username: 'Usuario', + Password: 'Contraseña', + Cancel: 'Cancelar', + Connect: 'Conectar', + Type_in_the_full_username_: 'Escriba el usuario completo y un alias opcional.', + Alias: 'Alias', + Add: 'Añadir', + Subscription_request: 'Solicitud de suscripción', + You_have_a_request_from: 'Tienes una petición de', + Deny: 'Rechazar', + Approve: 'Aprobar', + Remove_buddy: 'Eliminar amigo', + You_are_about_to_remove_: 'Vas a eliminar a {{cid_name}} (<b>{{cid_jid}}</b>) de tu lista de amigos. Todas las conversaciones relacionadas serán cerradas.', + Continue: 'Continuar', + Please_wait: 'Espere por favor', + Login_failed: 'Fallo el inicio de sesión', + Sorry_we_cant_authentikate_: 'Lo sentimos, no podemos autentificarlo en nuestro servidor de chat. ¿Tal vez la contraseña es incorrecta?', + Retry: 'Reintentar', + clear_history: 'Borrar el historial', + New_message_from: 'Nuevo mensaje de', + Should_we_notify_you_: '¿Debemos notificarle sobre nuevos mensajes en el futuro?', + Please_accept_: 'Por favor, haga clic en el botón "Permitir" en la parte superior.', + dnd: 'No Molestar', + Mute: 'Desactivar sonido', + Unmute: 'Activar sonido', + Subscription: 'Suscripción', + both: 'ambos', + Status: 'Estado', + online: 'en línea', + chat: 'chat', + away: 'ausente', + xa: 'mas ausente', + offline: 'desconectado', + none: 'nadie', + Unknown_instance_tag: 'Etiqueta de instancia desconocida.', + Not_of_our_latest_keys: 'No de nuestra ultima tecla.', + Received_an_unreadable_encrypted_message: 'Se recibió un mensaje cifrado ilegible.', + Online: 'En linea', + Chatty: 'Hablador', + Away: 'Ausente', + Extended_away: 'Mas ausente', + Offline: 'Desconectado', + Friendship_request: 'Solicitud de amistad', + Confirm: 'Confirmar', + Dismiss: 'Rechazar', + Remove: 'Eliminar', + Online_help: 'Ayuda en línea', + Settings: 'Ajustes', + Priority: 'Prioridad', + Save: 'Guardar', + User_settings: 'Configuración de usuario' } }; }(jQuery)); diff --git a/build/jsxc.lib.webrtc.js b/build/jsxc.lib.webrtc.js index 8f086784..52087538 100644 --- a/build/jsxc.lib.webrtc.js +++ b/build/jsxc.lib.webrtc.js @@ -1,5 +1,5 @@ /** - * jsxc v0.7.2 - 2014-05-28 + * jsxc v0.8.0-beta - 2014-06-27 * * Copyright (c) 2014 Klaus Herberth <klaus@jsxc.org> <br> * Released under the MIT license @@ -7,7 +7,7 @@ * Please see http://www.jsxc.org/ * * @author Klaus Herberth <klaus@jsxc.org> - * @version 0.7.2 + * @version 0.8.0-beta */ /* jsxc, Strophe, SDPUtil, getUserMediaWithConstraints, setupRTC, jQuery */ @@ -173,6 +173,32 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\ }, /** + * Add "video" button to roster + * + * @private + * @memberOf jsxc.webrtc + * @param event + * @param cid cid of roster item + * @param data data wich belongs to cid + * @param el the roster item + */ + onAddRosterItem: function(event, cid, data, el) { + var self = jsxc.webrtc; + var videoIcon = $('<div class="jsxc_video jsxc_disabled" title="' + jsxc.l.Start_video_call + '"></div>'); +console.log(data); + videoIcon.click(function() { + self.startCall(data.jid); + return false; + }); + + el.find('.jsxc_options.jsxc_left').append(videoIcon); + + el.on('extra.jsxc', function() { + self.updateIcon(cid); + }); + }, + + /** * Add "video" button to window menu. * * @private @@ -193,27 +219,26 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\ var div = $('<div>').addClass('jsxc_video'); win.find('.jsxc_transfer:eq(1)').after(div); - self.updateWindow(win); + self.updateIcon(jsxc.jidToCid(win.data('jid'))); }, /** - * Enable or disable "video" button and assign full jid. + * Enable or disable "video" icon and assign full jid. * * @memberOf jsxc.webrtc - * @param win jQuery window object + * @param cid CSS conform jid */ - updateWindow: function(win) { - if (!win || win.length === 0) { - return; - } + updateIcon: function(cid) { var self = jsxc.webrtc; - var jid = win.data('jid'); - var li = win.find('.jsxc_video'); + var win = jsxc.gui.getWindow(cid); + var jid = win.data('jid') || jsxc.storage.getUserItem('buddy_' + cid).jid; + + var el = win.find('.jsxc_video').add('#' + cid + ' .jsxc_video'); // only start video call to a full jid if (Strophe.getResourceFromJid(jid) === null) { - var cid = jsxc.jidToCid(jid); + var res = jsxc.storage.getUserItem('buddy_' + cid).res; if (Array.isArray(res) && res.length === 1) { @@ -221,19 +246,19 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\ } } - li.off('click'); + el.off('click'); if (self.conn.caps.hasFeatureByJid(jid, self.reqVideoFeatures)) { - li.click(function() { + el.click(function() { self.startCall(jid); }); - li.removeClass('jsxc_disabled'); + el.removeClass('jsxc_disabled'); - li.attr('title', jsxc.translate('%%Start video call%%')); + el.attr('title', jsxc.translate('%%Start video call%%')); } else { - li.addClass('jsxc_disabled'); + el.addClass('jsxc_disabled'); - li.attr('title', jsxc.translate('%%Video call not possible.%%')); + el.attr('title', jsxc.translate('%%Video call not possible.%%')); } }, @@ -250,7 +275,7 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\ var bJid = Strophe.getBareJidFromJid(from); if (self.chatJids[bJid] !== from) { - self.updateWindow(jsxc.gui.getWindow(jsxc.jidToCid(bJid))); + self.updateIcon(jsxc.jidToCid(bJid)); self.chatJids[bJid] = from; } }, @@ -312,11 +337,8 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\ */ onCaps: function(event, jid) { var self = jsxc.webrtc; - var win = jsxc.gui.getWindow(jsxc.jidToCid(jid)); - if (win.length > 0) { - self.updateWindow(win); - } + self.updateIcon(jsxc.jidToCid(jid)); }, /** @@ -799,13 +821,14 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\ if (RTC !== null) { RTCPeerconnection = RTC.peerconnection; + $(document).on('add.roster.jsxc', jsxc.webrtc.onAddRosterItem); $(document).on('init.window.jsxc', jsxc.webrtc.initWindow); $(document).on('attached.jsxc', jsxc.webrtc.init); } }); $.extend(jsxc.l10n.en, { - Please_allow_access_to_microphone_and_camera: 'Please allow access to microphone and camera.', + Please_allow_access_to_microphone_and_camera: 'Please click the "Allow" button at the top, to allow access to microphone and camera.', Incoming_call: 'Incoming call', from: 'from', Do_you_want_to_accept_the_call_from: 'Do you want to accept the call from', @@ -826,7 +849,7 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\ }); $.extend(jsxc.l10n.de, { - Please_allow_access_to_microphone_and_camera: 'Bitte erlaube den Zugriff auf Kamera und Mikrofon.', + Please_allow_access_to_microphone_and_camera: 'Bitte klick auf den "Zulassen" Button oben, um den Zugriff auf Kamera und Mikrofon zu erlauben.', Incoming_call: 'Eingehender Anruf', from: 'von', Do_you_want_to_accept_the_call_from: 'Möchtest Du den Anruf annehmen von', @@ -845,4 +868,25 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\ Video_call_not_possible: 'Videoanruf nicht verfügbar', Start_video_call: 'Starte Videoanruf' }); + + $.extend(jsxc.l10n.es, { + Please_allow_access_to_microphone_and_camera: 'Por favor, permitir el acceso al micrófono y la cámara.', + Incoming_call: 'Llamada entrante', + from: 'de', + Do_you_want_to_accept_the_call_from: 'Desea aceptar la llamada de', + Reject: 'Rechazar', + Accept: 'Aceptar', + hang_up: 'colgar', + snapshot: 'instantánea', + mute_my_audio: 'silenciar mi audio', + pause_my_video: 'pausar mi vídeo', + fullscreen: 'pantalla completa', + Info: 'Info', + Local_IP: 'IP local', + Remote_IP: 'IP remota', + Local_Fingerprint: 'Firma digital local', + Remote_Fingerprint: 'Firma digital remota', + Video_call_not_possible: 'Llamada de vídeo no es posible', + Start_video_call: 'Iniciar llamada de vídeo' + }); }(jQuery)); diff --git a/build/jsxc.webrtc.css b/build/jsxc.webrtc.css index 79470ccf..06c908e2 100644 --- a/build/jsxc.webrtc.css +++ b/build/jsxc.webrtc.css @@ -115,17 +115,17 @@ div:fullscreen.jsxc_localvideo { .jsxc_chatarea { position: relative; - height: 255px; + height: 270px; display: none; background-color: #A4A4A4; } -.jsxc_chatarea ul { +.jsxc_chatarea > ul { position: absolute; left: 50%; top: 0px; - width: 200px; - height: 255px; + width: 250px; + height: 270px; list-style: none; padding: 0px; margin: 0px 0px 0px -100px; @@ -153,18 +153,21 @@ div:fullscreen.jsxc_localvideo { } div.jsxc_video { - padding: 3px; - width: 17px; - height: 17px; background-image: url('img/camera_icon_grey.svg'); background-repeat: no-repeat; background-position: center center; background-size: 15px 15px; - cursor: pointer; - float: left; +} + +div.jsxc_video:not(.jsxc_disabled):hover, #jsxc_buddylist .jsxc_options .jsxc_video { + background-image: url('img/camera_icon_white.svg'); } div.jsxc_video.jsxc_disabled { opacity: 0.5; - cursor: default; + cursor: default !important; +} + +#jsxc_buddylist .jsxc_options .jsxc_video.jsxc_disabled { + opacity: 0.2; }
\ No newline at end of file diff --git a/build/sound/Ping1.mp3 b/build/sound/Ping1.mp3 Binary files differnew file mode 100644 index 00000000..d429eee7 --- /dev/null +++ b/build/sound/Ping1.mp3 diff --git a/build/sound/Rotary-Phone6.mp3 b/build/sound/Rotary-Phone6.mp3 Binary files differnew file mode 100644 index 00000000..c978c8d1 --- /dev/null +++ b/build/sound/Rotary-Phone6.mp3 diff --git a/build/sound/credential b/build/sound/credential new file mode 100644 index 00000000..522d7cee --- /dev/null +++ b/build/sound/credential @@ -0,0 +1,11 @@ +Rotary-Phone6.mp3 +=== +Creator: David English +Source: http://www.beepzoid.com/old-phones/ +License: unknown + +Ping1.mp3 +=== +Creator: CameronMusic +Source: https://soundcloud.com/freefilmandgamemusic/ping-1?in=freefilmandgamemusic/sets/free-notification-sounds-and +License: cc 3.0, http://creativecommons.org/licenses/by/3.0/
\ No newline at end of file diff --git a/build/sound/incomingMessage.wav b/build/sound/incomingMessage.wav Binary files differnew file mode 100644 index 00000000..012dbab1 --- /dev/null +++ b/build/sound/incomingMessage.wav diff --git a/jsxc.lib.js b/jsxc.lib.js index 4fc27353..02acedd4 100755 --- a/jsxc.lib.js +++ b/jsxc.lib.js @@ -1388,7 +1388,7 @@ var jsxc; }); }); - $('#jsxc_dialog form').submit(function(e) { + $('#jsxc_dialog form').submit(function() { var self = $(this); var data = {}; diff --git a/jsxc.lib.webrtc.js b/jsxc.lib.webrtc.js index abf909cb..c772a948 100644 --- a/jsxc.lib.webrtc.js +++ b/jsxc.lib.webrtc.js @@ -173,9 +173,9 @@ jsxc.gui.template.videoWindow = '<div class="jsxc_webrtc">\ onAddRosterItem: function(event, cid, data, el) { var self = jsxc.webrtc; var videoIcon = $('<div class="jsxc_video jsxc_disabled" title="' + jsxc.l.Start_video_call + '"></div>'); - +console.log(data); videoIcon.click(function() { - self.startCall(jid); + self.startCall(data.jid); return false; }); diff --git a/package.json b/package.json index b4b2a5af..824798a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsxc", - "version": "0.7.2", + "version": "0.8.0-beta", "description": "Real-time chat app", "homepage": "http://www.jsxc.org/", "bugs": "https://github.com/sualko/jsxc/issues", |