⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prototype.js

📁 这是linux下ssl vpn的实现程序
💻 JS
📖 第 1 页 / 共 4 页
字号:
  },



  indexOf: function(object) {

    for (var i = 0; i < this.length; i++)

      if (this[i] == object) return i;

    return -1;

  },



  reverse: function(inline) {

    return (inline !== false ? this : this.toArray())._reverse();

  },



  shift: function() {

    var result = this[0];

    for (var i = 0; i < this.length - 1; i++)

      this[i] = this[i + 1];

    this.length--;

    return result;

  },



  inspect: function() {

    return '[' + this.map(Object.inspect).join(', ') + ']';

  }

});

var Hash = {

  _each: function(iterator) {

    for (key in this) {

      var value = this[key];

      if (typeof value == 'function') continue;



      var pair = [key, value];

      pair.key = key;

      pair.value = value;

      iterator(pair);

    }

  },



  keys: function() {

    return this.pluck('key');

  },



  values: function() {

    return this.pluck('value');

  },



  merge: function(hash) {

    return $H(hash).inject($H(this), function(mergedHash, pair) {

      mergedHash[pair.key] = pair.value;

      return mergedHash;

    });

  },



  toQueryString: function() {

    return this.map(function(pair) {

      return pair.map(encodeURIComponent).join('=');

    }).join('&');

  },



  inspect: function() {

    return '#<Hash:{' + this.map(function(pair) {

      return pair.map(Object.inspect).join(': ');

    }).join(', ') + '}>';

  }

}



function $H(object) {

  var hash = Object.extend({}, object || {});

  Object.extend(hash, Enumerable);

  Object.extend(hash, Hash);

  return hash;

}

ObjectRange = Class.create();

Object.extend(ObjectRange.prototype, Enumerable);

Object.extend(ObjectRange.prototype, {

  initialize: function(start, end, exclusive) {

    this.start = start;

    this.end = end;

    this.exclusive = exclusive;

  },



  _each: function(iterator) {

    var value = this.start;

    do {

      iterator(value);

      value = value.succ();

    } while (this.include(value));

  },



  include: function(value) {

    if (value < this.start)

      return false;

    if (this.exclusive)

      return value < this.end;

    return value <= this.end;

  }

});



var $R = function(start, end, exclusive) {

  return new ObjectRange(start, end, exclusive);

}



var Ajax = {

  getTransport: function() {

    return Try.these(

      function() {return new ActiveXObject('Msxml2.XMLHTTP')},

      function() {return new ActiveXObject('Microsoft.XMLHTTP')},

      function() {return new XMLHttpRequest()}

    ) || false;

  },



  activeRequestCount: 0

}



Ajax.Responders = {

  responders: [],



  _each: function(iterator) {

    this.responders._each(iterator);

  },



  register: function(responderToAdd) {

    if (!this.include(responderToAdd))

      this.responders.push(responderToAdd);

  },



  unregister: function(responderToRemove) {

    this.responders = this.responders.without(responderToRemove);

  },



  dispatch: function(callback, request, transport, json) {

    this.each(function(responder) {

      if (responder[callback] && typeof responder[callback] == 'function') {

        try {

          responder[callback].apply(responder, [request, transport, json]);

        } catch (e) {}

      }

    });

  }

};



Object.extend(Ajax.Responders, Enumerable);



Ajax.Responders.register({

  onCreate: function() {

    Ajax.activeRequestCount++;

  },



  onComplete: function() {

    Ajax.activeRequestCount--;

  }

});



Ajax.Base = function() {};

Ajax.Base.prototype = {

  setOptions: function(options) {

    this.options = {

      method:       'post',

      asynchronous: true,

      parameters:   ''

    }

    Object.extend(this.options, options || {});

  },



  responseIsSuccess: function() {

    return this.transport.status == undefined

        || this.transport.status == 0

        || (this.transport.status >= 200 && this.transport.status < 300);

  },



  responseIsFailure: function() {

    return !this.responseIsSuccess();

  }

}



Ajax.Request = Class.create();

Ajax.Request.Events =

  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];



