Вход Регистрация
Файл: textpattern-4.5.7/textpattern/textpattern.js
Строк: 773
<?php
/*
$HeadURL: https://textpattern.googlecode.com/svn/releases/4.5.7/source/textpattern/textpattern.js $
$LastChangedRevision: 5004 $
*/

// -------------------------------------------------------------
// admin-side "cookies required" warning

function checkCookies()
{
    var 
date = new Date();

    
date.setTime(date.getTime() + (60 1000));

    
document.cookie 'testcookie=enabled; expired='+date.toGMTString()+'; path=/';

    
cookieEnabled = (document.cookie.length 2) ? true false;

    
date.setTime(date.getTime() - (60 1000));

    
document.cookie 'testcookie=; expires='+date.toGMTString()+'; path=/';

    return 
cookieEnabled;
}

// -------------------------------------------------------------
// auto-centering popup windows

function popWin(urlwidthheightoptions)
{
    var 
= (width) ? width 400;
    var 
= (height) ? height 400;

    var 
= (screen.height) ? (screen.height h) / 0;
    var 
=     (screen.width) ? (screen.width w) / 0;

    var 
opt = (options) ? options 'toolbar = no, location = no, directories = no, '+
        
'status = yes, menubar = no, scrollbars = yes, copyhistory = no, resizable = yes';

    var 
popped window.open(url'popupwindow',
        
'top = '+t+', left = '+l+', width = '+w+', height = '+h+',' opt);

    
popped.focus();
}

/**
 * Basic confirmation for potentially powerful choice (like deletion, for example)
 * @param string msg
 * @return bool
 */

function verify(msg)
{
    return 
confirm(msg);
}

/**
 * Selects all multi-edit checkboxes
 * @deprecated
 */

function selectall()
{
    $(
'form[name=longform] input[type=checkbox][name="selected[]"]').prop('checked'true);
}

/**
 * De-selects all multi-edit checkboxes
 * @deprecated
 */

function deselectall()
{
    $(
'form[name=longform] input[type=checkbox][name="selected[]"]').prop('checked'false);
}

/**
 * Selects a range of multi-edit checkboxes
 * @deprecated
 */

function selectrange()
{
    var 
inrange false;

    $(
'form[name=longform] input[type=checkbox][name="selected[]"]').each(function() {
        var 
$this = $(this);

        if (
$this.is(':checked'))
        {
            
inrange = (!inrange) ? true false;
        }

        if (
inrange)
        {
            
$this.prop('checked'true);
        }
    });
}

/**
 * ?
 * @deprecated
 */

function cleanSelects()
{
    var 
withsel document.getElementById('withselected');

    if (
withsel && withsel.options[withsel.selectedIndex].value != '')
    {
        return (
withsel.selectedIndex 0);
    }
}

/**
 * Multi-edit functions
 * @param string|obj method
 * @param obj opt
 * @since 4.5.0
 */

