Skip to content

Commit 208a5ac

Browse files
author
rvelices
committed
bug 2043: some Javascript errors in default theme (also makes the rating.js script async)
git-svn-id: http://piwigo.org/svn/trunk@7957 68402e56-0260-453c-a942-63ccdbb3a9ee
1 parent bad8030 commit 208a5ac

File tree

3 files changed

+83
-64
lines changed

3 files changed

+83
-64
lines changed

themes/default/js/rating.js

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ var gRatingOptions, gRatingButtons, gUserRating;
22

33
function makeNiceRatingForm(options)
44
{
5-
gRatingOptions = options || {};
5+
gRatingOptions = options;
66
var form = document.getElementById('rateForm');
77
if (!form) return; //? template changed
88

@@ -36,14 +36,11 @@ function makeNiceRatingForm(options)
3636
rateButton.parentNode.removeChild(rateButton.previousSibling);
3737

3838
pwgAddEventListener(rateButton, "click", updateRating);
39-
pwgAddEventListener(rateButton, "mouseout", resetRatingStarDisplay);
40-
pwgAddEventListener(rateButton, "mouseover", updateRatingStarDisplayEvt);
39+
pwgAddEventListener(rateButton, "mouseout", function() {updateRatingStarDisplay( gUserRating );});
40+
pwgAddEventListener(rateButton, "mouseover", function(e) {
41+
updateRatingStarDisplay( e.target ? e.target.initialRateValue : e.srcElement.initialRateValue);
42+
});
4143
}
42-
resetRatingStarDisplay();
43-
}
44-
45-
function resetRatingStarDisplay()
46-
{
4744
updateRatingStarDisplay( gUserRating );
4845
}
4946

@@ -53,12 +50,6 @@ function updateRatingStarDisplay(userRating)
5350
gRatingButtons[i].className = (userRating!=="" && userRating>=gRatingButtons[i].initialRateValue ) ? "rateButtonStarFull" : "rateButtonStarEmpty";
5451
}
5552

56-
function updateRatingStarDisplayEvt(e)
57-
{
58-
updateRatingStarDisplay(
59-
e.target ? e.target.initialRateValue : e.srcElement.initialRateValue);
60-
}
61-
6253
function updateRating(e)
6354
{
6455
var rateButton = e.target || e.srcElement;
@@ -89,4 +80,17 @@ function updateRating(e)
8980
}
9081
);
9182
return false;
92-
}
83+
}
84+
85+
(function() {
86+
if (typeof _pwgRatingAutoQueue!="undefined" && _pwgRatingAutoQueue.length)
87+
{
88+
for (var i=0; i<_pwgRatingAutoQueue.length; i++)
89+
makeNiceRatingForm(_pwgRatingAutoQueue[i]);
90+
}
91+
_pwgRatingAutoQueue = {
92+
push: function(opts) {
93+
makeNiceRatingForm(opts);
94+
}
95+
}
96+
})();

themes/default/js/scripts.js

Lines changed: 56 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@ function popuphelp(url)
2121
);
2222
}
2323

