/** * Contents * * Make ajax json request for Data Hata * * @version 0.1 * * @license MIT-style license * @author GIGA Team / vladimir.seleznev@gmail.com * @copyright Author */ var Contents = new Class({ Implements: [Events, Options, Chain], options: { url: 'index.php', action: 'content', postData: $empty, container: null, setHtml: true, loader: true, loaderColor: '#000000', opacity: 0.6, onSend: $empty, onLoad: $empty, onShow: $empty, onError: $empty }, initialize: function(module, options) { this.setOptions(options); this.options.postData = new Hash(); this.options.postData.set('module', module); this.options.container = $(this.options.container) || $('content'); }, sendForm: function(form, action) { if(!$(form) || $(form).get('tag') !== 'form') return; var postData = new Hash({'url': $(form).get('action'), 'action': (action || this.options.action)}); var types = new Hash({'text': 0, 'select': 1, 'textarea': 2, 'checkbox': 3, 'radiobox': 4, 'hidden': 5}); $(form).getElements("input[type!=submit], textarea, select").each(function(element) { var type = element.get('type') || element.get('tag'); if(element.get('name') && types.get(type)!=null) { switch(types.get(type)) { case types.get('checkbox'): postData.set(element.get('name'), element.get('checked')?1:0); break; case types.get('radiobox'): if(!element.get('checked')) { break; } default: postData.set(element.get('name'), element.get('value')); break; } } }); this.send(postData); }, send: function(data) { var postData = new Hash(data); postData.set('action', postData.get('action') || this.options.action); var waiter = null; var jsonRequest = new Request.JSON({url: this.options.url, onRequest: function() { this.fireEvent('onSend'); waiter = this.waiter(); }.bind(this), onComplete: function(response) { var thisObject = this; this.chain( function() { if(response) { if(this.options.setHtml && response.content != null) { this.options.container.set('html', response.content).fade('hide').fade('in'); } this.fireEvent('onLoad', response); } this.callChain(); }, function() { new Fx.Tween($(waiter), {property: 'opacity', duration: 'long'}).start(0).chain( function() { thisObject.callChain(); } ); }, function() { $(waiter).destroy(); this.fireEvent('onShow', response); } ); this.callChain(); }.bind(this), onFailure: function() { this.fireEvent('onError'); }.bind(this) }).post((postData).combine(this.options.postData)); }, waiter: function() { if(!this.options.loader) return; var layer = $(this.options.container).getCoordinates(); var loaderContainer = new Element("div", { 'class': 'loaderContainer', 'styles': { position: 'absolute', top: layer.top + $(this.options.container).getStyle("padding-top").toInt(), left: layer.left + $(this.options.container).getStyle("padding-left").toInt(), width: layer.width - $(this.options.container).getStyle("padding-left").toInt() - $(this.options.container).getStyle("padding-right").toInt(), height: layer.height - $(this.options.container).getStyle("padding-top").toInt() - $(this.options.container).getStyle("padding-bottom").toInt(), "opacity": this.options.opacity, "background-color": this.options.loaderColor } }); $(this.options.container).getParent().grab(loaderContainer); return loaderContainer; } }); var Contacts = new Class({ Implements: [Events, Options, Chain], options: { inside: false }, initialize: function(form, options) { this.setOptions(options); this.form = $(form) || null; this.form.addEvent('submit', function() { this.submit(); return false; }.bind(this)); this.render(); }, render: function() { if(!this.form) return; if(this.options.inside) { this.form.getElements('input[type!=submit],textarea').each(function(element) { var label = element.getPrevious('label'); label.setStyle('display', 'none'); element.set('value', label.get('text').clean()); element.addEvents({ 'focus': function() { if(element.get('value').clean() === label.get('text').clean()) { element.set('value', ''); } }, 'blur': function() { if(element.get('value').clean() === "") { element.set('value', label.get('text').clean()); } } }); }); } }, submit: function() { new Contents('contacts', {onShow: function(response) { if(response.message) { response.message.each(function(item) { $('contact' + item.id).highlight('#f00'); }); } else if(response.content) { $('content').getElement('div.contacts').set('html', response.content); } //alert(JSON.encode(response)); }, setHtml: false, container: this.form.getParent("div.contacts")}).sendForm(this.form); } }); function swiff(content) { if(!$(content) || !$(content).getElement('div.status') || !$(content).getElement('ul.list')) return; var uploader = new FancyUpload2($(content).getElement('div.status'), $(content).getElement('ul.list'), { url: $(content).getElement('form').action, path: 'templates/core-files/libs/FancyUpload2/Swiff.Uploader.swf', instantStart: true, typeFilter: {'Изображения (*.jpg, *.jpeg, *.gif, *.png)': '*.jpg; *.jpeg; *.gif; *.png'}, container: $(content).getElement('div.swiff'), data: {fill: true, width: 300, height: 300}, onLoad: function() { var thisObject = this; $(content).getElement('input[name=browse]').addEvent('click', function() { thisObject.browse(); }); }, onSelect: function() { $(content).getElement('div.image').empty().addClass('loaderContainer'); $(content).getElement('div.image').setStyles({width: this.options.data.width, height: this.options.data.height}); }, onComplete: function(file, response) { this.removeFile(); var response = JSON.decode(response); if(response.result === 'success' && response.thumbnail) { image = Asset.image(response.thumbnail + '?' + $time(), {onLoad: "this.getParent().removeClass('loaderContainer')"}); $(content).getElement('div.image').grab(image); } } }); } function insertComment(form) { var formPage = $(form).getElement('[name=page]'); var formLogin = $(form).getElement('[name=login]'); var formMessage = $(form).getElement('[name=message]'); var formCaptcha = $(form).getElement('[name=captcha]'); content('pages', 'comments', {action: 'commentsInsert', page: formPage.value, login: formLogin.value, message: formMessage.value, captcha: formCaptcha.value}, messageChars); } function removeComment(response, element) { if(response && response.deleted == 1) { var comment = $(element).getParent('div.comment'); comment.highlight('#600', '#f00'); comment.set('slide', {duration: 'long', transition: 'bounce:in'}); comment.slide('out'); var counter = $('comments').getElement('span.counter'); if(conter) { counter.set('text', parseInt(counter.get('text')) - 1); } } }