jQuery.fn.txpMultiEditForm = function(methodopt)
{
    var 
args = {};

    var 
defaults = {
        
'checkbox' 'input[name="selected[]"][type=checkbox]',
        
'row' 'tbody td',
        
'highlighted' 'tr',
        
'selectedClass' 'selected',
        
'actions' 'select[name=edit_method]',
        
'submitButton' '.multi-edit input[type=submit]',
        
'selectAll' 'input[name=select_all][type=checkbox]',
        
'rowClick' true,
        
'altClick' true,
        
'confirmation' textpattern.gTxt('are_you_sure')
    };

    if ($.
type(method) !== 'string')
    {
        
opt method;
        
method null;
    }
    else
    {
        
args opt;
    }

    
this.closest('form').each(function() {

        var 
$this = $(this), form = {}, methods = {}, lib = {};

        if (
$this.data('_txpMultiEdit'))
        {
            
form $this.data('_txpMultiEdit');
            
opt = $.extend(form.optopt);
        }
        else
        {
            
opt = $.extend(defaultsopt);
            
form.boxes opt.checkbox;
            
form.editMethod $this.find(opt.actions);
            
form.lastCheck null;
            
form.opt opt;
            
form.selectAll $this.find(opt.selectAll);
            
form.button $this.find(opt.submitButton);
        }

        
/**
         * Registers multi-edit options
         * @param string label
         * @param string value HTML Option's value
         * @param obj|string html Object or HTML markup used as for the action's second step. NULL to skip 2nd step.
         * @return obj this
         */

        
methods.addOption = function(options)
        {
            var 
settings = $.extend({
                
'label' null,
                
'value' null,
                
'html' null
            
}, options);
            
            if (!
settings.value)
            {
                return 
methods;
            }

            var 
option form.editMethod.find('option').filter(function() {
                return $(
this).attr('value') === settings.value;
            });
            
            var 
exists = (option.length 0);
            
form.editMethod.val('');
            
            if (!
exists)
            {
                
option = $('<option />');
            }
            
            if (!
option.data('method'))
            {
                if (!
option.attr('value'))
                {
                    
option.attr('value'settings.value);
                }
                
                if (!
option.text() && settings.label)
                {
                    
option.text(settings.label);
                }
                
                
option.data('method'settings.html);
            }
            
            if (!
exists)
            {
                
form.editMethod.append(option);
            }
            
            return 
methods;
        };

        
/**
         * Selects rows based on supplied arguments. Only one of the filters applies at time.
         * @param array index Select based on row's index.
         * @param array range [min, max] Select based on index range.
         * @param array value [value1, value2, value3, ...]
         * @param bool checked Set matched checked or unchecked. FALSE to uncheck.
         */

        
methods.select = function(options)
        {
            var 
settings = $.extend({
                
'index' null,
                
'range' null,
                
'value' null,
                
'checked' true
            
}, options);

            var 
obj $this.find(form.boxes);

            if (
settings.value !== null)
            {
                
obj obj.filter(function() {
                    return $.
inArray($(this).attr('value'), settings.value) !== -1;
                });
            }

            else if (
settings.index !== null)
            {
                
obj obj.filter(function(index) {
                    return $.
inArray(indexsettings.index) !== -1;
                });
            }

            else if (
settings.range !== null)
            {
                
obj obj.slice(settings.range[0], settings.range[1]);
            }

            
obj.prop('checked'settings.checked).change();
            return 
methods;
        };

        
/**
         * Highlights selected rows
         */

        
lib.highlight = function()
        {
            var 
element $this.find(form.boxes);
            
element.filter(':checked').closest(opt.highlighted).addClass(opt.selectedClass);
            
element.filter(':not(:checked)').closest(opt.highlighted).removeClass(opt.selectedClass);
            return 
lib;
        };

        
/**
         * Extends click region to whole row
         */

        
lib.extendedClick = function()
        {
            if (
opt.rowClick)
            {
                var 
selector opt.row;
            }
            else
            {
                var 
selector form.boxes;
            }

            
$this.on('click'selector, function(e) {

                var 
self = ($(e.target).is(form.boxes) || $(this).is(form.boxes));

                if (!
self && (e.target != this || $(this).is('a, :input') || $(e.target).is('a, :input')))
                {
                    return;
                }

                if (!
self && opt.altClick && !e.altKey && !e.ctrlKey)
                {
                    return;
                }

                var 
box = $(this).closest(opt.highlighted).find(form.boxes);

                if (
box.length 1)
                {
                    return;
                }

                var 
checked box.prop('checked');

                if (
self)
                {
                    
checked = !checked;
                }

                if (
e.shiftKey && form.lastCheck)
                {
                    var 
boxes $this.find(form.boxes);
                    var 
start boxes.index(box);
                    var 
end boxes.index(form.lastCheck);

                    
methods.select({
                        
'range' : [Math.min(startend), Math.max(startend)+1],
                        
'checked' : !checked
                    
});
                }
                else if (!
self)
                {
                    
box.prop('checked', !checked).change();
                }

                if (
checked === false)
                {
                    
form.lastCheck box;
                }
                else
                {
                    
form.lastCheck null;
                }
            });

            return 
lib;
        };

        
/**
         * Tracks row checks
         */

        
lib.checked = function()
        {
            
$this.on('change'form.boxes, function(e) {
                var 
box = $(this);
                var 
boxes $this.find(form.boxes);

                if (
box.prop('checked'))
                {
                    $(
this).closest(opt.highlighted).addClass(opt.selectedClass);
                    
$this.find(opt.selectAll).prop('checked'boxes.filter(':checked').length === boxes.length);
                }
                else
                {
                    $(
this).closest(opt.highlighted).removeClass(opt.selectedClass);
                    
$this.find(opt.selectAll).prop('checked'false);
                }
            });

            return 
lib;
        };

        
/**
         * Handles edit method selecting
         */

        
lib.changeMethod = function()
        {
            
form.button.hide();

            
form.editMethod.val('').change(function(e) {
                var 
selected = $(this).find('option:selected');
                
$this.find('.multi-step').remove();

                if (
selected.length || selected.val() === '')
                {
                    
form.button.hide();
                    return 
lib;
                }

                if (
selected.data('method'))
                {
                    $(
this).after($('<div />').attr('class''multi-step multi-option').html(selected.data('method')));
                    
form.button.show();
                }
                else 
                {
                    
form.button.hide();
                    $(
this).parents('form').submit();
                }
            });

            return 
lib;
        };

        
/**
         * Handles sending
         */

        
lib.sendForm = function()
        {
            
$this.submit(function() {
                if (
opt.confirmation !== false && verify(opt.confirmation) === false)
                {
                    
form.editMethod.val('').change();
                    return 
false;
                }
            });

            return 
lib;
        };

        if(!
$this.data('_txpMultiEdit'))
        {
            
lib.highlight().extendedClick().checked().changeMethod().sendForm();

            (function() {
                var 
multiOptions $this.find('.multi-option:not(.multi-step)');

                
form.editMethod.find('option[value!=""]').each(function() {
                    var 
value = $(this).val();

                    var 
option multiOptions.filter(function() {
                        return $(
this).hasClass('multi-option-'+value);
                    });

                    if (
option.length 0)
                    {
                        
methods.addOption({
                            
'label' null,
                            
'html' option.eq(0).contents(),
                            
'value' : $(this).val()
                        });
                    }
                });

                
multiOptions.remove();
            })();

            
$this.on('change'opt.selectAll, function(e) {
                
methods.select({
                    
'checked' : $(this).prop('checked')
                });
            });
        }

        if (
method && methods[method])
        {
            
methods[method].call($thisargs);
        }

        
$this.data('_txpMultiEdit'form);
    });

    return 
this;
};

