1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-05-25 20:28:12 +03:00
ifhub.club/framework/frontend/framework/js/core/main.js
2013-08-08 18:00:37 +07:00

621 lines
15 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Function.prototype.bind = function(context) {
var fn = this;
if(jQuery.type(fn) != 'function'){
throw new TypeError('Function.prototype.bind: call on non-function');
};
if(jQuery.type(context) == 'null'){
throw new TypeError('Function.prototype.bind: cant be bound to null');
};
return function() {
return fn.apply(context, arguments);
};
};
String.prototype.tr = function(a,p) {
var k;
var p = typeof(p)=='string' ? p : '';
var s = this;
jQuery.each(a,function(k){
var tk = p?p.split('/'):[];
tk[tk.length] = k;
var tp = tk.join('/');
if(typeof(a[k])=='object'){
s = s.tr(a[k],tp);
}else{
s = s.replace((new RegExp('%%'+tp+'%%', 'g')), a[k]);
};
});
return s;
};
var ls = ls || {};
/**
* Управление всплывающими сообщениями
*/
ls.msg = (function ($) {
/**
* Опции
*/
this.options = {
class_notice: 'n-notice',
class_error: 'n-error'
};
/**
* Отображение информационного сообщения
*/
this.notice = function(title,msg){
$.notifier.broadcast(title, msg, this.options.class_notice);
};
/**
* Отображение сообщения об ошибке
*/
this.error = function(title,msg){
$.notifier.broadcast(title, msg, this.options.class_error);
};
return this;
}).call(ls.msg || {},jQuery);
/**
* Доступ к языковым текстовкам (предварительно должны быть прогружены в шаблон)
*/
ls.lang = (function ($) {
/**
* Набор текстовок
*/
this.msgs = {};
/**
* Загрузка текстовок
*/
this.load = function(msgs){
$.extend(true,this.msgs,msgs);
};
/**
* Отображение сообщения об ошибке
*/
this.get = function(name,replace){
if (this.msgs[name]) {
var value=this.msgs[name];
if (replace) {
value = value.tr(replace);
}
return value;
}
return '';
};
return this;
}).call(ls.lang || {},jQuery);
/**
* Методы таймера например, запуск функии через интервал
*/
ls.timer = (function ($) {
this.aTimers={};
/**
* Запуск метода через определенный период, поддерживает пролонгацию
*/
this.run = function(fMethod,sUniqKey,aParams,iTime){
iTime=iTime || 1500;
aParams=aParams || [];
sUniqKey=sUniqKey || Math.random();
if (this.aTimers[sUniqKey]) {
clearTimeout(this.aTimers[sUniqKey]);
this.aTimers[sUniqKey]=null;
}
var timeout = setTimeout(function(){
clearTimeout(this.aTimers[sUniqKey]);
this.aTimers[sUniqKey]=null;
fMethod.apply(this,aParams);
}.bind(this),iTime);
this.aTimers[sUniqKey]=timeout;
};
return this;
}).call(ls.timer || {},jQuery);
/**
* Функционал хранения js данных
*/
ls.registry = (function ($) {
this.aData={};
/**
* Сохранение
*/
this.set = function(sName,data){
this.aData[sName]=data;
};
/**
* Получение
*/
this.get = function(sName){
return this.aData[sName];
};
return this;
}).call(ls.registry || {},jQuery);
/**
* Flash загрузчик
*/
ls.swfupload = (function ($) {
this.swfu = null;
this.swfOptions = {};
this.initOptions = function() {
this.swfOptions = {
// Backend Settings
upload_url: aRouter['photoset']+"upload",
post_params: {'SSID':SESSION_ID, 'security_ls_key': LIVESTREET_SECURITY_KEY},
// File Upload Settings
file_types : "*.jpg;*.jpe;*.jpeg;*.png;*.gif;*.JPG;*.JPE;*.JPEG;*.PNG;*.GIF",
file_types_description : "Images",
file_upload_limit : "0",
// Event Handler Settings
file_queue_error_handler : this.handlerFileQueueError,
file_dialog_complete_handler : this.handlerFileDialogComplete,
upload_progress_handler : this.handlerUploadProgress,
upload_error_handler : this.handlerUploadError,
upload_success_handler : this.handlerUploadSuccess,
upload_complete_handler : this.handlerUploadComplete,
// Button Settings
button_placeholder_id : "start-upload",
button_width: 122,
button_height: 30,
button_text : '<span class="button">'+ls.lang.get('topic_photoset_upload_choose')+'</span>',
button_text_style : '.button { color: #1F8AB7; font-size: 14px; }',
button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
button_text_left_padding: 6,
button_text_top_padding: 3,
button_cursor: SWFUpload.CURSOR.HAND,
// Flash Settings
flash_url : PATH_FRAMEWORK_FRONTEND+'/js/vendor/swfupload/swfupload.swf',
custom_settings : {
},
// Debug Settings
debug: false
};
ls.hook.run('ls_swfupload_init_options_after',arguments,this.swfOptions);
};
this.loadSwf = function() {
var f = {};
f.onSwfobject = function(){
if(window.swfobject && swfobject.swfupload){
f.onSwfobjectSwfupload();
}else{
ls.debug('window.swfobject && swfobject.swfupload is undefined, load swfobject/plugin/swfupload.js');
$.getScript(
PATH_FRAMEWORK_FRONTEND+'/js/vendor/swfobject/plugin/swfupload.js',
f.onSwfobjectSwfupload
);
}
}.bind(this);
f.onSwfobjectSwfupload = function(){
if(window.SWFUpload){
f.onSwfupload();
}else{
ls.debug('window.SWFUpload is undefined, load swfupload/swfupload.js');
$.getScript(
PATH_FRAMEWORK_FRONTEND+'/js/vendor/swfupload/swfupload.js',
f.onSwfupload
);
}
}.bind(this);
f.onSwfupload = function(){
this.initOptions();
$(this).trigger('load');
}.bind(this);
(function(){
if(window.swfobject){
f.onSwfobject();
}else{
ls.debug('window.swfobject is undefined, load swfobject/swfobject.js');
$.getScript(
PATH_FRAMEWORK_FRONTEND+'/js/vendor/swfobject/swfobject.js',
f.onSwfobject
);
}
}.bind(this))();
};
this.init = function(opt) {
if (opt) {
$.extend(true,this.swfOptions,opt);
}
this.swfu = new SWFUpload(this.swfOptions);
return this.swfu;
};
this.handlerFileQueueError = function(file, errorCode, message) {
$(this).trigger('eFileQueueError',[file, errorCode, message]);
};
this.handlerFileDialogComplete = function(numFilesSelected, numFilesQueued) {
$(this).trigger('eFileDialogComplete',[numFilesSelected, numFilesQueued]);
if (numFilesQueued>0) {
this.startUpload();
}
};
this.handlerUploadProgress = function(file, bytesLoaded) {
var percent = Math.ceil((bytesLoaded / file.size) * 100);
$(this).trigger('eUploadProgress',[file, bytesLoaded, percent]);
};
this.handlerUploadError = function(file, errorCode, message) {
$(this).trigger('eUploadError',[file, errorCode, message]);
};
this.handlerUploadSuccess = function(file, serverData) {
$(this).trigger('eUploadSuccess',[file, serverData]);
};
this.handlerUploadComplete = function(file) {
var next = this.getStats().files_queued;
if (next > 0) {
this.startUpload();
}
$(this).trigger('eUploadComplete',[file, next]);
};
return this;
}).call(ls.swfupload || {},jQuery);
/**
* Вспомогательные функции
*/
ls.tools = (function ($) {
/**
* Переводит первый символ в верхний регистр
*/
this.ucfirst = function(str) {
var f = str.charAt(0).toUpperCase();
return f + str.substr(1, str.length-1);
};
/**
* Выделяет все chekbox с определенным css классом
*/
this.checkAll = function(cssclass, checkbox, invert) {
$('.'+cssclass).each(function(index, item){
if (invert) {
$(item).attr('checked', !$(item).attr("checked"));
} else {
$(item).attr('checked', $(checkbox).attr("checked"));
}
});
};
/**
* Предпросмотр
*/
this.textPreview = function(textId, save, divPreview) {
var text = WYSIWYG ? tinyMCE.activeEditor.getContent() : $('#' + textId).val();
var ajaxUrl = aRouter['ajax']+'preview/text/';
var ajaxOptions = {text: text, save: save};
ls.hook.marker('textPreviewAjaxBefore');
ls.ajax(ajaxUrl, ajaxOptions, function(result){
if (!result) {
ls.msg.error('Error','Please try again later');
}
if (result.bStateError) {
ls.msg.error(result.sMsgTitle||'Error',result.sMsg||'Please try again later');
} else {
if (!divPreview) {
divPreview = 'text_preview';
}
var elementPreview = $('#'+divPreview);
ls.hook.marker('textPreviewDisplayBefore');
if (elementPreview.length) {
elementPreview.html(result.sText);
ls.hook.marker('textPreviewDisplayAfter');
}
}
});
};
/**
* Возвращает выделенный текст на странице
*/
this.getSelectedText = function(){
var text = '';
if(window.getSelection){
text = window.getSelection().toString();
} else if(window.document.selection){
var sel = window.document.selection.createRange();
text = sel.text || sel;
if(text.toString) {
text = text.toString();
} else {
text = '';
}
}
return text;
};
/**
* Получает значение атрибута data
*/
this.getOption = function (element, data, defaultValue) {
var option = element.data(data);
switch (option) {
case 'true':
return true;
case 'false':
return false;
case undefined:
return defaultValue
default:
return option;
}
};
this.getDataOptions = function (element, prefix) {
var prefix = prefix || 'option',
resultOptions = {},
dataOptions = typeof element === 'string' ? $(element).data() : element.data();
for (option in dataOptions) {
// Remove 'option' prefix
if (option.substring(0, prefix.length) == prefix) {
var str = option.substring(prefix.length);
resultOptions[str.charAt(0).toLowerCase() + str.substring(1)] = dataOptions[option];
}
}
return resultOptions;
};
return this;
}).call(ls.tools || {},jQuery);
/**
* Дополнительные функции
*/
ls = (function ($) {
/**
* Глобальные опции
*/
this.options = this.options || {};
/**
* Выполнение AJAX запроса, автоматически передает security key
*/
this.ajax = function(url, params, callback, more) {
more = more || {};
params = params || {};
params.security_ls_key = LIVESTREET_SECURITY_KEY;
$.each(params, function(k, v){
if (typeof(v) == "boolean") {
params[k] = v ? 1 : 0;
}
});
if (url.indexOf('http://') != 0 && url.indexOf('https://') != 0 && url.indexOf('/') != 0) {
url=aRouter['ajax'] + url + '/';
}
var ajaxOptions = $.extend({}, {
type: "POST",
url: url,
data: params,
dataType: 'json',
success: callback || function(){
ls.debug("ajax success: ");
ls.debug.apply(this,arguments);
}.bind(this),
error: function(msg){
ls.debug("ajax error: ");
ls.debug.apply(this, arguments);
}.bind(this),
complete: function(msg){
ls.debug("ajax complete: ");
ls.debug.apply(this, arguments);
}.bind(this)
}, more);
ls.hook.run('ls_ajax_before', [ajaxOptions, callback, more], this);
return $.ajax(ajaxOptions);
};
/**
* Выполнение AJAX отправки формы, включая загрузку файлов
*/
this.ajaxSubmit = function(url, form, callback, more) {
var more = more || {}
form = typeof form == 'string' ? $(form) : form;
if (url.indexOf('http://') != 0 && url.indexOf('https://') != 0 && url.indexOf('/') != 0) {
url = aRouter['ajax'] + url + '/';
}
var options = {
type: 'POST',
url: url,
dataType: more.dataType || 'json',
data: {
security_ls_key: LIVESTREET_SECURITY_KEY
},
beforeSubmit: function (arr, form, options) {
form.find('[type=submit]').prop('disabled', true).addClass('loading');
},
beforeSerialize: function (form, options) {
return form.parsley('validate');
},
success: typeof callback == 'function' ? function (result, status, xhr, form) {
if (result.bStateError) {
form.find('[type=submit]').prop('disabled', false).removeClass('loading');
ls.msg.error(null, result.sMsg);
more.warning(result, status, xhr, form);
} else {
if (result.sMsg) {
form.find('[type=submit]').prop('disabled', false).removeClass('loading');
ls.msg.notice(null, result.sMsg);
}
callback(result, status, xhr, form);
}
} : function () {
ls.debug("ajax success: ");
ls.debug.apply(this, arguments);
}.bind(this),
error: more.error || function(){
ls.debug("ajax error: ");
ls.debug.apply(this, arguments);
}.bind(this)
};
ls.hook.run('ls_ajaxsubmit_before', [options,form,callback,more], this);
form.ajaxSubmit(options);
};
/**
* Создание ajax формы
*
* @param {string} url Ссылка
* @param {jquery, string} form Селектор формы либо объект jquery
* @param {Function} callback Success коллбэк
* @param {[type]} more Дополнительные параметры
*/
this.ajaxForm = function(url, form, callback, more) {
var form = typeof form == 'string' ? $(form) : form;
form.on('submit', function (e) {
ls.ajaxSubmit(url, form, callback, more);
e.preventDefault();
});
};
/**
* Дебаг сообщений
*/
this.debug = function() {
if (this.options.debug) {
this.log.apply(this,arguments);
}
};
/**
* Лог сообщений
*/
this.log = function() {
if (!$.browser.msie && window.console && window.console.log) {
Function.prototype.bind.call(console.log, console).apply(console, arguments);
} else {
//alert(msg);
}
};
return this;
}).call(ls || {},jQuery);
/**
* Автокомплитер
*/
ls.autocomplete = (function ($) {
/**
* Добавляет автокомплитер к полю ввода
*/
this.add = function(obj, sPath, multiple) {
if (multiple) {
obj.bind("keydown", function(event) {
if ( event.keyCode === $.ui.keyCode.TAB && $( this ).data( "autocomplete" ).menu.active ) {
event.preventDefault();
}
})
.autocomplete({
source: function(request, response) {
ls.ajax(sPath,{value: ls.autocomplete.extractLast(request.term)},function(data){
response(data.aItems);
});
},
search: function() {
var term = ls.autocomplete.extractLast(this.value);
if (term.length < 2) {
return false;
}
},
focus: function() {
return false;
},
select: function(event, ui) {
var terms = ls.autocomplete.split(this.value);
terms.pop();
terms.push(ui.item.value);
terms.push("");
this.value = terms.join(", ");
return false;
}
});
} else {
obj.autocomplete({
source: function(request, response) {
ls.ajax(sPath,{value: ls.autocomplete.extractLast(request.term)},function(data){
response(data.aItems);
});
}
});
}
};
this.split = function(val) {
return val.split( /,\s*/ );
};
this.extractLast = function(term) {
return ls.autocomplete.split(term).pop();
};
return this;
}).call(ls.autocomplete || {},jQuery);
/**
* Костыли для ИЕ
*/
ls.ie = (function ($) {
return this;
}).call(ls.ie || {},jQuery);
(ls.options || {}).debug=1;