\
').insertAfter( $(this) );
$('.comment_reply_form').slideDown();
setCommentReplyFormValidation();
});
});
function setCommentReplyFormValidation() {
$('#commentReplyForm').validate({ // initialize plugin
errorClass: 'error',
errorPlacement: function(error, element) {
error.insertAfter(element);
},
highlight: function (element) {
$(element).addClass("hightlight_required");
},
unhighlight: function (element) {
$(element).removeClass("hightlight_required");
},
rules: {
comment_name: {
required: true,
minlength: 3,
// Using the normalizer to trim the value of the element before validating it.
normalizer: function(value) {return $.trim(value);}
},
comment_email: {
required: true,
email: true
},
comment_message: {
required: true,
minlength: 20,
// Using the normalizer to trim the value of the element before validating it.
normalizer: function(value) {return $.trim(value);}
}
},
messages: {
comment_name: {
required: "Please enter your name",
minlength: "Please enter at least 3 characters.",
},
comment_email: {
required: "Please enter your e-mail address",
email: "Please enter a valid email address."
},
comment_message: {
minlength: "Please enter at least 20 characters."
}
},
beforeSend: function (form) {
$(form).append('');
$(form).hide();
},
submitHandler: function(form) {
let formData = $(form).serializeArray();
$.ajax({
type : "POST",
url : "/comments",
data: formData,
success : function (data) {
if(data === 'ok') {
$(form).html('
');
$(".send_loading").remove();
$(form).show();
}
}
});
return false; // blocks regular submit since you have ajax
}
});
}
$('#myCommentForm').validate({ // initialize plugin
errorClass: 'error',
errorPlacement: function(error, element) {
error.insertAfter(element);
},
highlight: function (element) {
$(element).addClass("hightlight_required");
},
unhighlight: function (element) {
$(element).removeClass("hightlight_required");
},
rules: {
comment_name: {
required: true,
minlength: 3,
// Using the normalizer to trim the value of the element
// before validating it.
normalizer: function(value) {return $.trim(value);}
},
comment_email: {
required: true,
email: true
},
comment_message: {
required: true,
minlength: 20,
// Using the normalizer to trim the value of the element
// before validating it.
normalizer: function(value) {return $.trim(value);}
}
},
messages: {
comment_name: {
required: "Please enter your name",
minlength: "Please enter at least 3 characters.",
},
comment_email: {
required: "Please enter your e-mail address",
email: "Please enter a valid email address."
},
comment_message: {
minlength: "Please enter at least 20 characters."
}
},
beforeSend: function (form) {
$('#comment_form').append('');
$(form).hide();
},
submitHandler: function(form) {
let formData = $(form).serializeArray();
$.ajax({
type : "POST",
url : "/comments",
data: formData,
success : function (data) {
if(data === 'ok') {
$('#comment_form').html('
'),u=b(''),f=b(''));D=b('').append('').appendTo(f);
D.append(j=b(''),E=b(''),n=b(''),z=b(''),A=b(''));E.click(b.fancybox.close);t.click(b.fancybox.cancel);z.click(function(a){a.preventDefault();b.fancybox.prev()});A.click(function(a){a.preventDefault();b.fancybox.next()});
b.fn.mousewheel&&f.bind("mousewheel.fb",function(a,c){if(h)a.preventDefault();else if(b(a.target).get(0).clientHeight==0||b(a.target).get(0).scrollHeight===b(a.target).get(0).clientHeight){a.preventDefault();b.fancybox[c>0?"prev":"next"]()}});b.support.opacity||f.addClass("fancybox-ie");if(M){t.addClass("fancybox-ie6");f.addClass("fancybox-ie6");b('').prependTo(D)}}};
b.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",
easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};b(document).ready(function(){b.fancybox.init()})})(jQuery);function showPreview(coords){
var selected_img = $("#jcrop_pic");
var homepage_pic_nr = $("#edit_header_pictures").attr('rel');
//console.log( selected_img.attr('realwidth') );
$aspectRatio = $("#edit_header_pictures").attr('aspectRatio');
var rx = $aspectRatio.split('/')[0] / coords.w;
var ry = $aspectRatio.split('/')[1] / coords.h;
$('.homepage_pic_'+homepage_pic_nr+' img').remove();
if ( coords.h != 0 || coords.w != 0 ){
$('.homepage_pic_'+homepage_pic_nr ).append('');
$('.homepage_pic_'+homepage_pic_nr+' img').css({
width: Math.round(rx * selected_img.attr('realwidth') ) + 'px',
height: Math.round(ry * selected_img.attr('realheight') ) + 'px',
marginLeft: '-' + Math.round(rx * coords.x) + 'px',
marginTop: '-' + Math.round(ry * coords.y) + 'px'
});
/*console.log("X=");
console.log(coords.x);
console.log("Y=");
console.log(coords.y);
console.log("W=");
console.log(coords.w);
console.log("H=");
console.log(coords.h);*/
$("#edit_header_pictures").attr( 'xywh', coords.x +'/'+coords.y+'/' +coords.w +'/'+coords.h );
}
}
$(document).ready(function() {
$(".edit_header_picture").live("click", function(){
$("#edit_header_pictures_step_1").hide();
$("#edit_header_pictures_step_2").show();
var pic = $(this);
//add pic
$("#jcrop_pic_div").html( '' );
$("#jcrop_pic_div img").attr('id','jcrop_pic');
$("#jcrop_pic_div img").attr('imgsrc',pic.attr('imgsrc'));
//get real width & height
var img_obj = new Image();
img_obj.src = $("#jcrop_pic").attr('src');
$('#min_curr_pic_dimension').html('');
$('#min_pic_notice').hide();
img_obj.onload = function () {
$("#jcrop_pic").attr('realwidth', img_obj.width);
$("#jcrop_pic").attr('realheight', img_obj.height);
$('#min_curr_pic_dimension').html(img_obj.width + '/' + img_obj.height + 'px');
if ( img_obj.width < $aspectRatio.split('/')[0] || img_obj.height < $aspectRatio.split('/')[1] ) {
$('#min_pic_notice').show();
}
}
$aspectRatio = $("#edit_header_pictures").attr('aspectRatio');
$('#min_pic_dimension').html($aspectRatio + 'px');
// remove loading
if ($("#jcrop_pic").complete) {
$("#jcrop_pic_div").css("background","#ffffff");
}
else {
$("#jcrop_pic").load( function(){ $("#jcrop_pic_div").css("background","#ffffff"); } );
}
$('#jcrop_pic').Jcrop({
onChange: showPreview,
onSelect: showPreview,
setSelect: [ 10, 10, $aspectRatio.split('/')[0], $aspectRatio.split('/')[1] ],
aspectRatio: eval( $aspectRatio ),
minSize: [ $aspectRatio.split('/')[0] , $aspectRatio.split('/')[1] ]
});
});
$(".btn_change_header_pic").live("click",function(){
var this_a = $(this);
$("#edit_header_pictures").attr( 'rel', this_a.attr( 'rel') );
$("#edit_header_pictures").attr( 'aspectRatio', this_a.attr( 'aspectRatio') );
});
$(".btn_change_header_pic").fancybox({
//'transitionIn' : 'elastic',
//'transitionOut' : 'elastic',
'speedIn' : 600,
'speedOut' : 200,
'overlayShow' : false,
//'modal' : false,
'onClosed' : function() {
$('.homepage_pic_'+ $("#edit_header_pictures").attr('rel') +' img').remove();
$("#edit_header_pictures_step_1").show();
$("#edit_header_pictures_step_2").hide();
}
});
$('#btn_ok').live("click", function(){
var photo = $("#jcrop_pic").attr('imgsrc');
var pic_position = $("#edit_header_pictures").attr('rel');
var tpl_id = $("#edit_header_pictures").attr('template');
var xywh = $("#edit_header_pictures").attr('xywh');
var aspectRatio = $("#edit_header_pictures").attr('aspectRatio');
$.ajax({
type : "POST",
data : "pic_name=" + photo + '&pic_position=' + pic_position + '&tpl_id=' + tpl_id + '&xywh=' + xywh + '&aspectRatio=' + aspectRatio ,
url : "/save_header_pics",
success : function() {
window.location.reload();
}
});
});
$('#btn_go_back').live("click", function(){ $('.homepage_pic_'+ $("#edit_header_pictures").attr('rel') +' img').remove();
$("#edit_header_pictures_step_1").show();
$("#edit_header_pictures_step_2").hide();
});
/**JQuery file upload***/
var btnUpload=$('#upload');
if ( btnUpload.length ) {
var status=$('#status');
new AjaxUpload(btnUpload, {
action: '/upload-file',
name: 'uploadfile',
onSubmit: function(file, ext){
if (! (ext && /^(jpg|png|jpeg|gif)$/.test(ext))){
// extension is not allowed
status.html('Only JPG, PNG or GIF files are allowed');
return false;
}
status.html('');
$("#upload").hide();
},
onComplete: function(file, response){
status.html('');
$("#upload").show();
if(response!="error"){
$.each($.parseJSON(response), function(key, index) {
if( key == 'max_upload_error'){
status.html('Total size must be less than 4 MB');
}
else{
info = index.split('***');
img = info[1];
if( key != 'existing_file'){
data_sent = '';
$('.edit_header_list_pictures').append(data_sent);
}
if( key == 'existing_file'){
status.html('You already inserted this photo!');
}else{
//window.location.reload();
}
}
});
}
else{
status.html('You already inserted this photo!');
}
}
});
}
/**END - JQuery file upload***/
});
/**
* Ajax upload
* Project page - http://valums.com/ajax-upload/
* Copyright (c) 2008 Andris Valums, http://valums.com
* Licensed under the MIT license (http://valums.com/mit-license/)
* Version 3.5 (23.06.2009)
*/
/**
* Changes from the previous version:
* 1. Added better JSON handling that allows to use 'application/javascript' as a response
* 2. Added demo for usage with jQuery UI dialog
* 3. Fixed IE "mixed content" issue when used with secure connections
*
* For the full changelog please visit:
* http://valums.com/ajax-upload-changelog/
*/
(function(){
var d = document, w = window;
/**
* Get element by id
*/
function get(element){
if (typeof element == "string")
element = d.getElementById(element);
return element;
}
/**
* Attaches event to a dom element
*/
function addEvent(el, type, fn){
if (w.addEventListener){
el.addEventListener(type, fn, false);
} else if (w.attachEvent){
var f = function(){
fn.call(el, w.event);
};
el.attachEvent('on' + type, f)
}
}
/**
* Creates and returns element from html chunk
*/
var toElement = function(){
var div = d.createElement('div');
return function(html){
div.innerHTML = html;
var el = div.childNodes[0];
div.removeChild(el);
return el;
}
}();
function hasClass(ele,cls){
return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}
function addClass(ele,cls) {
if (!hasClass(ele,cls)) ele.className += " "+cls;
}
function removeClass(ele,cls) {
var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
ele.className=ele.className.replace(reg,' ');
}
// getOffset function copied from jQuery lib (http://jquery.com/)
if (document.documentElement["getBoundingClientRect"]){
// Get Offset using getBoundingClientRect
// http://ejohn.org/blog/getboundingclientrect-is-awesome/
var getOffset = function(el){
var box = el.getBoundingClientRect(),
doc = el.ownerDocument,
body = doc.body,
docElem = doc.documentElement,
// for ie
clientTop = docElem.clientTop || body.clientTop || 0,
clientLeft = docElem.clientLeft || body.clientLeft || 0,
// In Internet Explorer 7 getBoundingClientRect property is treated as physical,
// while others are logical. Make all logical, like in IE8.
zoom = 1;
if (body.getBoundingClientRect) {
var bound = body.getBoundingClientRect();
zoom = (bound.right - bound.left)/body.clientWidth;
}
if (zoom > 1){
clientTop = 0;
clientLeft = 0;
}
var top = box.top/zoom + (window.pageYOffset || docElem && docElem.scrollTop/zoom || body.scrollTop/zoom) - clientTop,
left = box.left/zoom + (window.pageXOffset|| docElem && docElem.scrollLeft/zoom || body.scrollLeft/zoom) - clientLeft;
return {
top: top,
left: left
};
}
} else {
// Get offset adding all offsets
var getOffset = function(el){
if (w.jQuery){
return jQuery(el).offset();
}
var top = 0, left = 0;
do {
top += el.offsetTop || 0;
left += el.offsetLeft || 0;
}
while (el = el.offsetParent);
return {
left: left,
top: top
};
}
}
function getBox(el){
var left, right, top, bottom;
var offset = getOffset(el);
left = offset.left;
top = offset.top;
right = left + el.offsetWidth;
bottom = top + el.offsetHeight;
return {
left: left,
right: right,
top: top,
bottom: bottom
};
}
/**
* Crossbrowser mouse coordinates
*/
function getMouseCoords(e){
// pageX/Y is not supported in IE
// http://www.quirksmode.org/dom/w3c_cssom.html
if (!e.pageX && e.clientX){
// In Internet Explorer 7 some properties (mouse coordinates) are treated as physical,
// while others are logical (offset).
var zoom = 1;
var body = document.body;
if (body.getBoundingClientRect) {
var bound = body.getBoundingClientRect();
zoom = (bound.right - bound.left)/body.clientWidth;
}
return {
x: e.clientX / zoom + d.body.scrollLeft + d.documentElement.scrollLeft,
y: e.clientY / zoom + d.body.scrollTop + d.documentElement.scrollTop
};
}
return {
x: e.pageX,
y: e.pageY
};
}
/**
* Function generates unique id
*/
var getUID = function(){
var id = 0;
return function(){
return 'ValumsAjaxUpload' + id++;
}
}();
function fileFromPath(file){
return file.replace(/.*(\/|\\)/, "");
}
function getExt(file){
return (/[.]/.exec(file)) ? /[^.]+$/.exec(file.toLowerCase()) : '';
}
// Please use AjaxUpload , Ajax_upload will be removed in the next version
Ajax_upload = AjaxUpload = function(button, options){
if (button.jquery){
// jquery object was passed
button = button[0];
} else if (typeof button == "string" && /^#.*/.test(button)){
button = button.slice(1);
}
button = get(button);
this._input = null;
this._button = button;
this._disabled = false;
this._submitting = false;
// Variable changes to true if the button was clicked
// 3 seconds ago (requred to fix Safari on Mac error)
this._justClicked = false;
this._parentDialog = d.body;
if (window.jQuery && jQuery.ui && jQuery.ui.dialog){
var parentDialog = jQuery(this._button).parents('.ui-dialog');
if (parentDialog.length){
this._parentDialog = parentDialog[0];
}
}
this._settings = {
// Location of the server-side upload script
action: 'upload.php',
// File upload name
name: 'userfile',
// Additional data to send
data: {},
// Submit file as soon as it's selected
autoSubmit: true,
// The type of data that you're expecting back from the server.
// Html and xml are detected automatically.
// Only useful when you are using json data as a response.
// Set to "json" in that case.
responseType: false,
// When user selects a file, useful with autoSubmit disabled
onChange: function(file, extension){},
// Callback to fire before file is uploaded
// You can return false to cancel upload
onSubmit: function(file, extension){},
// Fired when file upload is completed
// WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE!
onComplete: function(file, response) {}
};
// Merge the users options with our defaults
for (var i in options) {
this._settings[i] = options[i];
}
this._createInput();
this._rerouteClicks();
}
// assigning methods to our class
AjaxUpload.prototype = {
setData : function(data){
this._settings.data = data;
},
disable : function(){
this._disabled = true;
},
enable : function(){
this._disabled = false;
},
// removes ajaxupload
destroy : function(){
if(this._input){
if(this._input.parentNode){
this._input.parentNode.removeChild(this._input);
}
this._input = null;
}
},
/**
* Creates invisible file input above the button
*/
_createInput : function(){
var self = this;
var input = d.createElement("input");
input.setAttribute('type', 'file');
/*for multiple files*/
//input.setAttribute('name', this._settings.name);
input.setAttribute('name', 'uploadfile[]');
input.setAttribute('multiple', 'multiple');
/*END - for multiple files*/
var styles = {
'position' : 'absolute'
,'margin': '-5px 0 0 -175px'
,'padding': 0
,'width': '220px'
,'height': '30px'
,'fontSize': '14px'
,'opacity': 0
,'cursor': 'pointer'
,'display' : 'none'
,'zIndex' : 2147483583 //Max zIndex supported by Opera 9.0-9.2x
// Strange, I expected 2147483647
};
for (var i in styles){
input.style[i] = styles[i];
}
// Make sure that element opacity exists
// (IE uses filter instead)
if ( ! (input.style.opacity === "0")){
input.style.filter = "alpha(opacity=0)";
}
this._parentDialog.appendChild(input);
addEvent(input, 'change', function(){
// get filename from input
var file = fileFromPath(this.value);
if(self._settings.onChange.call(self, file, getExt(file)) == false ){
return;
}
// Submit form when value is changed
if (self._settings.autoSubmit){
self.submit();
}
});
// Fixing problem with Safari
// The problem is that if you leave input before the file select dialog opens
// it does not upload the file.
// As dialog opens slowly (it is a sheet dialog which takes some time to open)
// there is some time while you can leave the button.
// So we should not change display to none immediately
addEvent(input, 'click', function(){
self.justClicked = true;
setTimeout(function(){
// we will wait 3 seconds for dialog to open
self.justClicked = false;
}, 3000);
});
this._input = input;
},
_rerouteClicks : function (){
var self = this;
// IE displays 'access denied' error when using this method
// other browsers just ignore click()
// addEvent(this._button, 'click', function(e){
// self._input.click();
// });
var box, dialogOffset = {top:0, left:0}, over = false;
addEvent(self._button, 'mouseover', function(e){
if (!self._input || over) return;
over = true;
box = getBox(self._button);
if (self._parentDialog != d.body){
dialogOffset = getOffset(self._parentDialog);
}
});
// we can't use mouseout on the button,
// because invisible input is over it
addEvent(document, 'mousemove', function(e){
var input = self._input;
if (!input || !over) return;
if (self._disabled){
removeClass(self._button, 'hover');
input.style.display = 'none';
return;
}
var c = getMouseCoords(e);
if ((c.x >= box.left) && (c.x <= box.right) &&
(c.y >= box.top) && (c.y <= box.bottom)){
input.style.top = c.y - dialogOffset.top + 'px';
input.style.left = c.x - dialogOffset.left + 'px';
input.style.display = 'block';
addClass(self._button, 'hover');
} else {
// mouse left the button
over = false;
if (!self.justClicked){
input.style.display = 'none';
}
removeClass(self._button, 'hover');
}
});
},
/**
* Creates iframe with unique name
*/
_createIframe : function(){
// unique name
// We cannot use getTime, because it sometimes return
// same value in safari :(
var id = getUID();
// Remove ie6 "This page contains both secure and nonsecure items" prompt
// http://tinyurl.com/77w9wh
var iframe = toElement('');
iframe.id = id;
iframe.style.display = 'none';
d.body.appendChild(iframe);
return iframe;
},
/**
* Upload file without refreshing the page
*/
submit : function(){
var self = this, settings = this._settings;
if (this._input.value === ''){
// there is no file
return;
}
// get filename from input
var file = fileFromPath(this._input.value);
// execute user event
if (! (settings.onSubmit.call(this, file, getExt(file)) == false)) {
// Create new iframe for this submission
var iframe = this._createIframe();
// Do not submit if user function returns false
var form = this._createForm(iframe);
form.appendChild(this._input);
form.submit();
d.body.removeChild(form);
form = null;
this._input = null;
// create new input
this._createInput();
var toDeleteFlag = false;
addEvent(iframe, 'load', function(e){
if (// For Safari
iframe.src == "javascript:'%3Chtml%3E%3C/html%3E';" ||
// For FF, IE
iframe.src == "javascript:'';"){
// First time around, do not delete.
if( toDeleteFlag ){
// Fix busy state in FF3
setTimeout( function() {
d.body.removeChild(iframe);
}, 0);
}
return;
}
var doc = iframe.contentDocument ? iframe.contentDocument : frames[iframe.id].document;
// fixing Opera 9.26
if (doc.readyState && doc.readyState != 'complete'){
// Opera fires load event multiple times
// Even when the DOM is not ready yet
// this fix should not affect other browsers
return;
}
// fixing Opera 9.64
if (doc.body && doc.body.innerHTML == "false"){
// In Opera 9.64 event was fired second time
// when body.innerHTML changed from false
// to server response approx. after 1 sec
return;
}
var response;
if (doc.XMLDocument){
// response is a xml document IE property
response = doc.XMLDocument;
} else if (doc.body){
// response is html document or plain text
response = doc.body.innerHTML;
if (settings.responseType && settings.responseType.toLowerCase() == 'json'){
// If the document was sent as 'application/javascript' or
// 'text/javascript', then the browser wraps the text in a
// tag and performs html encoding on the contents. In this case,
// we need to pull the original text content from the text node's
// nodeValue property to retrieve the unmangled content.
// Note that IE6 only understands text/html
if (doc.body.firstChild && doc.body.firstChild.nodeName.toUpperCase() == 'PRE'){
response = doc.body.firstChild.firstChild.nodeValue;
}
if (response) {
response = window["eval"]("(" + response + ")");
} else {
response = {};
}
}
} else {
// response is a xml document
var response = doc;
}
settings.onComplete.call(self, file, response);
// Reload blank page, so that reloading main page
// does not re-submit the post. Also, remember to
// delete the frame
toDeleteFlag = true;
// Fix IE mixed content issue
iframe.src = "javascript:'';";
});
} else {
// clear input to allow user to select same file
// Doesn't work in IE6
// this._input.value = '';
d.body.removeChild(this._input);
this._input = null;
// create new input
this._createInput();
}
},
/**
* Creates form, that will be submitted to iframe
*/
_createForm : function(iframe){
var settings = this._settings;
// method, enctype must be specified here
// because changing this attr on the fly is not allowed in IE 6/7
var form = toElement('