// -------------------------------------------------------------
// event handling
// By S.Andrew -- http://www.scottandrew.com/

function addEvent(elmevTypefnuseCapture)
{
    if (
elm.addEventListener)
    {
        
elm.addEventListener(evTypefnuseCapture);
        return 
true;
    }

    else if (
elm.attachEvent)
    {
        var 
elm.attachEvent('on' evTypefn);
        return 
r;
    }

    else
    {
        
elm['on' evType] = fn;
    }
}

// -------------------------------------------------------------
// cookie handling

function setCookie(namevaluedays)
{
    if (
days)
    {
        var 
date = new Date();

        
date.setTime(date.getTime() + (days*24*60*60*1000));

        var 
expires '; expires=' date.toGMTString();
    }

    else
    {
        var 
expires '';
    }

    
document.cookie name '=' value expires '; path=/';
}

function 
getCookie(name)
{
    var 
nameEQ name '=';

    var 
ca document.cookie.split(';');

    for (var 
0ca.lengthi++)
    {
        var 
ca[i];

        while (
c.charAt(0)==' ')
        {
            
c.substring(1c.length);
        }

        if (
c.indexOf(nameEQ) == 0)
        {
            return 
c.substring(nameEQ.lengthc.length);
        }
    }

    return 
null;
}

function 
deleteCookie(name)
{
    
setCookie(name'', -1);
}

