diff options
Diffstat (limited to 'emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.uncompressed.js')
-rw-r--r-- | emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.uncompressed.js | 4078 |
1 files changed, 0 insertions, 4078 deletions
diff --git a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.uncompressed.js b/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.uncompressed.js deleted file mode 100644 index d0ef7e8..0000000 --- a/emacs.d/nxhtml/nxhtml/doc/js/smoothgallery/scripts/mootools.uncompressed.js +++ /dev/null @@ -1,4078 +0,0 @@ -/* -Script: Moo.js - My Object Oriented javascript. - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. - -Credits: - - Class is slightly based on Base.js <http://dean.edwards.name/weblog/2006/03/base/> (c) 2006 Dean Edwards, License <http://creativecommons.org/licenses/LGPL/2.1/> - - Some functions are based on those found in prototype.js <http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio [dot] net, MIT-style license - - Documentation by Aaron Newton (aaron.newton [at] cnet [dot] com) and Valerio Proietti. -*/ - -/* -Class: Class - The base class object of the <http://mootools.net> framework. - -Arguments: - properties - the collection of properties that apply to the class. Creates a new class, its initialize method will fire upon class instantiation. - -Example: - (start code) - var Cat = new Class({ - initialize: function(name){ - this.name = name; - } - }); - var myCat = new Cat('Micia'); - alert myCat.name; //alerts 'Micia' - (end) -*/ - -var Class = function(properties){ - var klass = function(){ - if (this.initialize && arguments[0] != 'noinit') return this.initialize.apply(this, arguments); - else return this; - }; - for (var property in this) klass[property] = this[property]; - klass.prototype = properties; - return klass; -}; - -/* -Property: empty - Returns an empty function -*/ - -Class.empty = function(){}; - -Class.prototype = { - - /* - Property: extend - Returns the copy of the Class extended with the passed in properties. - - Arguments: - properties - the properties to add to the base class in this new Class. - - Example: - (start code) - var Animal = new Class({ - initialize: function(age){ - this.age = age; - } - }); - var Cat = Animal.extend({ - initialize: function(name, age){ - this.parent(age); //will call the previous initialize; - this.name = name; - } - }); - var myCat = new Cat('Micia', 20); - alert myCat.name; //alerts 'Micia' - alert myCat.age; //alerts 20 - (end) - */ - - extend: function(properties){ - var pr0t0typ3 = new this('noinit'); - - var parentize = function(previous, current){ - if (!previous.apply || !current.apply) return false; - return function(){ - this.parent = previous; - return current.apply(this, arguments); - }; - }; - - for (var property in properties){ - var previous = pr0t0typ3[property]; - var current = properties[property]; - if (previous && previous != current) current = parentize(previous, current) || current; - pr0t0typ3[property] = current; - } - return new Class(pr0t0typ3); - }, - - /* - Property: implement - Implements the passed in properties to the base Class prototypes, altering the base class, unlike <Class.extend>. - - Arguments: - properties - the properties to add to the base class. - - Example: - (start code) - var Animal = new Class({ - initialize: function(age){ - this.age = age; - } - }); - Animal.implement({ - setName: function(name){ - this.name = name - } - }); - var myAnimal = new Animal(20); - myAnimal.setName('Micia'); - alert(myAnimal.name); //alerts 'Micia' - (end) - */ - - implement: function(properties){ - for (var property in properties) this.prototype[property] = properties[property]; - } - -}; - -/* Section: Object related Functions */ - -/* -Function: Object.extend - Copies all the properties from the second passed object to the first passed Object. - If you do myWhatever.extend = Object.extend the first parameter will become myWhatever, and your extend function will only need one parameter. - -Example: - (start code) - var firstOb = { - 'name': 'John', - 'lastName': 'Doe' - }; - var secondOb = { - 'age': '20', - 'sex': 'male', - 'lastName': 'Dorian' - }; - Object.extend(firstOb, secondOb); - //firstOb will become: - { - 'name': 'John', - 'lastName': 'Dorian', - 'age': '20', - 'sex': 'male' - }; - (end) - -Returns: - The first object, extended. -*/ - -Object.extend = function(){ - var args = arguments; - args = (args[1]) ? [args[0], args[1]] : [this, args[0]]; - for (var property in args[1]) args[0][property] = args[1][property]; - return args[0]; -}; - -/* -Function: Object.Native - Will add a .extend method to the objects passed as a parameter, equivalent to <Class.implement> - -Arguments: - a number of classes/native javascript objects - -*/ - -Object.Native = function(){ - for (var i = 0; i < arguments.length; i++) arguments[i].extend = Class.prototype.implement; -}; - -new Object.Native(Function, Array, String, Number, Class); - -/* -Script: Utility.js - Contains Utility functions - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -//htmlelement mapping - -if (typeof HTMLElement == 'undefined'){ - var HTMLElement = Class.empty; - HTMLElement.prototype = {}; -} - -/* -Function: $type - Returns the type of object that matches the element passed in. - -Arguments: - obj - the object to inspect. - -Example: - >var myString = 'hello'; - >$type(myString); //returns "string" - -Returns: - 'element' - if obj is a DOM element node - 'textnode' - if obj is a DOM text node - 'whitespace' - if obj is a DOM whitespace node - 'array' - if obj is an array - 'object' - if obj is an object - 'string' - if obj is a string - 'number' - if obj is a number - 'boolean' - if obj is a boolean - 'function' - if obj is a function - false - (boolean) if the object is not defined or none of the above. -*/ - -function $type(obj){ - if (obj === null || obj === undefined) return false; - var type = typeof obj; - if (type == 'object'){ - if (obj instanceof HTMLElement) return 'element'; - if (obj instanceof Array) return 'array'; - if (obj.nodeName){ - switch (obj.nodeType){ - case 1: return 'element'; - case 3: return obj.nodeValue.test('\\S') ? 'textnode' : 'whitespace'; - } - } - } - return type; -}; - -/* -Function: $chk - Returns true if the passed in value/object exists or is 0, otherwise returns false. - Useful to accept zeroes. -*/ - -function $chk(obj){ - return !!(obj || obj === 0); -}; - -/* -Function: $pick - Returns the first object if defined, otherwise returns the second. -*/ - -function $pick(obj, picked){ - return ($type(obj)) ? obj : picked; -}; - -/* -Function: $random - Returns a random integer number between the two passed in values. - -Arguments: - min - integer, the minimum value (inclusive). - max - integer, the maximum value (inclusive). - -Returns: - a random integer between min and max. -*/ - -function $random(min, max){ - return Math.floor(Math.random() * (max - min + 1) + min); -}; - -/* -Function: $clear - clears a timeout or an Interval. - -Returns: - null - -Arguments: - timer - the setInterval or setTimeout to clear. - -Example: - >var myTimer = myFunction.delay(5000); //wait 5 seconds and execute my function. - >myTimer = $clear(myTimer); //nevermind - -See also: - <Function.delay>, <Function.periodical> -*/ - -function $clear(timer){ - clearTimeout(timer); - clearInterval(timer); - return null; -}; - -/* Section: Browser Detection */ - -/* -Properties: - window.ie - will be set to true if the current browser is internet explorer (any). - window.ie6 - will be set to true if the current browser is internet explorer 6. - window.ie7 - will be set to true if the current browser is internet explorer 7. - window.khtml - will be set to true if the current browser is Safari/Konqueror. - window.gecko - will be set to true if the current browser is Mozilla/Gecko. -*/ - -if (window.ActiveXObject) window.ie = window[window.XMLHttpRequest ? 'ie7' : 'ie6'] = true; -else if (document.childNodes && !document.all && !navigator.taintEnabled) window.khtml = true; -else if (document.getBoxObjectFor != null) window.gecko = true; - -/* -Script: Array.js - Contains Array prototypes and the function <$A>; - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -/* -Class: Array - A collection of The Array Object prototype methods. -*/ - -//emulated methods - -/* -Property: forEach - Iterates through an array; This method is only available for browsers without native *forEach* support. - For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:forEach> -*/ - -Array.prototype.forEach = Array.prototype.forEach || function(fn, bind){ - for (var i = 0; i < this.length; i++) fn.call(bind, this[i], i, this); -}; - -/* -Property: map - This method is provided only for browsers without native *map* support. - For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:map> -*/ - -Array.prototype.map = Array.prototype.map || function(fn, bind){ - var results = []; - for (var i = 0; i < this.length; i++) results[i] = fn.call(bind, this[i], i, this); - return results; -}; - -/* -Property: every - This method is provided only for browsers without native *every* support. - For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every> -*/ - -Array.prototype.every = Array.prototype.every || function(fn, bind){ - for (var i = 0; i < this.length; i++){ - if (!fn.call(bind, this[i], i, this)) return false; - } - return true; -}; - -/* -Property: some - This method is provided only for browsers without native *some* support. - For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some> -*/ - -Array.prototype.some = Array.prototype.some || function(fn, bind){ - for (var i = 0; i < this.length; i++){ - if (fn.call(bind, this[i], i, this)) return true; - } - return false; -}; - -/* -Property: indexOf - This method is provided only for browsers without native *indexOf* support. - For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf> -*/ - -Array.prototype.indexOf = Array.prototype.indexOf || function(item, from){ - from = from || 0; - if (from < 0) from = Math.max(0, this.length + from); - while (from < this.length){ - if(this[from] === item) return from; - from++; - } - return -1; -}; - -//custom methods - -Array.extend({ - - /* - Property: each - Same as <Array.forEach>. - - Arguments: - fn - the function to execute with each item in the array - bind - optional, the object that the "this" of the function will refer to. - - Example: - >var Animals = ['Cat', 'Dog', 'Coala']; - >Animals.forEach(function(animal){ - > document.write(animal) - >}); - */ - - each: Array.prototype.forEach, - - /* - Property: copy - Copy the array and returns it. - - Returns: - an Array - - Example: - >var letters = ["a","b","c"]; - >var copy = ["a","b","c"].copy(); - */ - - copy: function(){ - var newArray = []; - for (var i = 0; i < this.length; i++) newArray[i] = this[i]; - return newArray; - }, - - /* - Property: remove - Removes all occurrences of an item from the array. - - Arguments: - item - the item to remove - - Returns: - the Array with all occurrences of the item removed. - - Example: - >["1","2","3","2"].remove("2") // ["1","3"]; - */ - - remove: function(item){ - var i = 0; - while (i < this.length){ - if (this[i] == item) this.splice(i, 1); - else i++; - } - return this; - }, - - /* - Property: test - Tests an array for the presence of an item. - - Arguments: - item - the item to search for in the array. - from - optional, the index at which to begin the search, default is 0. If negative, it is taken as the offset from the end of the array. - - Returns: - true - the item was found - false - it wasn't - - Example: - >["a","b","c"].test("a"); // true - >["a","b","c"].test("d"); // false - */ - - test: function(item, from){ - return this.indexOf(item, from) != -1; - }, - - /* - Property: extend - Extends an array with another - - Arguments: - newArray - the array to extend ours with - - Example: - >var Animals = ['Cat', 'Dog', 'Coala']; - >Animals.extend(['Lizard']); - >//Animals is now: ['Cat', 'Dog', 'Coala', 'Lizard']; - */ - - extend: function(newArray){ - for (var i = 0; i < newArray.length; i++) this.push(newArray[i]); - return this; - }, - - /* - Property: associate - Creates an object with key-value pairs based on the array of keywords passed in - and the current content of the array. - - Arguments: - keys - the array of keywords. - - Example: - (start code) - var Animals = ['Cat', 'Dog', 'Coala', 'Lizard']; - var Speech = ['Miao', 'Bau', 'Fruuu', 'Mute']; - var Speeches = Animals.associate(speech); - //Speeches['Miao'] is now Cat. - //Speeches['Bau'] is now Dog. - //... - (end) - */ - - associate: function(keys){ - var obj = {}, length = Math.min(this.length, keys.length); - for (var i = 0; i < length; i++) obj[keys[i]] = this[i]; - return obj; - } - -}); - -/* Section: Utility Functions */ - -/* -Function: $A() - Same as <Array.copy>, but as function. - Useful to apply Array prototypes to iterable objects, as a collection of DOM elements or the arguments object. - -Example: - (start code) - function myFunction(){ - $A(arguments).each(argument, function(){ - alert(argument); - }); - }; - //the above will alert all the arguments passed to the function myFunction. - (end) -*/ - -function $A(array){ - return Array.prototype.copy.call(array); -}; - -/* -Function: $each - use to iterate through iterables that are not regular arrays, such as builtin getElementsByTagName calls, or arguments of a function. - -Arguments: - iterable - an iterable element. - function - function to apply to the iterable. - bind - optional, the 'this' of the function will refer to this object. -*/ - -function $each(iterable, fn, bind){ - return Array.prototype.forEach.call(iterable, fn, bind); -}; - -/* -Script: String.js - Contains String prototypes and Number prototypes. - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -/* -Class: String - A collection of The String Object prototype methods. -*/ - -String.extend({ - - /* - Property: test - Tests a string with a regular expression. - - Arguments: - regex - the regular expression you want to match the string with - params - optional, any parameters you want to pass to the regex ('g' has no effect) - - Returns: - true if a match for the regular expression is found in the string, false if not. - See <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:RegExp:test> - - Example: - >"I like cookies".test("cookie"); // returns true - >"I like cookies".test("COOKIE", "i") // ignore case, returns true - >"I like cookies".test("cake"); // returns false - */ - - test: function(regex, params){ - return new RegExp(regex, params).test(this); - }, - - /* - Property: toInt - parses a string to an integer. - - Returns: - either an int or "NaN" if the string is not a number. - - Example: - >var value = "10px".toInt(); // value is 10 - */ - - toInt: function(){ - return parseInt(this); - }, - - toFloat: function(){ - return parseFloat(this); - }, - - /* - Property: camelCase - Converts a hiphenated string to a camelcase string. - - Example: - >"I-like-cookies".camelCase(); //"ILikeCookies" - - Returns: - the camel cased string - */ - - camelCase: function(){ - return this.replace(/-\D/g, function(match){ - return match.charAt(1).toUpperCase(); - }); - }, - - /* - Property: hyphenate - Converts a camelCased string to a hyphen-ated string. - - Example: - >"ILikeCookies".hyphenate(); //"I-like-cookies" - */ - - hyphenate: function(){ - return this.replace(/\w[A-Z]/g, function(match){ - return (match.charAt(0)+'-'+match.charAt(1).toLowerCase()); - }); - }, - - /* - Property: capitalize - Converts the first letter in each word of a string to Uppercase. - - Example: - >"i like cookies".capitalize(); //"I Like Cookies" - - Returns: - the capitalized string - */ - - capitalize: function(){ - return this.toLowerCase().replace(/\b[a-z]/g, function(match){ - return match.toUpperCase(); - }); - }, - - /* - Property: trim - Trims the leading and trailing spaces off a string. - - Example: - >" i like cookies ".trim() //"i like cookies" - - Returns: - the trimmed string - */ - - trim: function(){ - return this.replace(/^\s+|\s+$/g, ''); - }, - - /* - Property: clean - trims (<String.trim>) a string AND removes all the double spaces in a string. - - Returns: - the cleaned string - - Example: - >" i like cookies \n\n".clean() //"i like cookies" - */ - - clean: function(){ - return this.replace(/\s{2,}/g, ' ').trim(); - }, - - /* - Property: rgbToHex - Converts an RGB value to hexidecimal. The string must be in the format of "rgb(255, 255, 255)" or "rgba(255, 255, 255, 1)"; - - Arguments: - array - boolean value, defaults to false. Use true if you want the array ['FF', '33', '00'] as output instead of #FF3300 - - Returns: - hex string or array. returns transparent if the fourth value of rgba in input string is 0, - - Example: - >"rgb(17,34,51)".rgbToHex(); //"#112233" - >"rgba(17,34,51,0)".rgbToHex(); //"transparent" - >"rgb(17,34,51)".rgbToHex(true); //[11,22,33] - */ - - rgbToHex: function(array){ - var rgb = this.match(/\d{1,3}/g); - return (rgb) ? rgb.rgbToHex(array) : false; - }, - - /* - Property: hexToRgb - Converts a hexidecimal color value to RGB. Input string must be the hex color value (with or without the hash). Also accepts triplets ('333'); - - Arguments: - array - boolean value, defaults to false. Use true if you want the array ['255', '255', '255'] as output instead of "rgb(255,255,255)"; - - Returns: - rgb string or array. - - Example: - >"#112233".hexToRgb(); //"rgb(17,34,51)" - >"#112233".hexToRgb(true); //[17,34,51] - */ - - hexToRgb: function(array){ - var hex = this.match('^#?(\\w{1,2})(\\w{1,2})(\\w{1,2})$'); - return (hex) ? hex.hexToRgb(array) : false; - } - -}); - -Array.extend({ - - rgbToHex: function(array){ - if (this.length < 3) return false; - if (this[3] && this[3] == 0) return 'transparent'; - var hex = []; - for (var i = 0; i < 3; i++){ - var bit = (this[i]-0).toString(16); - hex.push(bit.length == 1 ? '0'+bit : bit); - } - return array ? hex : '#'+hex.join(''); - }, - - hexToRgb: function(array){ - if (this.length != 4) return false; - var rgb = []; - for (var i = 1; i < 4; i++){ - if (this[i].length == 1) this[i] += this[i]; - rgb.push(parseInt(this[i], 16)); - } - return array ? rgb : 'rgb('+rgb.join(',')+')'; - } - -}); - -/* -Class: Number - contains the internal method toInt. -*/ - -Number.extend({ - - /* - Property: toInt - Returns this number; useful because toInt must work on both Strings and Numbers. - */ - - toInt: function(){ - return parseInt(this); - }, - - toFloat: function(){ - return parseFloat(this); - } - -}); - -/* -Script: Function.js - Contains Function prototypes and utility functions . - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. - -Credits: - - Some functions are inspired by those found in prototype.js <http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio [dot] net, MIT-style license -*/ - -/* -Class: Function - A collection of The Function Object prototype methods. -*/ - -Function.extend({ - - create: function(options){ - var fn = this; - options = Object.extend({ - 'bind': fn, - 'event': false, - 'arguments': null, - 'delay': false, - 'periodical': false, - 'attempt': false - }, options || {}); - if (options.arguments != null && typeof options.arguments != 'undefined' && !(options.arguments instanceof Array)) - options.arguments = [options.arguments]; - return function(event){ - var args = options.arguments || arguments; - if (options.event){ - event = (options.event === true) ? event || window.event : new options.event(event); - args = [event].concat(args); - } - var returns = function(){ - return fn.apply(options.bind, args); - }; - if (options.delay) return setTimeout(returns, options.delay); - if (options.periodical) return setInterval(returns, options.periodical); - if (options.attempt){ - try { - var result = returns(); - } catch(err){ - result = err; - } finally { - return result; - } - } else return returns(); - }; - }, - - /* - Property: pass - Shortcut to create closures with arguments and bind. - - Returns: - a function. - - Arguments: - args - the arguments passed. must be an array if arguments > 1 - bind - optional, the object that the "this" of the function will refer to. - - Example: - >myFunction.pass([arg1, arg2], myElement); - */ - - pass: function(args, bind){ - return this.create({'arguments': args, 'bind': bind}); - }, - - /* - Property: attempt - Tries to execute the function, returns either the function results or the error. - - Arguments: - args - the arguments passed. must be an array if arguments > 1 - bind - optional, the object that the "this" of the function will refer to. - - Example: - >myFunction.attempt([arg1, arg2], myElement); - */ - - attempt: function(args, bind){ - return this.create({'arguments': args, 'bind': bind, 'attempt': true})(); - }, - - /* - Property: bind - method to easily create closures with "this" altered. - - Arguments: - bind - optional, the object that the "this" of the function will refer to. - args - optional, the arguments passed. must be an array if arguments > 1 - - Returns: - a function. - - Example: - >function myFunction(){ - > this.setStyle('color', 'red'); - > // note that 'this' here refers to myFunction, not an element - > // we'll need to bind this function to the element we want to alter - >}; - >var myBoundFunction = myFunction.bind(myElement); - >myBoundFunction(); // this will make the element myElement red. - */ - - bind: function(bind, args){ - return this.create({'bind': bind, 'arguments': args}); - }, - - /* - Property: bindAsEventListener - cross browser method to pass event firer - - Arguments: - bind - optional, the object that the "this" of the function will refer to. - args - optional, the arguments passed. must be an array if arguments > 1 - - Returns: - a function with the parameter bind as its "this" and as a pre-passed argument event or window.event, depending on the browser. - - Example: - >function myFunction(event){ - > alert(event.clientx) //returns the coordinates of the mouse.. - >}; - >myElement.onclick = myFunction.bindAsEventListener(myElement); - */ - - bindAsEventListener: function(bind, args){ - return this.create({'bind': bind, 'event': true, 'arguments': args}); - }, - - /* - Property: delay - Delays the execution of a function by a specified duration. - - Arguments: - ms - the duration to wait in milliseconds - bind - optional, the object that the "this" of the function will refer to. - args - optional, the arguments passed. must be an array if arguments > 1 - - Example: - >myFunction.delay(50, myElement) //wait 50 milliseconds, then call myFunction and bind myElement to it - >(function(){alert('one second later...')}).delay(1000); //wait a second and alert - */ - - delay: function(ms, bind, args){ - return this.create({'delay': ms, 'bind': bind, 'arguments': args})(); - }, - - /* - Property: periodical - Executes a function in the specified intervals of time - - Arguments: - ms - the duration of the intervals between executions. - bind - optional, the object that the "this" of the function will refer to. - args - optional, the arguments passed. must be an array if arguments > 1 - */ - - periodical: function(ms, bind, args){ - return this.create({'periodical': ms, 'bind': bind, 'arguments': args})(); - } - -}); - -/* -Script: Element.js - Contains useful Element prototypes, to be used with the dollar function <$>. - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. - -Credits: - - Some functions are inspired by those found in prototype.js <http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio [dot] net, MIT-style license -*/ - -/* -Class: Element - Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>. -*/ - -var Element = new Class({ - - /* - Property: initialize - Creates a new element of the type passed in. - - Arguments: - el - the tag name for the element you wish to create. - - Example: - >var div = new Element('div'); - */ - - initialize: function(el){ - if ($type(el) == 'string') el = document.createElement(el); - return $(el); - } - -}); - -/* -Function: $() - returns the element passed in with all the Element prototypes applied. - -Arguments: - el - a reference to an actual element or a string representing the id of an element - -Example: - >$('myElement') // gets a DOM element by id with all the Element prototypes applied. - >var div = document.getElementById('myElement'); - >$(div) //returns an Element also with all the mootools extentions applied. - - You'll use this when you aren't sure if a variable is an actual element or an id, as - well as just shorthand for document.getElementById(). - -Returns: - a DOM element or false (if no id was found). - -Note: - you need to call $ on an element only once to get all the prototypes. - But its no harm to call it multiple times, as it will detect if it has been already extended. -*/ - -function $(el){ - if (!el) return false; - if (el._element_extended_ || [window, document].test(el)) return el; - if ($type(el) == 'string') el = document.getElementById(el); - if ($type(el) != 'element') return false; - if (['object', 'embed'].test(el.tagName.toLowerCase()) || el.extend) return el; - el._element_extended_ = true; - Garbage.collect(el); - el.extend = Object.extend; - if (!(el instanceof HTMLElement)) el.extend(Element.prototype); - return el; -}; - -//elements class - -var Elements = new Class({}); - -new Object.Native(Elements); - -document.getElementsBySelector = document.getElementsByTagName; - -/* -Function: $$() - Selects, and extends DOM elements. - -Arguments: - HTMLCollection(document.getElementsByTagName, element.childNodes), an array of elements, a string. - -Note: - if you loaded <Dom.js>, $$ will also accept CSS Selectors. - -Example: - >$$('a') //an array of all anchor tags on the page - >$$('a', 'b') //an array of all anchor and bold tags on the page - >$$('#myElement') //array containing only the element with id = myElement. (only with <Dom.js>) - >$$('#myElement a.myClass') //an array of all anchor tags with the class "myClass" within the DOM element with id "myElement" (only with <Dom.js>) - -Returns: - array - array of all the dom elements matched -*/ - -function $$(){ - if (!arguments) return false; - if (arguments.length == 1){ - if (!arguments[0]) return false; - if (arguments[0]._elements_extended_) return arguments[0]; - } - var elements = []; - $each(arguments, function(selector){ - switch ($type(selector)){ - case 'element': elements.push($(selector)); break; - case 'string': selector = document.getElementsBySelector(selector); - default: - if (selector.length){ - $each(selector, function(el){ - if ($(el)) elements.push(el); - }); - } - } - }); - elements._elements_extended_ = true; - return Object.extend(elements, new Elements); -}; - -Elements.Multi = function(property){ - return function(){ - var args = arguments; - var items = []; - var elements = true; - $each(this, function(el){ - var returns = el[property].apply(el, args); - if ($type(returns) != 'element') elements = false; - items.push(returns); - }); - if (elements) items = $$(items); - return items; - }; -}; - -Element.extend = function(properties){ - for (var property in properties){ - HTMLElement.prototype[property] = properties[property]; - Element.prototype[property] = properties[property]; - Elements.prototype[property] = Elements.Multi(property); - } -}; - -Element.extend({ - - inject: function(el, where){ - el = $(el) || new Element(el); - switch (where){ - case "before": $(el.parentNode).insertBefore(this, el); break; - case "after": - if (!el.getNext()) $(el.parentNode).appendChild(this); - else $(el.parentNode).insertBefore(this, el.getNext()); - break; - case "inside": el.appendChild(this); - } - return this; - }, - - /* - Property: injectBefore - Inserts the Element before the passed element. - - Parameteres: - el - a string representing the element to be injected in (myElementId, or div), or an element reference. - If you pass div or another tag, the element will be created. - - Example: - >html: - ><div id="myElement"></div> - ><div id="mySecondElement"></div> - >js: - >$('mySecondElement').injectBefore('myElement'); - >resulting html: - ><div id="mySecondElement"></div> - ><div id="myElement"></div> - - */ - - injectBefore: function(el){ - return this.inject(el, 'before'); - }, - - /* - Property: injectAfter - Same as <Element.injectBefore>, but inserts the element after. - */ - - injectAfter: function(el){ - return this.inject(el, 'after'); - }, - - /* - Property: injectInside - Same as <Element.injectBefore>, but inserts the element inside. - */ - - injectInside: function(el){ - return this.inject(el, 'inside'); - }, - - /* - Property: adopt - Inserts the passed element inside the Element. Works as <Element.injectInside> but in reverse. - - Parameteres: - el - a string representing the element to be injected in (myElementId, or div), or an element reference. - If you pass div or another tag, the element will be created. - */ - - adopt: function(el){ - this.appendChild($(el) || new Element(el)); - return this; - }, - - /* - Property: remove - Removes the Element from the DOM. - - Example: - >$('myElement').remove() //bye bye - */ - - remove: function(){ - this.parentNode.removeChild(this); - return this; - }, - - /* - Property: clone - Clones the Element and returns the cloned one. - - Returns: - the cloned element - - Example: - >var clone = $('myElement').clone().injectAfter('myElement'); - >//clones the Element and append the clone after the Element. - */ - - clone: function(contents){ - var el = this.cloneNode(contents !== false); - return $(el); - }, - - /* - Property: replaceWith - Replaces the Element with an element passed. - - Parameteres: - el - a string representing the element to be injected in (myElementId, or div), or an element reference. - If you pass div or another tag, the element will be created. - - Returns: - the passed in element - - Example: - >$('myOldElement').replaceWith($('myNewElement')); //$('myOldElement') is gone, and $('myNewElement') is in its place. - */ - - replaceWith: function(el){ - el = $(el) || new Element(el); - this.parentNode.replaceChild(el, this); - return el; - }, - - /* - Property: appendText - Appends text node to a DOM element. - - Arguments: - text - the text to append. - - Example: - ><div id="myElement">hey</div> - >$('myElement').appendText(' howdy'); //myElement innerHTML is now "hey howdy" - */ - - appendText: function(text){ - if (window.ie){ - switch(this.getTag()){ - case 'style': this.styleSheet.cssText = text; return this; - case 'script': this.setProperty('text', text); return this; - } - } - this.appendChild(document.createTextNode(text)); - return this; - }, - - /* - Property: hasClass - Tests the Element to see if it has the passed in className. - - Returns: - true - the Element has the class - false - it doesn't - - Arguments: - className - the class name to test. - - Example: - ><div id="myElement" class="testClass"></div> - >$('myElement').hasClass('testClass'); //returns true - */ - - hasClass: function(className){ - return this.className.test('(?:^|\\s+)' + className + '(?:\\s+|$)'); - }, - - /* - Property: addClass - Adds the passed in class to the Element, if the element doesnt already have it. - - Arguments: - className - the class name to add - - Example: - ><div id="myElement" class="testClass"></div> - >$('myElement').addClass('newClass'); //<div id="myElement" class="testClass newClass"></div> - */ - - addClass: function(className){ - if (!this.hasClass(className)) this.className = (this.className+' '+className).clean(); - return this; - }, - - /* - Property: removeClass - works like <Element.addClass>, but removes the class from the element. - */ - - removeClass: function(className){ - if (this.hasClass(className)) this.className = this.className.replace(className, '').clean(); - return this; - }, - - /* - Property: toggleClass - Adds or removes the passed in class name to the element, depending on if it's present or not. - - Arguments: - className - the class to add or remove - - Example: - ><div id="myElement" class="myClass"></div> - >$('myElement').toggleClass('myClass'); - ><div id="myElement" class=""></div> - >$('myElement').toggleClass('myClass'); - ><div id="myElement" class="myClass"></div> - */ - - toggleClass: function(className){ - return this.hasClass(className) ? this.removeClass(className) : this.addClass(className); - }, - - /* - Property: setStyle - Sets a css property to the Element. - - Arguments: - property - the property to set - value - the value to which to set it - - Example: - >$('myElement').setStyle('width', '300px'); //the width is now 300px - */ - - setStyle: function(property, value){ - if (property == 'opacity') this.setOpacity(parseFloat(value)); - else this.style[property.camelCase()] = (value.push) ? value.rgbToHex() : value; - return this; - }, - - /* - Property: setStyles - Applies a collection of styles to the Element. - - Arguments: - source - an object or string containing all the styles to apply - - Examples: - >$('myElement').setStyles({ - > border: '1px solid #000', - > width: '300px', - > height: '400px' - >}); - - OR - - >$('myElement').setStyle('border: 1px solid #000; width: 300px; height: 400px;'); - */ - - setStyles: function(source){ - switch ($type(source)){ - case 'object': - for (var property in source) this.setStyle(property, source[property]); - break; - case 'string': - if (window.ie) this.cssText = source; - else this.setAttribute('style', source); - } - return this; - }, - - /* - Property: setOpacity - Sets the opacity of the Element, and sets also visibility == "hidden" if opacity == 0, and visibility = "visible" if opacity == 1. - - Arguments: - opacity - Accepts numbers from 0 to 1. - - Example: - >$('myElement').setOpacity(0.5) //make it 50% transparent - */ - - setOpacity: function(opacity){ - if (opacity == 0){ - if(this.style.visibility != "hidden") this.style.visibility = "hidden"; - } else { - if(this.style.visibility != "visible") this.style.visibility = "visible"; - } - if (!this.currentStyle || !this.currentStyle.hasLayout) this.style.zoom = 1; - if (window.ie) this.style.filter = "alpha(opacity=" + opacity*100 + ")"; - this.style.opacity = this.opacity = opacity; - return this; - }, - - /* - Property: getStyle - Returns the style of the Element given the property passed in. - - Arguments: - property - the css style property you want to retrieve - - Example: - >$('myElement').getStyle('width'); //returns "400px" - >//but you can also use - >$('myElement').getStyle('width').toInt(); //returns "400" - - Returns: - the style as a string - */ - - getStyle: function(property){ - property = property.camelCase(); - var style = this.style[property] || false; - if (!$chk(style)){ - if (property == 'opacity') return $chk(this.opacity) ? this.opacity : 1; - if (['margin', 'padding'].test(property)){ - return [this.getStyle(property+'-top') || 0, this.getStyle(property+'-right') || 0, - this.getStyle(property+'-bottom') || 0, this.getStyle(property+'-left') || 0].join(' '); - } - if (document.defaultView) style = document.defaultView.getComputedStyle(this, null).getPropertyValue(property.hyphenate()); - else if (this.currentStyle) style = this.currentStyle[property]; - } - return (style && property.test('color', 'i') && style.test('rgb')) ? style.rgbToHex() : style; - }, - - /* - Property: addEvent - Attaches an event listener to a DOM element. - - Arguments: - type - the event to monitor ('click', 'load', etc) without the prefix 'on'. - fn - the function to execute - - Example: - >$('myElement').addEvent('click', function(){alert('clicked!')}); - */ - - addEvent: function(type, fn){ - this.events = this.events || {}; - this.events[type] = this.events[type] || {'keys': [], 'values': []}; - if (!this.events[type].keys.test(fn)){ - this.events[type].keys.push(fn); - if (this.addEventListener){ - this.addEventListener((type == 'mousewheel' && window.gecko) ? 'DOMMouseScroll' : type, fn, false); - } else { - fn = fn.bind(this); - this.attachEvent('on'+type, fn); - this.events[type].values.push(fn); - } - } - return this; - }, - - addEvents: function(source){ - if (source){ - for (var type in source) this.addEvent(type, source[type]); - } - return this; - }, - - /* - Property: removeEvent - Works as Element.addEvent, but instead removes the previously added event listener. - */ - - removeEvent: function(type, fn){ - if (this.events && this.events[type]){ - var pos = this.events[type].keys.indexOf(fn); - if (pos == -1) return this; - var key = this.events[type].keys.splice(pos,1)[0]; - if (this.removeEventListener){ - this.removeEventListener((type == 'mousewheel' && window.gecko) ? 'DOMMouseScroll' : type, key, false); - } else { - this.detachEvent('on'+type, this.events[type].values.splice(pos,1)[0]); - } - } - return this; - }, - - /* - Property: removeEvents - removes all events of a certain type from an element. if no argument is passed in, removes all events. - */ - - removeEvents: function(type){ - if (this.events){ - if (type){ - if (this.events[type]){ - this.events[type].keys.each(function(fn){ - this.removeEvent(type, fn); - }, this); - this.events[type] = null; - } - } else { - for (var evType in this.events) this.removeEvents(evType); - this.events = null; - } - } - return this; - }, - - /* - Property: fireEvent - executes all events of the specified type present in the element. - */ - - fireEvent: function(type, args){ - if (this.events && this.events[type]){ - args = args || []; - if ($type(args) != 'array') args = [args]; - this.events[type].keys.each(function(fn){ - fn.apply(this, args); - }, this); - } - }, - - getBrother: function(what){ - var el = this[what+'Sibling']; - while ($type(el) == 'whitespace') el = el[what+'Sibling']; - return $(el); - }, - - /* - Property: getPrevious - Returns the previousSibling of the Element, excluding text nodes. - - Example: - >$('myElement').getPrevious(); //get the previous DOM element from myElement - - Returns: - the sibling element or undefined if none found. - */ - - getPrevious: function(){ - return this.getBrother('previous'); - }, - - /* - Property: getNext - Works as Element.getPrevious, but tries to find the nextSibling. - */ - - getNext: function(){ - return this.getBrother('next'); - }, - - /* - Property: getFirst - Works as <Element.getPrevious>, but tries to find the firstChild. - */ - - getFirst: function(){ - var el = this.firstChild; - while ($type(el) == 'whitespace') el = el.nextSibling; - return $(el); - }, - - /* - Property: getLast - Works as <Element.getPrevious>, but tries to find the lastChild. - */ - - getLast: function(){ - var el = this.lastChild; - while ($type(el) == 'whitespace') el = el.previousSibling; - return $(el); - }, - - /* - Property: getParent - returns the $(element.parentNode) - */ - - getParent: function(){ - return $(this.parentNode); - }, - - /* - Property: getChildren - returns all the $(element.childNodes), excluding text nodes. Returns as <Elements>. - */ - - getChildren: function(){ - return $$(this.childNodes); - }, - - /* - Property: setProperty - Sets an attribute for the Element. - - Arguments: - property - the property to assign the value passed in - value - the value to assign to the property passed in - - Example: - >$('myImage').setProperty('src', 'whatever.gif'); //myImage now points to whatever.gif for its source - */ - - setProperty: function(property, value){ - switch (property){ - case 'class': this.className = value; break; - case 'style': this.setStyles(value); break; - case 'name': if (window.ie6){ - var el = $(document.createElement('<'+this.getTag()+' name="'+value+'" />')); - $each(this.attributes, function(attribute){ - if (attribute.name != 'name') el.setProperty(attribute.name, attribute.value); - }); - if (this.parentNode) this.replaceWith(el); - return el; - } - default: this.setAttribute(property, value); - } - return this; - }, - - /* - Property: setProperties - Sets numerous attributes for the Element. - - Arguments: - source - an object with key/value pairs. - - Example: - >$('myElement').setProperties({ - > src: 'whatever.gif', - > alt: 'whatever dude' - >}); - ><img src="whatever.gif" alt="whatever dude"> - */ - - setProperties: function(source){ - for (var property in source) this.setProperty(property, source[property]); - return this; - }, - - /* - Property: setHTML - Sets the innerHTML of the Element. - - Arguments: - html - the new innerHTML for the element. - - Example: - >$('myElement').setHTML(newHTML) //the innerHTML of myElement is now = newHTML - */ - - setHTML: function(html){ - this.innerHTML = html; - return this; - }, - - /* - Property: getProperty - Gets the an attribute of the Element. - - Arguments: - property - the attribute to retrieve - - Example: - >$('myImage').getProperty('src') // returns whatever.gif - - Returns: - the value, or an empty string - */ - - getProperty: function(property){ - return (property == 'class') ? this.className : this.getAttribute(property); - }, - - /* - Property: getTag - Returns the tagName of the element in lower case. - - Example: - >$('myImage').getTag() // returns 'img' - - Returns: - The tag name in lower case - */ - - getTag: function(){ - return this.tagName.toLowerCase(); - }, - - getOffsets: function(){ - var el = this, offsetLeft = 0, offsetTop = 0; - do { - offsetLeft += el.offsetLeft || 0; - offsetTop += el.offsetTop || 0; - el = el.offsetParent; - } while (el); - return {'x': offsetLeft, 'y': offsetTop}; - }, - - /* - Property: scrollTo - scrolls the element to the specified coordinated (if the element has an overflow) - - Arguments: - x - the x coordinate - y - the y coordinate - - Example: - >$('myElement').scrollTo(0, 100) - */ - - scrollTo: function(x, y){ - this.scrollLeft = x; - this.scrollTop = y; - }, - - /* - Property: getSize - return an Object representing the size/scroll values of the element. - - Example: - (start code) - $('myElement').getSize(); - (end) - - Returns: - (start code) - { - 'scroll': {'x': 100, 'y': 100}, - 'size': {'x': 200, 'y': 400}, - 'scrollSize': {'x': 300, 'y': 500} - } - (end) - */ - - getSize: function(){ - return { - 'scroll': {'x': this.scrollLeft, 'y': this.scrollTop}, - 'size': {'x': this.offsetWidth, 'y': this.offsetHeight}, - 'scrollSize': {'x': this.scrollWidth, 'y': this.scrollHeight} - }; - }, - - /* - Property: getTop - Returns the distance from the top of the window to the Element. - */ - - getTop: function(){ - return this.getOffsets().y; - }, - - /* - Property: getLeft - Returns the distance from the left of the window to the Element. - */ - - getLeft: function(){ - return this.getOffsets().x; - }, - - /* - Property: getPosition - Returns an object with width, height, left, right, top, and bottom, representing the values of the Element - - Example: - (start code) - var myValues = $('myElement').getPosition(); - (end) - - Returns: - (start code) - { - width: 200, - height: 300, - left: 100, - top: 50, - right: 300, - bottom: 350 - } - (end) - */ - - getPosition: function(){ - var offs = this.getOffsets(); - var obj = { - 'width': this.offsetWidth, - 'height': this.offsetHeight, - 'left': offs.x, - 'top': offs.y - }; - obj.right = obj.left + obj.width; - obj.bottom = obj.top + obj.height; - return obj; - }, - - /* - Property: getValue - Returns the value of the Element, if its tag is textarea, select or input. no multiple select support. - */ - - getValue: function(){ - switch (this.getTag()){ - case 'select': if (this.selectedIndex != -1) return this.options[this.selectedIndex].value; break; - case 'input': if (!(this.checked && ['checkbox', 'radio'].test(this.type)) && !['hidden', 'text', 'password'].test(this.type)) break; - case 'textarea': return this.value; - } - return false; - } - -}); - -var Window = window; - -window.addEvent = document.addEvent = Element.prototype.addEvent; -window.removeEvent = document.removeEvent = Element.prototype.removeEvent; - -var Garbage = { - - elements: [], - - collect: function(element){ - Garbage.elements.push(element); - }, - - trash: function(){ - window.removeEvent('unload', Garbage.trash); - Garbage.elements.each(function(el){ - el.removeEvents(); - for (var p in Element.prototype) HTMLElement[p] = window[p] = document[p] = el[p] = null; - el.extend = null; - }); - } - -}; - -window.addEvent('unload', Garbage.trash); - -/* -Script: Event.js - Event class - -Author: - Valerio Proietti, <http://mad4milk.net>, Michael Jackson, <http://ajaxon.com/michael> - -License: - MIT-style license. -*/ - -/* -Class: Event - Cross browser methods to manage events. - -Arguments: - event - the event - -Properties: - shift - true if the user pressed the shift - control - true if the user pressed the control - alt - true if the user pressed the alt - meta - true if the user pressed the meta key - code - the keycode of the key pressed - page.x - the x position of the mouse, relative to the full window - page.y - the y position of the mouse, relative to the full window - client.x - the x position of the mouse, relative to the viewport - client.y - the y position of the mouse, relative to the viewport - key - the key pressed as a lowercase string. key also returns 'enter', 'up', 'down', 'left', 'right', 'space', 'backspace', 'delete', 'esc'. Handy for these special keys. - target - the event target - relatedTarget - the event related target - -Example: - (start code) - $('myLink').onkeydown = function(event){ - var event = new Event(event); - //event is now the Event class. - alert(event.key); //returns the lowercase letter pressed - alert(event.shift); //returns true if the key pressed is shift - if (event.key == 's' && event.control) alert('document saved'); - }; - (end) -*/ - -var Event = new Class({ - - initialize: function(event){ - this.event = event || window.event; - this.type = this.event.type; - this.target = this.event.target || this.event.srcElement; - if (this.target.nodeType == 3) this.target = this.target.parentNode; // Safari - this.shift = this.event.shiftKey; - this.control = this.event.ctrlKey; - this.alt = this.event.altKey; - this.meta = this.event.metaKey; - if (['DOMMouseScroll', 'mousewheel'].test(this.type)){ - this.wheel = this.event.wheelDelta ? (this.event.wheelDelta / (window.opera ? -120 : 120)) : -(this.event.detail || 0) / 3; - } else if (this.type.test('key')){ - this.code = this.event.which || this.event.keyCode; - for (var name in Event.keys){ - if (Event.keys[name] == this.code) var special = name; - } - this.key = special || String.fromCharCode(this.code).toLowerCase(); - - } else if (this.type.test('mouse') || this.type == 'click'){ - this.page = { - 'x': this.event.pageX || this.event.clientX + document.documentElement.scrollLeft, - 'y': this.event.pageY || this.event.clientY + document.documentElement.scrollTop - }; - this.client = { - 'x': this.event.pageX ? this.event.pageX - window.pageXOffset : this.event.clientX, - 'y': this.event.pageY ? this.event.pageY - window.pageYOffset : this.event.clientY - }; - this.rightClick = (this.event.which == 3) || (this.event.button == 2); - switch (this.type){ - case 'mouseover': this.relatedTarget = this.event.relatedTarget || this.event.fromElement; break; - case 'mouseout': this.relatedTarget = this.event.relatedTarget || this.event.toElement; - } - } - }, - - /* - Property: stop - cross browser method to stop an event - */ - - stop: function() { - this.stopPropagation(); - this.preventDefault(); - return this; - }, - - /* - Property: stopPropagation - cross browser method to stop the propagation of an event - */ - - stopPropagation: function(){ - if (this.event.stopPropagation) this.event.stopPropagation(); - else this.event.cancelBubble = true; - return this; - }, - - /* - Property: preventDefault - cross browser method to prevent the default action of the event - */ - - preventDefault: function(){ - if (this.event.preventDefault) this.event.preventDefault(); - else this.event.returnValue = false; - return this; - } - -}); - -Event.keys = { - 'enter': 13, - 'up': 38, - 'down': 40, - 'left': 37, - 'right': 39, - 'esc': 27, - 'space': 32, - 'backspace': 8, - 'delete': 46 -}; - -Function.extend({ - - /* - Property: bindWithEvent - automatically passes mootools Event Class. - - Arguments: - bind - optional, the object that the "this" of the function will refer to. - - Returns: - a function with the parameter bind as its "this" and as a pre-passed argument event or window.event, depending on the browser. - - Example: - >function myFunction(event){ - > alert(event.clientx) //returns the coordinates of the mouse.. - >}; - >myElement.onclick = myFunction.bindWithEvent(myElement); - */ - - bindWithEvent: function(bind, args){ - return this.create({'bind': bind, 'arguments': args, 'event': Event}); - } - -}); - - -/* -Script: Common.js - Contains common implementations for custom classes. In Mootools is implemented in <Ajax> and <Fx>. - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -/* -Class: Chain - An "Utility" Class. Its methods can be implemented with <Class.implement> into any <Class>. - Currently implemented in <Fx> and <Ajax>. In <Fx> for example, is used to execute a list of function, one after another, once the effect is completed. - The functions will not be fired all togheter, but one every completion, to create custom complex animations. - -Example: - (start code) - var myFx = new Fx.Style('element', 'opacity'); - - myFx.start(1,0).chain(function(){ - myFx.start(0,1); - }).chain(function(){ - myFx.start(1,0); - }).chain(function(){ - myFx.start(0,1); - }); - //the element will appear and disappear three times - (end) -*/ - -var Chain = new Class({ - - /* - Property: chain - adds a function to the Chain instance stack. - - Arguments: - fn - the function to append. - */ - - chain: function(fn){ - this.chains = this.chains || []; - this.chains.push(fn); - return this; - }, - - /* - Property: callChain - Executes the first function of the Chain instance stack, then removes it. The first function will then become the second. - */ - - callChain: function(){ - if (this.chains && this.chains.length) this.chains.splice(0, 1)[0].delay(10, this); - }, - - /* - Property: clearChain - Clears the stack of a Chain instance. - */ - - clearChain: function(){ - this.chains = []; - } - -}); - -/* -Class: Events - An "Utility" Class. Its methods can be implemented with <Class.implement> into any <Class>. - In <Fx> Class, for example, is used to give the possibility add any number of functions to the Effects events, like onComplete, onStart, onCancel - -Example: - (start code) - var myFx = new Fx.Style('element', 'opacity').addEvent('onComplete', function(){ - alert('the effect is completed'); - }).addEvent('onComplete', function(){ - alert('I told you the effect is completed'); - }); - - myFx.start(0,1); - //upon completion it will display the 2 alerts, in order. - (end) -*/ - -var Events = new Class({ - - /* - Property: addEvent - adds an event to the stack of events of the Class instance. - */ - - addEvent: function(type, fn){ - if (fn != Class.empty){ - this.events = this.events || {}; - this.events[type] = this.events[type] || []; - if (!this.events[type].test(fn)) this.events[type].push(fn); - } - return this; - }, - - /* - Property: fireEvent - fires all events of the specified type in the Class instance. - */ - - fireEvent: function(type, args, delay){ - if (this.events && this.events[type]){ - this.events[type].each(function(fn){ - fn.create({'bind': this, 'delay': delay, 'arguments': args})(); - }, this); - } - return this; - }, - - /* - Property: removeEvent - removes an event from the stack of events of the Class instance. - */ - - removeEvent: function(type, fn){ - if (this.events && this.events[type]) this.events[type].remove(fn); - return this; - } - -}); - -/* -Class: Options - An "Utility" Class. Its methods can be implemented with <Class.implement> into any <Class>. - Used to automate the options settings, also adding Class <Events> when the option begins with on. -*/ - -var Options = new Class({ - - /* - Property: setOptions - sets this.options - - Arguments: - defaults - the default set of options - options - the user entered options. can be empty too. - - Note: - if your Class has <Events> implemented, every option beginning with on, followed by a capital letter (onComplete) becomes an Class instance event. - */ - - setOptions: function(defaults, options){ - this.options = Object.extend(defaults, options); - if (this.addEvent){ - for (var option in this.options){ - if (($type(this.options[option]) == 'function') && option.test('^on[A-Z]')) this.addEvent(option, this.options[option]); - } - } - return this; - } - -}); - -/* -Script: Dom.js - Css Query related function and <Element> extensions - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -/* Section: Utility Functions */ - -/* -Function: $E - Selects a single (i.e. the first found) Element based on the selector passed in and an optional filter element. - -Arguments: - selector - the css selector to match - filter - optional; a DOM element to limit the scope of the selector match; defaults to document. - -Example: - >$E('a', 'myElement') //find the first anchor tag inside the DOM element with id 'myElement' - -Returns: - a DOM element - the first element that matches the selector -*/ - -function $E(selector, filter){ - return ($(filter) || document).getElement(selector); -}; - -/* -Function: $ES - Returns a collection of Elements that match the selector passed in limited to the scope of the optional filter. - See Also: <Element.getElements> for an alternate syntax. - -Returns: - an array of dom elements that match the selector within the filter - -Arguments: - selector - css selector to match - filter - optional; a DOM element to limit the scope of the selector match; defaults to document. - -Examples: - >$ES("a") //gets all the anchor tags; synonymous with $$("a") - >$ES('a','myElement') //get all the anchor tags within $('myElement') -*/ - -function $ES(selector, filter){ - return ($(filter) || document).getElementsBySelector(selector); -}; - -/* -Class: Element - Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>. -*/ - -Element.extend({ - - /* - Property: getElements - Gets all the elements within an element that match the given (single) selector. - - Arguments: - selector - the css selector to match - - Example: - >$('myElement').getElements('a'); // get all anchors within myElement - - Credits: - Say thanks to Christophe Beyls <http://digitalia.be> for the new regular expression that rules getElements, a big step forward in terms of speed. - */ - - getElements: function(selector){ - var filters = []; - selector.clean().split(' ').each(function(sel, i){ - var param = sel.match('^(\\w*|\\*)(?:#([\\w_-]+)|\\.([\\w_-]+))?(?:\\[["\']?(\\w+)["\']?(?:([\\*\\^\\$]?=)["\']?(\\w*)["\']?)?\\])?$'); - //PARAM ARRAY: 0 = full string: 1 = tag; 2 = id; 3 = class; 4 = attribute; 5 = operator; 6 = value; - if (!param) return; - param[1] = param[1] || '*'; - if (i == 0){ - if (param[2]){ - var el = this.getElementById(param[2]); - if (!el || ((param[1] != '*') && (Element.prototype.getTag.call(el) != param[1]))) return; - filters = [el]; - } else { - filters = $A(this.getElementsByTagName(param[1])); - } - } else { - filters = Elements.prototype.filterByTagName.call(filters, param[1]); - if (param[2]) filters = Elements.prototype.filterById.call(filters, param[2]); - } - if (param[3]) filters = Elements.prototype.filterByClassName.call(filters, param[3]); - if (param[4]) filters = Elements.prototype.filterByAttribute.call(filters, param[4], param[6], param[5]); - }, this); - return $$(filters); - }, - - /* - Property: getElementById - Targets an element with the specified id found inside the Element. Does not overwrite document.getElementById. - - Arguments: - id - the id of the element to find. - */ - - getElementById: function(id){ - var el = document.getElementById(id); - if (!el) return false; - for (var parent = el.parentNode; parent != this; parent = parent.parentNode){ - if (!parent) return false; - } - return el; - }, - - /* - Property: getElement - Same as <Element.getElements>, but returns only the first. Alternate syntax for <$E>, where filter is the Element. - */ - - getElement: function(selector){ - return this.getElementsBySelector(selector)[0]; - }, - - /* - Property: getElementsBySelector - Same as <Element.getElements>, but allows for comma separated selectors, as in css. Alternate syntax for <$$>, where filter is the Element. - - */ - - getElementsBySelector: function(selector){ - var els = []; - selector.split(',').each(function(sel){ - els.extend(this.getElements(sel)); - }, this); - return $$(els); - } - -}); - -document.extend = Object.extend; - -/* Section: document related functions */ - -document.extend({ - /* - Function: document.getElementsByClassName - Returns all the elements that match a specific class name. - Here for compatibility purposes. can also be written: document.getElements('.className'), or $$('.className') - */ - - getElementsByClassName: function(className){ - return document.getElements('.'+className); - }, - getElement: Element.prototype.getElement, - getElements: Element.prototype.getElements, - getElementsBySelector: Element.prototype.getElementsBySelector - -}); - -/* -Class: Elements - Methods for dom queries arrays, as <$$>. -*/ - -Elements.extend({ - - //internal methods - - filterById: function(id, tag){ - var found = []; - this.each(function(el){ - if (el.id == id) found.push(el); - }); - return found; - }, - - filterByClassName: function(className){ - var found = []; - this.each(function(el){ - if (Element.prototype.hasClass.call(el, className)) found.push(el); - }); - return found; - }, - - filterByTagName: function(tagName){ - var found = []; - this.each(function(el){ - found.extend(el.getElementsByTagName(tagName)); - }); - return found; - }, - - filterByAttribute: function(name, value, operator){ - var found = []; - this.each(function(el){ - var att = el.getAttribute(name); - if (!att) return found; - if (!operator) return found.push(el); - - switch (operator){ - case '*=': if (att.test(value)) found.push(el); break; - case '=': if (att == value) found.push(el); break; - case '^=': if (att.test('^'+value)) found.push(el); break; - case '$=': if (att.test(value+'$')) found.push(el); - } - return found; - }); - return found; - } - -}); - -/* -Script: Hash.js - Contains the class Hash. - -Author: - Christophe Beyls <http://digitalia.be> - -License: - MIT-style license. -*/ - -/* -Class: Hash - It wraps an object that it uses internally as a map. The user must use put(), get(), and remove() to add/change, retrieve and remove values, it must not access the internal object directly. With this implementation, null values are not allowed. - -Example: - (start code) - var hash = new Hash({a: 'hi', b: 'world', c: 'howdy'}); - hash.remove('b'); // b is removed. - hash.set('c', 'hello'); - hash.get('c'); // returns 'hello' - hash.length // returns 2 (a and b) - (end) -*/ - -var Hash = new Class({ - - length: 0, - - initialize: function(obj) { - this.obj = {}; - for (var property in obj) { - this.obj[property] = obj[property]; - this.length++; - } - }, - - get: function(key) { - return this.obj[key]; - }, - - set: function(key, value) { - if (value == null) return false; - if (this.obj[key] == undefined) this.length++; - this.obj[key] = value; - return this; - }, - - remove: function(key) { - if (this.obj[key] == undefined) return false; - var obj = {}; - this.length--; - for (var property in this.obj){ - if (property != key) obj[property] = this.obj[property]; - } - this.obj = obj; - return this; - }, - - each: function(fn, bind) { - for (var property in this.obj) fn.call(bind || this, property, this.obj[property]); - }, - - extend: function(obj){ - this.initialize(Object.extend(this.obj, obj)); - return this; - }, - - empty: function() { - return (this.length == 0); - }, - - keys: function() { - var keys = []; - for (var property in this.obj) keys.push(property); - return keys; - }, - - values: function() { - var values = []; - for (var property in this.obj) values.push(this.obj[property]); - return values; - } - -}); - -/* -Function: $H - Shortcut to create an Hash from an Object. -*/ - -function $H(obj) { - return new Hash(obj); -}; - -/* -Script: Color.js - Contains the Color class. - -Author: - Michael Jackson <http://ajaxon.com/michael> - -License: - MIT-style license. -*/ - -/* -Class: Color - Creates a new Color Object, which is an array with some color specific methods. - -Example: - (start code) - var black = new Color('#000'); - var purple = new Color([255,0,255]); - // mix black with white and purple, each time at 10% of the new color - var darkpurple = black.mix('#fff', purple, 10); - $('myDiv').setStyle('background-color', darkpurple); - (end) -*/ - -var Color = new Class({ - - initialize: function(color){ - if (color.mix && color.invert) return color; - var rgb = (color.push) ? color : color.hexToRgb(true); - return Object.extend(rgb, Color.prototype); - }, - - mix: function(){ - var colors = $A(arguments); - var alpha = 50; - if ($type(colors[colors.length-1]) == 'number') alpha = colors.pop(); - var rgb = this.copy(); - colors.each(function(color){ - color = new Color(color); - for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha)); - }); - return new Color(rgb); - }, - - invert: function(){ - var rgb = []; - for (var i = 0; i < 3; i++) rgb.push(255 - this[i]); - return new Color(rgb); - } - -}); - -function $C(color){ - return new Color(color); -}; - -/* -Script: Window.Base.js - Contains Window.onDomReady and Window.disableImageCache - -License: - MIT-style license. -*/ - -/* -Class: Window - Cross browser methods to get the window size, onDomReady method. -*/ - -window.extend = Object.extend; - -window.extend({ - - /* - Function: window.disableImageCache - Disables background image chache for internex explorer, to prevent flickering. - To be called if you have effects with background images, and they flicker. - - Example: - Window.disableImageCache(); - */ - - disableImageCache: function(){ - if (this.ie6) try {document.execCommand("BackgroundImageCache", false, true);} catch (e){}; - }, - - addEvent: function(type, fn){ - if (type == 'domready'){ - if (this.loaded) fn(); - else if (!this.events || !this.events.domready){ - var domReady = function(){ - if (this.loaded) return; - this.loaded = true; - if (this.timer) this.timer = $clear(this.timer); - Element.prototype.fireEvent.call(this, 'domready'); - this.events.domready = null; - }.bind(this); - if (document.readyState && this.khtml){ //safari and konqueror - this.timer = function(){ - if (['loaded','complete'].test(document.readyState)) domReady(); - }.periodical(50); - } - else if (document.readyState && this.ie){ //ie - document.write("<script id=ie_ready defer src=javascript:void(0)><\/script>"); - $('ie_ready').onreadystatechange = function(){ - if (this.readyState == 'complete') domReady(); - }; - } else { //others - this.addEvent("load", domReady); - document.addEvent("DOMContentLoaded", domReady); - } - } - } - Element.prototype.addEvent.call(this, type, fn); - return this; - }, - - /* - Function: window.onDomReady - Executes the passed in function when the DOM is ready (when the document tree has loaded, not waiting for images). - Same as window.addEvent('domready', init); - - Credits: - (c) Dean Edwards/Matthias Miller/John Resig, remastered for mootools. Later touched up by Christophe Beyls <http://digitalia.be>. - - Arguments: - init - the function to execute when the DOM is ready - - Example: - > window.addEvent('domready', function(){alert('the dom is ready')}); - */ - - onDomReady: function(init){ - return this.addEvent('domready', init); - } - -}); - -/* -Script: Window.Size.js - Window cross-browser dimensions methods. - -License: - MIT-style license. -*/ - -/* -Class: window - Cross browser methods to get the window size, onDomReady method. -*/ - -window.extend({ - - /* - Property: getWidth - Returns an integer representing the width of the browser. - */ - - getWidth: function(){ - if (this.khtml || this.opera) return this.innerWidth; - else return document.documentElement.clientWidth || document.body.clientWidth; - }, - - /* - Property: getHeight - Returns an integer representing the height of the browser. - */ - - getHeight: function(){ - if (this.khtml || this.opera) return this.innerHeight; - return document.documentElement.clientHeight || document.body.clientHeight; - }, - - /* - Property: getScrollHeight - Returns an integer representing the scrollHeight of the window. - - See Also: - <http://developer.mozilla.org/en/docs/DOM:element.scrollHeight> - */ - - getScrollHeight: function(){ - return document.documentElement.scrollHeight; - }, - - /* - Property: getScrollWidth - Returns an integer representing the scrollWidth of the window. - - See Also: - <http://developer.mozilla.org/en/docs/DOM:element.scrollWidth> - */ - - getScrollWidth: function(){ - return document.documentElement.scrollWidth; - }, - - /* - Property: getScrollTop - Returns an integer representing the scrollTop of the window (the number of pixels the window has scrolled from the top). - - See Also: - <http://developer.mozilla.org/en/docs/DOM:element.scrollTop> - */ - - getScrollTop: function(){ - return this.pageYOffset || document.documentElement.scrollTop; - }, - - /* - Property: getScrollLeft - Returns an integer representing the scrollLeft of the window (the number of pixels the window has scrolled from the left). - - See Also: - <http://developer.mozilla.org/en/docs/DOM:element.scrollLeft> - */ - - getScrollLeft: function(){ - return this.pageXOffset || document.documentElement.scrollLeft; - }, - - /* - Property: getSize - Same as <Element.getSize> - */ - - getSize: function(){ - return { - 'scroll': {'x': this.getScrollLeft(), 'y': this.getScrollTop()}, - 'size': {'x': this.getWidth(), 'y': this.getHeight()}, - 'scrollSize': {'x': this.getScrollWidth(), 'y': this.getScrollHeight()} - }; - }, - - //ignore - getOffsets: function(){return {'x': 0, 'y': 0}} - -}); - -/* -Script: Fx.Base.js - Contains <Fx.Base> and two Transitions. - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -var Fx = {}; - -/* -Class: Fx.Base - Base class for the Mootools Effects (Moo.Fx) library. - -Options: - onStart - the function to execute as the effect begins; nothing (<Class.empty>) by default. - onComplete - the function to execute after the effect has processed; nothing (<Class.empty>) by default. - transition - the equation to use for the effect see <Fx.Transitions>; default is <Fx.Transitions.sineInOut> - duration - the duration of the effect in ms; 500 is the default. - unit - the unit is 'px' by default (other values include things like 'em' for fonts or '%'). - wait - boolean: to wait or not to wait for a current transition to end before running another of the same instance. defaults to true. - fps - the frames per second for the transition; default is 30 -*/ - -Fx.Base = new Class({ - - getOptions: function(){ - return { - onStart: Class.empty, - onComplete: Class.empty, - onCancel: Class.empty, - transition: Fx.Transitions.sineInOut, - duration: 500, - unit: 'px', - wait: true, - fps: 50 - }; - }, - - initialize: function(options){ - this.element = this.element || null; - this.setOptions(this.getOptions(), options); - if (this.options.initialize) this.options.initialize.call(this); - }, - - step: function(){ - var time = new Date().getTime(); - if (time < this.time + this.options.duration){ - this.cTime = time - this.time; - this.setNow(); - this.increase(); - } else { - this.stop(true); - this.now = this.to; - this.increase(); - this.fireEvent('onComplete', this.element, 10); - this.callChain(); - } - }, - - /* - Property: set - Immediately sets the value with no transition. - - Arguments: - to - the point to jump to - - Example: - >var myFx = new Fx.Style('myElement', 'opacity').set(0); //will make it immediately transparent - */ - - set: function(to){ - this.now = to; - this.increase(); - return this; - }, - - setNow: function(){ - this.now = this.compute(this.from, this.to); - }, - - compute: function(from, to){ - return this.options.transition(this.cTime, from, (to - from), this.options.duration); - }, - - /* - Property: start - Executes an effect from one position to the other. - - Arguments: - from - integer: staring value - to - integer: the ending value - - Examples: - >var myFx = new Fx.Style('myElement', 'opacity').start(0,1); //display a transition from transparent to opaque. - */ - - start: function(from, to){ - if (!this.options.wait) this.stop(); - else if (this.timer) return this; - this.from = from; - this.to = to; - this.time = new Date().getTime(); - this.timer = this.step.periodical(Math.round(1000/this.options.fps), this); - this.fireEvent('onStart', this.element); - return this; - }, - - /* - Property: stop - Stops the transition. - */ - - stop: function(end){ - if (!this.timer) return this; - this.timer = $clear(this.timer); - if (!end) this.fireEvent('onCancel', this.element); - return this; - }, - - //compat - custom: function(from, to){return this.start(from, to)}, - clearTimer: function(end){return this.stop(end)} - -}); - -Fx.Base.implement(new Chain); -Fx.Base.implement(new Events); -Fx.Base.implement(new Options); - -/* -Class: Fx.Transitions - A collection of transition equations for use with the <Fx> Class. - -See Also: - <Fxtransitions.js> for a whole bunch of transitions. - -Credits: - Easing Equations, (c) 2003 Robert Penner (http://www.robertpenner.com/easing/), Open Source BSD License. -*/ - -Fx.Transitions = { - - /* Property: linear */ - linear: function(t, b, c, d){ - return c*t/d + b; - }, - - /* Property: sineInOut */ - sineInOut: function(t, b, c, d){ - return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; - } - -}; - -/* -Script: Fx.CSS.js - Css parsing class for effects. Required by <Fx.Style>, <Fx.Styles>, <Fx.Elements>. No documentation needed, as its used internally. - -Author: - Christophe Beyls, <http://www.digitalia.be>, - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -Fx.CSS = { - - select: function(property, to){ - if (property.test('color', 'i')) return this.Color; - if (to.test && to.test(' ')) return this.Multi; - return this.Single; - }, - - parse: function(el, property, fromTo){ - if (!fromTo.push) fromTo = [fromTo]; - var from = fromTo[0], to = fromTo[1]; - if (!to && to != 0){ - to = from; - from = el.getStyle(property); - } - var css = this.select(property, to); - return {from: css.parse(from), to: css.parse(to), css: css}; - } - -}; - -Fx.CSS.Single = { - - parse: function(value){ - return parseFloat(value); - }, - - getNow: function(from, to, fx){ - return fx.compute(from, to); - }, - - getValue: function(value, unit){ - return value+unit; - } - -}; - -Fx.CSS.Multi = { - - parse: function(value){ - return value.push ? value : value.split(' ').map(function(v){ - return parseFloat(v); - }); - }, - - getNow: function(from, to, fx){ - var now = []; - for (var i = 0; i < from.length; i++) now[i] = fx.compute(from[i], to[i]); - return now; - }, - - getValue: function(value, unit){ - return value.join(unit+' ')+unit; - } - -}; - -Fx.CSS.Color = { - - parse: function(value){ - return value.push ? value : value.hexToRgb(true); - }, - - getNow: function(from, to, fx){ - var now = []; - for (var i = 0; i < from.length; i++) now[i] = Math.round(fx.compute(from[i], to[i])); - return now; - }, - - getValue: function(value){ - return 'rgb('+value.join(',')+')'; - } - -}; - -/* -Script: Fx.Style.js - Contains <Fx.Style> - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -/* -Class: Fx.Style - The Style effect; Extends <Fx.Base>, inherits all its properties. Used to transition any css property from one value to another. Includes colors. - Colors must be in hex format. - -Arguments: - el - the $(element) to apply the style transition to - property - the property to transition - options - the Fx.Base options (see: <Fx.Base>) - -Example: - >var marginChange = new Fx.Style('myElement', 'margin-top', {duration:500}); - >marginChange.start(10, 100); -*/ - -Fx.Style = Fx.Base.extend({ - - initialize: function(el, property, options){ - this.element = $(el); - this.property = property; - this.parent(options); - }, - - /* - Property: hide - Same as <Fx.Base.set>(0) - */ - - hide: function(){ - return this.set(0); - }, - - setNow: function(){ - this.now = this.css.getNow(this.from, this.to, this); - }, - - set: function(to){ - this.css = Fx.CSS.select(this.property, to); - return this.parent(this.css.parse(to)); - }, - - /* - Property: start - displays the transition to the value/values passed in - - Example: - (start code) - var var marginChange = new Fx.Style('myElement', 'margin-top', {duration:500}); - marginChange.start(10); //tries to read current margin top value and goes from current to 10 - (end) - */ - - start: function(from, to){ - if (this.timer && this.options.wait) return this; - var parsed = Fx.CSS.parse(this.element, this.property, [from, to]); - this.css = parsed.css; - return this.parent(parsed.from, parsed.to); - }, - - increase: function(){ - this.element.setStyle(this.property, this.css.getValue(this.now, this.options.unit)); - } - -}); - -/* -Class: Element - Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>. -*/ - -Element.extend({ - - /* - Property: effect - Applies an <Fx.Style> to the Element; This a shortcut for <Fx.Style>. - - Example: - >var myEffect = $('myElement').effect('height', {duration: 1000, transition: Fx.Transitions.linear}); - >myEffect.start(10, 100); - */ - - effect: function(property, options){ - return new Fx.Style(this, property, options); - } - -}); - -/* -Script: Fx.Styles.js - Contains <Fx.Styles> - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -/* -Class: Fx.Styles - Allows you to animate multiple css properties at once; Extends <Fx.Base>, inherits all its properties. Includes colors. - Colors must be in hex format. - -Arguments: - el - the $(element) to apply the styles transition to - options - the fx options (see: <Fx.Base>) - -Example: - (start code) - var myEffects = new Fx.Styles('myElement', {duration: 1000, transition: Fx.Transitions.linear}); - - //height from 10 to 100 and width from 900 to 300 - myEffects.start({ - 'height': [10, 100], - 'width': [900, 300] - }); - - //or height from current height to 100 and width from current width to 300 - myEffects.start({ - 'height': 100, - 'width': 300 - }); - (end) -*/ - -Fx.Styles = Fx.Base.extend({ - - initialize: function(el, options){ - this.element = $(el); - this.parent(options); - }, - - setNow: function(){ - for (var p in this.from) this.now[p] = this.css[p].getNow(this.from[p], this.to[p], this); - }, - - set: function(to){ - var parsed = {}; - this.css = {}; - for (var p in to){ - this.css[p] = Fx.CSS.select(p, to[p]); - parsed[p] = this.css[p].parse(to[p]); - } - return this.parent(parsed); - }, - - /* - Property: start - The function you'll actually use to execute a transition. - - Arguments: - an object - - Example: - see <Fx.Styles> - */ - - start: function(obj){ - if (this.timer && this.options.wait) return this; - this.now = {}; - this.css = {}; - var from = {}, to = {}; - for (var p in obj){ - var parsed = Fx.CSS.parse(this.element, p, obj[p]); - from[p] = parsed.from; - to[p] = parsed.to; - this.css[p] = parsed.css; - } - return this.parent(from, to); - }, - - increase: function(){ - for (var p in this.now) this.element.setStyle(p, this.css[p].getValue(this.now[p], this.options.unit)); - } - -}); - -/* -Class: Element - Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>. -*/ - -Element.extend({ - - /* - Property: effects - Applies an <Fx.Styles> to the Element; This a shortcut for <Fx.Styles>. - - Example: - >var myEffects = $(myElement).effects({duration: 1000, transition: Fx.Transitions.sineInOut}); - >myEffects.start({'height': [10, 100], 'width': [900, 300]}); - */ - - effects: function(options){ - return new Fx.Styles(this, options); - } - -}); - -/* -Script: Fx.Elements.js - Contains <Fx.Elements> - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -/* -Class: Fx.Elements - Fx.Elements allows you to apply any number of styles transitions to a selection of elements. Includes colors (must be in hex format). - -Arguments: - elements - a collection of elements the effects will be applied to. - options - same as <Fx.Base> options. -*/ - -Fx.Elements = Fx.Base.extend({ - - initialize: function(elements, options){ - this.elements = $$(elements); - this.parent(options); - }, - - setNow: function(){ - for (var i in this.from){ - var iFrom = this.from[i], iTo = this.to[i], iCss = this.css[i], iNow = this.now[i] = {}; - for (var p in iFrom) iNow[p] = iCss[p].getNow(iFrom[p], iTo[p], this); - } - }, - - set: function(to){ - var parsed = {}; - this.css = {}; - for (var i in to){ - var iTo = to[i], iCss = this.css[i] = {}, iParsed = parsed[i] = {}; - for (var p in iTo){ - iCss[p] = Fx.CSS.select(p, iTo[p]); - iParsed[p] = iCss[p].parse(iTo[p]); - } - } - return this.parent(parsed); - }, - - /* - Property: start - Applies the passed in style transitions to each object named (see example). Each item in the collection is refered to as a numerical string ("1" for instance). The first item is "0", the second "1", etc. - - Example: - (start code) - var myElementsEffects = new Fx.Elements($$('a')); - myElementsEffects.start({ - '0': { //let's change the first element's opacity and width - 'opacity': [0,1], - 'width': [100,200] - }, - '1': { //and the second one's opacity - 'opacity': [0.2, 0.5] - } - }); - (end) - */ - - start: function(obj){ - if (this.timer && this.options.wait) return this; - this.now = {}; - this.css = {}; - var from = {}, to = {}; - for (var i in obj){ - var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {}, iCss = this.css[i] = {}; - for (var p in iProps){ - var parsed = Fx.CSS.parse(this.elements[i], p, iProps[p]); - iFrom[p] = parsed.from; - iTo[p] = parsed.to; - iCss[p] = parsed.css; - } - } - return this.parent(from, to); - }, - - increase: function(){ - for (var i in this.now){ - var iNow = this.now[i], iCss = this.css[i]; - for (var p in iNow) this.elements[i].setStyle(p, iCss[p].getValue(iNow[p], this.options.unit)); - } - } - -}); - -/* -Script: Fx.Scroll.js - Contains <Fx.Scroll> - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -/* -Class: Fx.Scroll - Scroll any element with an overflow, including the window element. - -Arguments: - element - the element to scroll - options - same as <Fx.Base> options. -*/ - -Fx.Scroll = Fx.Base.extend({ - - initialize: function(element, options){ - this.now = []; - this.element = $(element); - this.addEvent('onStart', function(){ - this.element.addEvent('mousewheel', this.stop.bind(this, false)); - }.bind(this)); - this.removeEvent('onComplete', function(){ - this.element.removeEvent('mousewheel', this.stop.bind(this, false)); - }.bind(this)); - this.parent(options); - }, - - setNow: function(){ - for (var i = 0; i < 2; i++) this.now[i] = this.compute(this.from[i], this.to[i]); - }, - - /* - Property: scrollTo - Scrolls the chosen element to the x/y coordinates. - - Arguments: - x - the x coordinate to scroll the element to - y - the y coordinate to scroll the element to - */ - - scrollTo: function(x, y){ - if (this.timer && this.options.wait) return this; - var el = this.element.getSize(); - var values = {'x': x, 'y': y}; - for (var z in el.size){ - var max = el.scrollSize[z] - el.size[z]; - if ($chk(values[z])) values[z] = ($type(values[z]) == 'number') ? Math.max(Math.min(values[z], max), 0) : max; - else values[z] = el.scroll[z]; - } - return this.start([el.scroll.x, el.scroll.y], [values.x, values.y]); - }, - - /* - Property: toTop - Scrolls the chosen element to its maximum top. - */ - - toTop: function(){ - return this.scrollTo(false, 0); - }, - - /* - Property: toBottom - Scrolls the chosen element to its maximum bottom. - */ - - toBottom: function(){ - return this.scrollTo(false, 'full'); - }, - - /* - Property: toLeft - Scrolls the chosen element to its maximum left. - */ - - toLeft: function(){ - return this.scrollTo(0, false); - }, - - /* - Property: toRight - Scrolls the chosen element to its maximum right. - */ - - toRight: function(){ - return this.scrollTo('full', false); - }, - - /* - Property: toElement - Scrolls the specified element to the position the passed in element is found. Only usable if the chosen element is == window. - - Arguments: - el - the $(element) to scroll the window to - */ - - toElement: function(el){ - return this.scrollTo($(el).getLeft(), $(el).getTop()); - }, - - increase: function(){ - this.element.scrollTo(this.now[0], this.now[1]); - } - -}); - -/* -Script: Fx.Slide.js - Contains <Fx.Slide> - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -/* -Class: Fx.Slide - The slide effect; slides an element in horizontally or vertically, the contents will fold inside. Extends <Fx.Base>, inherits all its properties. - -Note: - This effect works on any block element, but the element *cannot be positioned*; no margins or absolute positions. To position the element, put it inside another element (a wrapper div, for instance) and position that instead. - -Options: - mode - set it to vertical or horizontal. Defaults to vertical. - and all the <Fx.Base> options - -Example: - (start code) - var mySlider = new Fx.Slide('myElement', {duration: 500}); - mySlider.toggle() //toggle the slider up and down. - (end) -*/ - -Fx.Slide = Fx.Base.extend({ - - initialize: function(el, options){ - this.element = $(el).setStyle('margin', 0); - this.wrapper = new Element('div').injectAfter(this.element).setStyle('overflow', 'hidden').adopt(this.element); - this.setOptions({'mode': 'vertical'}, options); - this.now = []; - this.parent(this.options); - }, - - setNow: function(){ - for (var i = 0; i < 2; i++) this.now[i] = this.compute(this.from[i], this.to[i]); - }, - - vertical: function(){ - this.margin = 'top'; - this.layout = 'height'; - this.offset = this.element.offsetHeight; - return [this.element.getStyle('margin-top').toInt(), this.wrapper.getStyle('height').toInt()]; - }, - - horizontal: function(){ - this.margin = 'left'; - this.layout = 'width'; - this.offset = this.element.offsetWidth; - return [this.element.getStyle('margin-left').toInt(), this.wrapper.getStyle('width').toInt()]; - }, - - /* - Property: slideIn - slides the elements in view horizontally or vertically, depending on the mode parameter or options.mode. - */ - - slideIn: function(mode){ - return this.start(this[mode || this.options.mode](), [0, this.offset]); - }, - - /* - Property: slideOut - slides the elements out of the view horizontally or vertically, depending on the mode parameter or options.mode. - */ - - slideOut: function(mode){ - return this.start(this[mode || this.options.mode](), [-this.offset, 0]); - }, - - /* - Property: hide - Hides the element without a transition. - */ - - hide: function(mode){ - this[mode || this.options.mode](); - return this.set([-this.offset, 0]); - }, - - /* - Property: show - Shows the element without a transition. - */ - - show: function(mode){ - this[mode || this.options.mode](); - return this.set([0, this.offset]); - }, - - /* - Property: toggle - Slides in or Out the element, depending on its state - */ - - toggle: function(mode){ - if (this.wrapper.offsetHeight == 0 || this.wrapper.offsetWidth == 0) return this.slideIn(mode); - else return this.slideOut(mode); - }, - - increase: function(){ - this.element.setStyle('margin-'+this.margin, this.now[0]+this.options.unit); - this.wrapper.setStyle(this.layout, this.now[1]+this.options.unit); - } - -}); - -/* -Script: Fx.Transitions.js - Cool transitions, to be used with all the effects. - -Author: - Robert Penner, <http://www.robertpenner.com/easing/>, modified to be used with mootools. - -License: - Easing Equations v1.5, (c) 2003 Robert Penner, all rights reserved. Open Source BSD License. -*/ - -/* -Class: Fx.Transitions - A collection of tweaning transitions for use with the <Fx.Base> classes. -*/ - -Fx.Transitions = { - - /* Property: linear */ - linear: function(t, b, c, d){ - return c*t/d + b; - }, - - /* Property: quadIn */ - quadIn: function(t, b, c, d){ - return c*(t/=d)*t + b; - }, - - /* Property: quatOut */ - quadOut: function(t, b, c, d){ - return -c *(t/=d)*(t-2) + b; - }, - - /* Property: quadInOut */ - quadInOut: function(t, b, c, d){ - if ((t/=d/2) < 1) return c/2*t*t + b; - return -c/2 * ((--t)*(t-2) - 1) + b; - }, - - /* Property: cubicIn */ - cubicIn: function(t, b, c, d){ - return c*(t/=d)*t*t + b; - }, - - /* Property: cubicOut */ - cubicOut: function(t, b, c, d){ - return c*((t=t/d-1)*t*t + 1) + b; - }, - - /* Property: cubicInOut */ - cubicInOut: function(t, b, c, d){ - if ((t/=d/2) < 1) return c/2*t*t*t + b; - return c/2*((t-=2)*t*t + 2) + b; - }, - - /* Property: quartIn */ - quartIn: function(t, b, c, d){ - return c*(t/=d)*t*t*t + b; - }, - - /* Property: quartOut */ - quartOut: function(t, b, c, d){ - return -c * ((t=t/d-1)*t*t*t - 1) + b; - }, - - /* Property: quartInOut */ - quartInOut: function(t, b, c, d){ - if ((t/=d/2) < 1) return c/2*t*t*t*t + b; - return -c/2 * ((t-=2)*t*t*t - 2) + b; - }, - - /* Property: quintIn */ - quintIn: function(t, b, c, d){ - return c*(t/=d)*t*t*t*t + b; - }, - - /* Property: quintOut */ - quintOut: function(t, b, c, d){ - return c*((t=t/d-1)*t*t*t*t + 1) + b; - }, - - /* Property: quintInOut */ - quintInOut: function(t, b, c, d){ - if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; - return c/2*((t-=2)*t*t*t*t + 2) + b; - }, - - /* Property: sineIn */ - sineIn: function(t, b, c, d){ - return -c * Math.cos(t/d * (Math.PI/2)) + c + b; - }, - - /* Property: sineOut */ - sineOut: function(t, b, c, d){ - return c * Math.sin(t/d * (Math.PI/2)) + b; - }, - - /* Property: sineInOut */ - sineInOut: function(t, b, c, d){ - return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; - }, - - /* Property: expoIn */ - expoIn: function(t, b, c, d){ - return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; - }, - - /* Property: expoOut */ - expoOut: function(t, b, c, d){ - return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; - }, - - /* Property: expoInOut */ - expoInOut: function(t, b, c, d){ - if (t==0) return b; - if (t==d) return b+c; - if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; - return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; - }, - - /* Property: circIn */ - circIn: function(t, b, c, d){ - return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; - }, - - /* Property: circOut */ - circOut: function(t, b, c, d){ - return c * Math.sqrt(1 - (t=t/d-1)*t) + b; - }, - - /* Property: circInOut */ - circInOut: function(t, b, c, d){ - if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; - return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; - }, - - /* Property: elasticIn */ - elasticIn: function(t, b, c, d, a, p){ - if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; if (!a) a = 1; - if (a < Math.abs(c)){ a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin(c/a); - return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; - }, - - /* Property: elasticOut */ - elasticOut: function(t, b, c, d, a, p){ - if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; if (!a) a = 1; - if (a < Math.abs(c)){ a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin(c/a); - return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; - }, - - /* Property: elasticInOut */ - elasticInOut: function(t, b, c, d, a, p){ - if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); if (!a) a = 1; - if (a < Math.abs(c)){ a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin(c/a); - if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; - return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; - }, - - /* Property: backIn */ - backIn: function(t, b, c, d, s){ - if (!s) s = 1.70158; - return c*(t/=d)*t*((s+1)*t - s) + b; - }, - - /* Property: backOut */ - backOut: function(t, b, c, d, s){ - if (!s) s = 1.70158; - return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; - }, - - /* Property: backInOut */ - backInOut: function(t, b, c, d, s){ - if (!s) s = 1.70158; - if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; - return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; - }, - - /* Property: bounceIn */ - bounceIn: function(t, b, c, d){ - return c - Fx.Transitions.bounceOut (d-t, 0, c, d) + b; - }, - - /* Property: bounceOut */ - bounceOut: function(t, b, c, d){ - if ((t/=d) < (1/2.75)){ - return c*(7.5625*t*t) + b; - } else if (t < (2/2.75)){ - return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; - } else if (t < (2.5/2.75)){ - return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; - } else { - return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; - } - }, - - /* Property: bounceInOut */ - bounceInOut: function(t, b, c, d){ - if (t < d/2) return Fx.Transitions.bounceIn(t*2, 0, c, d) * .5 + b; - return Fx.Transitions.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; - } - -}; - -/* -Script: Drag.Base.js - Contains <Drag.Base>, <Element.makeResizable> - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -var Drag = {}; - -/* -Class: Drag.Base - Modify two css properties of an element based on the position of the mouse. - -Arguments: - el - the $(element) to apply the transformations to. - options - optional. The options object. - -Options: - handle - the $(element) to act as the handle for the draggable element. defaults to the $(element) itself. - modifiers - an object. see Modifiers Below. - onStart - optional, function to execute when the user starts to drag (on mousedown); - onComplete - optional, function to execute when the user completes the drag. - onDrag - optional, function to execute at every step of the drag - limit - an object, see Limit below. - snap - optional, the distance you have to drag before the element starts to respond to the drag. defaults to false - - modifiers: - x - string, the style you want to modify when the mouse moves in an horizontal direction. defaults to 'left' - y - string, the style you want to modify when the mouse moves in a vertical direction. defaults to 'top' - - limit: - x - array with start and end limit relative to modifiers.x - y - array with start and end limit relative to modifiers.y -*/ - -Drag.Base = new Class({ - - getOptions: function(){ - return { - handle: false, - unit: 'px', - onStart: Class.empty, - onComplete: Class.empty, - onSnap: Class.empty, - onDrag: Class.empty, - limit: false, - modifiers: {x: 'left', y: 'top'}, - snap: 6 - }; - }, - - initialize: function(el, options){ - this.setOptions(this.getOptions(), options); - this.element = $(el); - this.handle = $(this.options.handle) || this.element; - this.mouse = {'now': {}, 'pos': {}}; - this.value = {'start': {}, 'now': {}}; - this.bound = {'start': this.start.bindWithEvent(this)}; - this.handle.addEvent('mousedown', this.bound.start); - if (this.options.initialize) this.options.initialize.call(this); - }, - - start: function(event){ - this.mouse.start = event.page; - var limit = this.options.limit; - this.limit = {'x': [], 'y': []}; - for (var z in this.options.modifiers){ - this.value.now[z] = this.element.getStyle(this.options.modifiers[z]).toInt(); - this.mouse.pos[z] = event.page[z] - this.value.now[z]; - if (limit && limit[z]){ - for (var i = 0; i < 2; i++){ - if ($chk(limit[z][i])) this.limit[z][i] = limit[z][i].apply ? limit[z][i].call(this) : limit[z][i]; - } - } - } - this.bound.drag = this.drag.bindWithEvent(this); - this.bound.checkAndDrag = this.checkAndDrag.bindWithEvent(this); - this.bound.stop = this.stop.bind(this); - document.addEvent('mousemove', this.options.snap ? this.bound.checkAndDrag : this.bound.drag); - document.addEvent('mouseup', this.bound.stop); - this.fireEvent('onStart', this.element); - event.stop(); - }, - - checkAndDrag: function(event){ - var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2))); - if (distance > this.options.snap){ - document.removeEvent('mousemove', this.bound.checkAndDrag); - document.addEvent('mousemove', this.bound.drag); - this.drag(event); - this.fireEvent('onSnap', this.element); - } - event.stop(); - }, - - drag: function(event){ - this.out = false; - this.mouse.now = event.page; - for (var z in this.options.modifiers){ - this.value.now[z] = event.page[z] - this.mouse.pos[z]; - if (this.limit[z]){ - if ($chk(this.limit[z][1]) && (this.value.now[z] > this.limit[z][1])){ - this.value.now[z] = this.limit[z][1]; - this.out = true; - } else if ($chk(this.limit[z][0]) && (this.value.now[z] < this.limit[z][0])){ - this.value.now[z] = this.limit[z][0]; - this.out = true; - } - } - this.element.setStyle(this.options.modifiers[z], this.value.now[z] + this.options.unit); - } - this.fireEvent('onDrag', this.element); - event.stop(); - }, - - detach: function(){ - this.handle.removeEvent('mousedown', this.bound.start); - }, - - stop: function(){ - document.removeEvent('mousemove', this.bound.drag); - document.removeEvent('mouseup', this.bound.stop); - this.fireEvent('onComplete', this.element); - } - -}); - -Drag.Base.implement(new Events); -Drag.Base.implement(new Options); - -/* -Class: Element - Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>. -*/ - -Element.extend({ - - /* - Property: makeResizable - Makes an element resizable (by dragging) with the supplied options. - - Arguments: - options - see <Drag.Base> for acceptable options. - */ - - makeResizable: function(options){ - return new Drag.Base(this, Object.extend(options || {}, {modifiers: {x: 'width', y: 'height'}})); - } - -}); - -/* -Script: Scroller.js - Contains the <Scroller>. - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -/* -Class: Scroller - The Scroller is a class to scroll any element with an overflow (including the window) when the mouse cursor reaches certain buondaries of that element. - You must call its start method to start listening to mouse movements. - -Arguments: - element - required, the element to scroll. - options - optional, see options below, and <Fx.Base> options. - -Options: - area - integer, the necessary boundaries to make the element scroll. - velocity - integer, velocity ratio, the modifier for the window scrolling speed. - onChange - optionally, when the mouse reaches some boundaries, you can choose to alter some other values, instead of the scrolling offsets. - Automatically passes as parameters x and y values. -*/ - -var Scroller = new Class({ - - getOptions: function(){ - return { - area: 20, - velocity: 1, - onChange: function(x, y){ - this.element.scrollTo(x, y); - } - }; - }, - - initialize: function(element, options){ - this.setOptions(this.getOptions(), options); - this.element = $(element); - this.mousemover = ([window, document].test(element)) ? $(document.body) : this.element; - }, - - /* - Property: start - The scroller starts listening to mouse movements. - */ - - start: function(){ - this.coord = this.getCoords.bindWithEvent(this); - this.mousemover.addEvent('mousemove', this.coord); - }, - - /* - Property: stop - The scroller stops listening to mouse movements. - */ - - stop: function(){ - this.mousemover.removeEvent('mousemove', this.coord); - this.timer = $clear(this.timer); - }, - - getCoords: function(event){ - this.page = (this.element == window) ? event.client : event.page; - if (!this.timer) this.timer = this.scroll.periodical(50, this); - }, - - scroll: function(){ - var el = this.element.getSize(); - var pos = this.element.getOffsets(); - - var change = {'x': 0, 'y': 0}; - for (var z in this.page){ - if (this.page[z] < (this.options.area + pos[z]) && el.scroll[z] != 0) - change[z] = (this.page[z] - this.options.area - pos[z]) * this.options.velocity; - else if (this.page[z] + this.options.area > (el.size[z] + pos[z]) && el.scroll[z] + el.size[z] != el.scrollSize[z]) - change[z] = (this.page[z] - el.size[z] + this.options.area - pos[z]) * this.options.velocity; - } - if (change.y || change.x) this.fireEvent('onChange', [el.scroll.x + change.x, el.scroll.y + change.y]); - } - -}); - -Scroller.implement(new Events); -Scroller.implement(new Options); - -/* -Script: Slider.js - Contains <Slider> - -Author: - Valerio Proietti, <http://mad4milk.net> - -License: - MIT-style license. -*/ - -/* -Class: Slider - Creates a slider with two elements: a knob and a container. Returns the values. - -Arguments: - element - the knob container - knob - the handle - options - see Options below - -Options: - onChange - a function to fire when the value changes. - onComplete - a function to fire when you're done dragging. - onTick - optionally, you can alter the onTick behavior, for example displaying an effect of the knob moving to the desired position. - Passes as parameter the new position. - steps - the number of steps for your slider. - mode - either 'horizontal' or 'vertical'. defaults to horizontal. - wheel - experimental! Also use the mouse wheel to control the slider. defaults to false. -*/ - -var Slider = new Class({ - - getOptions: function(){ - return { - onChange: Class.empty, - onComplete: Class.empty, - onTick: function(pos){ - this.knob.setStyle(this.p, pos+'px'); - }, - steps: 100, - mode: 'horizontal', - wheel: false - }; - }, - - initialize: function(el, knob, options){ - this.element = $(el); - this.knob = $(knob); - this.setOptions(this.getOptions(), options); - - this.previousChange = -1; - this.previousEnd = -1; - this.step = -1; - - this.element.addEvent('mousedown', this.clickedElement.bindWithEvent(this)); - - if (this.options.wheel) this.element.addEvent('mousewheel', this.scrolledElement.bindWithEvent(this)); - - if (this.options.mode == 'horizontal'){ - this.z = 'x'; this.p = 'left'; - this.max = this.element.offsetWidth-this.knob.offsetWidth; - this.half = this.knob.offsetWidth/2; - this.getPos = this.element.getLeft.bind(this.element); - } else if (this.options.mode == 'vertical'){ - this.z = 'y'; this.p = 'top'; - this.max = this.element.offsetHeight-this.knob.offsetHeight; - this.half = this.knob.offsetHeight/2; - this.getPos = this.element.getTop.bind(this.element); - } - - this.knob.setStyle('position', 'relative').setStyle(this.p, 0); - - var modSlide = {}, limSlide = {}; - - limSlide[this.z] = [0, this.max]; - modSlide[this.z] = this.p; - - this.drag = new Drag.Base(this.knob, { - limit: limSlide, - snap: 0, - modifiers: modSlide, - onStart: function(){ - this.draggedKnob(); - }.bind(this), - onDrag: function(){ - this.draggedKnob(); - }.bind(this), - onComplete: function(){ - this.draggedKnob(); - this.end(); - }.bind(this) - }); - if (this.options.initialize) this.options.initialize.call(this); - }, - - /* - Property: set - The slider will get the step you pass. - - Arguments: - step - one integer - */ - - set: function(step){ - if (step > this.options.steps) step = this.options.steps; - else if (step < 0) step = 0; - this.step = step; - this.checkStep(); - this.end(); - this.fireEvent('onTick', this.toPosition(this.step)+''); - return this; - }, - - scrolledElement: function(event){ - if (event.wheel < 0) this.set(this.step + 1); - else if (event.wheel > 0) this.set(this.step - 1); - event.stop(); - }, - - clickedElement: function(event){ - var position = event.page[this.z] - this.getPos() - this.half; - if (position > this.max) position = this.max; - else if (position < 0) position = 0; - this.step = this.toStep(position); - this.checkStep(); - this.end(); - this.fireEvent('onTick', position+''); - }, - - draggedKnob: function(){ - this.step = this.toStep(this.drag.value.now[this.z]); - this.checkStep(); - }, - - checkStep: function(){ - if (this.previousChange != this.step){ - this.previousChange = this.step; - this.fireEvent('onChange', this.step); - } - }, - - end: function(){ - if (this.previousEnd !== this.step){ - this.previousEnd = this.step; - this.fireEvent('onComplete', this.step+''); - } - }, - - toStep: function(position){ - return Math.round(position/this.max*this.options.steps); - }, - - toPosition: function(step){ - return (this.max)*step/this.options.steps; - } - -}); - -Slider.implement(new Events); -Slider.implement(new Options);
\ No newline at end of file |