/* ** AJAX FUNCTION */ function mort_ajax(opt) { if(opt['url']+'' == '') opt['url'] = (document.location+"").substring(0, (document.location+"").indexOf('?')); if(typeof opt['async'] === 'undefined') opt['async'] = true; var data = new FormData(); if(typeof opt['ajax'] === 'undefined') data.append('ajax', true); $.each(opt, function(k, v) { data.append(k+"", v); }); return $.ajax({ async: opt['async'], url: opt['url'], type: 'POST', data: data, cache: false, processData: false, // Don't process the files contentType: false, // Set content type to false as jQuery will tell the server its a query string request success: function(data){ if(typeof opt['cb_success'] !== 'undefined') { if( $.isFunction(opt['cb_success']) ) { return opt['cb_success'](data); } else { return eval(opt['cb_success'] +'(data);'); } } else { opt['data'] = data; return mort_func(opt); } }, error: function( xhr, textStatus, errorThrown ){ // setTimeout(function(){ // window.alert("raw/func.js\n"+ textStatus +"\n"+ errorThrown); mort_ajax(opt); // }, 2000); } }); } /* ** AJAX INPUT/LABEL CONNECTION */ function mort_ajax_link(opt) { var obj = $(":input[name='"+ opt['name'] +"']"); var lbl = $("label[name='"+ opt['name'] +"']"); // ATTACH OBJECT LISTENER if(obj.attr('type') == 'hidden') obj.trigger('hide'); obj.hide().blur(function(){ if(mort_input_type(obj) === 'checkbox') { // SPECIAL CASE FOR CHECKBOX $(this).val( $(this).is(':checked')*1 ); } if($(this).val() !== lbl.val()) { $(this).prop('disabled', true); // PREPARE PARAMETERS TO BE PASSED var params = $.extend({}, opt); params['field'] = opt['name'].substr(opt['prefix'].length); params['value'] = $(this).val(); if(typeof params['url'] == 'undefined') params['url'] = ''; // LINK TO THE display_trait CORE MODULE if(typeof params['sw'] == 'undefined') { params['sw'] = typeof params['object_class'] == 'undefined' ? 'Change' : 'Mort Change'; } params['cb_success'] = function(data){ if(typeof data === 'undefined') return; // cb_success CALLED FOR NO REASON: PREVENT FURTHER ACTION FOR UNWANTED CALL // CUSTOM ERROR HANDLE var can_continue = null; if( eval("$.isFunction(window."+ opt['cb_success'] +")") ) { eval("can_continue = window."+ opt['cb_success'] +"(data);"); } // HANDLE DATA RETURN / CUSTOM ERROR if(can_continue == null && data || can_continue == false ) { // HANDLE ERROR: CONTINUE EDITING OR REVERT if(can_continue == null && confirm(data) || can_continue == false ) { obj.prop('disabled', false).focus(); } else if(mort_input_type(obj) === 'checkbox') { obj.prop('checked', lbl.val()*1); obj.val(lbl.val()*1).blur(); } else { obj.val(lbl.val()).blur(); } } else { // NO ERRORS, SUCCESSFUL SAVE obj.hide(); lbl.html(_mort_ajax_link(obj, opt['js_formatter'], opt['js_input_formatter'])).val(obj.val()).show(); // DO SAVE CALLBACK FUNCTION if(typeof opt['cb_save'] != 'undefined') { opt['field'] = opt['name'].substr(opt['prefix'].length); opt['value'] = obj.val(); if($.isFunction(opt['cb_save'])) { opt['cb_save'](opt); } else { eval(opt['cb_save'] +'(opt)'); } } } }; // AJAX CALL mort_ajax( params ); } else { // NO CHANGE $(this).hide(); lbl.show(); } }); // ATTACH LABEL LISTENER lbl .click(function(){ $(this).hide(); obj.prop('disabled', false).show().focus(); }) .val(mort_input_type(obj) === 'checkbox' ? obj.is(':checked')*1 : obj.val()) .html(_mort_ajax_link(obj, opt['js_formatter'], opt['js_input_formatter'])) ; // SET LABEL SIZE var o = obj.clone(); $('body').append(o); lbl .width(o.width()) .css('display', 'inline-block') ; if(opt['crop_label']) { lbl .css('overflow', 'hidden') .css('text-overflow', 'ellipsis') .css('white-space', 'nowrap') ; } o.remove(); } function _mort_ajax_link(obj, cb_formatter, cb_input_formatter) { var lbl_text = ''; // THE KIND OF INPUT THAT IS BEING CONSIDERED IS WHAT IS BEING SWITCHED switch( mort_input_type(obj) ) { case 'select': lbl_text = obj.find(':selected').attr('display') +''; if(lbl_text === 'undefined') lbl_text = ''; break; case 'checkbox': lbl_text = obj.is(":checked") ? 'Y' : 'N'; break; case 'password': lbl_text = ''; for(var i=0; i'); } while(txt.indexOf("\n") >= 0); lbl_text = txt; break; } if($.isFunction(window[cb_input_formatter])) obj.val( window[cb_input_formatter](obj.val()) ); if($.isFunction(window[cb_formatter])) lbl_text = window[cb_formatter](lbl_text); if(lbl_text == '') return '_____'; return lbl_text; } function number_format(val, decimals) { val = $.trim(val); val = val.replace(/\s/g, ''); var arr = val.split('.'); if(arr[1]+'' == 'undefined') arr[1] = '0'; while(arr[1].length < decimals) arr[1] += '0'; if(arr[1].length > decimals) { var start = arr[1].substr(0,decimals-1); var i = arr[1].substr(decimals-1,1)*1; if(arr[1].substr(decimals,1)*1 >= 5) i++; arr[1] = start + i; } return arr[0]*1 +'.'+ arr[1]; } function money_format(val) { return '$'+ number_format(val+'', 2); } function percent_format(val) { return number_format(val+'', 3) +'%'; } function slug_format(val) { val = $.trim(val); val = val.replace(/\s+/g, ' '); val = val.replace(/\s/g, '_'); return val; } function date_format(val) { var arr = val.split('-') var d = new Date(arr[0], arr[1]-1, arr[2]); return d.toLocaleString('en-US', { year: 'numeric', month: 'long', day: 'numeric', }); /* var arr = val.split('-'); switch(arr[1]*1) { case 1: arr[1] = 'January'; break; case 2: arr[1] = 'Febrauary'; break; case 3: arr[1] = 'March'; break; case 4: arr[1] = 'April'; break; case 5: arr[1] = 'May'; break; case 6: arr[1] = 'June'; break; case 7: arr[1] = 'July'; break; case 8: arr[1] = 'August'; break; case 9: arr[1] = 'September'; break; case 10: arr[1] = 'October'; break; case 11: arr[1] = 'November'; break; case 12: arr[1] = 'December'; break; default: arr[1] = 'Unknown'; } return arr[1] +" "+ arr[2]*1 +", "+ arr[0]; */ } function mort_ajax_form(opt) { // GET ALL INPUT AFFILIATED WITH PREFIX var input = {}; $(":input[name^='"+ opt['prefix'] +"']").each(function(){ var n = $(this).prop('name').substr(opt['prefix'].length); switch( mort_input_type($(this)) ) { case 'file': input[n] = $(this).prop('files')[0]; break; case 'checkbox': input[n] = ($(this).is(":checked")+'').toUpperCase(); break; case 'radio': if($(this).is(':checked')) { input[n] = $(this).val(); } else if(input[n]+'' == 'undefined') { input[n] = ''; } break; case 'select': case 'text': default: input[n] = $(this).val(); } $(this).prop('disabled', true); }); // PREPARE FOR AJAX CALL if(typeof opt['params'] == 'undefined') opt['params'] = {}; if(typeof opt['url'] == 'undefined') opt['url'] = ''; if(typeof opt['cb_success'] == 'undefined') opt['cb_success'] = 'mort_func'; var params = input; params = $.extend(params, opt['params']); params['url'] = opt['url']; params['cb_success'] = function(data){ if(typeof data == 'undefined') return; // THIS IS CALLED FOR NO REASON: PREVENT FURTHER ACTION FOR UNWANTED CALL opt['data'] = data; var r_val; if( $.isFunction(opt['cb_success']) ) { r_val = opt['cb_success'](opt); } else { eval( 'r_val = '+ opt['cb_success'] +'(opt);'); } if(!r_val) for(var i in input) $(":input[name='"+ opt['prefix'] + i +"']").prop('disabled', false); }; // MAKE CALL mort_ajax( params ); } function mort_input_type(obj) { if( typeof obj.attr('name') == 'undefined') return; return obj.prop('tagName') === 'INPUT' ? obj.attr('type').toLowerCase() : obj.prop('tagName').toLowerCase() } function mort_create_func(args) { mort_ajax_form({ params:args['params'], prefix:args['prefix'], cb_success:function(opt){ if(!$.isNumeric(opt['data'])) { window.alert(opt['data']); } else if(typeof args['cb_create'] != 'undefined') { if( $.isFunction(args['cb_create']) ) { return args['cb_create'](opt); } else { return eval( args['cb_create'] +"(opt);"); } } else { if(typeof args['url'] != 'undefined') { window.document.location.replace(args['url'] +'?id='+ opt['data']); return true; // KEEP INPUTS DISABLED } } }, }); } /* ** DEFAULT HANDLER */ function mort_func(opt) { if(opt['data']) { if(typeof opt['mort_err_func'] != 'undefined') { if($.isFunction(opt['mort_err_func'])) { return opt['mort_err_func'](opt); } else { return eval(opt['mort_err_func'] +'(opt);'); } } window.alert(opt['data']); return false; } else if(typeof opt['mort_func'] != 'undefined') { if($.isFunction(opt['mort_func'])) { return opt['mort_func'](opt); } else { return eval(opt['mort_func'] +'(opt);'); } } else if(typeof opt['mort_uri'] != 'undefined') document.location.replace(opt['mort_uri']); return true; // KEEP INPUTS DISABLED } // AUTOSIZE TEXTAREAS function mort_autosize_text_areas() { $('textarea').not('[autoexpand="false"]').each(function(){ $(this) .attr('wrap', 'soft') .css('overflow', 'hidden') .on('keyup', function(){ // CONE AN OBJECT TO GET HEIGHT var obj = $(this).clone().attr('rows', 1).show().css('width', $(this).css('width')); obj.appendTo($("body")); var scroll_h = obj.prop('scrollHeight'); obj.remove(); // GET INFORMATION BASED ON THIS OBJECT var char_h = Math.round($(this).css('font-size').replace('px','') * 1.125 ); // 15 var padding = $(this).css('padding-top').replace('px','')*1+$(this).css('padding-bottom').replace('px','')*1 + 1 ; // 5 // SET NUMBER OF ROWS var num_rows = (scroll_h - padding) / char_h; var excess = Math.floor(num_rows / (char_h * 10 +1)); // REMOVE ONE LINE FOR EVERY 150 $(this).attr('rows', num_rows-excess); }) .trigger('keyup') ; // DOES NOT FIT TO WIDTH WHEN FIRST VISIBLE AFTER INITIALLY HIDDEN }); } $().ready(function(){ mort_autosize_text_areas(); }); // FORMAT INPUT OBJECTS function fixSpaces(obj) { var str = $(obj).val(); str = str.replace(/\s\s+/g, ' '); str = $.trim(str); $(obj).val(str); } function removeSpaces(obj) { var str = $(obj).val(); str = str.replace(/\s\s+/g, ''); str = $.trim(str); $(obj).val(str); } /* ** ADD LISTENERS */ $().ready(function(){ // USE AS FOLLOWS: .on('show', function(){ ... }); $.each(['show', 'hide'], function(i, ev) { var el = $.fn[ev]; $.fn[ev] = function() { this.trigger(ev); return el.apply(this, arguments); }; }); });