24-
Function.prototype.pwgBind = function() {
25-
var __method = this, object = arguments[0], args = Array.prototype.slice.call(arguments,1);
26-
return function() {
27-
return __method.apply(object, args.concat(arguments) );
28-
}
24+
function pwgBind(object, method) {
25+
var args = Array.prototype.slice.call(arguments,2);
26+
return function() {
27+
return method.apply(object, args.concat(Array.prototype.slice.call(arguments,0)) );
28+
}
2929
}
30+
3031
function PwgWS(urlRoot)
3132
{
3233
this.urlRoot = urlRoot;
@@ -39,106 +40,116 @@ function PwgWS(urlRoot)
3940
};
4041

4142
PwgWS.prototype = {
42-
4343
callService : function(method, parameters, options)
4444
{
4545
if (options)
4646
{
47-
for (var property in options)
48-
this.options[property] = options[property];
47+
for (var prop in options)
48+
this.options[prop] = options[prop];
4949
}
50-
try { this.transport = new XMLHttpRequest();}
50+
try { this.xhr = new XMLHttpRequest();}
5151
catch(e) {
52-
try { this.transport = new ActiveXObject('Msxml2.XMLHTTP'); }
52+
try { this.xhr = new ActiveXObject('Msxml2.XMLHTTP'); }
5353
catch(e) {
54-
try { this.transport = new ActiveXObject('Microsoft.XMLHTTP'); }
54+
try { this.xhr = new ActiveXObject('Microsoft.XMLHTTP'); }
5555
catch (e){
56-
dispatchError(0, "Cannot create request object");
56+
this.error(0, "Cannot create request object");
57+
return;
5758
}
5859
}
5960
}
60-
this.transport.onreadystatechange = this.onStateChange.pwgBind(this);
61+
this.xhr.onreadystatechange = pwgBind(this, this.onStateChange);
6162

6263
var url = this.urlRoot+"ws.php?format=json";
6364

6465
var body = "method="+method;
6566
if (parameters)
6667
{
67-
for (var property in parameters)
68+
for (var prop in parameters)
6869
{
69-
if ( typeof parameters[property] == 'object' && parameters[property])
70+
if ( typeof parameters[prop] == 'object' && parameters[prop])
7071
{
71-
for (var i=0; i<parameters[property].length; i++)
72-
body += "&"+property+"[]="+encodeURIComponent(parameters[property][i]);
72+
for (var i=0; i<parameters[prop].length; i++)
73+
body += "&"+prop+"[]="+encodeURIComponent(parameters[prop][i]);
7374
}
7475
else
75-
body += "&"+property+"="+encodeURIComponent(parameters[property]);
76+
body += "&"+prop+"="+encodeURIComponent(parameters[prop]);
7677
}
7778
}
7879

7980
if (this.options.method == "POST" )
80-
{
81-
this.transport.open(this.options.method, url, this.options.async);
82-
this.transport.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
83-
this.transport.send(body);
84-
}
81+
this.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
8582
else
8683
{
8784
url += "&"+body;
88-
this.transport.open(this.options.method, url, this.options.async);
89-
this.transport.send(null);
85+
body = null;
86+
}
87+
this.xhr.open(this.options.method, url, this.options.async);
88+
try {
89+
this.xhr.send(body);
90+
} catch(e) {
91+
this.error(0, e.message);
9092
}
9193
},
9294

9395
onStateChange: function() {
94-
var readyState = this.transport.readyState;
96+
var readyState = this.xhr.readyState;
9597
if (readyState==4)
96-
this.respondToReadyState(readyState);
98+
{
99+
try {
100+
this.respondToReadyState(readyState);
101+
} finally {
102+
this.cleanup();
103+
}
104+
}
97105
},
98106

99-
dispatchError: function( httpCode, text )
107+
error: function( httpCode, text )
100108
{
101109
!this.options.onFailure || this.options.onFailure( httpCode, text);
110+
this.cleanup();
102111
},
103112

104113
respondToReadyState: function(readyState)
105114
{
106-
var transport = this.transport;
107-
if (readyState==4 && transport.status == 200)
115+
var xhr = this.xhr;
116+
if (readyState==4 && xhr.status == 200)
108117
{
109118
var resp;
110119
try {
111-
eval('resp = ' + transport.responseText);
120+
resp = window.JSON && window.JSON.parse ? window.JSON.parse( xhr.responseText ) : (new Function("return " + xhr.responseText))();
112121
}
113122
catch (e) {
114-
this.dispatchError( 200, e.message + '\n' + transport.responseText.substr(0,512) );
123+
this.error( 200, e.message + '\n' + xhr.responseText.substr(0,512) );
115124
}
116125
if (resp!=null)
117126
{
118127
if (resp.stat==null)
119-
this.dispatchError( 200, "Invalid response" );
128+
this.error( 200, "Invalid response" );
120129
else if (resp.stat=='ok')
121-
{
122-
if (this.options.onSuccess) this.options.onSuccess( resp.result );
123-
}
130+
!this.options.onSuccess || this.options.onSuccess( resp.result );
124131
else
125-
this.dispatchError( 200, resp.err + " " + resp.message);
132+
this.error( 200, resp.err + " " + resp.message);
126133
}
127134
}
128-
if (readyState==4 && transport.status != 200)
129-
this.dispatchError( transport.status, transport.statusText );
135+
if (readyState==4 && xhr.status != 200)
136+
this.error( xhr.status, xhr.statusText );
130137
},
131138

139+
cleanup: function()
140+
{
141+
if (this.xhr) this.xhr.onreadystatechange = null;
142+
this.xhr = null;
143+
this.options.onFailure = this.options.onSuccess = null;
144+
},
132145

133-
transport: null,
134-
urlRoot: null,
135-
options: {}
146+
xhr: null
136147
}
137148

138149
function pwgAddEventListener(elem, evt, fn)
139150
{
140-
if (window.attachEvent)
141-
elem.attachEvent('on'+evt, fn);
142-
else
151+
if (window.addEventListener)
143152
elem.addEventListener(evt, fn, false);
153+
else
154+
elem.attachEvent('on'+evt, fn);
144155
}

themes/default/template/picture.tpl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,15 @@ y.callService(
208208
<input type="submit" name="rate" value="{$mark}" class="rateButton" title="{$mark}">
209209
{/if}
210210
{/foreach}
211-
<script type="text/javascript" src="{$ROOT_URL}themes/default/js/rating.js"></script>
212211
<script type="text/javascript">
213-
makeNiceRatingForm( {ldelim}rootUrl: '{$ROOT_URL|@escape:"javascript"}', image_id: {$current.id},
214-
updateRateText: "{'Update your rating'|@translate|@escape:'javascript'}", updateRateElement: document.getElementById("updateRate"),
215-
ratingSummaryText: "{'%.2f (rated %d times)'|@translate|@escape:'javascript'}", ratingSummaryElement: document.getElementById("ratingSummary") {rdelim} );
212+
var _pwgRatingAutoQueue = _pwgRatingAutoQueue || [];
213+
_pwgRatingAutoQueue.push( {ldelim}rootUrl: '{$ROOT_URL|@escape:"javascript"}', image_id: {$current.id},
214+
updateRateText: "{'Update your rating'|@translate|@escape:'javascript'}", updateRateElement: document.getElementById("updateRate"),
215+
ratingSummaryText: "{'%.2f (rated %d times)'|@translate|@escape:'javascript'}", ratingSummaryElement: document.getElementById("ratingSummary") {rdelim} );
216+
(function () {ldelim}
217+
var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = '{$ROOT_URL}themes/default/js/rating.js';
218+
var s0 = document.getElementsByTagName('script')[0]; s0.parentNode.insertBefore(s, s0);
219+
})();
216220
</script>
217221
</div>
218222
</form>

0 commit comments

Comments
 (0)