AnonSec Shell
Server IP : 54.36.91.62  /  Your IP : 216.73.217.117
Web Server : Apache
System : Linux webm013.cluster127.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64
User : coopiak ( 151928)
PHP Version : 8.3.23
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/coopiak/amisdesseniors-fr/nice2/media/jlexreview/assets/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/coopiak/amisdesseniors-fr/nice2/media/jlexreview/assets/script.js
function JLexReviewFp($, config, langs, ratingData)
{
	var _this = this;

	this.config = config || {};

	this.libs = function()
	{
		!function(a){var b,c,d,e,f,g,h,i,j,k={setNakedBarDelta:function(a,b){if("stickToSides"===a)j={toEndWidth:b,toBeginLeft:0,toBeginWidth:b};else{if("middle"!==a)throw new Error("unknown position of setNakedBarDelta: "+a);j={toEndWidth:b/2,toBeginLeft:b/2,toBeginWidth:b/2}}},getSliderValuesAtPositionPx:function(a,b){var c,d,e=this,f=e.data("pixel_to_value_mapping");if("undefined"!=typeof f)c=f(a),d=f(b);else{var g=k.getSliderWidthPx.call(e)-e.data("left_grip_width");c=k.inverse_rangemap_0_to_n.call(e,a,g),d=k.inverse_rangemap_0_to_n.call(e,b,g)}return[c,d]},validateAndMoveGripsToPx:function(a,b){var c=this,d=k.getSliderWidthPx.call(c)-c.data("left_grip_width");if(d>=b&&a>=0&&d>=a&&(!c.data("has_right_grip")||b>=a)){var e=c.data("cur_min"),f=c.data("cur_max");k.set_position_from_px.call(c,a,b),k.refresh_grips_style.call(c),k.notify_changed_implicit.call(c,"drag_move",e,f)}return c},updateAriaAttributes:function(){var a=this,b=a.data("settings"),c=a.find(b.left_grip_selector);if(a.data("has_right_grip")){var d=a.find(b.right_grip_selector);c.attr("aria-valuemin",a.data("range_min")).attr("aria-valuenow",l.get_current_min_value.call(a)).attr("aria-valuemax",l.get_current_max_value.call(a)),d.attr("aria-valuemin",l.get_current_min_value.call(a)).attr("aria-valuenow",l.get_current_max_value.call(a)).attr("aria-valuemax",a.data("range_max"))}else c.attr("aria-valuemin",a.data("range_min")).attr("aria-valuenow",l.get_current_min_value.call(a)).attr("aria-valuemax",a.data("range_max"));return a},getSliderWidthPx:function(){var a=this;return Math.round(a.width())},getGripPositionPx:function(a){return parseInt(a.css("left").replace("px",""),10)},getLeftGripPositionPx:function(){var a=this,b=a.data("settings"),c=a.find(b.left_grip_selector);return k.getGripPositionPx.call(a,c)},getRightGripPositionPx:function(){var a=this,b=a.data("settings");if(a.data("has_right_grip"))return k.getGripPositionPx.call(a,a.find(b.right_grip_selector));var c=k.getSliderWidthPx.call(a)-a.data("left_grip_width");return k.rangemap_0_to_n.call(a,a.data("cur_max"),c)},getLeftGripWidth:function(){var a=this,b=a.data("settings"),c=a.find(b.left_grip_selector);return Math.round(c.outerWidth())},getRightGripWidth:function(){var a=this,b=a.data("settings"),c=a.find(b.right_grip_selector);return Math.round(c.outerWidth())},binarySearchValueToPxCompareFunc:function(b,c,d){return b===c[d]?0:b<c[d]&&0===d?0:c[d-1]<=b&&b<c[d]?0:b>c[d]?1:b<=c[d-1]?-1:void a.error("cannot compare s: "+b+" with a["+d+"]. a is: "+c.join(","))},binarySearch:function(a,b,c,d){for(var e,f,g=0,h=a.length-1;h>=g;){e=(g+h)/2|0,f=c(a,e);var i=d(b,a,e);if(i>0)g=e+1;else{if(!(0>i))return e;h=e-1}}return-1},haveLimits:function(){var a=this,b=a.data("lower-limit"),c=a.data("upper-limit"),d=!1;return"undefined"!=typeof b&&"undefined"!=typeof c&&(d=!0),d},refresh_grips_style:function(){var a=this,b=a.data("settings");if("undefined"!=typeof b.highlight){var c=a.data("highlightedRangeMin");if("undefined"!=typeof c){var d=a.find(b.left_grip_selector),e=a.find(b.right_grip_selector),f=a.data("highlightedRangeMax"),g=a.data("cur_min"),h=a.data("cur_max"),i=b.highlight.grip_class;c>g||g>f?d.removeClass(i):d.addClass(i),c>h||h>f?e.removeClass(i):e.addClass(i)}}},set_position_from_val:function(a,b){var c=this,d=c.data("range_min"),e=c.data("range_max");d>a&&(a=d),a>e&&(a=e),c.data("has_right_grip")?(b>e&&(b=e),d>b&&(b=d)):b=c.data("cur_max");var f=l.value_to_px.call(c,a),g=l.value_to_px.call(c,b);return k.set_handles_at_px.call(c,f,g),c.data("cur_min",a),c.data("has_right_grip")&&c.data("cur_max",b),c},set_position_from_px:function(a,b){var c=this;k.set_handles_at_px.call(c,a,b);var d=k.getSliderValuesAtPositionPx.call(c,a,b),e=d[0],f=d[1];return c.data("cur_min",e),c.data("has_right_grip")&&c.data("cur_max",f),c},set_handles_at_px:function(a,b){var c=this,d=c.data("settings"),e=d.left_grip_selector,f=d.right_grip_selector,g=d.value_bar_selector,h=c.data("left_grip_width");return c.find(e).css("left",a+"px"),c.find(f).css("left",b+"px"),c.data("has_right_grip")?c.find(g).css("left",a+"px").css("width",b-a+h+"px"):(j||k.populateNakedBarDeltas.call(c,a,b,h),b>a?c.find(g).css("left",a+"px").css("width",b-a+j.toEndWidth+"px"):c.find(g).css("left",b+j.toBeginLeft+"px").css("width",a-b+j.toBeginWidth+"px")),c},drag_start_func_touch:function(a,b,c,e,f){var g=this,h=a.originalEvent,i=h.touches[0],j=i.pageY,l=i.pageX,m=Math.abs(g.offset().top-j),n=g.offset().left,o=n-l,p=l-(n+g.width());m>b.touch_tolerance_value_bar_y||o>b.touch_tolerance_value_bar_x||p>b.touch_tolerance_value_bar_x||(h.preventDefault(),d=i.pageX,k.drag_start_func.call(g,i,b,c,e,f))},drag_start_func:function(d,f,g,h,i){var j=this;if(j.find(f.left_grip_selector+","+f.value_bar_selector+","+f.right_grip_selector).removeClass(f.animating_css_class),l.is_enabled.call(j)){var m=a(d.target),n=!1;if("object"==typeof f.highlight&&(n=m.is(f.highlight.panel_selector)),i!==!1||m.is(f.left_grip_selector)||m.is(f.right_grip_selector)||m.is(f.value_bar_selector)||n||m.is(j)){b=j;var o,p,q,r,s,t,u=k.getGripPositionPx.call(j,g),v=k.getSliderWidthPx.call(j)-j.data("left_grip_width"),w=g.offset().left,x=k.getRightGripPositionPx.call(j);p=Math.round(d.pageX)-j.data("left_grip_width")/2,q=Math.abs(w-p),s=p-w,j.data("has_right_grip")?(o=h.offset().left,r=Math.abs(o-p),t=p-o):(r=2*q,t=2*s),f.user_drag_start_callback.call(j,d),q===r?w>p?(u+=s,e=!0):(x+=t,e=!1):r>q?(u+=s,e=!0):(x+=t,e=!1),j.data("has_right_grip")?x>v&&(x=v):u>v&&(u=v),0>u&&(u=0),c=!0;var y=j.data("cur_min"),z=j.data("cur_max");k.set_position_from_px.call(j,u,x),k.refresh_grips_style.call(j),k.notify_changed_implicit.call(j,"drag_start",y,z),"[object Touch]"!==Object.prototype.toString.apply(d)&&d.preventDefault()}}},drag_move_func_touch:function(a){if(c===!0){var b=a.originalEvent;b.preventDefault();var d=b.touches[0];k.drag_move_func(d)}},drag_move_func:function(a){if(c){var f=b,g=f.data("settings"),h=k.getSliderWidthPx.call(f)-f.data("left_grip_width"),i=k.getLeftGripPositionPx.call(f),j=k.getRightGripPositionPx.call(f),l=Math.round(a.pageX),m=l-d,n=f.data("left_grip_width")/2,o=f.offset().left+f.data("left_grip_width")-n,p=o+h;g.crossable_handles===!1&&f.data("has_right_grip")&&(e?p=o+j:o+=i);var q=0,r=0;o>l&&(q=1,r=0),l>p&&(r=1,q=0),g.crossable_handles===!0&&f.data("has_right_grip")&&(e?h>=j&&i+m>j&&(e=!1,i=j):i>=0&&i>j+m&&(e=!0,j=i));var s=i,t=j;(m>0&&!q||0>m&&!r)&&(e?s+=m:t+=m),k.validateAndMoveGripsToPx.call(f,s,t),d=l,"[object Touch]"!==Object.prototype.toString.apply(a)&&a.preventDefault()}},drag_end_func_touch:function(a){var b=a.originalEvent;b.preventDefault();var c=b.touches[0];k.drag_end_func(c)},drag_end_func:function(){var a=b;if("undefined"!=typeof a){c=!1,d=void 0,k.notify_mouse_up_implicit.call(a,e),b=void 0;var f=a.data("settings");a.find(f.left_grip_selector+","+f.value_bar_selector+","+f.right_grip_selector).addClass(f.animating_css_class)}},get_rounding_for_value:function(a){var b=this,c=b.data("rounding"),d=b.data("rounding_ranges");if("object"==typeof d){var e=k.binarySearch.call(b,d,a,function(a,b){return a[b].range},function(a,b,c){return a<b[c].range?c>0?a>=b[c-1].range?0:-1:0:1});if(c=1,e>-1)c=parseInt(d[e].value,10);else{var f=d.length-1;a>=d[f].range&&(c=d[f].value)}}return c},notify_mouse_up_implicit:function(a){var b=this,c=l.get_current_min_value.call(b),d=l.get_current_max_value.call(b),e=!1;(b.data("beforestart_min")!==c||b.data("beforestart_max")!==d)&&(e=!0,b.data("beforestart_min",c),b.data("beforestart_max",d));var f=b.data("settings");return f.user_mouseup_callback.call(b,l.get_current_min_value.call(b),l.get_current_max_value.call(b),a,e),b},notify_changed_implicit:function(a,b,c){var d=this,e=!1;("init"===a||"refresh"===a)&&(e=!0);var f=l.get_current_min_value.call(d),g=l.get_current_max_value.call(d);return e||(b=l.round_value_according_to_rounding.call(d,b),c=l.round_value_according_to_rounding.call(d,c)),(e||f!==b||g!==c)&&(k.notify_changed_explicit.call(d,a,b,c,f,g),e=1),e},notify_changed_explicit:function(a,b,c,d,e){var f=this,g=f.data("settings");return f.data("aria_enabled")&&k.updateAriaAttributes.call(f),g.value_changed_callback.call(f,a,d,e,b,c),f},validate_params:function(b){var c=this,d=c.data("range_min"),e=c.data("range_max"),f=c.data("cur_min"),g=c.data("lower-limit"),h=c.data("upper-limit"),i=k.haveLimits.call(c);"undefined"==typeof d&&a.error("the data-range_min attribute was not defined"),"undefined"==typeof e&&a.error("the data-range_max attribute was not defined"),"undefined"==typeof f&&a.error("the data-cur_min attribute must be defined"),d>e&&a.error("Invalid input parameter. must be min < max"),i&&g>h&&a.error("Invalid data-lower-limit or data-upper-limit"),0===c.find(b.left_grip_selector).length&&a.error("Cannot find element pointed by left_grip_selector: "+b.left_grip_selector),"undefined"!=typeof b.right_grip_selector&&0===c.find(b.right_grip_selector).length&&a.error("Cannot find element pointed by right_grip_selector: "+b.right_grip_selector),"undefined"!=typeof b.value_bar_selector&&0===c.find(b.value_bar_selector).length&&a.error("Cannot find element pointed by value_bar_selector"+b.value_bar_selector)},rangemap_0_to_n:function(a,b){var c=this,d=c.data("range_min"),e=c.data("range_max");return d>=a?0:a>=e?b:Math.floor((b*a-b*d)/(e-d))},inverse_rangemap_0_to_n:function(a,b){var c=this,d=c.data("range_min"),e=c.data("range_max");if(0>=a)return d;if(a>=b)return e;var f=(e-d)*a/b;return f+d}},l={teardown:function(){var b=this;return b.removeData(),a(document).unbind("mousemove.nstSlider").unbind("mouseup.nstSlider"),b.parent().unbind("mousedown.nstSlider").unbind("touchstart.nstSlider").unbind("touchmove.nstSlider").unbind("touchend.nstSlider"),b.unbind("keydown.nstSlider").unbind("keyup.nstSlider"),b},init:function(b){var c=a.extend({animating_css_class:"nst-animating",touch_tolerance_value_bar_y:30,touch_tolerance_value_bar_x:15,left_grip_selector:".nst-slider-grip-left",right_grip_selector:void 0,highlight:void 0,rounding:void 0,value_bar_selector:void 0,crossable_handles:!0,value_changed_callback:function(){},user_mouseup_callback:function(){},user_drag_start_callback:function(){}},b),d=a(document);return d.unbind("mouseup.nstSlider"),d.unbind("mousemove.nstSlider"),d.bind("mousemove.nstSlider",k.drag_move_func),d.bind("mouseup.nstSlider",k.drag_end_func),this.each(function(){var b=a(this),d=b.parent();b.data("enabled",!0);var j=b.data("range_min"),m=b.data("range_max"),n=b.data("cur_min"),o=b.data("cur_max");"undefined"==typeof o&&(o=n),""===j&&(j=0),""===m&&(m=0),""===n&&(n=0),""===o&&(o=0),b.data("range_min",j),b.data("range_max",m),b.data("cur_min",n),b.data("cur_max",o),k.validate_params.call(b,c),b.data("settings",c),"undefined"!=typeof c.rounding?l.set_rounding.call(b,c.rounding):"undefined"!=typeof b.data("rounding")?l.set_rounding.call(b,b.data("rounding")):l.set_rounding.call(b,1);var p=b.find(c.left_grip_selector)[0],q=a(p),r=a(b.find(c.right_grip_selector)[0]);"undefined"==typeof q.attr("tabindex")&&q.attr("tabindex",0);var s=!1;b.find(c.right_grip_selector).length>0&&(s=!0,"undefined"==typeof r.attr("tabindex")&&r.attr("tabindex",0)),b.data("has_right_grip",s),b.data("aria_enabled")===!0&&(q.attr("role","slider").attr("aria-disabled","false"),s&&r.attr("role","slider").attr("aria-disabled","false")),b.bind("keyup.nstSlider",function(a){if(b.data("enabled")){switch(a.which){case 37:case 38:case 39:case 40:if(f===h){var c,d,j,m=k.getSliderWidthPx.call(b);if(0>g-i){for(d=i;m>=d;d++)if(c=l.round_value_according_to_rounding.call(b,k.getSliderValuesAtPositionPx.call(b,d,d)[1]),c!==h){j=d;break}}else for(d=i;d>=0;d--)if(c=l.round_value_according_to_rounding.call(b,k.getSliderValuesAtPositionPx.call(b,d,d)[1]),c!==h){j=d;break}e?k.validateAndMoveGripsToPx.call(b,j,k.getRightGripPositionPx.call(b)):k.validateAndMoveGripsToPx.call(b,k.getLeftGripPositionPx.call(b),j),k.notify_mouse_up_implicit.call(b,e)}}f=void 0,g=void 0,h=void 0,i=void 0}}),b.bind("keydown.nstSlider",function(a){if(b.data("enabled")){var c=function(a,c){var d=k.getLeftGripPositionPx.call(b),j=k.getRightGripPositionPx.call(b);switch("undefined"==typeof f&&(g=e?d:j,f=e?l.get_current_min_value.call(b):l.get_current_max_value.call(b)),c.which){case 37:case 40:e?d--:j--,c.preventDefault();break;case 38:case 39:e?d++:j++,c.preventDefault()}i=e?d:j,k.validateAndMoveGripsToPx.call(b,d,j),h=e?l.get_current_min_value.call(b):l.get_current_max_value.call(b)};s&&b.find(":focus").is(r)?(e=!1,c.call(b,r,a)):(e=!0,c.call(b,q,a))}});var t=k.getLeftGripWidth.call(b),u=s?k.getRightGripWidth.call(b):t;if(b.data("left_grip_width",t),b.data("right_grip_width",u),b.data("value_bar_selector",c.value_bar_selector),!s){var v=o===m||o===j;k.setNakedBarDelta.call(b,v?"stickToSides":"middle",t)}j===m||n===o?l.set_range.call(b,j,m):k.set_position_from_val.call(b,b.data("cur_min"),b.data("cur_max")),k.notify_changed_implicit.call(b,"init"),b.data("beforestart_min",l.get_current_min_value.call(b)),b.data("beforestart_max",l.get_current_max_value.call(b)),b.bind("mousedown.nstSlider",function(a){k.drag_start_func.call(b,a,c,q,r,!1)}),d.bind("touchstart.nstSlider",function(a){k.drag_start_func_touch.call(b,a,c,q,r,!0)}),d.bind("touchend.nstSlider",function(a){k.drag_end_func_touch.call(b,a)}),d.bind("touchmove.nstSlider",function(a){k.drag_move_func_touch.call(b,a)});var w=b.data("histogram");"undefined"!=typeof w&&l.set_step_histogram.call(b,w)})},get_range_min:function(){var a=this;return a.data("range_min")},get_range_max:function(){var a=this;return a.data("range_max")},get_current_min_value:function(){var b,c=a(this),d=l.get_range_min.call(c),e=l.get_range_max.call(c),f=c.data("cur_min");if(b=d>=f?d:l.round_value_according_to_rounding.call(c,f),k.haveLimits.call(c)){if(d>=b)return c.data("lower-limit");if(b>=e)return c.data("upper-limit")}else{if(d>=b)return d;if(b>=e)return e}return b},get_current_max_value:function(){var b,c=a(this),d=l.get_range_min.call(c),e=l.get_range_max.call(c),f=c.data("cur_max");if(b=f>=e?e:l.round_value_according_to_rounding.call(c,f),k.haveLimits.call(c)){if(b>=e)return c.data("upper-limit");if(d>=b)return c.data("lower-limit")}else{if(b>=e)return e;if(d>=b)return d}return b},is_handle_to_left_extreme:function(){var a=this;return k.haveLimits.call(a)?a.data("lower-limit")===l.get_current_min_value.call(a):l.get_range_min.call(a)===l.get_current_min_value.call(a)},is_handle_to_right_extreme:function(){var a=this;return k.haveLimits.call(a)?a.data("upper-limit")===l.get_current_max_value.call(a):l.get_range_max.call(a)===l.get_current_max_value.call(a)},refresh:function(){var a=this,b=a.data("last_step_histogram");"undefined"!=typeof b&&l.set_step_histogram.call(a,b),k.set_position_from_val.call(a,l.get_current_min_value.call(a),l.get_current_max_value.call(a));var c=a.data("highlightedRangeMin");if("number"==typeof c){var d=a.data("highlightedRangeMax");l.highlight_range.call(a,c,d)}return k.notify_changed_implicit.call(a,"refresh"),a},disable:function(){var a=this,b=a.data("settings");return a.data("enabled",!1).find(b.left_grip_selector).attr("aria-disabled","true").end().find(b.right_grip_selector).attr("aria-disabled","true"),a},enable:function(){var a=this,b=a.data("settings");return a.data("enabled",!0).find(b.left_grip_selector).attr("aria-disabled","false").end().find(b.right_grip_selector).attr("aria-disabled","false"),a},is_enabled:function(){var a=this;return a.data("enabled")},set_position:function(a,b){var c=this,d=c.data("cur_min"),e=c.data("cur_max");a>b?k.set_position_from_val.call(c,b,a):k.set_position_from_val.call(c,a,b),k.refresh_grips_style.call(c),k.notify_changed_implicit.call(c,"set_position",d,e),c.data("beforestart_min",a),c.data("beforestart_max",b)},set_step_histogram:function(b){var c=this;c.data("last_step_histogram",b),"undefined"==typeof b&&(a.error("got an undefined histogram in set_step_histogram"),k.unset_step_histogram.call(c));var d=k.getSliderWidthPx.call(c)-c.data("left_grip_width"),e=b.length;if(!(0>=d)){var f,g=0;for(f=0;e>f;f++)g+=b[f];if(0===g)return l.unset_step_histogram.call(c),c;var h=parseFloat(g)/d;for(f=0;e>f;f++)b[f]=b[f]/h;var i=[b[0]];for(f=1;e>f;f++){var j=i[f-1]+b[f];i.push(j)}i.push(d);for(var m=[c.data("range_min")],n=0,o=m[0],p=0;d>=n;){var q=parseInt(i.shift(),10),r=k.inverse_rangemap_0_to_n.call(c,p+1,e+1);p++;var s=q-n,t=r-o;for(f=n;q>f;f++){var u=o+t*(f-n+1)/s;m.push(u),n++,o=u}if(n===d)break}m[m.length-1]=c.data("range_max");var v=function(a){return m[parseInt(a,10)]},w=function(a){var b=k.binarySearch.call(c,m,a,function(a,b){return a[b]},k.binarySearchValueToPxCompareFunc);return m[b]===a?b:Math.abs(m[b-1]-a)<Math.abs(m[b]-a)?b-1:b};return c.data("pixel_to_value_mapping",v),c.data("value_to_pixel_mapping",w),c}},unset_step_histogram:function(){var a=this;return a.removeData("pixel_to_value_mapping"),a.removeData("value_to_pixel_mapping"),a.removeData("last_step_histogram"),a},set_range:function(a,b){var c=this,d=l.get_current_min_value.call(c),e=l.get_current_max_value.call(c);return c.data("range_min",a),c.data("range_max",b),k.set_position_from_val.call(c,d,e),k.notify_changed_implicit.call(c,"set_range",d,e),c},highlight_range:function(b,c){var d=this,e=d.data("settings");"undefined"==typeof e.highlight&&a.error('you cannot call highlight_range if you haven\' specified the "highlight" parameter in construction!'),b||(b=0),c||(c=0);var f=l.value_to_px.call(d,b),g=l.value_to_px.call(d,c),h=g-f+d.data("left_grip_width"),i=d.find(e.highlight.panel_selector);return i.css("left",f+"px"),i.css("width",h+"px"),d.data("highlightedRangeMin",b),d.data("highlightedRangeMax",c),k.refresh_grips_style.call(d),d},set_rounding:function(b){var c=this;"string"==typeof b&&b.indexOf("{")>-1&&(b=a.parseJSON(b)),c.data("rounding",b);var d=[];if("object"==typeof b){var e;for(e in b)if(b.hasOwnProperty(e)){var f=b[e];d.push({range:f,value:e})}d.sort(function(a,b){return a.range-b.range}),c.data("rounding_ranges",d)}else c.removeData("rounding_ranges");return c},get_rounding:function(){var a=this;return a.data("rounding")},round_value_according_to_rounding:function(b){var c=this,d=k.get_rounding_for_value.call(c,b);if(d>0){var e=b/d,f=parseInt(e,10),g=e-f;g>.5&&f++;var h=f*d;return h}return a.error("rounding must be > 0, got "+d+" instead"),b},value_to_px:function(a){var b=this,c=b.data("value_to_pixel_mapping");if("undefined"!=typeof c)return c(a);var d=k.getSliderWidthPx.call(b)-b.data("left_grip_width");return k.rangemap_0_to_n.call(b,a,d)}},m="nstSlider";a.fn[m]=function(b){if(l[b]){if(this.data("initialized")===!0)return l[b].apply(this,Array.prototype.slice.call(arguments,1));throw new Error("method "+b+" called on an uninitialized instance of "+m)}return"object"!=typeof b&&b?void a.error("Cannot call method "+b):(this.data("initialized",!0),l.init.apply(this,arguments))}}(jQuery);
	};

	this.lang = {
		data : {},
		load : function (langs)
		{
			_this.lang.data = langs;
		},
		get  : function ()
		{
			if (! arguments.length) return '';

			if ( _this.lang.data.hasOwnProperty(arguments[0]) )
			{
				if (arguments.length==1)
				{
					return _this.lang.data[ arguments[0] ];
				} else {
					var str = _this.lang.data[ arguments[0] ];
					for (var i = 1; i <= arguments.length; i++) {
						str = str.replace(/(\%s)/, arguments[i]);
					}
					return str;
				}
			}
			return arguments[0];
		}
	};

	// load language
	if(typeof langs!='undefined') _this.lang.load(langs);

	this.helper = {
		url : function(params){
			params['t'] = new Date().getTime();

			return _this.config.request
					+ (_this.config.request.indexOf('?')==-1?'?':'&')
					+ $.param (params);
		},
		redirect : function(url){
			var url = decodeURIComponent(url);
			window.location.href = url;
		},
		report : function(_el, type){
			let id = _el.attr('data-id')*1,
				r = {id:id, type:type};

			if(_el.hasClass('loading')) return false;
			if(_el.hasClass('active'))
			{
				// remove
				let dig = new _this.dialog({
					caption : _this.lang.get("report"),
					content : _this.lang.get("ignore_report"),
					submitLabel : _this.lang.get("ignore"),
					submitfn : function(dig)
					{
						dig.el.find('.jreview-dg-content').empty().append('<span>'+_this.lang.get("please_wait")+'</span>');
						_el.addClass('loading');

						dig.overlay();
						$.post(_this.helper.url({view:'others', task:'report_ignore'}), r, function(d){
							_el.removeClass('loading');
							dig.unOverlay();
							
							if(d.status==200)
							{
								_el.removeClass('active');
								dig.off();
							} else {
								dig.el.find('.jreview-dg-content').empty().append(d.error);
								dig.el.find('.jreview-dg-submit').remove();
							}
						}, 'json');
					}
				});
			} else {
				// post
				let c='<div class="jreview-report-box">';
					c+='<label>'+_this.lang.get('report_reason')+'</label><textarea></textarea>';

				if(_this.config.member==0)
				{
					// guest, request name & email
					c+='<label>'+_this.lang.get('your_name')+'</label>';
					c+='<input type="text" name="guest_name" value="'+_this.helper.cache.name+'" />';
					
					if(_this.config.report_email)
					{
						c+='<label>'+_this.lang.get('your_email')+'</label>';
						c+='<input type="email" name="guest_email" value="'+_this.helper.cache.email+'" />';
					}
				}

				c+='</div>';

				let dig = new _this.dialog({
					caption : _this.lang.get("report"),
					content : c,
					submitLabel : _this.lang.get("report"),
					submitfn : function(dig)
					{
						var msg = dig.el.find('textarea').val();
						if(/^\s*$/.test(msg))
						{
							dig.setError(_this.lang.get('report_empty'));
							dig.el.find('textarea').focus();
							return;
						}

						if(_this.config.member==0)
						{
							r.name = dig.el.find('input[name="guest_name"]').val();
							if(/^\s*$/.test(r.name))
							{
								dig.el.find ('input[name="guest_name"]').focus();
								return;
							}

							if(_this.config.report_email)
							{
								r.email = dig.el.find('input[name="guest_email"]').val();
								if(/^\s*$/.test(r.email))
								{
									dig.el.find ('input[name="guest_email"]').focus();
									return;
								}
							}
							
							// set
							_this.helper.cache.set(r.name, r.email);
						}

						dig.el.find('.jreview-dg-content').find ('.jreview-report-box').hide();
						dig.el.find('.jreview-dg-content').append('<span class="_loading">'+_this.lang.get('please_wait')+'</span>');

						r.msg = msg;
						_el.addClass('loading');
						dig.overlay();

						$.post(_this.helper.url({view:'others',task:'report_add'}), r, function(d){
							dig.unOverlay();
							_el.removeClass('loading');
							
							if(d.status==200)
							{
								_el.addClass('active');
								dig.el.find('.jreview-dg-content').empty().append( '<span>'+_this.lang.get('thanks_report')+'</span>' );
								dig.el.find ('.jreview-dg-submit').remove();
								
								window.setTimeout(function(){
									dig.off();
								}, 3000);
							} else {
								dig.el.find('.jreview-dg-content').find('.jreview-report-box').show();
								dig.el.find('.jreview-dg-content').find('._loading').remove();
								dig.setError(d.error);
							}
						}, 'json');
					}
				});
			}
		},
		login : function(msg, callback)
		{
			if(_this.config.login.type=='page'||_this.config.login.type=='url')
			{
				window.location.href=_this.config.login.url;
				return;
			}

			var loginHtml = '<div class="">';
					loginHtml+= '<label>'+_this.lang.get('username')+'</label>';
					loginHtml+= '<input type="text" data-name="username" />';
				loginHtml+= '</div>';

				loginHtml+= '<div class="">';
					loginHtml+= '<label>'+_this.lang.get('password')+'</label>';
					loginHtml+= '<input type="password" data-name="password" />';
				loginHtml+= '</div>';

			// social login
			if(_this.config.login.hasOwnProperty('socialid'))
			{
				loginHtml+= '<div class="_socialogin_method" style="font-size:1.2em">'+_this.lang.get("use_social_id")+'</div>';
				if (_this.config.login.socialid.fb==1)
				{
					loginHtml+= '<button type="button" class="_socialBtn" data-action="fb" style="background:#3b5998"><i class="fa fa-facebook" aria-hidden="true"></i> Facebook</button>';
				}

				if (_this.config.login.socialid.gg==1)
				{
					loginHtml+= '<button type="button" class="_socialBtn" data-action="gg" style="background:#d95032"><i class="fa fa-google" aria-hidden="true"></i> Google</button>';
				}

				if (_this.config.login.socialid.tw==1)
				{
					loginHtml+= '<button type="button" class="_socialBtn" data-action="tw" style="background:#3a92c8"><i class="fa fa-twitter" aria-hidden="true"></i> Twitter</button>';
				}

				if (_this.config.login.socialid.vk==1)
				{
					loginHtml+= '<button type="button" class="_socialBtn" data-action="vk" style="background:#5181b9"><i class="fa fa-vk" aria-hidden="true"></i> VKontakte</button>';
				}
			}

			loginHtml+='<ul class="list-unstyled">';
				loginHtml+='<li><a href="'+_this.config.login.reset+'" target="_blank">'+_this.lang.get('login_reset')+'</a></li>';
				if(_this.config.login.hasOwnProperty('join'))
				{
					loginHtml+='<li><a href="'+_this.config.login.join+'" target="_blank">'+_this.lang.get('register')+'</a></li>';
				}
			loginHtml+='</ul>';

			var loginDialog = new _this.dialog({
				caption: _this.lang.get('login_dialog'),
				content : loginHtml,
				loadfn: function(dialog)
				{
					dialog.el.find('input:eq(0)').focus();
					dialog.el.find('._socialBtn').click(function(){
						var type = $(this).attr('data-action'),
							url  = '',
							name = '';
						switch (type)
						{
							case 'fb':
								url = _this.helper.url({
									view: 'profile',
									task: 'oauth',
									type:'fb',
									popup:1
								});
								name = "jlex_popup_fb";
								break;

							case 'gg':
								url = _this.helper.url({
									view: 'profile',
									task: 'oauth',
									type:'google',
									popup:1
								});
								name = "jlex_popup_google";
								break;

							case 'tw':
								url = _this.helper.url({
									view: 'profile',
									task: 'oauth',
									type:'twitter',
									popup:1
								});
								name = "jlex_popup_twitter";
								break;

							case 'vk':
								url = _this.helper.url({
									view: 'profile',
									task: 'oauth',
									type:'vk',
									popup:1
								});
								name = "jlex_popup_vk";
								break;
						}
						
						window.open (url, name, "width=500, height=350");
					});
				},
				submitLabel: _this.lang.get('login'),
				submitfn: function(dialog)
				{
					var _nameEl = dialog.el.find('[data-name=username]'),
						_pwEl = dialog.el.find('[data-name=password]'),
						data = {};

					if (/^\s*$/.test(_nameEl.val()))
					{
						_nameEl.focus();
						return false;
					}

					if (/^\s*$/.test(_pwEl.val()))
					{
						_pwEl.focus();
						return false;
					}

					data.username = _nameEl.val();
					data.password = _pwEl.val();

					dialog.overlay();
					$.post(_this.helper.url({view:'profile', task:'login'}), data, function(d){
						dialog.unOverlay();
						if (d.status==200)
						{
							if(typeof callback=='function')
							{
								callback();
							} else {
								window.location.reload();
							}

							dialog.off();
						} else {
							dialog.setError(d.error);
						}
					}, 'json');
				}
			});

			if (msg!=null && /^\s*$/.test(msg))
			{
				loginDialog.setError(msg);
			}
		},
		logout: function(){
			$.post(_this.helper.url({view:'profile', task:'logout'}), function(d){
				window.location.reload();
			}, 'json');
		},
		cookie : {
			set : function(cname, cvalue, exdays)
			{
				var d = new Date();
			    d.setTime(d.getTime() + (exdays*24*60*60*1000));
			    var expires = "expires="+ d.toUTCString();
			    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
			},
			get : function(cname)
			{
				var name = cname + "=";
			    var decodedCookie = decodeURIComponent(document.cookie);
			    var ca = decodedCookie.split(';');
			    for(var i = 0; i <ca.length; i++) {
			        var c = ca[i];
			        while (c.charAt(0) == ' ') {
			            c = c.substring(1);
			        }
			        if (c.indexOf(name) == 0) {
			            return c.substring(name.length, c.length);
			        }
			    }
			    return null;
			},
			earse : function(cname)
			{
				document.cookie = cname + "=0; expires=Thu, 18 Dec 2013 12:00:00 UTC";
			}
		},
		listenEvent : function(name,data){
			if (typeof CustomEvent == 'undefined') return false;
			data = data||{};
			var evt = new CustomEvent(name, {detail:data});
			window.dispatchEvent(evt);
		},
		cache : {
			name : "",
			email : "",
			set : function(name, email)
			{
				_this.helper.cookie.set('jr_guest_name',name,30);
				_this.helper.cookie.set('jr_guest_email',email,30);
			},
			load: function()
			{
				var guest_name = _this.helper.cookie.get('jr_guest_name'),
					guest_email = _this.helper.cookie.get('jr_guest_email');
				_this.helper.cache.name = guest_name!=null?guest_name:'';
				_this.helper.cache.email = guest_email!=null?guest_email:'';
			}
		},
		overlay: function(isOn){
			isOn=typeof isOn=="undefined"?true:isOn;
			if(isOn && !$('.jreview-overlay .loading').length)
			{
				$('.jreview-overlay').remove();
				$('body')
					.addClass('disableScroll')
					.append('<div class="jreview-overlay center"><div class="loading"><i class="fa fa-circle-notch fa-circle-o-notch fa-spin"></i></div></div>');
			}
			
			if(!isOn)
			{
				$('.jreview-overlay').remove();
				$('body').removeClass('disableScroll');
			}
		},
		filters: {}
	};

	this.emoji = {
		pos: null,
		input: null,
		init: function(){
			if(typeof EmojiPanel=="undefined") return;
			$('body').append('<div id="jr-emoji-box"><div id="jr-emoji"></div><button id="jr-emoji-btn"><img src="'+_this.config.base+'/media/jlexreview/assets/emoji/simple.png"></button></div>');

			ej = new EmojiPanel({
		        container: '#jr-emoji',
		        trigger: '.jr-uk',
		        json_url: _this.config.base+'/media/jlexreview/assets/emoji/emojis.json',
		        pack_url: _this.config.base+'/media/jlexreview/assets/emoji/twemoji.svg'
		    });

		    ej.addListener('select', function(emoji){
		    	if(_this.emoji.input==null) return;

				//_this.emoji.input.focus();
				var field = _this.emoji.input[0];

				//IE support
			    if(document.selection){
			        document.selection.createRange().text = emoji.char;
			    } else if(field.selectionStart || field.selectionStart=='0') {
			        var startPos = field.selectionStart,
			        	endPos 	 = field.selectionEnd;

			        field.value = field.value.substring(0, startPos)
			            + emoji.char
			            + field.value.substring(endPos, field.value.length);

			        field.focus();
			        field.setSelectionRange(startPos+emoji.char.length, startPos+emoji.char.length);
			    } else {
			        field.value+=emoji.char;
			    }
			});

			$('#jr-emoji-btn').click(function(){
				$('#jr-emoji').toggleClass('active');
			});
		},
		build: function($el){
			if(_this.emoji.input!=null && _this.emoji.input.is($el))
			{
				return;
			}

			var $d=$('#jr-emoji-btn');
			_this.emoji.input=$el;
			
			if(_this.emoji.pos!=null)
				clearInterval(_this.emoji.pos);

			$('#jr-emoji').removeClass('active');

			_this.emoji.pos=setInterval(function(){
				if(!$el.is(':visible')){
					$d.hide();
					$('#jr-emoji').removeClass('active');
					return;
				}
				
				var bTop=$el.offset().top+$el.outerHeight(false)+5,
					bLeft=$el.offset().left+$el.outerWidth(false)-$d.outerWidth(false);

				$d.show();
				$('#jr-emoji-box').css({top:bTop+'px', left:bLeft+'px'});
			}, 10);
		}
	};

	this.dialog = function (options)
	{
		var _dialog = this,
			settings = 
			{
				caption 	: _this.lang.get("dialog"),
				submitLabel : _this.lang.get("submit"),
				cancelLabel : _this.lang.get("cancel"),
				content 	: '',
				loadfn 		: null,
				submitfn 	: null,
				cancelfn 	: null
			};

		if (typeof options=='object') $.extend (settings, options);

		_dialog.init = function ()
		{
			var html = '<div class="jreview-overlay">';
					html+= '<div class="jreview-dialog">';
						html+= '<div class="jreview-dg-caption">'+settings.caption+'</div>';
						html+= '<div class="jreview-dg-error"></div>';
						html+= '<div class="jreview-dg-content">'+settings.content+'</div>';
						html+= '<div class="jreview-dg-footer">';
							if (settings.submitLabel!==false)
							{
								html+= '<button class="jreview-dg-submit">'+settings.submitLabel+'</button>';
							}
							html+= '<button class="jreview-dg-cancel">'+settings.cancelLabel+'</button>';
						html+= '</div>';
					html+= '</div>';
				html+= '</div>';
			_dialog.el = $(html);
			_dialog.el.appendTo ('body');

			// events
			if (typeof settings.loadfn=='function')
				settings.loadfn (_dialog);

			_dialog.el.on ('click', '.jreview-dg-submit', function() {
				if (typeof settings.submitfn=='function')
					settings.submitfn (_dialog);
			});

			_dialog.el.on ('click', '.jreview-dg-cancel', function() {
				if (typeof settings.cancelfn=='function')
				{
					var rn = settings.cancelfn (_dialog);
					if (rn!==false)
					{
						_dialog.off ();
					}
				} else {
					_dialog.off ();
				}
			});

			var resizeEvent = function ()
			{
				if (! $('.jreview-dialog').length)
				{
					return false;
				}

				var widthOfScreen = $(window).width (),
					heightOfScreen = $(window).width ();

				if (widthOfScreen <= 650)
				{
					_dialog.el.find ('.jreview-dialog')
								.removeClass ('wide touch')
								.removeAttr ('style')
								.addClass ('touch');

					$('html,body').addClass ('disableScroll');
				} else {
					_dialog.el.find ('.jreview-dialog')
								.removeClass ('wide touch')
								.removeAttr ('style')
								.addClass ('wide');

					var widthOfdialog = widthOfScreen > 650 ? 600 : (widthOfScreen-40),
						left = (widthOfScreen - widthOfdialog) / 2,
						maxHeight = heightOfScreen - 50 - 30; // 30 is top possition.

					_dialog.el.find ('.jreview-dialog').css ({
						width: widthOfdialog + 'px',
						left : left + 'px',
						'max-height' : maxHeight + 'px'
					});

					$('html,body').removeClass ('disableScroll');
				}
			}

			resizeEvent ();
			$(window).resize (function(){
				resizeEvent ();
			});
		};

		_dialog.off = function ()
		{
			_dialog.el.off ();
			_dialog.el.fadeOut ('fast', function (){
				$(this).remove ();
				$('html,body').removeClass ('disableScroll');
			});
		};

		_dialog.setError = function (msg)
		{
			_dialog.el.find ('.jreview-dg-error')
				.addClass('active').html (msg);
		};

		_dialog.clearError = function ()
		{
			_dialog.el.find ('.jreview-dg-error')
				.removeClass('active').html ('');
		};

		_dialog.overlay = function ()
		{
			if (!_dialog.el.find('.jreview-dg-overlay').length)
			{
				_dialog.el.find('.jreview-dg-content').append ('<div class="jreview-dg-overlay"></div>');
				_dialog.el.find('button').attr ('disabled', 'disabled');
			}
		};

		_dialog.unOverlay = function ()
		{
			_dialog.el.find('.jreview-dg-overlay').remove ();
			_dialog.el.find('button').removeAttr ('disabled');
		};

		_dialog.init();
	};

	this.formErrors = function(errors)
	{
		_this.helper.overlay(false);
		if(!errors.length) return;

		var _el = $("#jreview-form ._errorMsg:eq(0)");

		_el.html(errors.join('<br/>')).addClass('active');
		$("html,body").animate({scrollTop:_el.offset().top-20}, 500);

		// plugin events
		_this.helper.listenEvent('jreview.rating.error',{$:$, jreview:_this});
	};

	this.formEvents = function(dept)
	{
		var _form = $("#jreview-form");

		if(typeof dept!='undefined' && dept==true)
		{
			$('.jlexreview').on("click", "._user_login", function(e){
				_this.helper.login();
			});
		}

		/* basic events */
		_form.find(".checkbox input[type=checkbox]").change(function(){
			var _el = $(this).parent('label');
			if ($(this).is(":checked"))
			{
				_el.addClass("checked");
			} else {
				_el.removeClass("checked");
			}
		});
		_form.find(".checkbox input[type=checkbox]").trigger("change");

		// extra css for special rating flag
		if (_this.config.hasOwnProperty('rtext') && typeof _this.config.rtext=="object")
		{
			// extra css for special rating flag
			var _css = [];
			$.each(_this.config.rtext, function(k,v){
				var _prefix = 'mod_'+v.min.toString()+v.max.toString();
				_css.push('#jreview-form ._ratingFlag[data-id="'+_prefix+'"]{background:#'+v.color+'}');
				_css.push('#jreview-form ._ratingFlag[data-id="'+_prefix+'"]:before{border-color:transparent #'+v.color+' transparent transparent}');
			});

			$('head').append('<style>'+_css.join('\n')+'</style>');
		}

		// term
		var termContent = null;
		_form.find('._get_term').click(function(e){
			e.preventDefault();
			new _this.dialog({
				caption : _this.lang.get("tos"),
				content : _this.lang.get("loading"),
				loadfn : function(dialog)
				{
					if (termContent!=null)
					{
						dialog.el.find('.jreview-dg-content').empty().append(termContent);
					} else {
						$.get(_this.helper.url({view:"others", task:"term"}), function(d){
							termContent = d.data;
							dialog.el.find('.jreview-dg-content').empty().append(d.data);
						}, "json");
					}
				},
				submitLabel:false,
				cancelLabel:"Ok"
			});
		});


		// create star/slider rating
		var create_rating = function(_el)
			{
				var def 	= _el.attr("data-default")*1,
					half 	= _el.attr("data-half")*1==1?true:false,
					style 	= _el.attr("data-style"),
					max 	= _el.attr("data-max"),
					require = _el.attr("data-require")*1==1?true:false,
					val 	= _el.attr("value"),
					_ratingFlag = function($p, value, max)
					{
						if(_this.config.hasOwnProperty('rtext') && typeof _this.config.rtext=="object")
						{
							var _percent = parseInt(value*100/max);
							$.each(_this.config.rtext, function(k,v){
								if (_percent>=v.min && _percent<=v.max)
								{
									var _prefix = 'mod_'+v.min.toString()+v.max.toString();
									$p.find("._ratingFlag").attr('data-id', _prefix);
									$p.find("._ratingFlag").text(v.title);
									return false;
								}
							});
						} else {
							//$p.find("._ratingFlag").text(isNaN(value)?0:value);
							$p.find("._ratingFlag").hide();
						}
					};

				if (style=="slider")
				{
					var _slider = '<div><div class="nstSlider" data-range_min="1" data-range_max="'+max+'" data-cur_min="'+(val<=0?def:val)+'">';
						_slider+= '<div class="leftGrip"></div>';
						_slider+= '</div>';
						_slider+= '<div class="ratingPoint"><span><span class="_point">'+(val<=0?def:val)+'</span>/'+max+'</span>';
						_slider+= '<span class="_ratingFlag"></span>';
						_slider+= '</div>';

						if (!require)
						{
							_slider+= '<div class="_overlay"></div>';
							_slider+= '<a class="skip_rating">'+_this.lang.get('skip')+'</a>';
						}

						_slider+= '</div>';

					_slider = $(_slider);
					_slider.insertBefore(_el);
					_slider.find('.nstSlider').nstSlider({
					    "left_grip_selector": ".leftGrip",
					    "value_changed_callback": function(cause, leftValue, rightValue) {
					        _slider.find('._point').text(leftValue);
					        _el.val(leftValue);
					        _ratingFlag(_slider, leftValue, max);
					    }
					});

					_slider.find('.skip_rating').click(function(){
						_slider.toggleClass('disabled');
						if ($(this).hasClass('active'))
						{
							// get old value
							var oldval = typeof _el.attr('data-old')=='undefined' ? def : _el.attr('data-old');
							_el.val(oldval);
						} else {
							// set value is 0
							_el.attr('data-old', _el.val());
							_el.val("-1");
						}

						$(this).toggleClass('active');
					});

					if (val=="-1")
					{
						_slider.find('.skip_rating').trigger("click");
					}
				} else {
					var _elName = _el.attr('name'),
						_starRating = '<div class="_starRating">',
						_val = val<=0?def:val,
						keysafe = _elName.replace(/\[|\]/g,'_');

					if (!require)
					{
						_starRating+= '<div class="_overlay"></div>';
						_starRating+= '<a class="skip_rating" style="float:right">'+_this.lang.get('skip')+'</a>';
					}

					_starRating+= '<span class="_ratingFlag"></span>';

					for (i=max;i>=1;i--)
					{
						_starRating+= '<input type="radio" id="jrating'+i.toString()+keysafe+'" name="'+_elName+'" value="'+i+'.0" /><label for="jrating'+i.toString()+keysafe+'" class="fa" data-value="'+i+'"></label>';
						if (half)
						{
							_starRating+= '<input type="radio" id="jrating'+(i-1).toString()+'_5'+keysafe+'" name="'+_elName+'" value="'+(i-0.5)+'" /><label for="jrating'+(i-1).toString()+'_5'+keysafe+'" class="half fa" data-value="'+(i-0.5)+'"></label>';
						}
					}

					_starRating+= '</div>';

					_starRating = $(_starRating);
					_starRating.find('label').mouseenter(function(){
						_ratingFlag(_starRating, $(this).attr('data-value')*1, max);
					});
					_starRating.mouseleave(function() {
						_ratingFlag(_starRating, _starRating.find('input:checked').val()*1, max);
					});

					_val = parseFloat(_val).toFixed(1);

					_starRating.find('input[value="'+_val+'"]').prop("checked", true);
					_ratingFlag(_starRating, _val, max);

					_starRating.find('.skip_rating').click(function(){
						_starRating.toggleClass('disabled');
						if ($(this).hasClass('active'))
						{
							// get old value
							_starRating.find('input[type="radio"]').removeAttr("disabled");
							_starRating.find('input[type="hidden"]').remove();
						} else {
							// set value is -1
							_starRating.find('input[type="radio"]').attr("disabled", "disabled");
							_starRating.append('<input type="hidden" name="'+_elName+'" value="-1" />');
						}

						$(this).toggleClass('active');
					});

					if (val=="-1")
					{
						_starRating.find('.skip_rating').trigger("click");
					}

					_el.replaceWith(_starRating);
				}
			};

		if (_form.is(":visible"))
		{
			_form.find("._ratingStar").each(function(){
				create_rating( $(this) );
			});
		} else {
			var _wait = window.setInterval(function(){
				if (_form.is(":visible"))
				{
					window.clearInterval(_wait);
					_form.find("._ratingStar").each(function(){
						create_rating( $(this) );
					});
				}
			},100);
		}


		// files/attachment
		var urlObject = window.webkitURL || window.URL,
			htmlMedia = function(info, status) {
				var _el = $("#jreview-media-layout").clone().removeAttr("id"),
					_formatSize = function(size)
					{
						if (size>1000*1000*1000)
						{
							size = (size/(1000*1000*1000)).toFixed(2) + ' Gb';
						} else if (size>1000*1000) {
							size = (size/(1000*1000)).toFixed(2) + ' Mb';
						} else {
							size = (size/1000).toFixed(2) + ' Kb';
						}

						return size;
					};

				_el.addClass('state-'+status); /*state-uploading*/
				_el.find('span[data-name=name]').text(info.name);
				if (info.desc && !/^\s*$/.test(info.desc))
				{
					_el.find('span[data-name=desc]').text(info.desc);
				}
				_el.find('input[data-name=name]').val(info.name)
				_el.find('textarea[data-name=desc]').val(info.desc);
				_el.find('span[data-name=size]').text(_formatSize(info.size));
				_el.find('span[data-name=type]').text(info.type);

				if (info.hasOwnProperty('id'))
				{
					_el.find('._media_id').val(info.id);
				}

				if (info.preview!=null && info.preview!="")
				{
					_el.find('[data-name=preview]').append('<img src="'+info.preview+'" />');
				} else {
					_el.find('[data-name=preview]').append(_this.lang.get("no_preview"));
				}

				// events
				_el.find('._remove').click(function(){
					_el.fadeOut(function(){
						_el.remove();
					})
				});

				_el.find('._edit').click(function(){
					var id = _el.find('._media_id').val();

					_el.removeClass('state-complete')
					   .addClass('state-edit');

					$.get(_this.helper.url ({view:'media', task:'load_item', id:id}), function(r){
						if (r.status==400)
						{
							alert(r.error);
						} else {
							_el.find('input[data-name=name]').val(r.data.name);
							_el.find('textarea[data-name=desc]').val(r.data.description);
						}
					}, "json");
				});

				_el.find('._save').click(function(){
					var data = {
							name : _el.find('input[data-name=name]').val(),
							description : _el.find('textarea[data-name=desc]').val(),
							id : _el.find('._media_id').val()
						};

					if (/^\s*$/.test(data.name))
					{
						_el.find('input[data-name=name]').focus();
						return false;
					}

					_el.find('input,textarea').attr('disabled','disabled');

					$.post(_this.helper.url ({view:'media', task:'update'}), data, function(r){
						_el.find('input,textarea').removeAttr('disabled','disabled');
						if (r.status==400)
						{
							alert(r.error);
						} else {
							_el.find('span[data-name=name]').text(data.name);
							_el.find('span[data-name=desc]').html(data.description.replace(/(?:\r\n|\r|\n)/g, '<br/>'));

							_el.removeClass('state-edit')
					   			.addClass('state-complete');
						}
					}, "json");
				});

				_el.find('._ignore').click(function(){
					_el.removeClass('state-edit')
					   .addClass('state-complete');
				});
				

				return _el;
			};

		_form.find("._attachEvent").click(function (){
			var _elMedias 	= [],
				html = '';

			html+= '<div class="re-alert re-info" style="font-size:1.1em">';
				html+= '<ul class="jreview-list-unstyled">';
					html+= '<li>'+_this.lang.get("file_type_allow")+': '+_this.config.attachment.exts+'</li>';
					html+= '<li>'+_this.lang.get("max_file_size")+': '+_this.config.attachment.size+' Mb</li>';
					html+= '<li>'+_this.lang.get("max_file_upload")+': '+_this.config.attachment.max+'</li>';
				html+= '<ul>';
			html+= '</div>';
			html+= '<div style="text-align:center;margin-bottom:7px">';
				html+= '<button type="button" class="_selectFile">'+_this.lang.get("select_your_file")+'</button>';
			html+= '</div>';

			var dialogUploader = new _this.dialog (
			{
				caption : _this.lang.get("attachment"),
				content : html,
				submitLabel : _this.lang.get("add"),
				cancelfn : function (dialog)
				{
					
				},
				loadfn : function (dialog)
				{
					var _elFile = $('<input type="file" multiple="multiple" />');

					_elFile.change(function(evt){
						if (evt.target.files.length<1) return false;

						$.each (evt.target.files, function(k, file) {
							if ( typeof FormData=='undefined')
							{
								// not support HTML 5
								alert ("This feature couldn't run in your browser. Please update your browser to latest version.");
							}

							var data = new FormData(),
								_elMedia = htmlMedia ({
									name : file.name,
									desc : '',
									size : file.size,
									type : file.type,
									preview : $.inArray(file.type, ["image/gif", "image/jpeg", "image/png"])>-1 ? urlObject.createObjectURL(file) : null
								}, 'uploading');

							_elMedia.appendTo( dialog.el.find('.jreview-dg-content') );

							data.append('file', file);

							window.setTimeout (function(){
								var _elIndex = 0, 
									xhr = $.ajax({
										url: _this.helper.url ({view:'media', task:'upload'}),
										data: data,
										processData: false,
										contentType: false,
										dataType: 'json',
										xhr: function() {
											var xhrobj = $.ajaxSettings.xhr();
											if (xhrobj.upload) {
										        //obj.addClass('loading');
										        xhrobj.upload.addEventListener('progress', function(event) {
										            	var percent = 0;
										            	var position = event.loaded || event.position;
										            	var total = event.total;
											            if (event.lengthComputable) {
											                percent = Math.ceil(position / total * 100);
											            }
											            //Set progress
											            _elMedia.find('._media_bar ._filled').css('width',percent+'%');
											            _elMedia.find('._percent span').text(percent);
										        }, false);
										    }
											return xhrobj;
										},
										type: 'POST',
										success: function(d){
											//obj.removeClass('loading');
											if (d.status==200) {
												_elMedia.removeClass('state-uploading').addClass ('state-complete');
												_elMedia.find ('._media_id').val (d.id);

												_elMedias.push(_elMedia);
												_elIndex = _elMedias.length-1;

												_elMedia.find('._remove').click(function(){
													_elMedias.splice(_elIndex,1);
												});
											} else {
												_elMedia.removeClass('state-uploading').addClass ('state-error');
												_elMedia.find ('._errorMsg').text (d.error);
											}
										},
										error: function(xhr, ajaxOptions, thrownError){
											_elMedia.removeClass('state-uploading').addClass ('state-error');
											_elMedia.find ('._errorMsg').text ("JSON couldn't load.");
										}
									});

								_elMedia.on ('click','._cancel', function(){
									if (typeof xhr!='undefined') xhr.abort();
									_elMedia.fadeOut (function(){
										$(this).remove ();
									});
								});
							}, k*500);
						});
					});

					dialog.el.find('button._selectFile').click(function(){
						_elFile.trigger("click");
					});

					window.setInterval(function(){
						if (dialog.el.find('.state-complete').length<1 || dialog.el.find('.state-uploading').length>0)
						{
							dialog.el.find('.jreview-dg-submit').attr('disabled', 'disabled');
						} else {
							dialog.el.find('.jreview-dg-submit').removeAttr('disabled');
						}
					},500);
				},
				submitfn: function(dialog)
				{
					if (!_elMedias.length)
					{
						return null;
					}

					var numberMedia = _elMedias.length + _form.find(".jreview-media-success .jreview-media-item").length;
					if (numberMedia > _this.config.attachment.max*1)
					{
						dialog.setError(_this.lang.get("max_file_upload_desc", _this.config.attachment.max));
						return false;
					}

					$.each(_elMedias, function(k,_el){
						_el.appendTo( _form.find(".jreview-media-success") );
					});

					dialog.off();
				}
			});
		});

		// file/attachment of existing review
		if (typeof ratingData!="undefined" && ratingData.hasOwnProperty("media"))
		{
			$.each(ratingData.media, function(k,v){
				v.desc = v.description;
				var _el = htmlMedia(v, "complete");
				_el.appendTo( _form.find(".jreview-media-success") );
			});
		}
		
		// map location
		_this.mapData = 
		{
			lat: null,
			lng: null,
			address : null,
			name : null,
			icon : ""
		};

		var mapDataTmp = null,
			locLabelOg = _form.find("._attachLoc").text(),
			createMap = function()
			{
				if (!_this.config.location)
				{
					alert('You must enter Google Map API to run this featured');
					return;
				}

				var dialogMap = new _this.dialog (
				{
					caption : _this.lang.get("embed_location"),
					content : '<div class="mapContent">'+_this.lang.get("please_wait")+'</div>',
					submitLabel : _this.lang.get("add"),
					submitfn : function (dialog)
					{
						if (mapDataTmp!=null)
						{
							_this.mapData = mapDataTmp;
							_form.find("._attachLoc").text(_this.mapData.name);
						}

						dialog.off ();
					},
					loadfn : function (dialog)
					{
						if (mapDataTmp==null)
						{
							mapDataTmp = _this.mapData;
						}

						window.setTimeout (function()
						{
							var map = new google.maps.Map(dialog.el.find(".mapContent")[0],
								{
									center: {lat: -33.8688, lng: 151.2195},
									zoom: 13
						        }),
								html = '<div class="pac-box"><input type="text" class="pac-input" /></div>';
								html+= '<div class="infowindow-content">';
								html+= '<img src="" width="16" height="16" class="_icon">';
								html+= '<span class="_name"  class="title"></span><br>';
								html+= '<span class="_address"></span></div>';

							dialog.el.find('.jreview-dg-content').prepend(html);

					        var input = dialog.el.find('input.pac-input'),
					        	pac_box = dialog.el.find('.pac-box')[0];

					        map.controls[google.maps.ControlPosition.TOP_RIGHT].push(pac_box);

					        var autocomplete = new google.maps.places.Autocomplete(input[0]);
					        autocomplete.bindTo('bounds', map);

					        var infowindow = new google.maps.InfoWindow(),
					        	infowindowContent = dialog.el.find('.infowindow-content');
					        	infowindow.setContent(infowindowContent[0]);

					        var marker = new google.maps.Marker({
								map: map,
								anchorPoint: new google.maps.Point(0, -29)
					        });

					        // Bind map if have values
							if (_this.mapData.lng!=null)
							{
								var marker_loc  = new google.maps.LatLng(_this.mapData.lat, _this.mapData.lng);

								marker.setPosition(marker_loc);
								marker.setVisible(true);
								
								input.val (_this.mapData.name);

								infowindowContent.find('._name').text(_this.mapData.name);
								infowindowContent.find('._address').text(_this.mapData.address);
								infowindowContent.find('._icon').attr("src", _this.mapData.icon);
								infowindow.open(map, marker);
							}

					        autocomplete.addListener('place_changed', function() {
								infowindow.close();
								marker.setVisible(false);
								var place = autocomplete.getPlace();
								if (!place.geometry)
								{
									window.alert(_this.lang.get("map_not_found") + ": '" + place.name + "'");
									return;
								}

								// If the place has a geometry, then present it on a map.
								if (place.geometry.viewport)
								{
									map.fitBounds(place.geometry.viewport);
								} else {
									map.setCenter(place.geometry.location);
									map.setZoom(17);  // Why 17? Because it looks good.
								}

								marker.setPosition(place.geometry.location);
								marker.setVisible(true);

								var address = '';
								if (place.address_components)
								{
									address = [
									(place.address_components[0] && place.address_components[0].short_name || ''),
									(place.address_components[1] && place.address_components[1].short_name || ''),
									(place.address_components[2] && place.address_components[2].short_name || '')
									].join(' ');
								}

								infowindowContent.find('._icon').attr("src", place.icon);
								infowindowContent.find('._name').text(place.name);
								infowindowContent.find('._address').text(address);
								infowindow.open(map, marker);
								
								mapDataTmp.lat = marker.getPosition().lat();
								mapDataTmp.lng = marker.getPosition().lng();
								mapDataTmp.name = place.name;
								mapDataTmp.address = address;
								mapDataTmp.icon = place.icon;
							});
						}, 300);

						// create empty button
						if (_this.mapData.lat!=null)
						{
							var _emptyBtn = $('<button type="button">'+_this.lang.get("empty")+'</button>');
							_emptyBtn.click(function(){
								_this.mapData = {
									lat : null,
									lng : null,
									address : "",
									name : ""
								};
								_form.find("._attachLoc").text(locLabelOg);
								_emptyBtn.remove();
								dialog.off();
							});

							_emptyBtn.prependTo( dialog.el.find(".jreview-dg-caption") );
						}
					}
				});
			};

		_form.find("._attachLoc").click(function (){
			createMap();
		});

		// map of existing review
		if (typeof ratingData!="undefined" && ratingData.hasOwnProperty("map") && ratingData.map.hasOwnProperty("map_name") && !/^\s*$/.test(ratingData.map.map_name))
		{
			_form.find("._attachLoc").text( ratingData.map.map_name );
			_this.mapData = 
			{
				lat: ratingData.map.map_lat,
				lng: ratingData.map.map_lng,
				address : ratingData.map.map_address,
				name : ratingData.map.map_name,
				icon : ratingData.map.map_icon
			};
		}

		// check voting feature
		(function(){
			var requirelen = _form.find('.jreview-fields').find('.field-required').filter('[data-type=text],[data-type=textarea],[data-type=editor]').length;

			if (requirelen>0 || _form.find('#jform_title.required').length>0) return;

			var _el = $('<span class="jreview-voting"><i class="i-jreview-star"></i> '+_this.lang.get("quick")+'</span>');
			_el.click(function(){
				if (_el.hasClass('active'))
				{
					_el.removeClass('active');
					_form.find('.jreview-fields').find('textarea,input[type=text]').each(function(){
						$(this).removeAttr('disabled');
						var _p = $(this).parents('.control-group');
							_p.removeAttr('style');
							_p.find('.controls').removeAttr('style');
					});

					_form.find('#jform_title').removeAttr('disabled');
					_form.find('#jform_title').parents('.control-group').removeAttr('style');

				} else {
					_el.addClass('active');
					_form.find('.jreview-fields').find('textarea,input[type=text]').each(function(){
						$(this).attr('disabled','disabled');
						var _p = $(this).parents('.control-group');

						if (_p.find('.control-label._hasRating').length>0)
						{
							_p.find('.controls').hide();
						} else {
							_p.hide();
						}
					});

					// subject
					_form.find('#jform_title').attr('disabled','disabled');
					_form.find('#jform_title').parents('.control-group').hide();
				}
			});

			_el.prependTo(_form);
		})();

		// submit
		var passX = false;

		_form.submit(function(){
			var _form = $(this);

			// bind map data
			if (_this.mapData.lat!=null)
			{
				$("#jform_params_map_address").val(_this.mapData.address);
				$("#jform_params_map_name").val(_this.mapData.name);
				$("#jform_params_map_lat").val(_this.mapData.lat);
				$("#jform_params_map_lng").val(_this.mapData.lng);
				$("#jform_params_map_icon").val(_this.mapData.icon);
			} else {
				$("jreview-form .map_hidden input").val("");
			}

			if (passX)
			{
				passX = false;
				return true;
			}

			_this.helper.overlay();

			return true;
		});
	};

	this.reviewsEvents = function()
	{
		var _o = this,
			cookieLife = 1;
			this.sort = 'best',
			this.box = $('#jlexreview-e'+_this.config.id);

		this.events = function()
		{
			// filter
			_o.box.find('#jreview-summary input._filter_input').change(function(){
				var _filter = {};
				_o.box.find('#jreview-summary input._filter_input:checked').each(function(){
					var _name = $(this).attr("data-name");
					if (/^[1-9][0-9]*$/.test(_name) || _name=="star")
					{
						if (!_filter.hasOwnProperty(_name))
						{
							_filter[_name] = [$(this).val()];
						} else {
							_filter[_name].push( $(this).val() );
						}
					} else {
						_filter[_name] = $(this).val();
					}
				});

				_this.helper.filters=_filter;
				//_this.helper.cookie.set('jreview_filter', JSON.stringify(_filter), cookieLife);
				_o.getReviews(1);
			});

			// filter data
			var filterCid = [];
			_o.box.find('#jreview-summary input._filter_input').each(function(){
				if ($(this).attr("data-name")!="star")
				{
					filterCid.push({
						"name" : $(this).attr("data-name"),
						"value": $(this).val()
					});
				}
			});

			if(filterCid.length)
			{
				$.post(_this.helper.url({view:'others',task:'filter_data'}), {id:_this.config.id, cid:JSON.stringify(filterCid)}, function(d){
					if (d.length)
					{
						$.each(d, function(k,v){
							var _el = _o.box.find('#jreview-summary label._filter_label[for=_field_'+v.name+'_'+v.value+']');
							if (_el.length && v.count>0)
							{
								_el.append(' <span class="_filterCount">('+v.count+')</span>');
							}
						});
					}			
				}, 'json');
			}

			// sort
			_o.box.find('._sort').click(function(e){
				e.preventDefault();
				var _el = $(this),
					_sortby = _el.attr("data-col"),
					_label = _el.attr("data-label");

				if (_el.hasClass('active'))
				{
					return;
				}

				_o.box.find('._sort.active').removeClass('active');

				if (typeof _el.attr("data-dir")!= "undefined")
				{
					_sortby+= ' '+_el.attr("data-dir");
					_el.attr("data-dir", (_el.attr("data-dir")=='desc'?'asc':'desc'));
				}

				_el.addClass('active');

				if($.inArray(_sortby,['best','popular','desc','asc','modified'])==-1)
					_this.helper.cookie.set('jreview_sort', _sortby, cookieLife);
				_this.config.sort = _sortby;
				_o.getReviews(1);
				
				_o.box.find('.jreview-sort .jreview-dropdown-toggle span').text(_label);

				if (_o.box.find('.jreview-sort').hasClass('active'))
				{
					_o.box.find('.jreview-sort').removeClass('active');
				}
			});

			// search
			var qi_old='';
			_o.box.find('#jreview-sf').submit(function(e){
				e.preventDefault();
				var qi=$(this).find('input[type=text]');
					//_filter = _this.helper.cookie.get('jreview_filter');

				if(/^\s*$/.test(qi.val()) && /^\s*$/.test(qi_old))
				{
					qi.focus();
					return;
				}

				// assign new value
				qi_old = qi.val();
				_this.helper.filters.q=qi.val();

				/*
				if(_filter!=null)
				{
					_filter = $.parseJSON(_filter);
					_filter['q'] = qi.val();
				} else {
					_filter={q:qi.val()}
				}

				_this.helper.cookie.set('jreview_filter', JSON.stringify(_filter), cookieLife);
				*/
				_o.getReviews(1);
			});

			// language
			_o.box.on('click','.jreview-langs a._dx',function(e){
				e.preventDefault();
				var _el = $(this);
				if (_el.hasClass('active'))
				{
					return;
				}

				_this.helper.filters.lang=_el.attr("data-lang");
				/*
				var _filter = _this.helper.cookie.get('jreview_filter');

				if (_filter!=null)
				{
					_filter = $.parseJSON(_filter);
					_filter['lang'] = _el.attr("data-lang");
				} else {
					_filter = {lang:_el.attr("data-lang")}
				}

				_this.helper.cookie.set('jreview_filter', JSON.stringify(_filter), cookieLife);
				*/
				_o.getReviews(1);

				_o.box.find('.jreview-langs a.active').removeClass('active');
				_el.addClass('active');
				_o.box.find('.jreview-langs .jreview-dropdown-toggle').text( _el.text() );
				_o.box.find('.jreview-langs').removeClass('active');
			});

			_o.box.on("click", "._user_login", function(e){
				_this.helper.login();
			});

			_o.box.on("click", "._user_logout", function(e){
				e.preventDefault();
				$(this).text(_this.lang.get("please_wait"));
				_this.helper.logout();
			});

			// alert
			var alertCache = null;
				alertCheck = function(){
					if (_this.config.hasOwnProperty('embed')) return;
					$.get(_this.helper.url({view:'profile', task:'notification', unread:1}), function(d){
						if (d.total>0)
						{
							_o.box.find('._count_alert').text(d.total).show();
						}
					}, 'json');
				};

				if (_this.config.member==1)
				{
					alertCheck();
					window.setInterval(function(){
						alertCheck();
					}, 900000);
				}
				
			_o.box.find('._user_alert').click(function(){
				_o.box.find('._count_alert').hide();
				new _this.dialog({
					caption : _this.lang.get("notification"),
					content : '',
					submitLabel: _this.lang.get("mark_all_read"),
					submitfn : function(dialog)
					{
						dialog.overlay();

						$.post(_this.helper.url({view:'profile',task:'read'}), {all:1}, function(d){
							alertCache = null;
							dialog.off();
						}, 'json');
					},
					loadfn : function(dialog)
					{
						var bind_html = function(d)
							{
								if (d.total==0)
								{
									// no alert
									dialog.el.find('.jreview-dg-content').empty().append(_this.lang.get("empty_notification"));
									return;
								}

								var html = '',
									unread = [];

								$.each(d.alerts, function(k,v){
									html+= '<a class="alert-item '+(v.unread==1?'_unread':'')+'" href="'+ v.url +'">';
										html+= '<span class="_caption">'+v.caption+'</span>';
										html+= '<span class="_date">'+v.date_format+'</span>';
									html+= '</a>';

									if (v.unread==1)
									{
										unread.push(v.id);
									}
								});

								dialog.el.find('.jreview-dg-content').append(html);
								dialog.el.find('._load_more').remove();

								if (d.offset*1+d.limit*1<d.total*1)
								{
									dialog.el.find('.jreview-dg-content').append('<a class="_load_more">'+_this.lang.get("load_more")+'</a>');
									dialog.el.find('._load_more').click(function(){
										load_alerts( d.offset*1+d.limit*1 );
									});
								}

								if (unread.length>0)
								{
									$.post(_this.helper.url({view:'profile',task:'read'}), {cid:unread}, function(d){

									}, 'json');

									alertCache = null;
								}
							},
							load_alerts = function(offset)
							{
								var request = {view:'profile', task:'notification'},
									offset = typeof offset=="number" && offset>0 ? offset:0;
								
								if (offset>0)
								{
									request['offset'] = offset;
								}

								$.get(_this.helper.url(request), function(d){
									if (offset==0)
									{
										alertCache = d;
									}
									bind_html(d);
								}, 'json');
							};

						if (alertCache!=null)
						{
							bind_html(alertCache);
						} else {
							load_alerts();
						}
					}
				});
			});

			// profile
			if (_this.config.profile_page==1)
			{
				_o.box.on('click', '.jreview-pop', function(e){
					e.preventDefault();

					var uid = $(this).attr('data-uid'),
						url = _this.helper.url({view:'profile',id:uid,tmpl:'component'});

					if (uid<1) return;
					
					var	_profileDialog = new _this.dialog({
							caption: _this.lang.get("activities"),
							content: '<iframe id="jreview-profile" src="'+url+'"></iframe>',
							submitLabel: false
						});
				});
			}

			// embed
			_o.box.on('click', '.jreview-embed', function(e){
				e.preventDefault();

				var _key 	= $(this).attr('data-key'),
					_html 	= '';
					_key 	= _key.split(',');

				_html+= '<p style="text-align:center">'+_this.lang.get('embed_guide')+'<br>';
				_html+= '<input type="text" id="embed-code" value="" style="display:inline; margin-right:0" onclick="this.focus();this.select()" readonly></p>';

				_html+= '<iframe src="about:blank" id="embed-preview" style="border: 2px solid #d1d1d1; margin: 0 auto 20px auto; display: block; width: 100%; max-width: 300px; border-radius: 5px; height: 200px;"></iframe>';

				_html+= '<ul class="jreview-list-inline" style="text-align:center">';
				_html+= '<li><label><input type="checkbox" data-name="list">'+_this.lang.get('reviews')+'</label></li>';
				_html+= '<li><label><input type="checkbox" data-name="sd">'+_this.lang.get('summary')+'</label></li>';
				_html+= '<li><label>'+_this.lang.get('width')+' <input type="number" data-name="w" value="250"></label></li>';
				_html+= '<li><label>'+_this.lang.get('height')+' <input type="number" data-name="h" value="300"></label></li>';
				_html+= '</ul>';

				var	_embedDialog = new _this.dialog({
						caption: _this.lang.get("embed"),
						content: _html,
						loadfn: function(dialog)
						{
							var _createUrlEmbed = function(params, w, h){
								w = w || 250; if (w<50) w=250;
								h = h || 300; if (h<50) h=300;
								var f = _this.helper.url(params);
									f = window.location.origin + f;
								var	fenc = '<iframe width="'+w+'" height="'+h+'" src="'+f+'" frameborder="0"></iframe>';
								dialog.el.find('#embed-code').val(fenc);
								dialog.el.find('#embed-preview').attr('src', f);
							};

							_createUrlEmbed({view:'embed',obj:_key[0],id:_key[1]});

							dialog.el.find('.jreview-dg-content').addClass('embed');
							dialog.el.find('input[data-name]').on('click keyup', function(){
								var _params = {
										view:'embed',
										obj:_key[0],
										id:_key[1]
									};
								dialog.el.find('input[type=checkbox]:checked').each(function(){
									_params[$(this).attr('data-name')]=1;
								});

								_createUrlEmbed(_params, dialog.el.find('[data-name=w]').val(), dialog.el.find('[data-name=h]').val());
							});
						},
						submitLabel: false
					});
			});

			// summary - rating flag text
			if (_this.config.hasOwnProperty('rtext') && typeof _this.config.rtext == "object" && _o.box.find('.rating-text-label').length)
			{
				_o.box.find('.rating-text-label').each(function(){
					var _el = $(this),
						_percent = parseFloat(_el.attr('data-percent'));

					$.each(_this.config.rtext, function(k,v){
						if (_percent<=parseFloat(v.max) && _percent>=parseFloat(v.min) )
						{
							_el.text(v.title);
						}
					});
				});
			}

			// summary - large star
			_o.box.find('#jreview-summary .sum-star').each(function(){
				var _el = $(this),
					_elrating = _el.attr('data-rating')*1,
					_elmax = _el.attr('data-max'),
					_h='';

				for(var i=0; i<_elmax; i++)
				{
					var _fill = _elrating<i?0:(_elrating-1>=i?100:parseInt((_elrating-i)*100));
					_h+='<span class="_star"><span class="fill" style="width:'+_fill+'%"></span><span class="star-sprite"></span></span>';
				}

				_el.empty().append(_h);
			});

			var __cronblock = function()
			{
				var _els = _o.box.find('.reviewBlock').not('.marked');

				if(!_els.length) return;

				_els.each(function(){
					var _el = $(this),
						_rating=0;
						_max=5;

					// star rating
					_el.find('.star-rating').each(function(){
						var _elc = $(this),
							_elmax = _elc.attr('data-max')*1;
							_elrating = _elc.attr('data-rating')*1;

						if(_elc.hasClass('jovv')){
							_rating=_elrating;
							_max=_elmax;
							if(_elrating==0){
								_el.find('.re-rank').remove();
							}
						}

						if(_elrating==0)
						{
							_elc.remove();
						} else {
							for(var i=1; i<=_elmax; i++)
							{
								var hk='<div class="_star';
										if (_elrating>=i)
										{
											hk+= ' fullStar';
										} else if (_elrating+0.5==i) {
											hk+= ' halfStar';
										}
										hk+= '"><span class="_star_inner"></span>';
										hk+= '<span class="star-sprite"></span>';
									hk+= '</div>';
								_elc.append(hk);
							}
						}
					});

					// rating text
					if (_this.config.hasOwnProperty('rtext') && typeof _this.config.rtext=="object")
					{
						var _percent = parseInt(_rating*100/_max);
						$.each(_this.config.rtext, function(k,v){
							if(_percent<=v.max && _percent>=v.min)
							{
								_el.find('.re-rank').css('background', '#'+v.color);
								_el.find('.re-rank').text(v.title);
								return false;
							}
						});

						_el.find('.re-color').each(function(){
							var _elc = $(this),
								_elp = _elc.attr('data-percent')*1;

							$.each(_this.config.rtext, function(k,v){
								if(_elp<=v.max && _elp>=v.min)
								{
									_el.find('.re-color')
										.css('background', '#'+v.color)
										.attr('title', v.title);
									return false;
								}
							});
						});
					}

					// render photo box
					_el.find('.jreview-images').lightGallery({
						selector:'a'
					});

					// collapse review if too long
					if(_this.config.review_collapse==1 && _this.config.hasOwnProperty('collapse_height'))
					{
						if (_el.find('.re-body').height()>_this.config.collapse_height)
						{
							_el.addClass('_collapse');
							_el.find('._collapse_btn').click(function(){
								_el.removeClass('_collapse');
							});
						}
					}
					

					// should hide label when form has only one field
					if(_el.find('.re-control-group').length===1) _el.find('.re-control-label').hide();
				});
				
				_els.addClass('marked');
			};
			
			__cronblock();
			window.setInterval(function(){ __cronblock(); }, 500);
		};

		this.pagination = function(page, total)
		{
			var _el 	= _o.box.find('#jreview-pagination'),
				_create = function(pageNumber)
				{
					var _itemPage = 0;
						_item = null;
						url = _this.config.url+(_this.config.url.indexOf('?')==-1?'?':'&')+'jpage=';

					if (pageNumber==0)
					{
						if (page==1)
						{
							//_item = $('<li><a>Previous</a></li>');
						} else {
							_itemPage = page-1;
							_item = $('<li><a href="'+url+(page-1)+'">'+_this.lang.get("previous")+'</a></li>');
						}
					} else if (pageNumber==-1) {
						if (page==total)
						{
							//_item = $('<li><a>Next</a></li>');
						} else {
							_item = $('<li><a href="'+url+(page+1)+'">'+_this.lang.get("next")+'</a></li>');
							_itemPage = page+1;
						}
					} else {
						_item = $( '<li><a href="'+url+pageNumber+'" class="'+(pageNumber==page?'active':'')+'">'+pageNumber+'</a></li>');
						_itemPage = pageNumber;
					}

					if (_item==null) return;

					_item.on("click", "a", function(e){
						e.preventDefault();
						if (_itemPage==0 || $(this).hasClass("active") || $(this).hasClass("loading"))
						{
							return;
						}
						
						_o.getReviews(_itemPage);
						history.pushState({etype:'review',page:_itemPage}, null, $(this).attr("href"));
					});

					return _item;
				};

			if (typeof total=='undefined')
			{
				total 	= _el.find('input').attr('data-total')*1;
			}
			
			if (typeof page=='undefined')
			{
				page 	= _el.find('input').attr('data-current')*1;
			}

			// reset
			_el.find('.jreview-pagination').remove();

			if (total<2)
			{
				return;
			}

			var html = $('<ul class="jreview-pagination"></ul>');
			
			if (total<=5)
			{
				for (i=1;i<=total;i++)
				{
					html.append( _create(i) );
				}
			} else {
				html.append( _create(0) );
				html.append( _create(1) );

				if (page-2 > 1)
				{
					html.append('<li>...</li>');
				}

				if (page<4)
				{
					html.append( _create(2) );
					html.append( _create(3) );
					html.append( _create(4) );
				} else if (page>total-3) {
					html.append( _create(total-3) );
					html.append( _create(total-2) );
					html.append( _create(total-1) );
				} else {
					html.append( _create(page-1) );
					html.append( _create(page) );
					html.append( _create(page+1) );
				}

				if (page+2 < total)
				{
					html.append('<li>...</li>');
				}

				// end page
				html.append( _create(total) );
				html.append( _create(-1) );
			}

			_el.prepend( html );
		};

		this.getReviews = function(page)
		{
			var response = {
					"entry_id" : _this.config.id,
					"jpage" : page,
					"t" : _this.config.time
				};

			if(_this.config.hasOwnProperty('sort')) response.sort = _this.config.sort;
			_this.config.page=page;

			// filter
			if(!$.isEmptyObject(_this.helper.filters))
			{
				response.filters=JSON.stringify(_this.helper.filters);
			}

			// create overlay
			_o.box.find("#jreview-listing")
				.append('<div class="_load_review_state"></div>');
			// move to top
			$('html,body').animate({scrollTop: _o.box.find("#jreview-listing").offset().top - 50}, '500');

			$.post(_this.helper.url({view:"reviews", task:"more"}), response , function(d){
				_o.box.find("#jreview-listing").empty().append(d.data); // reset reviews
				_o.pagination(d.pagination.page, d.pagination.total); // create pagination again

				_o.box.find('[data-dest="jreview-main"] ._tab_count').text(d.pagination.total_rating);

				// lang filter
				if (_this.config.langfilter==1 && d.langTags!=null)
				{
					var html = '';
					$.each(d.langTags, function(k,v){
						html+= '<li><a class="_dx" data-lang="'+k+'">'+v.text+' ('+v.count+')'+'</a></li>';
					});
					_o.box.find('.jreview-langs .jreview-dropdown-menu').empty().append(html);
				}

				// active review form
				_o.box.find('[data-dest="jreview-main"]').trigger('click');
			}, "json");
		};

		this.photos = function(el)
		{
			// limit, all, lightbox
			var $grid = null,
				pConfig = {
					limit: el.attr('data-limit'),
					all: el.attr('data-all'),
					lightbox: el.attr('data-lightbox')
				},
				pOptions = {
						selector:'a',
						download:false,
						counter:false
					},
				getPhotos = function(offset)
				{
					offset = typeof offset=="undefined" ? 0 : offset;
					$.get(_this.helper.url({view:'others', task:'photos'}), {id:_this.config.id, offset:offset, limit:pConfig.limit}, function(d){
						if (typeof d.photos=='object' && d.photos.length>0)
						{
							$.each(d.photos, function(k,v){
								var url 	= _this.config.url + (_this.config.url.indexOf('?')==-1?'?':'&') + 'review_id=' + v.review_id,
									html 	= '',
									desc 	= '';

								if (!/^\s*$/.test(v.title))
								{
									desc+= '<h4><a href="'+url+'">'+v.title+'</a></h4>';
								}
								desc+= '<p><b>'+v.name+'</b> ';
								if (!/^\s*$/.test(v.description) && v.description!=null)
								{
									desc+= v.description;
								}
								desc+= '</p>';

								// encode
								desc = 	desc.replace(/&/g, "&amp;")
									      .replace(/</g, "&lt;")
									      .replace(/>/g, "&gt;")
									      .replace(/"/g, "&quot;")
									      .replace(/'/g, "&#039;");

								html+= '<div class="photoItem">';
									if(pConfig.lightbox=='1') html+= '<a href="'+v.full+'" data-sub-html="'+desc+'">';
										html+= '<span class="_img" style="background-image:url('+v.thumb+')"></span>';
									if(pConfig.lightbox=='1') html+= '</a>';
								html+= '</div>';

								$grid.append( html );
							});

							if(offset>0 && pConfig.lightbox=='1') $grid.data('lightGallery').destroy(true);
							if(pConfig.lightbox=='1') $grid.lightGallery(pOptions);
						} else {
							if(offset==0)
							{
								el.remove();
								return;
							}
						}

						// pagination
						if(pConfig.all=='1')
						{
							var _page = '<a>('+(d.page.offset+d.page.limit)+'/'+d.page.total+') '+_this.lang.get("load_more")+'</a>';
								_page = $(_page);

							_page.click(function(){
								getPhotos(d.page.offset+d.page.limit);
							});

							el.find('._pagination').remove();
							if(d.page.offset+d.page.limit<d.page.total)
							{
								el.append('<div class="_pagination"></div>');
								el.find('._pagination').append(_page);
							}
						} else {
							if(d.page.offset+d.page.limit<d.page.total)
							{
								el.find('.photoItem').last().append('<div class="_imgall">'+_this.lang.get("show_all_photos", d.page.total)+'<div>');
							}
						}
					}, "json");
				};

			// replace
			el.after('<div class="jphoto"></div>');
			el=el.next('.jphoto');
			el.prev().remove();

			el.append('<div class="_items"></div>');
			$grid = el.find('._items');

			getPhotos(0);
		};
		
		this.init = function()
		{
			_o.events();

			window.setInterval(function(){
				if(!_o.box.find('.jreviewPtConfig').length) return;
				_o.box.find('.jreviewPtConfig').each(function(){
					_o.photos($(this));
				});
			},500);

			/*
			var _filter = _this.helper.cookie.get('jreview_filter');
			if (_filter!=null)
			{
				_filter = $.parseJSON( _filter );
				$.each(_filter, function(k,v){
					if (k=="star")
					{
						$.each(v, function(k1,v1){
							_o.box.find('input[data-name="star"][value='+v1+']').prop("checked", true);
						});
					} else if (k=="q") {
						_o.box.find('#jreview-sf input').val( v );
						if (!/^\s*$/.test(v))
						{
							_o.box.find('.jreview-findbox').removeClass('hidden');
						}
					} else if (k=="lang") {
						var _el = _o.box.find('.jreview-langs a._dx[data-lang="'+v+'"]');
						
						_o.box.find('.jreview-langs a._dx.active').removeClass('active');
						_el.addClass('active');

						_o.box.find('.jreview-langs .jreview-dropdown-toggle').text( _el.text() );
					} else if (/^[1-9][0-9]*$/.test(k)) {
						$.each(v, function(k1,v1){
							_o.box.find('input[data-name="'+k+'"][value='+v1+']').prop("checked", true);
						});
					}
				});
			}
			*/

			var _sortby = _this.helper.cookie.get('jreview_sort');
			if (_sortby!=null && $.inArray(_sortby,['best','popular','desc','asc','modified'])==-1)
			{
				var res = _sortby.match(/^([1-9][0-9]*)\s(asc|desc)$/i);

				_o.box.find('._sort.active').removeClass('active');

				if (res!=null)
				{
					var _el = _o.box.find('._sort[data-col='+res[1]+'][data-dir='+res[2]+']');
					_el.attr('data-dir', res[2]=='desc'?'asc':'desc');
					_el.addClass('active');
				} else {
					var _el = _o.box.find('._sort[data-col='+_sortby+']');
					_el.addClass('active');
				}

				_o.box.find('.jreview-sort .jreview-dropdown-toggle span').text(_el.attr('data-label'));
			}

			_o.pagination();

			var first_page = _this.config.page;
			_o.pagination();
			window.onpopstate = function(e){
				var p=first_page;
				if(e.state && e.state.etype=='review'){
					p=e.state.page; 
			    }

			    if(p==_this.config.page) return;
			    _o.getReviews(p);
			};
		}
	};

	this.reviewEvents = function()
	{
		// map
		$("#jreview-listing").on("click", ".jreview-cmd-map", function(){
			var _el = $(this),
				dialogMap = new _this.dialog (
				{
					caption : _el.attr("data-name"),
					content : '<div class="mapContent">'+_this.lang.get("please_wait")+'</div>',
					submitLabel : false,
					loadfn : function (dialog)
					{
						window.setTimeout (function()
						{
							var map = new google.maps.Map(dialog.el.find(".mapContent")[0],
								{
									center: {lat: -33.8688, lng: 151.2195},
									zoom: 13
						        }),
								html = '<div class="infowindow-content">';
								html+= '<img src="" width="16" height="16" class="_icon">';
								html+= '<span class="_name"  class="title"></span><br>';
								html+= '<span class="_address"></span></div>';

							dialog.el.find('.jreview-dg-content').prepend(html);

					        var infowindow = new google.maps.InfoWindow(),
					        	infowindowContent = dialog.el.find('.infowindow-content');
					        	infowindow.setContent(infowindowContent[0]);

					        var marker = new google.maps.Marker({
								map: map,
								anchorPoint: new google.maps.Point(0, -29)
					        });

					        var marker_loc  = new google.maps.LatLng(_el.attr("data-lat"), _el.attr("data-lng"));

							marker.setPosition(marker_loc);
							marker.setVisible(true);

							infowindowContent.find('._name').text(_el.attr("data-name"));
							infowindowContent.find('._address').text(_el.attr("data-address"));
							infowindowContent.find('._icon').attr("src", decodeURIComponent(_el.attr("data-image")));
							infowindow.open(map, marker);

						}, 300);
					}
				});
		});

		// helpful vote
		$("#jreview-listing").on("click", ".re-help-up, .re-help-down", function(){
			var _el = $(this),
				rid = _el.attr("data-id"),
				vote 	= _el.hasClass("re-help-up") ? 1 : 0,
				_parent = _el.parents('.re-helpful');

			if (_el.hasClass("active"))
			{
				vote = -1;
			}

			_el.parent().children().attr("disabled","disabled");
			$.post(_this.helper.url({view:"others", task:"vote"}), {id:rid, val:vote, type:1}, function(d){
				_el.parent().children().removeAttr("disabled","disabled");

				if (d.status==400)
				{
					alert(d.error);
					return;
				}

				switch (d.r.id)
				{
					case -1:
						_el.removeClass("active");
						break;

					case 1:
					case 0:
						_el.addClass("active");
						if (vote==1)
						{
							_el.parent().find(".re-help-down").removeClass("active");
						} else {
							_el.parent().find(".re-help-up").removeClass("active");
						}
						break;

					default:
						return;
				}

				if (d.r.data!=null)
				{
					_parent.find('.re-help-match').text( d.r.data.count_help );
					_parent.find('.re-help-count').text( d.r.data.count_help*1+d.r.data.count_unhelp*1 );
				}
			}, "json");
		});

		// report
		$("#jreview-listing").on("click", ".jreview-report", function(e){
			e.preventDefault ();
			_this.helper.report( $(this), 1 );
		});

		// sharing
		$("#jreview-listing").on("click", ".jreview-share", function(){
			var _el  = $(this),
				id = _el.attr ('data-id'),
				caption = $("#review-"+id+" .re-title").text();

			caption = $.trim(caption);

			var url  = _this.config.url + (_this.config.url.indexOf('?')==-1?'?':'&') + 'review_id=' + id;

			var content = '<input type="text" readonly value="'+url+'" style="margin: 10px auto;background: #fff;" />',
				shareTools = [];

			if (_this.config.sharefb==1)
			{
				shareTools.push ('<li><a class="jreview-share-fb jreview-share-item" data-type="fb"><i class="fa fa-facebook" aria-hidden="true"></i></a></li>');
			}

			if (_this.config.sharetw==1)
			{
				shareTools.push ('<li><a class="jreview-share-tw jreview-share-item" data-type="tw"><i class="fa fa-twitter" aria-hidden="true"></i></a></li>');
			}

			if (_this.config.sharegg==1)
			{
				shareTools.push ('<li><a class="jreview-share-gg jreview-share-item" data-type="gg"><i class="fa fa-google" aria-hidden="true"></i></a></li>');
			}

			if (shareTools.length)
			{
				content+= '<ul class="jreview-inline" style="text-align:center">';
					content+= shareTools.join ('');
				content+= '</ul>';
			}
			
			new _this.dialog ({
				caption : _this.lang.get("permalink"),
				submitLabel : false,
				content : content,
				loadfn : function (dialog)
				{
					dialog.el.find ('input[type="text"]').click (function(){
						dialog.el.find ('input[type="text"]').select();
					});

					dialog.el.find ('input[type="text"]').focus().select();

					dialog.el.on ('click', '.jreview-share-item', function(){
						var t = $(this).attr('data-type'),
							url2share = null;

						switch (t) {
							case 'fb':
								if (typeof FB!='undefined') {
									var fbOptions = {
											method: 'feed',
											link: url
										};

									if (!/^\s*$/.test(caption))
									{
										fbOptions['caption'] = caption;
									}

									FB.ui(fbOptions, function(response){});

									return;
								}
								
								url2share = 'https://www.facebook.com/sharer.php?s=100&p[url]'+encodeURIComponent(url)+(!/^\s*$/.test(caption)?'&p[message]='+encodeURIComponent(caption):'');
								break;

							case 'tw':
								url2share = 'https://twitter.com/intent/tweet?tw_p=tweetbutton'+(!/^\s*$/.test(caption)?'&text='+encodeURIComponent(caption):'')+'&url='+encodeURIComponent(url);
								break;

							case 'gg':
								url2share = 'https://plus.google.com/share?url='+encodeURIComponent(url);
								break;
						}

						if (url2share!=null)
						{
					        window.open(url2share, 'jreview_sharer', 'top=200,left=200,toolbar=0,status=0,width=600,height=450');
						}
					});
				}
			});
		});

		// comment
		$("#jreview-listing").on("click", ".jreview-cm-load", function(){
			var _el = $(this),
				id  = _el.attr("data-id");

			if (_el.hasClass("disabled"))
			{
				return;
			}

			_el.addClass("disabled");
			$.post(_this.helper.url({view:"comments", task:"more"}), {rid:id, tl:_this.config.time, wrap:1}, function(d){
				if (!d.data)
				{
					return;
				}

				$('#review-'+id).find('.re-content').append('<div class="re-comments">'+d.data+'</div>');
			}, "json");
		});

		// state
		$("#jreview-listing").on("click", ".jreview-state", function(){
			var _el = $(this),
				id  = _el.attr("data-id");

			if (_el.hasClass("disabled"))
			{
				return;
			}

			_el.addClass("disabled");
			$.post(_this.helper.url({view:"review", task:"state"}), {id:id}, function(d){
				_el.removeClass("disabled");
				if (d.status==400)
				{
					alert( d.error);
				} else {
					if (d.data==1)
					{
						$("#review-" + id + " .jreview-state-msg").addClass("hidden");
					} else {
						$("#review-" + id + " .jreview-state-msg").removeClass("hidden");
					}
				}
			}, "json");
		});

		// featured
		$("#jreview-listing").on("click", ".jreview-hl", function(){
			var _el = $(this),
				id  = _el.attr("data-id");

			if (_el.hasClass("disabled"))
			{
				return;
			}

			_el.addClass("disabled");
			$.post(_this.helper.url({view:"review", task:"featured"}), {id:id}, function(d){
				_el.removeClass("disabled");
				if (d.status==400)
				{
					alert( d.error);
				} else {
					if (d.data==1)
					{
						$("#review-" + id).addClass("_featured");
					} else {
						$("#review-" + id).removeClass("_featured");
					}
				}
			}, "json");
		});

		// remove
		$("#jreview-listing").on("click", ".jreview-remove", function(){
			var _el = $(this),
				id  = _el.attr("data-id");

			new _this.dialog({
				caption: _this.lang.get("confirm"),
				content: _this.lang.get("confirm_del_review"),
				submitLabel: _this.lang.get("delete"),
				submitfn: function(dialog)
				{
					dialog.overlay();
					$.post(_this.helper.url({view:"review", task:"remove"}), {id:id}, function(d){
						if (d.status==400)
						{
							dialog.unOverlay();
							dialog.setError(d.error);
							dialog.el.find(".jreview-dg-submit").remove();
						} else {
							dialog.off();
							$("#review-"+id).fadeOut(function(){
								$(this).remove();
							})
						}
					}, "json");
				}
			});
		});

		// download file
		$("#jreview-listing").on("click", "._item_attach", function(e){
			e.preventDefault();

			var _el = $(this),
				id  = _el.attr("data-id"),
				downloadfn = function()
				{
					var url = _this.helper.url({view:"media", task:"download", id:id, tmpl:"component"});
						window.location.href = url;
				};

			if (_el.hasClass("disabled"))
			{
				return false;
			}

			_el.addClass("disabled");
			$.get( _this.helper.url({view:"media", task:"checker"}), {id:id}, function(d){
				_el.removeClass("disabled");
				if (d.status==200)
				{
					// ok - download now
					downloadfn();
				} else if (d.status==302) {
					// guest - show login form
					_this.helper.login(_this.lang.get("download_login_require"));
				} else {
					// error
					alert( d.error );
				}
			}, "json");
		});
	};

	this.commentEvents = function()
	{
		$("#jreview-listing")
		.on("click", ".jreview-cm-add, .jreview-cm-reply", function(){
			var _el = $(this),
				id 	= _el.attr("data-id"),
				repid = typeof _el.attr("data-repid") == "undefined" ? 0 : _el.attr("data-repid"),
				pid = typeof _el.attr("data-pid") == "undefined" ? 0 : _el.attr("data-pid"),
				_dest = repid>0 ? $("#comment-"+repid+" .reply-form:eq(0)") : $("#review-"+id+" .jreview-cm-form-box");

			if(_el.hasClass("processing")) return;

			if(_el.hasClass("active"))
			{
				_el.removeClass("active");
				_dest.empty();
				return;
			}

			_el.addClass("active");

			var formCm 	= $("#jreview-cm-form-layout").clone().removeAttr("id")
							.attr("class", "jreview-cm-form").removeAttr("style");

			formCm.appendTo( _dest );
			formCm.find("textarea").focus();

			// assign data
			formCm.find('input[name=reply_id]').val(repid);
			formCm.find('input[name=review_id]').val(id);

			if(_this.config.member==0)
			{
				formCm.find('input[name=author_name]').val(_this.helper.cache.name);
				formCm.find('input[name=author_email]').val(_this.helper.cache.email);
			}


			// events
			var cmExtendData = [];
			formCm.find('._cancel').click(function(){
				_el.removeClass("active");
				_dest.empty();
			});
			
			formCm.submit(function(e){
				e.preventDefault();

				var cmMsg  = formCm.find('textarea[name=comment]').val(),
					postCm = function()
					{
						var formfn = {
								countEvent 	: 0,
								passEvent	: 0,
								el 			: formCm.find('form'),
								data 		: []
							},
							submitCm = function(callback)
							{
								if (formfn.countEvent!=formfn.passEvent)
								{
									return false;
								}

								var formData = formCm.find('form').serializeArray();
									postData = [];

								$.each(formData, function(k,v){
									postData.push({
										name:'jform['+v.name+']',
										value:v.value
									});
								});

								$.each(cmExtendData, function(k,v){
									postData.push({
										name:'jform['+v.name+']',
										value:v.value
									});
								});

								postData = $.merge(formfn.data, postData);

								$.post(_this.helper.url({view:"comments",task:"save"}), postData, function(d){
									if (typeof callback=="function")
									{
										callback(d);
									}

									if (d.status==200)
									{
										_loadCm(id, pid, repid);
										formCm.remove();
									} else {
										alert(d.error);
									}
								}, "json");
							};

						
						_this.helper.listenEvent('jreview.cm.submit',{$:$, jreview:_this, form:formfn, submitfn:submitCm});
						
						if (formfn.countEvent==0)
						{
							submitCm();
						}
					};

				if(/^\s*$/.test(cmMsg))
				{
					formCm.find("textarea").focus();
					return false;
				}

				if(_this.config.member==0)
				{
					_this.helper.cache.set(formCm.find('input[name=author_name]').val(), formCm.find('input[name=author_email]').val());
				}

				postCm();
			});
		})
		.on("click", ".jreview-cmVoteUp, .jreview-cmVoteDown", function(){
			// like/dislike
			var _el = $(this),
				id 	= _el.attr("data-id"),
				vote 	= _el.hasClass("jreview-cmVoteUp") ? 1 : 0,
				_parent = _el.parents(".jreview-cmVote");

			if(_el.hasClass("disabled")) return;

			if(_el.hasClass("active")) vote=-1;

			_parent.find( "a" ).addClass("disabled");

			$.post(_this.helper.url({view:"others", task:"vote"}), {id:id, val:vote, type:0}, function(d){
				_parent.find( "a" ).removeClass("disabled");

				if (d.status==400)
				{
					alert(d.error);
					return;
				}

				switch (d.r.id)
				{
					case -1:
						_el.removeClass("active");
						break;

					case 1:
					case 0:
						_el.addClass("active");
						if (vote==1)
						{
							_parent.find( ".jreview-cmVoteDown" ).removeClass("active");
						} else {
							_parent.find( ".jreview-cmVoteUp" ).removeClass("active");
						}
						break;

					default:
						return;
				}

				if(d.r.data!=null)
				{
					var $elU=_parent.find('.jreview-cmVoteUp').next('._count'),
						$elD=_parent.find('.jreview-cmVoteDown').next('._count');

					$elU.text(d.r.data.count_help);
					if(d.r.data.count_help>0){
						$elU.removeClass('jreview-hidden');
					} else {
						$elU.addClass('jreview-hidden');
					}

					$elD.text(d.r.data.count_unhelp);
					if(d.r.data.count_unhelp>0){
						$elD.removeClass('jreview-hidden');
					} else {
						$elD.addClass('jreview-hidden');
					}
				}
			}, "json");
		})
		.on("click", ".jreview-cm-edit", function(){
			var id = $(this).attr("data-id")*1,
				dialogCm = new _this.dialog({
					caption : _this.lang.get("edit_comment"),
					content : _this.lang.get("please_wait"),
					submitLabel : "Update",
					loadfn : function (dialog)
					{
						$.post(_this.helper.url({view:"comments", task:"edit"}), {id:id}, function(d)
						{
							if (d.status==400)
							{
								dialog.setError( d.error );
								dialog.el.find(".jreview-dg-submit").remove();
								return;
							}

							var html = '<textarea>'+d.data.comment+'</textarea>';
							dialog.el.find(".jreview-dg-content").empty().append(html);
						}, "json");
					},
					submitfn : function(dialog)
					{
						var _elComment = dialog.el.find("textarea"),
							_dataCm = [
								{
									name : 'comment',
									value: _elComment.val()
								},
								{
									name : 'id',
									value : id
								}
							];

						if (/^\s*$/.test(_elComment.val()))
						{
							_elComment.focus();
							return;
						}

						dialog.overlay();

						$.post(_this.helper.url({view:"comments", task:"update"}), _dataCm, function(d){
							dialog.unOverlay();

							if (d.status==400)
							{
								dialog.setError( d.error );
							} else {
								$('#comment-'+id).find('._comment').empty().append(d.data);
								dialog.off();
							}
						}, "json");
					}
				});
		})
		.on("click", ".jreview-cm-delete", function(){
			var _el = $(this),
				id  = _el.attr("data-id");

			if (_el.hasClass("disabled"))
			{
				return;
			}

			$.post(_this.helper.url({view:"comments", task:"remove"}), {id:id}, function(d){
				_el.removeClass("disabled");
				if (d.status==400)
				{
					alert( d.error );
				} else {
					$("#comment-"+id).fadeOut('fast', function(){
						$(this).remove();
					});
				}
			}, "json");
		})
		.on("click", ".jreview-cm-state", function(){
			var _el = $(this),
				id  = _el.attr("data-id");

			if (_el.hasClass("disabled"))
			{
				return;
			}

			$.post(_this.helper.url({view:"comments", task:"state"}), {id:id}, function(d){
				_el.removeClass("disabled");
				if (d.status==400)
				{
					alert( d.error );
				} else {
					var _cmEl = $("#comment-"+id);
					if (d.publish==1)
					{
						_cmEl.find("._state:eq(0)").addClass("hidden");
					} else {
						_cmEl.find("._state:eq(0)").removeClass("hidden");
					}
				}
			}, "json");
		})
		.on("click", ".jreview-cm-report", function(e){
			e.preventDefault ();
			_this.helper.report( $(this), 0 );
		})
		.on("click", ".jreview-cmUrl", function(e){
			e.preventDefault ();
			var id = $(this).attr("data-id");
				content = '<input type="text" value="' + ( _this.config.url + (_this.config.url.indexOf('?')==-1?'?':'&') + 'review_id=' + id ) + '" style="margin: 10px auto;background: #fff;" />';
			new _this.dialog({
				caption : "Permalink",
				content : content,
				submitLabel : false,
				loadfn : function(dialog)
				{
					dialog.el.find("input").click(function(){
						$(this).select();
					});

					dialog.el.find("input").focus().select();
				}
			})
		});

		// load comment
		var _cm_map = {},
			_loadCm = function(rid, pid, reply_id)
			{
				var key = rid + '_' + pid,
					request = {
						rid : rid,
						pid : pid,
						to  : 0
					},
					_parent = $('.jreview-cmlist[data-id="'+rid+','+pid+'"]'),
					reply_id = typeof reply_id=='undefined' ? 0 : reply_id;

				if (!_cm_map.hasOwnProperty(key))
				{
					_cm_map[key] = _this.config.time;
				}

				request.to = _cm_map[key];
				if (_parent.length)
				{
					request.wrap = 0;
				} else {
					request.wrap = 1;
				}

				$.post(_this.helper.url({view:"comments", task:"more"}), request, function(d){
					if (d.data==null)
					{
						return;
					}

					// update time
					_cm_map[key] = d.time;

					if (_parent.length)
					{
						if (pid>0 && reply_id>0)
						{
							_parent.find('#comment-'+reply_id).after( d.data );
						} else {
							_parent.prepend(d.data);
						}
					} else {
						if (pid==0)
						{
							$('#review-'+rid).find('.re-content').append('<div class="re-comments">'+d.data+'</div>');
						} else {
							$('#comment-'+pid).find('.cm-content').after('<div class="_child">'+d.data+'</div>');
						}
					}
				}, "json");
			};

		// create comment pagination
		var _cm_page = function(_el)
		{
			var _info = {
					rid : _el.attr("data-id")*1,
					pid : _el.attr("data-pid")*1,
					total : _el.attr("data-total")*1,
					limit : _el.attr("data-limit")*1,
					offset : _el.attr("data-offset")*1,
					offset_top : 0,
					offset_bottom : 0,
					loaded : 0
				},
				_parent = $('.jreview-cmlist[data-id="'+_info.rid+','+_info.pid+'"]');
			
			_el.addClass("loaded");
			_info.loaded = _parent.children().length;
			_info.offset_bottom = _info.loaded + _info.offset;
			_info.offset_top = _info.offset - _info.limit;

			// top
			if (_info.offset>0)
			{
				var _el_pageTop = $('<a>'+_this.lang.get("load_previous_comments")+'</a>');
				_el_pageTop.insertBefore( _parent );

				_el_pageTop.click(function(){
					$.post(_this.helper.url({view:"comments", task:"more"}),
						{
							rid : _info.rid,
							pid : _info.pid,
							offset : _info.offset_top,
							tl : _this.config.time
						}, function(d){
						_info.loaded += d.count;
						_parent.prepend(d.data);

						if (_info.offset_top<=0)
						{
							_el_pageTop.remove();
						}

						_info.offset_top -= d.count;
					}, "json");
				});
			}

			// bottom
			if (_info.offset_bottom < _info.total)
			{
				var _el_pageBottom = $('<a class="_more_cm_loader">'+_this.lang.get("load_more_comment")+'</a>');
				_el_pageBottom.insertAfter( _parent );

				_el_pageBottom.click(function(){
					if ($(this).hasClass('disabled'))
					{
						return;
					}

					$(this).addClass('disabled');

					$.post(_this.helper.url({view:"comments", task:"more"}),
						{
							rid : _info.rid,
							pid : _info.pid,
							offset : _info.offset_bottom,
							tl : _this.config.time
						}, function(d){
						_el_pageBottom.removeClass('disabled');

						_info.loaded += d.count;
						_info.offset_bottom += d.count;
						_parent.append(d.data);

						if (_info.offset_bottom >= _info.total)
						{
							_el_pageBottom.remove();
						}
					}, "json");
				});
			}
		};

		window.setInterval(function(){
			$("._cm_pagination").not(".loaded").each(function(){
				_cm_page( $(this) );
			});
		}, 500);
		
	};

	this.events = function()
	{
		_this.helper.cache.load();

		// dropdown
		$(document).on("click", ".jreview-dropdown-toggle", function(){
			let e=$(this),
				p=e.parent();

			if(p.hasClass("active"))
			{
				p.removeClass("active");
				return;
			}

			$(".jreview_dropdown.active").not(p).removeClass("active");
			p.addClass("active");
		})
		.on(".jreview-dropdown-menu li", "click", function(){
			let e=$(this),
				p=e.parents(".jreview_dropdown");

			p.removeClass("active");
		})
		.on("click", function(e){
			if(!$(e.target).is(".jreview_dropdown.active") && $(e.target).parents(".jreview_dropdown.active").length==0)
			{
				$(".jreview_dropdown.active").removeClass("active");
			}
		});

		// subscribe button
		$("#jreview-subscribe").click(function(){
			var _el = $(this),
				_allow = _el.attr("data-open"),
				_id = _el.attr("data-id"),
				_dialog = null,
				_action = function(data, callback)
				{
					$.post(_this.helper.url({view:'profile',task:'subscribe'}), data, function(d){
						if (typeof callback=='function')
						{
							callback(d);
						}
					}, "json");
				};

			if (_el.hasClass("disabled")) return;

			if (_el.hasClass("active"))
			{
				// unsubscribe
				new _this.dialog({
					caption: _this.lang.get("message"),
					content: _this.lang.get("unsubscribe_notice"),
					submitLabel: 'Ok',
					submitfn: function(dialog)
					{
						dialog.overlay();

						$.post(_this.helper.url({view:'profile', task:'unsubscribe'}), {type:1, id:_id}, function(d){
							dialog.unOverlay();
							
							if (d.status==200)
							{
								_el.removeClass('active');
								dialog.off();
							} else {
								dialog.setError(d.error);
							}
						}, 'json');
					}
				});

				return;
			}

			if (_this.config.member==0)
			{
				if (_allow==1)
				{
					// show guest form
					var _html = '<div class="">';
							_html+= '<label>'+_this.lang.get("your_name")+'</label>';
							_html+= '<input type="text" data-name="name" value="'+_this.helper.cache.name+'" />';
							_html+= '<label>'+_this.lang.get("your_email")+'</label>';
							_html+= '<input type="email" data-name="email" value="'+_this.helper.cache.email+'" />';
						_html+= '</div>';

					_dialog = new _this.dialog({
						caption : _this.lang.get("subscribe_form"),
						content : _html,
						loadfn  : function(dialog)
						{
							dialog.el.find('input:eq(0)').focus();
						},
						submitfn : function(dialog)
						{
							var _nameEl = dialog.el.find('[data-name=name]'),
								_emailEl = dialog.el.find('[data-name=email]');
							
							if (/^\s*$/.test(_nameEl.val()))
							{
								_nameEl.focus();
								return false;
							}

							if (/^\s*$/.test(_emailEl.val()))
							{
								_emailEl.focus();
								return false;
							}

							dialog.overlay();
							_this.helper.cache.set(_nameEl.val(), _emailEl.val());

							_action({type:1, id:_id, name:_nameEl.val(), email:_emailEl.val()}, function(d){
								dialog.unOverlay();

								if (d.status==200)
								{
									dialog.off();
									_el.addClass('active');
								} else {
									dialog.setError(d.error);
								}
							});
						}
					});
				} else {
					// login form
					_this.helper.login();
				}
			} else {
				if (_allow==1)
				{
					_el.addClass("disabled");
					_action({type:1, id:_id}, function(d){
						_el.removeClass("disabled");
						if (d.status==200)
						{
							_el.addClass('active');
						} else {
							alert(d.error);
						}
					});
				} else {
					// this feature invalid
					alert(_this.lang.get("feature_invalid"));
					_el.addClass("disabled");
				}
			}
		});

		// review form
		_this.formEvents();

		// highlight review, comment
		if (_this.config.hasOwnProperty('hl') && /^([1-9][0-9]*)(\,([1-9][0-9]*))?$/.test(_this.config.hl))
		{
			var hls = _this.config.hl.match(/^([1-9][0-9]*)(\,([1-9][0-9]*))?$/),
				_el = null;
			if (typeof hls[3] != "undefined")
			{
				// comment
				_el = $("#comment-"+hls[3]);
			} else {
				// review
				_el = $("#review-"+hls[1]);
			}

			window.setTimeout(function(){
				_el.addClass("_hlight");
				$("html, body").animate({ scrollTop: _el.offset().top }, 500);
			},1000);
		}
	};

	this.init = function()
	{
		_this.libs();
		_this.events();

		var reviews = new _this.reviewsEvents();
		reviews.init();

		_this.reviewEvents();
		_this.commentEvents();

		var hl = function(hash)
			{
				switch(hash)
				{
					case '#add-review':
					case '#post-review':
						$('#post-review').removeClass('hidden');
						$('html,body').animate({scrollTop:$('#post-review').offset().top}, 500);
						break;

					case '#reviews':
						$('html,body').animate({scrollTop:$('#reviews').offset().top}, 500);
						break;
				}
			};

		$(document).on('click', '.jreview-begin', function(){
			hl('#reviews');
		})
		.on('click', '._write', function(e){
			e.preventDefault();
			if($('#post-review').length)
			{
				$('#post-review').removeClass('hidden');
				$('html,body').animate({scrollTop:$('#post-review').offset().top}, 500);
			}
		});

		// emoji
		if(_this.config.emoji!='0')
		{
			_this.emoji.init();
			$('.jlexreview').on('focus', '.input-emoji', function(){
				_this.emoji.build($(this));
			});

			if(typeof twemoji!='undefined')
			{
				$(document).ajaxComplete(function(){
				    twemoji.parse($('.jlexreview')[0]);
				});

				twemoji.parse($('.jlexreview')[0]);
			}
		}

		if(_this.config.hasOwnProperty('events'))
		{
			try {
			    eval(_this.config.events);
			} catch(err) {
			    console.log(err.message);
			}
		}

		hl(location.hash);
		$(window).on('hashchange',function(){ 
		    hl(location.hash);
		});
	};

	this.embed = function(els, title, url)
	{
		_this.config.embed = 1;
		$(els).remove();

		if ($('._filter_tools').length && !$('.jreview-controllers').length)
		{
			$('#jreview-summary input._filter_input').off();
			$('#jreview-summary input._filter_input').parent('.toggle').remove();
			$('#jreview-summary input._filter_input').remove();
		}

		$('.jlexreview').prepend('<h1 class="embed-title"><a href="'+url+'" target="_blank">'+title+'</a></h1>');

		var url = '<a href="'+url+'#reviews" target="_blank" class="embed-link">'+_this.lang.get('post_your_review')+'</a>';
		if ($('#jreview-summary').length)
		{
			$('#jreview-summary').after(url);
		} else {
			$('.jlexreview').prepend(url);
		}
	};
}

Anon7 - 2022
AnonSec Team