Ajax.Request.prototype = Object.extend(new Ajax.Base(), {

  initialize: function(url, options) {

    this.transport = Ajax.getTransport();

    this.setOptions(options);

    this.request(url);

  },



  request: function(url) {

    var parameters = this.options.parameters || '';

    if (parameters.length > 0) parameters += '&_=';



    try {

      this.url = url;

      if (this.options.method == 'get' && parameters.length > 0)

        this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;



      Ajax.Responders.dispatch('onCreate', this, this.transport);



      this.transport.open(this.options.method, this.url,

        this.options.asynchronous);



      if (this.options.asynchronous) {

        this.transport.onreadystatechange = this.onStateChange.bind(this);

        setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);

      }



      this.setRequestHeaders();



      var body = this.options.postBody ? this.options.postBody : parameters;

      this.transport.send(this.options.method == 'post' ? body : null);



    } catch (e) {

      this.dispatchException(e);

    }

  },



  setRequestHeaders: function() {

    var requestHeaders =

      ['X-Requested-With', 'XMLHttpRequest',

       'X-Prototype-Version', Prototype.Version];



    if (this.options.method == 'post') {

      requestHeaders.push('Content-type',

        'application/x-www-form-urlencoded');



      /* Force "Connection: close" for Mozilla browsers to work around

       * a bug where XMLHttpReqeuest sends an incorrect Content-length

       * header. See Mozilla Bugzilla #246651.

       */

      if (this.transport.overrideMimeType)

        requestHeaders.push('Connection', 'close');

    }



    if (this.options.requestHeaders)

      requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);



    for (var i = 0; i < requestHeaders.length; i += 2)

      this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);

  },



  onStateChange: function() {

    var readyState = this.transport.readyState;

    if (readyState != 1)

      this.respondToReadyState(this.transport.readyState);

  },



  header: function(name) {

    try {

      return this.transport.getResponseHeader(name);

    } catch (e) {}

  },



  evalJSON: function() {

    try {

      return eval(this.header('X-JSON'));

    } catch (e) {}

  },



  evalResponse: function() {

    try {

      return eval(this.transport.responseText);

    } catch (e) {

      this.dispatchException(e);

    }

  },



  respondToReadyState: function(readyState) {

    var event = Ajax.Request.Events[readyState];

    var transport = this.transport, json = this.evalJSON();



    if (event == 'Complete') {

      try {

        (this.options['on' + this.transport.status]

         || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]

         || Prototype.emptyFunction)(transport, json);

      } catch (e) {

        this.dispatchException(e);

      }



      if ((this.header('Content-type') || '').match(/^text\/javascript/i))

        this.evalResponse();

    }



    try {

      (this.options['on' + event] || Prototype.emptyFunction)(transport, json);

      Ajax.Responders.dispatch('on' + event, this, transport, json);

    } catch (e) {

      this.dispatchException(e);

    }



    /* Avoid memory leak in MSIE: clean up the oncomplete event handler */

    if (event == 'Complete')

      this.transport.onreadystatechange = Prototype.emptyFunction;

  },



  dispatchException: function(exception) {

    (this.options.onException || Prototype.emptyFunction)(this, exception);

    Ajax.Responders.dispatch('onException', this, exception);

  }

});



Ajax.Updater = Class.create();



Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {

  initialize: function(container, url, options) {

    this.containers = {

      success: container.success ? $(container.success) : $(container),

      failure: container.failure ? $(container.failure) :

        (container.success ? null : $(container))

    }



    this.transport = Ajax.getTransport();

    this.setOptions(options);



    var onComplete = this.options.onComplete || Prototype.emptyFunction;

    this.options.onComplete = (function(transport, object) {

      this.updateContent();

      onComplete(transport, object);

    }).bind(this);



    this.request(url);

  },



  updateContent: function() {

    var receiver = this.responseIsSuccess() ?

      this.containers.success : this.containers.failure;

    var response = this.transport.responseText;



    if (!this.options.evalScripts)

      response = response.stripScripts();



    if (receiver) {

      if (this.options.insertion) {

        new this.options.insertion(receiver, response);

      } else {

        Element.update(receiver, response);

      }

    }



    if (this.responseIsSuccess()) {

      if (this.onComplete)

        setTimeout(this.onComplete.bind(this), 10);

    }

  }

});



Ajax.PeriodicalUpdater = Class.create();

Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {

  initialize: function(container, url, options) {

    this.setOptions(options);

    this.onComplete = this.options.onComplete;



    this.frequency = (this.options.frequency || 2);

    this.decay = (this.options.decay || 1);



    this.updater = {};

    this.container = container;

    this.url = url;



    this.start();

  },



  start: function() {

    this.options.onComplete = this.updateComplete.bind(this);

    this.onTimerEvent();

  },



  stop: function() {

    this.updater.onComplete = undefined;

    clearTimeout(this.timer);

    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);

  },



  updateComplete: function(request) {

    if (this.options.decay) {

      this.decay = (request.responseText == this.lastText ?

        this.decay * this.options.decay : 1);



      this.lastText = request.responseText;

    }

    this.timer = setTimeout(this.onTimerEvent.bind(this),

      this.decay * this.frequency * 1000);

  },



  onTimerEvent: function() {

    this.updater = new Ajax.Updater(this.container, this.url, this.options);

  }

});

document.getElementsByClassName = function(className, parentElement) {

  var children = ($(parentElement) || document.body).getElementsByTagName('*');

  return $A(children).inject([], function(elements, child) {

    if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))

      elements.push(child);

    return elements;

  });

}



/*--------------------------------------------------------------------------*/



if (!window.Element) {

  var Element = new Object();

}



Object.extend(Element, {

  visible: function(element) {

    return $(element).style.display != 'none';

  },



  toggle: function() {

    for (var i = 0; i < arguments.length; i++) {

      var element = $(arguments[i]);

      Element[Element.visible(element) ? 'hide' : 'show'](element);

    }

  },



  hide: function() {

    for (var i = 0; i < arguments.length; i++) {

      var element = $(arguments[i]);

      element.style.display = 'none';

    }

  },



  show: function() {

    for (var i = 0; i < arguments.length; i++) {

      var element = $(arguments[i]);

      element.style.display = '';

    }

  },



  remove: function(element) {

    element = $(element);

    element.parentNode.removeChild(element);

  },



  update: function(element, html) {

    $(element).innerHTML = html.stripScripts();

    setTimeout(function() {html.evalScripts()}, 10);

  },



  getHeight: function(element) {

    element = $(element);

    return element.offsetHeight;

  },



  classNames: function(element) {

    return new Element.ClassNames(element);

  },



  hasClassName: function(element, className) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -