/** * ThemeSelector loads various selectors' properties when they are select from * a list */ var ThemeSelector = { /** * Constructor * * @param string the address to the load script * @param string the address to the save script * @param object the select element * @param object the stylesheet info div * @param string the stylesheet file name * @param object the form element * @param number the theme id * @return void */ init: function(url, saveUrl, selector, styleSheet, file, selectorForm, tid) { // verify input if (!url || !saveUrl || !selector || !styleSheet || !file || !selectorForm || !tid) { return; } ThemeSelector.url = url; ThemeSelector.saveUrl = saveUrl; ThemeSelector.selector = selector; ThemeSelector.selectorPrevOpt = ThemeSelector.selector.val(); ThemeSelector.styleSheet = styleSheet; ThemeSelector.file = file; ThemeSelector.selectorForm = selectorForm; ThemeSelector.tid = tid; ThemeSelector.background = $("#css_bits\\[background\\]").val(); ThemeSelector.width = $("#css_bits\\[width\\]").val(); ThemeSelector.color = $("#css_bits\\[color\\]").val(); ThemeSelector.extra = $("#css_bits\\[extra\\]").val(); ThemeSelector.text_decoration = $("#css_bits\\[text_decoration\\]").val(); ThemeSelector.font_family = $("#css_bits\\[font_family\\]").val(); ThemeSelector.font_size = $("#css_bits\\[font_size\\]").val(); ThemeSelector.font_style = $("#css_bits\\[font_style\\]").val(); ThemeSelector.font_weight = $("#css_bits\\[font_weight\\]").val(); $("#save").on('click', function(event) { ThemeSelector.save(event, true); } ); $("#save_close").on('click', function(event) { ThemeSelector.saveClose(event); } ); $(window).on('beforeunload', function(event){ if(ThemeSelector.isChanged()) { return ' '; } }); ThemeSelector.selector.on("change", ThemeSelector.updateSelector); ThemeSelector.selectorForm.on("submit", ThemeSelector.updateSelector); }, /** * prevents no-save warning messaging when saving * * @return void */ saveClose: function(e) { ThemeSelector.isClosing = true; }, /** * updates the stylesheet info to match the current selection, checking * first that work isn't lost * * @param object the event * @return void */ updateSelector: function(e) { var postData; e.preventDefault() ThemeSelector.saveCheck(e, true); postData = "file=" + encodeURIComponent(ThemeSelector.file) + "&tid=" + encodeURIComponent(ThemeSelector.tid) + "&selector=" + encodeURIComponent(ThemeSelector.selector.val()) + "&my_post_key=" + encodeURIComponent(my_post_key); ThemeSelector.selectorGoText = $("#mini_spinner").html(); $("#mini_spinner").html(" \"\" "); $.ajax({ type: 'post', url: ThemeSelector.url, data: postData, complete: ThemeSelector.onComplete, }); }, /** * handles the AJAX return data * * @param object the request * @return true */ onComplete: function(request) { var message, saved; if (request.responseText.match(/(.*)<\/error>/)) { message = request.responseText.match(/(.*)<\/error>/); if (!message[1]) { message[1] = lang.unknown_error; } $.jGrowl(lang.theme_info_fetch_error + '\n\n' + message[1], {theme:'jgrowl_error'}); } else if(request.responseText) { if ($("#saved").html()) { saved = $("#saved").html(); } ThemeSelector.styleSheet.html(request.responseText); } ThemeSelector.background = $("#css_bits\\[background\\]").val(); ThemeSelector.width = $("#css_bits\\[width\\]").val(); ThemeSelector.color = $("#css_bits\\[color\\]").val(); ThemeSelector.extra = $("#css_bits\\[extra\\]").val(); ThemeSelector.text_decoration = $("#css_bits\\[text_decoration\\]").val(); ThemeSelector.font_family = $("#css_bits\\[font_family\\]").val(); ThemeSelector.font_size = $("#css_bits\\[font_size\\]").val(); ThemeSelector.font_style = $("#css_bits\\[font_style\\]").val(); ThemeSelector.font_weight = $("#css_bits\\[font_weight\\]").val(); if (saved) { $("#saved").html(saved); window.setTimeout(function() { $("#saved").html(""); }, 30000); } $("#mini_spinner").html(ThemeSelector.selectorGoText); ThemeSelector.selectorGoText = ''; return true; }, isChanged: function() { return (ThemeSelector.background != $("#css_bits\\[background\\]").val() || ThemeSelector.width != $("#css_bits\\[width\\]").val() || ThemeSelector.color != $("#css_bits\\[color\\]").val() || ThemeSelector.extra != $("#css_bits\\[extra\\]").val() || ThemeSelector.text_decoration != $("#css_bits\\[text_decoration\\]").val() || ThemeSelector.font_family != $("#css_bits\\[font_family\\]").val() || ThemeSelector.font_size != $("#css_bits\\[font_size\\]").val() || ThemeSelector.font_style != $("#css_bits\\[font_style\\]").val() || ThemeSelector.font_weight != $("#css_bits\\[font_weight\\]").val()); }, /** * check if anything has changed * * @param object the event * @param bool true if AJAX, false if not * @return true */ saveCheck: function(e, isAjax) { if (ThemeSelector.isClosing == true) { return true; } if(e != null && isAjax == true) e.preventDefault(); if (ThemeSelector.isChanged()) { e.preventDefault(); if(isAjax == false) return save_changes_lang_string; else { confirmReturn = confirm(save_changes_lang_string); if (confirmReturn == true) { ThemeSelector.save(false, isAjax); $.jGrowl(lang.saved, {theme:'jgrowl_success'}); } } } else if(isAjax == true) { ThemeSelector.selectorPrevOpt = ThemeSelector.selector.val(); return true; } }, /** * saves the selector info * * @param object the event * @param bool true if AJAX, false if not * @return true */ save: function(e, isAjax) { var cssBits, postData, completeMethod = 'onUnloadSaveComplete'; if (e) { e.preventDefault(); } cssBits = { 'background': $('#css_bits\\[background\\]').val(), 'width': $('#css_bits\\[width\\]').val(), 'color': $('#css_bits\\[color\\]').val(), 'extra': $('#css_bits\\[extra\\]').val(), 'text_decoration': $('#css_bits\\[text_decoration\\]').val(), 'font_family': $('#css_bits\\[font_family\\]').val(), 'font_size': $('#css_bits\\[font_size\\]').val(), 'font_style': $('#css_bits\\[font_style\\]').val(), 'font_weight': $('#css_bits\\[font_weight\\]').val() }; postData = "css_bits=" + encodeURIComponent(jsArrayToPhpArray(cssBits)) + "&selector=" + encodeURIComponent(ThemeSelector.selectorPrevOpt) + "&file=" + encodeURIComponent(ThemeSelector.file) + "&tid=" + encodeURIComponent(ThemeSelector.tid) + "&my_post_key=" + encodeURIComponent(my_post_key) + "&serialized=1"; if (isAjax == true) { postData += "&ajax=1"; } ThemeSelector.isAjax = isAjax; if (isAjax == true) { completeMethod = 'onSaveComplete'; $.jGrowl(lang.saving, {theme:'jgrowl_process'}); } $.ajax({ type: 'post', url: ThemeSelector.saveUrl, data: postData, complete: ThemeSelector[completeMethod], }); return !isAjax; }, /** * handle errors, reset values and clean up * * @param object the request * @return true */ onSaveComplete: function(request) { var message; if (request.responseText.match(/(.*)<\/error>/)) { message = request.responseText.match(/(.*)<\/error>/); if (!message[1]) { message[1] = lang.unkown_error; } $.jGrowl(lang.theme_info_save_error + '\n\n' + message[1], {theme:'jgrowl_error'}); return false; } else if(request.responseText) { $("#saved").html(" (" + lang.saved + " @ "+ Date() + ")"); if ($("#ajax_alert")) { $("#ajax_alert").html('').hide(); } } ThemeSelector.background = $("#css_bits\\[background\\]").val(); ThemeSelector.width = $("#css_bits\\[width\\]").val(); ThemeSelector.color = $("#css_bits\\[color\\]").val(); ThemeSelector.extra = $("#css_bits\\[extra\\]").val(); ThemeSelector.text_decoration = $("#css_bits\\[text_decoration\\]").val(); ThemeSelector.font_family = $("#css_bits\\[font_family\\]").val(); ThemeSelector.font_size = $("#css_bits\\[font_size\\]").val(); ThemeSelector.font_style = $("#css_bits\\[font_style\\]").val(); ThemeSelector.font_weight = $("#css_bits\\[font_weight\\]").val(); return true; }, /** * handle leaving page save * * @param object the request * @return true */ onUnloadSaveComplete: function(request) { var message; if (request.responseText.match(/(.*)<\/error>/)) { message = request.responseText.match(/(.*)<\/error>/); if (!message[1]) { message[1] = lang.unkown_error; } $.jGrowl(lang.theme_info_save_error + '\n\n' + message[1], {theme:'jgrowl_error'}); return false; } return true; }, url: null, saveUrl: null, selector: null, styleSheet: null, file: null, selectorForm: null, tid: null, miniSpinnerImage: "../images/spinner.gif", isAjax: false, specific_count: 0, selectorGoText: null, selectorPrevOpt: null, isClosing: false, background: null, width: null, color: null, extra: null, text_decoration: null, font_family: null, font_size: null, font_style: null, font_weight: null }; /** * converts a JS object to a JSON of a PHP associative array * * @param array the JS array * @return string the JSON */ function jsArrayToPhpArray(a) { var a_php = "", total = 0; for (var key in a) { ++total; a_php += "s:" + String(key).length + ":\"" + String(key) + "\";s:" + String(a[key]).length + ":\"" + String(a[key]) + "\";"; } a_php = "a:" + total + ":{" + a_php + "}"; return a_php; }