// -------------------------------------------------------------
// @see http://www.snook.ca/archives/javascript/your_favourite_1/
function getElementsByClass(classnamenode)
{
    var 
= [];
    var 
re = new RegExp('(^|\s)' classname '(\s|$)');
    if(
node == nullnode document;
    var 
els node.getElementsByTagName("*");
    for(var 
i=0,j=els.lengthi<ji++)
        if(
re.test(els[i].className)) a.push(els[i]);
    return 
a;
}

// -------------------------------------------------------------
// direct show/hide

function toggleDisplay(id)
{
    var 
obj = $('#' id);
    if (
obj) {
        
obj.toggle();
        
// send state of toggle pane to server
        
sendAsyncEvent(
            {
                
eventtextpattern.event,
                
step'save_pane_state',
                
pane: $(obj).attr('id'),
                
visible: ($(obj).is(':visible'))
            }
        );
    }
    return 
false;
}

// -------------------------------------------------------------
// direct show/hide referred #segment; decorate parent lever

function toggleDisplayHref()
{
    var 
href = $(this).attr('href');
    var 
lever = $(this).parent('.lever');
    if (
hreftoggleDisplay(href.substr(1));
    if (
lever) {
        if ($(
href+':visible').length) {
            
lever.addClass('expanded');
        } else {
            
lever.removeClass('expanded');
        }
    }
    return 
false;
}

/**
 * Shows/hides matching elements
 * @param className string Targeted element's class
 * @param show bool|int 1 to display, 0 to hide
 */

function setClassDisplay(classNameshow)
{
    var 
obj = $('.'+className);
    
    if (
show == 1)
    {
        
obj.show();
    }
    else
    {
        
obj.hide();
    }
}

// -------------------------------------------------------------
// toggle show/hide matching elements, and set a cookie to remember

function toggleClassRemember(className)
{
    var 
getCookie('toggle_' className);
    
= (== 1);

    
setCookie('toggle_' classNamev365);

    
setClassDisplay(classNamev);
    
setClassDisplay(className+'_neg'1-v);
}

// -------------------------------------------------------------
// show/hide matching elements based on cookie value

function setClassRemember(classNameforce)
{
    if (
typeof(force) != 'undefined')
        
setCookie('toggle_' classNameforce365);
    var 
getCookie('toggle_' className);

    
setClassDisplay(classNamev);
    
setClassDisplay(className+'_neg'1-v);
}

/**
 * Send/receive AJAX posts
 *
 * @param data     POST payload
 * @param fn     success handler
 * @param format response data format ['xml']
 * @see http://api.jquery.com/jQuery.post/
 */
function sendAsyncEvent(datafnformat)
{
    if($.
type(data) === 'string' && data.length 0) {
        
// Got serialized data
        
data data '&app_mode=async&_txp_token=' textpattern._txp_token;
    } else {
        
data.app_mode 'async';
        
data._txp_token textpattern._txp_token;
    }
    
format format || 'xml';
    return $.
post('index.php'datafnformat);
}

/**
 * A pub/sub hub for client side events
 * @since   4.5.0
 */
textpattern.Relay =
{
    
/**
     * Publish an event to all registered subscribers
     * @param   event string
     * @param   data object
     * @return  the Relay object
     */
    
callback: function(eventdata)
    {
        return $(
this).trigger(eventdata);
        return 
this;
    },
    
/**
     * Subscribe to an event
     * @param   event string
     * @param   fn callback(event, data); // see individual events for details on data members
     * @return  the Relay object
     */
    
register: function(eventfn)
    {
        $(
this).bind(eventfn);
        return 
this;
    }
};

/**
 * txpAsyncForm jQuery plugin. Sends a form's entry elements as AJAX data and processes the response javascript.
 *
 * @param   object  options-object {dataType, error: function error_callback(){}, success: function success_callback(){}} | undefined
 * @return  object this form
 * @since   4.5.0
 */

jQuery.fn.txpAsyncForm = function(options)
{
    
options = $.extend({
        
dataType'script',
        
successnull,
        
errornull
    
}, options);

    
// Send form data to application, process response as script.
    
this.submit(function(event) {
        try {
            var 
form = $(this);
            var 
s;

            
// Show feedback while processing
            
form.addClass('busy');
            $(
'body').addClass('busy');

            
form.find('input[type="submit"]:focus');
            if (
s.length == 0) {
                
// WebKit does not set :focus on button-click: use first submit input as a fallback
                
form.find('input[type="submit"]');
            }
            if (
s.length 0) {
                
s.slice(0,1);
            }

            
s.attr('disabled'true).after(' <span class="spinner"></span>');

            
// error handler
            
form.ajaxError(function(eventjqXHRajaxSettingsthrownError) {
                
// do not pile up error handlers upon repeat submissions
                
$(this).off('ajaxError');
                
// remove feedback elements
                
form.removeClass('busy');
                
s.removeAttr('disabled');
                $(
'body').removeClass('busy');
                $(
'span.spinner').remove();
                if (
options.erroroptions.error(formeventjqXHRajaxSettingsthrownError);
                
textpattern.Relay.callback('txpAsyncForm.error', {'this'form'event'event'jqXHR'jqXHR'ajaxSettings'ajaxSettings'thrownError'thrownError});
            });

            
sendAsyncEvent(
                
form.serialize() + '&' + (s.attr('name') || '_txp_submit') + '=' + (s.val() || '_txp_submit'),
                function(
datatextStatusjqXHR) {
                    
// remove feedback elements
                    
form.removeClass('busy');
                    
s.removeAttr('disabled');
                    $(
'body').removeClass('busy');
                    $(
'span.spinner').remove();
                    
form.ajaxError null;
                    if (
options.successoptions.success(formeventdatatextStatusjqXHR);
                    
textpattern.Relay.callback('txpAsyncForm.success', {'this'form'event'event'data'data'textStatus'textStatus'jqXHR'jqXHR});
                },
                
options.dataType
            
);
            
event.preventDefault();
        } catch(
e) {}
    });
    return 
this;
};

jQuery.fn.txpAsyncHref = function(options) {
    
options = $.extend({
        
successnull,
        
errornull
    
}, options);

    
this.click(function(event) {
        try {
            
event.preventDefault();
            var 
obj = $(this);

            
// Show feedback while processing
            
obj.addClass('busy');
            $(
'body').addClass('busy');

            
// error handler
            
obj.ajaxError(function(eventjqXHRajaxSettingsthrownError) {
                
// do not pile up error handlers upon repeat submissions
                
$(this).off('ajaxError');
                
// remove feedback elements
                
obj.removeClass('busy');
                $(
'body').removeClass('busy');
                if (
options.erroroptions.error(objeventjqXHRajaxSettingsthrownError);
                
textpattern.Relay.callback('txpAsyncHref.error', {'this'obj'event'event'jqXHR'jqXHR'ajaxSettings'ajaxSettings'thrownError'thrownError});
            });

            
sendAsyncEvent(
                
// query string contains request params
                
this.search.replace('?''') + '&value=' obj.text(),
                function(
datatextStatusjqXHR) {
                    
obj.html(data);

                    
// remove feedback elements
                    
obj.removeClass('busy');
                    $(
'body').removeClass('busy');
                    if (
options.successoptions.success(objeventdatatextStatusjqXHR);
                    
textpattern.Relay.callback('txpAsyncHref.success', {'this'obj'event'event'data'data'textStatus'textStatus'jqXHR'jqXHR});
                },
                
'text'
            
);
        } catch(
e){}

    });
    return 
this;
}

/**
 * Returns a i18n string.
 * @param string i18n The i18n string to output
 * @param object atts Replacement map
 * @param boolean escape Escape HTML. Default TRUE
 * @return string
 */

textpattern.gTxt = function(i18nattsescape)
{
    var 
tags atts || {};
    var 
string i18n;
    var 
name string.toLowerCase();

    if ($.
type(textpattern.textarray[name]) !== 'undefined') {
        
string textpattern.textarray[name];
    }

    if (
escape !== false) {
        
string = $('<div/>').text(string).html();

        $.
each(tags, function(keyvalue) {
            
tags[key] = $('<div/>').text(value).html();
        });
    }

    $.
each(tags, function(keyvalue) {
        
string string.replace(keyvalue);
    });

    return 
string;
}

/**
 * jQuery plugin for textpattern.gTxt. Sets HTML contents of each matched element.
 * @param object options-object {string, tags : {}, escape : TRUE} | string The i18n string
 * @param object|undefined tags Replacement tags
 * @param boolean|undefined escape Escape HTML
 * @return object this
 */

jQuery.fn.gTxt = function(optstagsescape)
{
    var 
options = $.extend({
        
'string' opts,
        
'tags' tags,
        
'escape' escape
    
}, opts);

    
this.html(textpattern.gTxt(options.stringoptions.tagsoptions.escape));
    return 
this;
};

//-------------------------------------------------------------
// global admin-side behaviour
$(document).keyup(function(e) {
    if (
e.keyCode == 27)
    {
        $(
'.close').parent().remove();
    }
});

$(
document).ready(function() {
    
// disable spellchecking on all elements of class "code" in capable browsers
    
var = $(".code")[0];
    if(
&& "spellcheck" in c) {$(".code").prop("spellcheck"false);}
    
// enable spellcheck for all elements mentioned in textpattern.do_spellcheck
    
= $(textpattern.do_spellcheck)[0];
    if(
&& "spellcheck" in c) {$(textpattern.do_spellcheck).prop("spellcheck"true);}
    
// attach toggle behaviours
    
$('.lever a[class!=pophelp]').click(toggleDisplayHref);
    $(
'.multi_edit_form').txpMultiEditForm();
    
// establish AJAX timeout from prefs
    
if($.ajaxSetup().timeout === undefined) {
        $.
ajaxSetup( {timeout textpattern.ajax_timeout} );
    }
    
// setup async forms/hrefs
    
if(!textpattern.ajaxally_challenged) {
        $(
'form.async').txpAsyncForm({
            
error: function() {window.alert(textpattern.gTxt('form_submission_error'));}
        });
        $(
'a.async').txpAsyncHref({
            
error: function() {window.alert(textpattern.gTxt('form_submission_error'));}
        });
    }
    $(
document).on('click''.close', function(e) {
        
e.preventDefault();
        $(
this).parent().remove();
    });
    
// arm UI
    
$('body').removeClass('not-ready');
});
?>
Онлайн: 0
Реклама