server/php/basic/public_html/static/lib/paper/paper-full.js
author rougeronj
Wed, 03 Jun 2015 17:27:46 +0200
changeset 471 e0c7be5dc02c
parent 442 adb907bba956
child 495 444b80998255
permissions -rw-r--r--
Add a router to handle fragment identifier Set up a listener of the router in the scene to update it Start Backbone.history (eventlistener of the router) when all the project is loaded Include router.js to all the test file
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
442
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
/*!
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
 * Paper.js v0.9.22 - The Swiss Army Knife of Vector Graphics Scripting.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * http://paperjs.org/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * Copyright (c) 2011 - 2014, Juerg Lehni & Jonathan Puckey
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * http://scratchdisk.com/ & http://jonathanpuckey.com/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * Distributed under the MIT license. See LICENSE file for details.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 * All rights reserved.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
 * Date: Sat Feb 28 19:20:48 2015 +0100
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 ***
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 * Straps.js - Class inheritance library with support for bean-style accessors
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 * Copyright (c) 2006 - 2013 Juerg Lehni
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
 * http://scratchdisk.com/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
 * Distributed under the MIT license.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
 ***
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
 * Acorn.js
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
 * http://marijnhaverbeke.nl/acorn/
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
 * Acorn is a tiny, fast JavaScript parser written in JavaScript,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
 * created by Marijn Haverbeke and released under an MIT license.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
 *
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
 */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
var paper = new function(undefined) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
var Base = new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
	var hidden = /^(statics|enumerable|beans|preserve)$/,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
		forEach = [].forEach || function(iter, bind) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
			for (var i = 0, l = this.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
				iter.call(bind, this[i], i, this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
		forIn = function(iter, bind) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
			for (var i in this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
				if (this.hasOwnProperty(i))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
					iter.call(bind, this[i], i, this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
		create = Object.create || function(proto) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
			return { __proto__: proto };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
		describe = Object.getOwnPropertyDescriptor || function(obj, name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
			var get = obj.__lookupGetter__ && obj.__lookupGetter__(name);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
			return get
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
					? { get: get, set: obj.__lookupSetter__(name),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
						enumerable: true, configurable: true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
					: obj.hasOwnProperty(name)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
						? { value: obj[name], enumerable: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
							configurable: true, writable: true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
						: null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
		_define = Object.defineProperty || function(obj, name, desc) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
			if ((desc.get || desc.set) && obj.__defineGetter__) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
				if (desc.get)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
					obj.__defineGetter__(name, desc.get);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
				if (desc.set)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
					obj.__defineSetter__(name, desc.set);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
				obj[name] = desc.value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
			return obj;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
		define = function(obj, name, desc) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
			delete obj[name];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
			return _define(obj, name, desc);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
	function inject(dest, src, enumerable, beans, preserve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
		var beansNames = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
		function field(name, val) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
			val = val || (val = describe(src, name))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
					&& (val.get ? val : val.value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
			if (typeof val === 'string' && val[0] === '#')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
				val = dest[val.substring(1)] || val;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
			var isFunc = typeof val === 'function',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
				res = val,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
				prev = preserve || isFunc
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
						? (val && val.get ? name in dest : dest[name])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
						: null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
				bean;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
			if (!preserve || !prev) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
				if (isFunc && prev)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
					val.base = prev;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
				if (isFunc && beans !== false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
						&& (bean = name.match(/^([gs]et|is)(([A-Z])(.*))$/)))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
					beansNames[bean[3].toLowerCase() + bean[4]] = bean[2];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
				if (!res || isFunc || !res.get || typeof res.get !== 'function'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
						|| !Base.isPlainObject(res))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
					res = { value: res, writable: true };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
				if ((describe(dest, name)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
						|| { configurable: true }).configurable) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
					res.configurable = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
					res.enumerable = enumerable;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
				define(dest, name, res);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
		if (src) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
			for (var name in src) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
				if (src.hasOwnProperty(name) && !hidden.test(name))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
					field(name);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
			for (var name in beansNames) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
				var part = beansNames[name],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
					set = dest['set' + part],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
					get = dest['get' + part] || set && dest['is' + part];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
				if (get && (beans === true || get.length === 0))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
					field(name, { get: get, set: set });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
		return dest;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
	function each(obj, iter, bind) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
		if (obj)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
			('length' in obj && !obj.getLength
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
					&& typeof obj.length === 'number'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
				? forEach
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
				: forIn).call(obj, iter, bind = bind || obj);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
		return bind;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
	function set(obj, props, exclude) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
		for (var key in props)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
			if (props.hasOwnProperty(key) && !(exclude && exclude[key]))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
				obj[key] = props[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
		return obj;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
	return inject(function Base() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
		for (var i = 0, l = arguments.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
			set(this, arguments[i]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
	}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
		inject: function(src) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
			if (src) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
				var statics = src.statics === true ? src : src.statics,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
					beans = src.beans,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
					preserve = src.preserve;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
				if (statics !== src)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
					inject(this.prototype, src, src.enumerable, beans, preserve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
				inject(this, statics, true, beans, preserve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
			for (var i = 1, l = arguments.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
				this.inject(arguments[i]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
			return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
		extend: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
			var base = this,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
				ctor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
			for (var i = 0, l = arguments.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
				if (ctor = arguments[i].initialize)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
					break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
			ctor = ctor || function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
				base.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
			};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
			ctor.prototype = create(this.prototype);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
			ctor.base = base;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
			define(ctor.prototype, 'constructor',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
					{ value: ctor, writable: true, configurable: true });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
			inject(ctor, this, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
			return arguments.length ? this.inject.apply(ctor, arguments) : ctor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
	}, true).inject({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
		inject: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
			for (var i = 0, l = arguments.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
				var src = arguments[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
				if (src)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
					inject(this, src, src.enumerable, src.beans, src.preserve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
			return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
		extend: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
			var res = create(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
			return res.inject.apply(res, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
		each: function(iter, bind) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
			return each(this, iter, bind);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
		set: function(props) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
			return set(this, props);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
		clone: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
			return new this.constructor(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
		statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
			each: each,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
			create: create,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
			define: define,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
			describe: describe,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
			set: set,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
			clone: function(obj) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
				return set(new obj.constructor(), obj);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
			},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
			isPlainObject: function(obj) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
				var ctor = obj != null && obj.constructor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
				return ctor && (ctor === Object || ctor === Base
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
						|| ctor.name === 'Object');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
			},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
			pick: function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
				return a !== undefined ? a : b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
if (typeof module !== 'undefined')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
	module.exports = Base;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
Base.inject({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
	toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
		return this._id != null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
			?  (this._class || 'Object') + (this._name
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
				? " '" + this._name + "'"
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
				: ' @' + this._id)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
			: '{ ' + Base.each(this, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
				if (!/^_/.test(key)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
					var type = typeof value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
					this.push(key + ': ' + (type === 'number'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
							? Formatter.instance.number(value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
							: type === 'string' ? "'" + value + "'" : value));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
			}, []).join(', ') + ' }';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
	getClassName: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
		return this._class || '';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
	exportJSON: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
		return Base.exportJSON(this, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
	toJSON: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
		return Base.serialize(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
	_set: function(props, exclude, dontCheck) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
		if (props && (dontCheck || Base.isPlainObject(props))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
			var orig = props._filtering || props;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
			for (var key in orig) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
				if (orig.hasOwnProperty(key) && !(exclude && exclude[key])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
					var value = props[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
					if (value !== undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
						this[key] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
			return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
	statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
		exports: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
			enumerable: true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
		extend: function extend() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
			var res = extend.base.apply(this, arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
				name = res.prototype._class;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
			if (name && !Base.exports[name])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
				Base.exports[name] = res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
			return res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
		equals: function(obj1, obj2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
			function checkKeys(o1, o2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
				for (var i in o1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
					if (o1.hasOwnProperty(i) && !o2.hasOwnProperty(i))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
						return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
				return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
			if (obj1 === obj2)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
				return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
			if (obj1 && obj1.equals)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
				return obj1.equals(obj2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
			if (obj2 && obj2.equals)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
				return obj2.equals(obj1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
			if (Array.isArray(obj1) && Array.isArray(obj2)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
				if (obj1.length !== obj2.length)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
					return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
				for (var i = 0, l = obj1.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
					if (!Base.equals(obj1[i], obj2[i]))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
						return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
				return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
			if (obj1 && typeof obj1 === 'object'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
					&& obj2 && typeof obj2 === 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
				if (!checkKeys(obj1, obj2) || !checkKeys(obj2, obj1))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
					return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
				for (var i in obj1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
					if (obj1.hasOwnProperty(i)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
							&& !Base.equals(obj1[i], obj2[i]))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
						return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
				return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
			return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
		read: function(list, start, options, length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
			if (this === Base) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
				var value = this.peek(list, start);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
				list.__index++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
				return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
			var proto = this.prototype,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
				readIndex = proto._readIndex,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
				index = start || readIndex && list.__index || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
			if (!length)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
				length = list.length - index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
			var obj = list[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
			if (obj instanceof this
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
				|| options && options.readNull && obj == null && length <= 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
				if (readIndex)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
					list.__index = index + 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
				return obj && options && options.clone ? obj.clone() : obj;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
			obj = Base.create(this.prototype);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
			if (readIndex)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
				obj.__read = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
			obj = obj.initialize.apply(obj, index > 0 || length < list.length
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
				? Array.prototype.slice.call(list, index, index + length)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
				: list) || obj;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
			if (readIndex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
				list.__index = index + obj.__read;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
				obj.__read = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
			return obj;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
		peek: function(list, start) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
			return list[list.__index = start || list.__index || 0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
		remain: function(list) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
			return list.length - (list.__index || 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
		readAll: function(list, start, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
			var res = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
				entry;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
			for (var i = start || 0, l = list.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
				res.push(Array.isArray(entry = list[i])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
						? this.read(entry, 0, options)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
						: this.read(list, i, options, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
			return res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
		readNamed: function(list, name, start, options, length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
			var value = this.getNamed(list, name),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
				hasObject = value !== undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
			if (hasObject) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
				var filtered = list._filtered;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
				if (!filtered) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
					filtered = list._filtered = Base.create(list[0]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
					filtered._filtering = list[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
				filtered[name] = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
			return this.read(hasObject ? [value] : list, start, options, length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
		getNamed: function(list, name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
			var arg = list[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
			if (list._hasObject === undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
				list._hasObject = list.length === 1 && Base.isPlainObject(arg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
			if (list._hasObject)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
				return name ? arg[name] : list._filtered || arg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
		hasNamed: function(list, name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
			return !!this.getNamed(list, name);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
		isPlainValue: function(obj, asString) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
			return this.isPlainObject(obj) || Array.isArray(obj)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
					|| asString && typeof obj === 'string';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
		serialize: function(obj, options, compact, dictionary) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
			options = options || {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
			var root = !dictionary,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
				res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
			if (root) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
				options.formatter = new Formatter(options.precision);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
				dictionary = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
					length: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
					definitions: {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
					references: {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
					add: function(item, create) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
						var id = '#' + item._id,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
							ref = this.references[id];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
						if (!ref) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
							this.length++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
							var res = create.call(item),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
								name = item._class;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
							if (name && res[0] !== name)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
								res.unshift(name);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
							this.definitions[id] = res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
							ref = this.references[id] = [id];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
						return ref;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
				};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
			if (obj && obj._serialize) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
				res = obj._serialize(options, dictionary);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
				var name = obj._class;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
				if (name && !compact && !res._compact && res[0] !== name)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
					res.unshift(name);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
			} else if (Array.isArray(obj)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
				res = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
				for (var i = 0, l = obj.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
					res[i] = Base.serialize(obj[i], options, compact,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
							dictionary);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
				if (compact)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
					res._compact = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
			} else if (Base.isPlainObject(obj)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
				res = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
				for (var i in obj)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
					if (obj.hasOwnProperty(i))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
						res[i] = Base.serialize(obj[i], options, compact,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
								dictionary);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
			} else if (typeof obj === 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
				res = options.formatter.number(obj, options.precision);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
				res = obj;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
			return root && dictionary.length > 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
					? [['dictionary', dictionary.definitions], res]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
					: res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
		deserialize: function(json, create, _data) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
			var res = json,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
				isRoot = !_data;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
			_data = _data || {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
			if (Array.isArray(json)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
				var type = json[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
					isDictionary = type === 'dictionary';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
				if (!isDictionary) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
					if (_data.dictionary && json.length == 1 && /^#/.test(type))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
						return _data.dictionary[type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
					type = Base.exports[type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
				res = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
				for (var i = type ? 1 : 0, l = json.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
					res.push(Base.deserialize(json[i], create, _data));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
				if (isDictionary) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
					_data.dictionary = res[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
				} else if (type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
					var args = res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
					if (create) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
						res = create(type, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
					} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
						res = Base.create(type.prototype);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
						type.apply(res, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
			} else if (Base.isPlainObject(json)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
				res = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
				for (var key in json)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
					res[key] = Base.deserialize(json[key], create, _data);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
			return isRoot && json && json.length && json[0][0] === 'dictionary'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
					? res[1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
					: res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
		exportJSON: function(obj, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
			var json = Base.serialize(obj, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
			return options && options.asString === false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
					? json
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
					: JSON.stringify(json);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
		importJSON: function(json, target) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
			return Base.deserialize(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
					typeof json === 'string' ? JSON.parse(json) : json,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
					function(type, args) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
						var obj = target && target.constructor === type
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
								? target
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
								: Base.create(type.prototype),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
							isTarget = obj === target;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
						if (args.length === 1 && obj instanceof Item
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
								&& (isTarget || !(obj instanceof Layer))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
							var arg = args[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
							if (Base.isPlainObject(arg))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
								arg.insert = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
						type.apply(obj, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
						if (isTarget)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
							target = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
						return obj;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
					});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
		splice: function(list, items, index, remove) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
			var amount = items && items.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
				append = index === undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
			index = append ? list.length : index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
			if (index > list.length)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
				index = list.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
			for (var i = 0; i < amount; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
				items[i]._index = index + i;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
			if (append) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
				list.push.apply(list, items);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
				return [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
				var args = [index, remove];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
				if (items)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
					args.push.apply(args, items);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
				var removed = list.splice.apply(list, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
				for (var i = 0, l = removed.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
					removed[i]._index = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
				for (var i = index + amount, l = list.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
					list[i]._index = i;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
				return removed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
		capitalize: function(str) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
			return str.replace(/\b[a-z]/g, function(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
				return match.toUpperCase();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
			});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
		camelize: function(str) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
			return str.replace(/-(.)/g, function(all, chr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
				return chr.toUpperCase();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
			});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
		hyphenate: function(str) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
			return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
var Emitter = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
	on: function(type, func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
		if (typeof type !== 'string') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
			Base.each(type, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
				this.on(key, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
			}, this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
			var entry = this._eventTypes[type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
			if (entry) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
				var handlers = this._callbacks = this._callbacks || {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
				handlers = handlers[type] = handlers[type] || [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
				if (handlers.indexOf(func) === -1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
					handlers.push(func);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
					if (entry.install && handlers.length == 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
						entry.install.call(this, type);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
	off: function(type, func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
		if (typeof type !== 'string') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
			Base.each(type, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
				this.off(key, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
			}, this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
			return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
		var entry = this._eventTypes[type],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
			handlers = this._callbacks && this._callbacks[type],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
			index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
		if (entry && handlers) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
			if (!func || (index = handlers.indexOf(func)) !== -1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
					&& handlers.length === 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
				if (entry.uninstall)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
					entry.uninstall.call(this, type);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
				delete this._callbacks[type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
			} else if (index !== -1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
				handlers.splice(index, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
	once: function(type, func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
		return this.on(type, function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
			func.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
			this.off(type, func);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
	emit: function(type, event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
		var handlers = this._callbacks && this._callbacks[type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
		if (!handlers)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
			return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
		var args = [].slice.call(arguments, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
		for (var i = 0, l = handlers.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
			if (handlers[i].apply(this, args) === false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
					&& event && event.stop) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
				event.stop();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
	responds: function(type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
		return !!(this._callbacks && this._callbacks[type]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
	attach: '#on',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
	detach: '#off',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
	fire: '#emit',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
	_installEvents: function(install) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
		var handlers = this._callbacks,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
			key = install ? 'install' : 'uninstall';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
		for (var type in handlers) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
			if (handlers[type].length > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
				var entry = this._eventTypes[type],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
					func = entry[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
				if (func)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
					func.call(this, type);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
	statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
		inject: function inject(src) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
			var events = src._events;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
			if (events) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
				var types = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
				Base.each(events, function(entry, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
					var isString = typeof entry === 'string',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
						name = isString ? entry : key,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
						part = Base.capitalize(name),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
						type = name.substring(2).toLowerCase();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
					types[type] = isString ? {} : entry;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
					name = '_' + name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
					src['get' + part] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
						return this[name];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
					};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
					src['set' + part] = function(func) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
						var prev = this[name];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
						if (prev)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
							this.off(type, prev);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
						if (func)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
							this.on(type, func);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
						this[name] = func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
					};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
				});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
				src._eventTypes = types;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
			return inject.base.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
var PaperScope = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
	_class: 'PaperScope',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
	initialize: function PaperScope() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
		paper = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
		this.settings = new Base({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
			applyMatrix: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
			handleSize: 4,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
			hitTolerance: 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
		this.project = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
		this.projects = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
		this.tools = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
		this.palettes = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
		this._id = PaperScope._id++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
		PaperScope._scopes[this._id] = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
		var proto = PaperScope.prototype;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
		if (!this.support) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
			var ctx = CanvasProvider.getContext(1, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
			proto.support = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
				nativeDash: 'setLineDash' in ctx || 'mozDash' in ctx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
				nativeBlendModes: BlendMode.nativeModes
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
			};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
			CanvasProvider.release(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
		if (!this.browser) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
			var browser = proto.browser = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
			navigator.userAgent.toLowerCase().replace(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
				/(opera|chrome|safari|webkit|firefox|msie|trident|atom)\/?\s*([.\d]+)(?:.*version\/([.\d]+))?(?:.*rv\:([.\d]+))?/g,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
				function(all, n, v1, v2, rv) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
					if (!browser.chrome) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
						var v = n === 'opera' ? v2 : v1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
						if (n === 'trident') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
							v = rv;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
							n = 'msie';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
						browser.version = v;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
						browser.versionNumber = parseFloat(v);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
						browser.name = n;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
						browser[n] = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
			);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
			if (browser.chrome)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
				delete browser.webkit;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
			if (browser.atom)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
				delete browser.chrome;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
	version: '0.9.22',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
	getView: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
		return this.project && this.project.getView();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
	getPaper: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
	execute: function(code, url, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
		paper.PaperScript.execute(code, this, url, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
		View.updateFocus();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
	install: function(scope) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
		var that = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
		Base.each(['project', 'view', 'tool'], function(key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
			Base.define(scope, key, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
				configurable: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
				get: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
					return that[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
			});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
		for (var key in this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
			if (!/^_/.test(key) && this[key])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
				scope[key] = this[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
	setup: function(element) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
		paper = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
		this.project = new Project(element);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
	activate: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
		paper = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
	clear: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
		for (var i = this.projects.length - 1; i >= 0; i--)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
			this.projects[i].remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
		for (var i = this.tools.length - 1; i >= 0; i--)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
			this.tools[i].remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
		for (var i = this.palettes.length - 1; i >= 0; i--)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
			this.palettes[i].remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
	remove: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
		this.clear();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
		delete PaperScope._scopes[this._id];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
	statics: new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
		function handleAttribute(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
			name += 'Attribute';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
			return function(el, attr) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
				return el[name](attr) || el[name]('data-paper-' + attr);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
			};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
		return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
			_scopes: {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
			_id: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
			get: function(id) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
				return this._scopes[id] || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
			},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
			getAttribute: handleAttribute('get'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
			hasAttribute: handleAttribute('has')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
var PaperScopeItem = Base.extend(Emitter, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
	initialize: function(activate) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
		this._scope = paper;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
		this._index = this._scope[this._list].push(this) - 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
		if (activate || !this._scope[this._reference])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
			this.activate();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
	activate: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
		if (!this._scope)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
			return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
		var prev = this._scope[this._reference];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
		if (prev && prev !== this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
			prev.emit('deactivate');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
		this._scope[this._reference] = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
		this.emit('activate', prev);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
	isActive: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
		return this._scope[this._reference] === this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
	remove: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
		if (this._index == null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
			return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
		Base.splice(this._scope[this._list], null, this._index, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
		if (this._scope[this._reference] == this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
			this._scope[this._reference] = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
		this._scope = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
var Formatter = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
	initialize: function(precision) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
		this.precision = precision || 5;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
		this.multiplier = Math.pow(10, this.precision);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
	number: function(val) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
		return Math.round(val * this.multiplier) / this.multiplier;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
	pair: function(val1, val2, separator) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
		return this.number(val1) + (separator || ',') + this.number(val2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
	point: function(val, separator) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
		return this.number(val.x) + (separator || ',') + this.number(val.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
	size: function(val, separator) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
		return this.number(val.width) + (separator || ',')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
				+ this.number(val.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
	rectangle: function(val, separator) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
		return this.point(val, separator) + (separator || ',')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
				+ this.size(val, separator);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
Formatter.instance = new Formatter();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
var Numerical = new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
	var abscissas = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
		[  0.5773502691896257645091488],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
		[0,0.7745966692414833770358531],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
		[  0.3399810435848562648026658,0.8611363115940525752239465],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
		[0,0.5384693101056830910363144,0.9061798459386639927976269],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
		[  0.2386191860831969086305017,0.6612093864662645136613996,0.9324695142031520278123016],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
		[0,0.4058451513773971669066064,0.7415311855993944398638648,0.9491079123427585245261897],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
		[  0.1834346424956498049394761,0.5255324099163289858177390,0.7966664774136267395915539,0.9602898564975362316835609],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
		[0,0.3242534234038089290385380,0.6133714327005903973087020,0.8360311073266357942994298,0.9681602395076260898355762],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
		[  0.1488743389816312108848260,0.4333953941292471907992659,0.6794095682990244062343274,0.8650633666889845107320967,0.9739065285171717200779640],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
		[0,0.2695431559523449723315320,0.5190961292068118159257257,0.7301520055740493240934163,0.8870625997680952990751578,0.9782286581460569928039380],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
		[  0.1252334085114689154724414,0.3678314989981801937526915,0.5873179542866174472967024,0.7699026741943046870368938,0.9041172563704748566784659,0.9815606342467192506905491],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
		[0,0.2304583159551347940655281,0.4484927510364468528779129,0.6423493394403402206439846,0.8015780907333099127942065,0.9175983992229779652065478,0.9841830547185881494728294],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
		[  0.1080549487073436620662447,0.3191123689278897604356718,0.5152486363581540919652907,0.6872929048116854701480198,0.8272013150697649931897947,0.9284348836635735173363911,0.9862838086968123388415973],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
		[0,0.2011940939974345223006283,0.3941513470775633698972074,0.5709721726085388475372267,0.7244177313601700474161861,0.8482065834104272162006483,0.9372733924007059043077589,0.9879925180204854284895657],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
		[  0.0950125098376374401853193,0.2816035507792589132304605,0.4580167776572273863424194,0.6178762444026437484466718,0.7554044083550030338951012,0.8656312023878317438804679,0.9445750230732325760779884,0.9894009349916499325961542]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
	];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
	var weights = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
		[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
		[0.8888888888888888888888889,0.5555555555555555555555556],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
		[0.6521451548625461426269361,0.3478548451374538573730639],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
		[0.5688888888888888888888889,0.4786286704993664680412915,0.2369268850561890875142640],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
		[0.4679139345726910473898703,0.3607615730481386075698335,0.1713244923791703450402961],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
		[0.4179591836734693877551020,0.3818300505051189449503698,0.2797053914892766679014678,0.1294849661688696932706114],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
		[0.3626837833783619829651504,0.3137066458778872873379622,0.2223810344533744705443560,0.1012285362903762591525314],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
		[0.3302393550012597631645251,0.3123470770400028400686304,0.2606106964029354623187429,0.1806481606948574040584720,0.0812743883615744119718922],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
		[0.2955242247147528701738930,0.2692667193099963550912269,0.2190863625159820439955349,0.1494513491505805931457763,0.0666713443086881375935688],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
		[0.2729250867779006307144835,0.2628045445102466621806889,0.2331937645919904799185237,0.1862902109277342514260976,0.1255803694649046246346943,0.0556685671161736664827537],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
		[0.2491470458134027850005624,0.2334925365383548087608499,0.2031674267230659217490645,0.1600783285433462263346525,0.1069393259953184309602547,0.0471753363865118271946160],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
		[0.2325515532308739101945895,0.2262831802628972384120902,0.2078160475368885023125232,0.1781459807619457382800467,0.1388735102197872384636018,0.0921214998377284479144218,0.0404840047653158795200216],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
		[0.2152638534631577901958764,0.2051984637212956039659241,0.1855383974779378137417166,0.1572031671581935345696019,0.1215185706879031846894148,0.0801580871597602098056333,0.0351194603317518630318329],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
		[0.2025782419255612728806202,0.1984314853271115764561183,0.1861610000155622110268006,0.1662692058169939335532009,0.1395706779261543144478048,0.1071592204671719350118695,0.0703660474881081247092674,0.0307532419961172683546284],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
		[0.1894506104550684962853967,0.1826034150449235888667637,0.1691565193950025381893121,0.1495959888165767320815017,0.1246289712555338720524763,0.0951585116824927848099251,0.0622535239386478928628438,0.0271524594117540948517806]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
	];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
	var abs = Math.abs,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
		sqrt = Math.sqrt,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
		pow = Math.pow,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
		TOLERANCE = 1e-6,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
		EPSILON = 1e-12,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
		MACHINE_EPSILON = 1.12e-16;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
		TOLERANCE: TOLERANCE,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
		EPSILON: EPSILON,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
		MACHINE_EPSILON: MACHINE_EPSILON,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   926
		KAPPA: 4 * (sqrt(2) - 1) / 3,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
		isZero: function(val) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
			return abs(val) <= EPSILON;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
		integrate: function(f, a, b, n) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   933
			var x = abscissas[n - 2],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   934
				w = weights[n - 2],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   935
				A = (b - a) * 0.5,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   936
				B = A + a,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   937
				i = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   938
				m = (n + 1) >> 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
				sum = n & 1 ? w[i++] * f(B) : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
			while (i < m) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
				var Ax = A * x[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
				sum += w[i++] * (f(B + Ax) + f(B - Ax));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
			return A * sum;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
		findRoot: function(f, df, x, a, b, n, tolerance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
			for (var i = 0; i < n; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
				var fx = f(x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
					dx = fx / df(x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
					nx = x - dx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   952
				if (abs(dx) < tolerance)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   953
					return nx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
				if (fx > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
					b = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
					x = nx <= a ? (a + b) * 0.5 : nx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   957
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   958
					a = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
					x = nx >= b ? (a + b) * 0.5 : nx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
			return x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
		solveQuadratic: function(a, b, c, roots, min, max) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
			var count = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
				x1, x2 = Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
				B = b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
				D;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
			b /= 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
			D = b * b - a * c;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   972
			if (abs(D) < MACHINE_EPSILON) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
				var pow = Math.pow,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
					gmC = pow(abs(a*b*c), 1/3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
				if (gmC < 1e-8) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
					/*
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
					 * we multiply with a factor to normalize the
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
					 * coefficients. The factor is just the nearest exponent
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
					 * of 10, big enough to raise all the coefficients to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
					 * nearly [-1, +1] range.
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
					 */
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
					var mult = pow(10, abs(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
						Math.floor(Math.log(gmC) * Math.LOG10E)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
					if (!isFinite(mult))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
						mult = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
					a *= mult;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
					b *= mult;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
					c *= mult;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
					D = b * b - a * c;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
			if (abs(a) < MACHINE_EPSILON) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
				if (abs(B) < MACHINE_EPSILON)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
					return abs(c) < MACHINE_EPSILON ? -1 : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
				x1 = -c / B;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
				if (D >= -MACHINE_EPSILON) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
					D = D < 0 ? 0 : D;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
					var R = sqrt(D);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
					if (b >= MACHINE_EPSILON && b <= MACHINE_EPSILON) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
						x1 = abs(a) >= abs(c) ? R / a : -c / R;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
						x2 = -x1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
					} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
						var q = -(b + (b < 0 ? -1 : 1) * R);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
						x1 = q / a;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
						x2 = c / q;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
			if (isFinite(x1) && (min == null || x1 >= min && x1 <= max))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
				roots[count++] = x1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
			if (x2 !== x1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
					&& isFinite(x2) && (min == null || x2 >= min && x2 <= max))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
				roots[count++] = x2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
			return count;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
		solveCubic: function(a, b, c, d, roots, min, max) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
			var x, b1, c2, count = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
			if (a === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
				a = b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
				b1 = c;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
				c2 = d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
				x = Infinity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
			} else if (d === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
				b1 = b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
				c2 = c;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
				x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
				var ec = 1 + MACHINE_EPSILON,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
					x0, q, qd, t, r, s, tmp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
				x = -(b / a) / 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
				tmp = a * x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
				b1 = tmp + b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
				c2 = b1 * x + c,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
				qd = (tmp + b1) * x + c2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
				q = c2 * x + d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
				t = q /a;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
				r = pow(abs(t), 1/3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
				s = t < 0 ? -1 : 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
				t = -qd / a;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
				r = t > 0 ? 1.3247179572 * Math.max(r, sqrt(t)) : r;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
				x0 = x - s * r;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
				if (x0 !== x) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
					do {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
						x = x0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
						tmp = a * x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
						b1 = tmp + b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
						c2 = b1 * x + c,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
						qd = (tmp + b1) * x + c2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
						q = c2 * x + d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
						x0 = qd === 0 ? x : x - q / qd / ec;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
						if (x0 === x) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
							x = x0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
							break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
					} while (s * x0 > s * x);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
					if (abs(a) * x * x > abs(d / x)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
						c2 = -d / x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
						b1 = (c2 - c) / x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
			var count = Numerical.solveQuadratic(a, b1, c2, roots, min, max);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
			if (isFinite(x) && (count === 0 || x !== roots[count - 1])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
					&& (min == null || x >= min && x <= max))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
				roots[count++] = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
			return count;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
var Point = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
	_class: 'Point',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
	_readIndex: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
	initialize: function Point(arg0, arg1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
		var type = typeof arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
		if (type === 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
			var hasY = typeof arg1 === 'number';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
			this.x = arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
			this.y = hasY ? arg1 : arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
			if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
				this.__read = hasY ? 2 : 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1085
		} else if (type === 'undefined' || arg0 === null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1086
			this.x = this.y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1087
			if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1088
				this.__read = arg0 === null ? 1 : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1089
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1090
			if (Array.isArray(arg0)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1091
				this.x = arg0[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1092
				this.y = arg0.length > 1 ? arg0[1] : arg0[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1093
			} else if (arg0.x != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1094
				this.x = arg0.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1095
				this.y = arg0.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1096
			} else if (arg0.width != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1097
				this.x = arg0.width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1098
				this.y = arg0.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1099
			} else if (arg0.angle != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1100
				this.x = arg0.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1101
				this.y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1102
				this.setAngle(arg0.angle);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1103
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1104
				this.x = this.y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1105
				if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1106
					this.__read = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1107
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1108
			if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1109
				this.__read = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1110
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1111
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1112
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1113
	set: function(x, y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1114
		this.x = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1115
		this.y = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1116
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1117
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1118
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1119
	equals: function(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1120
		return this === point || point
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1121
				&& (this.x === point.x && this.y === point.y
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1122
					|| Array.isArray(point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1123
						&& this.x === point[0] && this.y === point[1])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1124
				|| false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1125
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1126
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1127
	clone: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1128
		return new Point(this.x, this.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1129
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1130
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1131
	toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1132
		var f = Formatter.instance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1133
		return '{ x: ' + f.number(this.x) + ', y: ' + f.number(this.y) + ' }';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1134
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1135
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1136
	_serialize: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1137
		var f = options.formatter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1138
		return [f.number(this.x), f.number(this.y)];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1139
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1140
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1141
	getLength: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1142
		return Math.sqrt(this.x * this.x + this.y * this.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1143
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1144
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1145
	setLength: function(length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1146
		if (this.isZero()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1147
			var angle = this._angle || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1148
			this.set(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1149
				Math.cos(angle) * length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1150
				Math.sin(angle) * length
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1151
			);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1152
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1153
			var scale = length / this.getLength();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1154
			if (Numerical.isZero(scale))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1155
				this.getAngle();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1156
			this.set(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1157
				this.x * scale,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1158
				this.y * scale
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1159
			);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1160
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1161
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1162
	getAngle: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1163
		return this.getAngleInRadians.apply(this, arguments) * 180 / Math.PI;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1164
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1165
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1166
	setAngle: function(angle) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1167
		this.setAngleInRadians.call(this, angle * Math.PI / 180);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1168
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1169
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1170
	getAngleInDegrees: '#getAngle',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1171
	setAngleInDegrees: '#setAngle',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1172
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1173
	getAngleInRadians: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1174
		if (!arguments.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1175
			return this.isZero()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1176
					? this._angle || 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1177
					: this._angle = Math.atan2(this.y, this.x);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1178
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1179
			var point = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1180
				div = this.getLength() * point.getLength();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1181
			if (Numerical.isZero(div)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1182
				return NaN;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1183
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1184
				var a = this.dot(point) / div;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1185
				return Math.acos(a < -1 ? -1 : a > 1 ? 1 : a);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1186
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1187
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1188
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1189
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1190
	setAngleInRadians: function(angle) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1191
		this._angle = angle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1192
		if (!this.isZero()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1193
			var length = this.getLength();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1194
			this.set(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1195
				Math.cos(angle) * length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1196
				Math.sin(angle) * length
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1197
			);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1198
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1199
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1200
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1201
	getQuadrant: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1202
		return this.x >= 0 ? this.y >= 0 ? 1 : 4 : this.y >= 0 ? 2 : 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1203
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1204
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1205
	beans: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1206
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1207
	getDirectedAngle: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1208
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1209
		return Math.atan2(this.cross(point), this.dot(point)) * 180 / Math.PI;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1210
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1211
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1212
	getDistance: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1213
		var point = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1214
			x = point.x - this.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1215
			y = point.y - this.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1216
			d = x * x + y * y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1217
			squared = Base.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1218
		return squared ? d : Math.sqrt(d);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1219
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1220
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1221
	normalize: function(length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1222
		if (length === undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1223
			length = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1224
		var current = this.getLength(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1225
			scale = current !== 0 ? length / current : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1226
			point = new Point(this.x * scale, this.y * scale);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1227
		if (scale >= 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1228
			point._angle = this._angle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1229
		return point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1230
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1231
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1232
	rotate: function(angle, center) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1233
		if (angle === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1234
			return this.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1235
		angle = angle * Math.PI / 180;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1236
		var point = center ? this.subtract(center) : this,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1237
			s = Math.sin(angle),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1238
			c = Math.cos(angle);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1239
		point = new Point(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1240
			point.x * c - point.y * s,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1241
			point.x * s + point.y * c
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1242
		);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1243
		return center ? point.add(center) : point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1244
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1245
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1246
	transform: function(matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1247
		return matrix ? matrix._transformPoint(this) : this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1248
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1249
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1250
	add: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1251
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1252
		return new Point(this.x + point.x, this.y + point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1253
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1254
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1255
	subtract: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1256
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1257
		return new Point(this.x - point.x, this.y - point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1258
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1259
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1260
	multiply: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1261
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1262
		return new Point(this.x * point.x, this.y * point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1263
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1264
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1265
	divide: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1266
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1267
		return new Point(this.x / point.x, this.y / point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1268
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1269
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1270
	modulo: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1271
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1272
		return new Point(this.x % point.x, this.y % point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1273
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1274
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1275
	negate: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1276
		return new Point(-this.x, -this.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1277
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1278
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1279
	isInside: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1280
		return Rectangle.read(arguments).contains(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1281
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1282
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1283
	isClose: function(point, tolerance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1284
		return this.getDistance(point) < tolerance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1285
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1286
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1287
	isColinear: function(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1288
		return Math.abs(this.cross(point)) < 1e-12;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1289
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1290
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1291
	isOrthogonal: function(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1292
		return Math.abs(this.dot(point)) < 1e-12;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1293
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1294
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1295
	isZero: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1296
		return Numerical.isZero(this.x) && Numerical.isZero(this.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1297
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1298
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1299
	isNaN: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1300
		return isNaN(this.x) || isNaN(this.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1301
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1302
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1303
	dot: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1304
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1305
		return this.x * point.x + this.y * point.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1306
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1307
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1308
	cross: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1309
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1310
		return this.x * point.y - this.y * point.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1311
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1312
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1313
	project: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1314
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1315
		if (point.isZero()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1316
			return new Point(0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1317
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1318
			var scale = this.dot(point) / point.dot(point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1319
			return new Point(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1320
				point.x * scale,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1321
				point.y * scale
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1322
			);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1323
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1324
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1325
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1326
	statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1327
		min: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1328
			var point1 = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1329
				point2 = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1330
			return new Point(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1331
				Math.min(point1.x, point2.x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1332
				Math.min(point1.y, point2.y)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1333
			);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1334
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1335
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1336
		max: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1337
			var point1 = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1338
				point2 = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1339
			return new Point(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1340
				Math.max(point1.x, point2.x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1341
				Math.max(point1.y, point2.y)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1342
			);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1343
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1344
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1345
		random: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1346
			return new Point(Math.random(), Math.random());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1347
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1348
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1349
}, Base.each(['round', 'ceil', 'floor', 'abs'], function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1350
	var op = Math[name];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1351
	this[name] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1352
		return new Point(op(this.x), op(this.y));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1353
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1354
}, {}));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1355
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1356
var LinkedPoint = Point.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1357
	initialize: function Point(x, y, owner, setter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1358
		this._x = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1359
		this._y = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1360
		this._owner = owner;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1361
		this._setter = setter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1362
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1363
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1364
	set: function(x, y, _dontNotify) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1365
		this._x = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1366
		this._y = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1367
		if (!_dontNotify)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1368
			this._owner[this._setter](this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1369
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1370
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1371
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1372
	getX: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1373
		return this._x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1374
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1375
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1376
	setX: function(x) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1377
		this._x = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1378
		this._owner[this._setter](this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1379
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1380
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1381
	getY: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1382
		return this._y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1383
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1384
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1385
	setY: function(y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1386
		this._y = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1387
		this._owner[this._setter](this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1388
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1389
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1390
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1391
var Size = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1392
	_class: 'Size',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1393
	_readIndex: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1394
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1395
	initialize: function Size(arg0, arg1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1396
		var type = typeof arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1397
		if (type === 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1398
			var hasHeight = typeof arg1 === 'number';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1399
			this.width = arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1400
			this.height = hasHeight ? arg1 : arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1401
			if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1402
				this.__read = hasHeight ? 2 : 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1403
		} else if (type === 'undefined' || arg0 === null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1404
			this.width = this.height = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1405
			if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1406
				this.__read = arg0 === null ? 1 : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1407
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1408
			if (Array.isArray(arg0)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1409
				this.width = arg0[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1410
				this.height = arg0.length > 1 ? arg0[1] : arg0[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1411
			} else if (arg0.width != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1412
				this.width = arg0.width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1413
				this.height = arg0.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1414
			} else if (arg0.x != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1415
				this.width = arg0.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1416
				this.height = arg0.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1417
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1418
				this.width = this.height = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1419
				if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1420
					this.__read = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1421
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1422
			if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1423
				this.__read = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1424
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1425
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1426
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1427
	set: function(width, height) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1428
		this.width = width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1429
		this.height = height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1430
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1431
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1432
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1433
	equals: function(size) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1434
		return size === this || size && (this.width === size.width
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1435
				&& this.height === size.height
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1436
				|| Array.isArray(size) && this.width === size[0]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1437
					&& this.height === size[1]) || false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1438
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1439
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1440
	clone: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1441
		return new Size(this.width, this.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1442
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1443
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1444
	toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1445
		var f = Formatter.instance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1446
		return '{ width: ' + f.number(this.width)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1447
				+ ', height: ' + f.number(this.height) + ' }';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1448
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1449
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1450
	_serialize: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1451
		var f = options.formatter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1452
		return [f.number(this.width),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1453
				f.number(this.height)];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1454
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1455
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1456
	add: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1457
		var size = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1458
		return new Size(this.width + size.width, this.height + size.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1459
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1460
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1461
	subtract: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1462
		var size = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1463
		return new Size(this.width - size.width, this.height - size.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1464
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1465
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1466
	multiply: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1467
		var size = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1468
		return new Size(this.width * size.width, this.height * size.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1469
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1470
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1471
	divide: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1472
		var size = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1473
		return new Size(this.width / size.width, this.height / size.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1474
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1475
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1476
	modulo: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1477
		var size = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1478
		return new Size(this.width % size.width, this.height % size.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1479
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1480
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1481
	negate: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1482
		return new Size(-this.width, -this.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1483
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1484
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1485
	isZero: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1486
		return Numerical.isZero(this.width) && Numerical.isZero(this.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1487
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1488
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1489
	isNaN: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1490
		return isNaN(this.width) || isNaN(this.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1491
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1492
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1493
	statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1494
		min: function(size1, size2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1495
			return new Size(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1496
				Math.min(size1.width, size2.width),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1497
				Math.min(size1.height, size2.height));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1498
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1499
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1500
		max: function(size1, size2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1501
			return new Size(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1502
				Math.max(size1.width, size2.width),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1503
				Math.max(size1.height, size2.height));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1504
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1505
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1506
		random: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1507
			return new Size(Math.random(), Math.random());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1508
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1509
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1510
}, Base.each(['round', 'ceil', 'floor', 'abs'], function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1511
	var op = Math[name];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1512
	this[name] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1513
		return new Size(op(this.width), op(this.height));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1514
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1515
}, {}));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1516
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1517
var LinkedSize = Size.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1518
	initialize: function Size(width, height, owner, setter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1519
		this._width = width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1520
		this._height = height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1521
		this._owner = owner;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1522
		this._setter = setter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1523
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1524
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1525
	set: function(width, height, _dontNotify) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1526
		this._width = width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1527
		this._height = height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1528
		if (!_dontNotify)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1529
			this._owner[this._setter](this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1530
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1531
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1532
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1533
	getWidth: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1534
		return this._width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1535
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1536
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1537
	setWidth: function(width) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1538
		this._width = width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1539
		this._owner[this._setter](this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1540
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1541
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1542
	getHeight: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1543
		return this._height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1544
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1545
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1546
	setHeight: function(height) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1547
		this._height = height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1548
		this._owner[this._setter](this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1549
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1550
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1551
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1552
var Rectangle = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1553
	_class: 'Rectangle',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1554
	_readIndex: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1555
	beans: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1556
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1557
	initialize: function Rectangle(arg0, arg1, arg2, arg3) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1558
		var type = typeof arg0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1559
			read = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1560
		if (type === 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1561
			this.x = arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1562
			this.y = arg1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1563
			this.width = arg2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1564
			this.height = arg3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1565
			read = 4;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1566
		} else if (type === 'undefined' || arg0 === null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1567
			this.x = this.y = this.width = this.height = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1568
			read = arg0 === null ? 1 : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1569
		} else if (arguments.length === 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1570
			if (Array.isArray(arg0)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1571
				this.x = arg0[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1572
				this.y = arg0[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1573
				this.width = arg0[2];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1574
				this.height = arg0[3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1575
				read = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1576
			} else if (arg0.x !== undefined || arg0.width !== undefined) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1577
				this.x = arg0.x || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1578
				this.y = arg0.y || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1579
				this.width = arg0.width || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1580
				this.height = arg0.height || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1581
				read = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1582
			} else if (arg0.from === undefined && arg0.to === undefined) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1583
				this.x = this.y = this.width = this.height = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1584
				this._set(arg0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1585
				read = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1586
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1587
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1588
		if (!read) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1589
			var point = Point.readNamed(arguments, 'from'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1590
				next = Base.peek(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1591
			this.x = point.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1592
			this.y = point.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1593
			if (next && next.x !== undefined || Base.hasNamed(arguments, 'to')) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1594
				var to = Point.readNamed(arguments, 'to');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1595
				this.width = to.x - point.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1596
				this.height = to.y - point.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1597
				if (this.width < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1598
					this.x = to.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1599
					this.width = -this.width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1600
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1601
				if (this.height < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1602
					this.y = to.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1603
					this.height = -this.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1604
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1605
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1606
				var size = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1607
				this.width = size.width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1608
				this.height = size.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1609
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1610
			read = arguments.__index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1611
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1612
		if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1613
			this.__read = read;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1614
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1615
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1616
	set: function(x, y, width, height) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1617
		this.x = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1618
		this.y = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1619
		this.width = width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1620
		this.height = height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1621
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1622
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1623
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1624
	clone: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1625
		return new Rectangle(this.x, this.y, this.width, this.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1626
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1627
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1628
	equals: function(rect) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1629
		var rt = Base.isPlainValue(rect)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1630
				? Rectangle.read(arguments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1631
				: rect;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1632
		return rt === this
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1633
				|| rt && this.x === rt.x && this.y === rt.y
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1634
					&& this.width === rt.width && this.height === rt.height
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1635
				|| false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1636
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1637
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1638
	toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1639
		var f = Formatter.instance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1640
		return '{ x: ' + f.number(this.x)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1641
				+ ', y: ' + f.number(this.y)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1642
				+ ', width: ' + f.number(this.width)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1643
				+ ', height: ' + f.number(this.height)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1644
				+ ' }';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1645
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1646
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1647
	_serialize: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1648
		var f = options.formatter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1649
		return [f.number(this.x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1650
				f.number(this.y),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1651
				f.number(this.width),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1652
				f.number(this.height)];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1653
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1654
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1655
	getPoint: function(_dontLink) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1656
		var ctor = _dontLink ? Point : LinkedPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1657
		return new ctor(this.x, this.y, this, 'setPoint');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1658
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1659
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1660
	setPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1661
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1662
		this.x = point.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1663
		this.y = point.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1664
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1665
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1666
	getSize: function(_dontLink) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1667
		var ctor = _dontLink ? Size : LinkedSize;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1668
		return new ctor(this.width, this.height, this, 'setSize');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1669
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1670
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1671
	setSize: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1672
		var size = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1673
		if (this._fixX)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1674
			this.x += (this.width - size.width) * this._fixX;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1675
		if (this._fixY)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1676
			this.y += (this.height - size.height) * this._fixY;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1677
		this.width = size.width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1678
		this.height = size.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1679
		this._fixW = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1680
		this._fixH = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1681
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1682
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1683
	getLeft: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1684
		return this.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1685
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1686
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1687
	setLeft: function(left) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1688
		if (!this._fixW)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1689
			this.width -= left - this.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1690
		this.x = left;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1691
		this._fixX = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1692
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1693
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1694
	getTop: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1695
		return this.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1696
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1697
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1698
	setTop: function(top) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1699
		if (!this._fixH)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1700
			this.height -= top - this.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1701
		this.y = top;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1702
		this._fixY = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1703
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1704
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1705
	getRight: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1706
		return this.x + this.width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1707
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1708
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1709
	setRight: function(right) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1710
		if (this._fixX !== undefined && this._fixX !== 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1711
			this._fixW = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1712
		if (this._fixW)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1713
			this.x = right - this.width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1714
		else
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1715
			this.width = right - this.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1716
		this._fixX = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1717
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1718
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1719
	getBottom: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1720
		return this.y + this.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1721
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1722
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1723
	setBottom: function(bottom) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1724
		if (this._fixY !== undefined && this._fixY !== 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1725
			this._fixH = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1726
		if (this._fixH)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1727
			this.y = bottom - this.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1728
		else
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1729
			this.height = bottom - this.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1730
		this._fixY = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1731
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1732
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1733
	getCenterX: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1734
		return this.x + this.width * 0.5;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1735
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1736
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1737
	setCenterX: function(x) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1738
		this.x = x - this.width * 0.5;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1739
		this._fixX = 0.5;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1740
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1741
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1742
	getCenterY: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1743
		return this.y + this.height * 0.5;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1744
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1745
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1746
	setCenterY: function(y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1747
		this.y = y - this.height * 0.5;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1748
		this._fixY = 0.5;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1749
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1750
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1751
	getCenter: function(_dontLink) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1752
		var ctor = _dontLink ? Point : LinkedPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1753
		return new ctor(this.getCenterX(), this.getCenterY(), this, 'setCenter');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1754
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1755
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1756
	setCenter: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1757
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1758
		this.setCenterX(point.x);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1759
		this.setCenterY(point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1760
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1761
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1762
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1763
	getArea: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1764
		return this.width * this.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1765
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1766
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1767
	isEmpty: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1768
		return this.width === 0 || this.height === 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1769
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1770
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1771
	contains: function(arg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1772
		return arg && arg.width !== undefined
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1773
				|| (Array.isArray(arg) ? arg : arguments).length == 4
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1774
				? this._containsRectangle(Rectangle.read(arguments))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1775
				: this._containsPoint(Point.read(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1776
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1777
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1778
	_containsPoint: function(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1779
		var x = point.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1780
			y = point.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1781
		return x >= this.x && y >= this.y
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1782
				&& x <= this.x + this.width
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1783
				&& y <= this.y + this.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1784
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1785
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1786
	_containsRectangle: function(rect) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1787
		var x = rect.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1788
			y = rect.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1789
		return x >= this.x && y >= this.y
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1790
				&& x + rect.width <= this.x + this.width
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1791
				&& y + rect.height <= this.y + this.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1792
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1793
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1794
	intersects: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1795
		var rect = Rectangle.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1796
		return rect.x + rect.width > this.x
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1797
				&& rect.y + rect.height > this.y
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1798
				&& rect.x < this.x + this.width
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1799
				&& rect.y < this.y + this.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1800
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1801
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1802
	touches: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1803
		var rect = Rectangle.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1804
		return rect.x + rect.width >= this.x
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1805
				&& rect.y + rect.height >= this.y
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1806
				&& rect.x <= this.x + this.width
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1807
				&& rect.y <= this.y + this.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1808
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1809
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1810
	intersect: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1811
		var rect = Rectangle.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1812
			x1 = Math.max(this.x, rect.x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1813
			y1 = Math.max(this.y, rect.y),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1814
			x2 = Math.min(this.x + this.width, rect.x + rect.width),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1815
			y2 = Math.min(this.y + this.height, rect.y + rect.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1816
		return new Rectangle(x1, y1, x2 - x1, y2 - y1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1817
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1818
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1819
	unite: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1820
		var rect = Rectangle.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1821
			x1 = Math.min(this.x, rect.x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1822
			y1 = Math.min(this.y, rect.y),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1823
			x2 = Math.max(this.x + this.width, rect.x + rect.width),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1824
			y2 = Math.max(this.y + this.height, rect.y + rect.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1825
		return new Rectangle(x1, y1, x2 - x1, y2 - y1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1826
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1827
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1828
	include: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1829
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1830
		var x1 = Math.min(this.x, point.x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1831
			y1 = Math.min(this.y, point.y),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1832
			x2 = Math.max(this.x + this.width, point.x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1833
			y2 = Math.max(this.y + this.height, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1834
		return new Rectangle(x1, y1, x2 - x1, y2 - y1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1835
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1836
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1837
	expand: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1838
		var amount = Size.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1839
			hor = amount.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1840
			ver = amount.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1841
		return new Rectangle(this.x - hor / 2, this.y - ver / 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1842
				this.width + hor, this.height + ver);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1843
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1844
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1845
	scale: function(hor, ver) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1846
		return this.expand(this.width * hor - this.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1847
				this.height * (ver === undefined ? hor : ver) - this.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1848
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1849
}, Base.each([
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1850
		['Top', 'Left'], ['Top', 'Right'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1851
		['Bottom', 'Left'], ['Bottom', 'Right'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1852
		['Left', 'Center'], ['Top', 'Center'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1853
		['Right', 'Center'], ['Bottom', 'Center']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1854
	],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1855
	function(parts, index) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1856
		var part = parts.join('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1857
		var xFirst = /^[RL]/.test(part);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1858
		if (index >= 4)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1859
			parts[1] += xFirst ? 'Y' : 'X';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1860
		var x = parts[xFirst ? 0 : 1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1861
			y = parts[xFirst ? 1 : 0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1862
			getX = 'get' + x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1863
			getY = 'get' + y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1864
			setX = 'set' + x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1865
			setY = 'set' + y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1866
			get = 'get' + part,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1867
			set = 'set' + part;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1868
		this[get] = function(_dontLink) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1869
			var ctor = _dontLink ? Point : LinkedPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1870
			return new ctor(this[getX](), this[getY](), this, set);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1871
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1872
		this[set] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1873
			var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1874
			this[setX](point.x);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1875
			this[setY](point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1876
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1877
	}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1878
		beans: true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1879
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1880
));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1881
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1882
var LinkedRectangle = Rectangle.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1883
	initialize: function Rectangle(x, y, width, height, owner, setter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1884
		this.set(x, y, width, height, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1885
		this._owner = owner;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1886
		this._setter = setter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1887
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1888
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1889
	set: function(x, y, width, height, _dontNotify) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1890
		this._x = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1891
		this._y = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1892
		this._width = width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1893
		this._height = height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1894
		if (!_dontNotify)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1895
			this._owner[this._setter](this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1896
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1897
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1898
}, new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1899
	var proto = Rectangle.prototype;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1900
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1901
	return Base.each(['x', 'y', 'width', 'height'], function(key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1902
		var part = Base.capitalize(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1903
		var internal = '_' + key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1904
		this['get' + part] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1905
			return this[internal];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1906
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1907
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1908
		this['set' + part] = function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1909
			this[internal] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1910
			if (!this._dontNotify)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1911
				this._owner[this._setter](this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1912
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1913
	}, Base.each(['Point', 'Size', 'Center',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1914
			'Left', 'Top', 'Right', 'Bottom', 'CenterX', 'CenterY',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1915
			'TopLeft', 'TopRight', 'BottomLeft', 'BottomRight',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1916
			'LeftCenter', 'TopCenter', 'RightCenter', 'BottomCenter'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1917
		function(key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1918
			var name = 'set' + key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1919
			this[name] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1920
				this._dontNotify = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1921
				proto[name].apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1922
				this._dontNotify = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1923
				this._owner[this._setter](this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1924
			};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1925
		}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1926
			isSelected: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1927
				return this._owner._boundsSelected;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1928
			},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1929
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1930
			setSelected: function(selected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1931
				var owner = this._owner;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1932
				if (owner.setSelected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1933
					owner._boundsSelected = selected;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1934
					owner.setSelected(selected || owner._selectedSegmentState > 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1935
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1936
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1937
		})
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1938
	);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1939
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1940
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1941
var Matrix = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1942
	_class: 'Matrix',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1943
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1944
	initialize: function Matrix(arg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1945
		var count = arguments.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1946
			ok = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1947
		if (count === 6) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1948
			this.set.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1949
		} else if (count === 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1950
			if (arg instanceof Matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1951
				this.set(arg._a, arg._c, arg._b, arg._d, arg._tx, arg._ty);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1952
			} else if (Array.isArray(arg)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1953
				this.set.apply(this, arg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1954
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1955
				ok = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1956
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1957
		} else if (count === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1958
			this.reset();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1959
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1960
			ok = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1961
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1962
		if (!ok)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1963
			throw new Error('Unsupported matrix parameters');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1964
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1965
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1966
	set: function(a, c, b, d, tx, ty, _dontNotify) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1967
		this._a = a;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1968
		this._c = c;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1969
		this._b = b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1970
		this._d = d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1971
		this._tx = tx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1972
		this._ty = ty;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1973
		if (!_dontNotify)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1974
			this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1975
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1976
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1977
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1978
	_serialize: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1979
		return Base.serialize(this.getValues(), options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1980
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1981
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1982
	_changed: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1983
		var owner = this._owner;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1984
		if (owner) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1985
			if (owner._applyMatrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1986
				owner.transform(null, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1987
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1988
				owner._changed(9);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1989
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1990
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1991
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1992
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1993
	clone: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1994
		return new Matrix(this._a, this._c, this._b, this._d,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1995
				this._tx, this._ty);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1996
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1997
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1998
	equals: function(mx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1999
		return mx === this || mx && this._a === mx._a && this._b === mx._b
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2000
				&& this._c === mx._c && this._d === mx._d
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2001
				&& this._tx === mx._tx && this._ty === mx._ty
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2002
				|| false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2003
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2004
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2005
	toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2006
		var f = Formatter.instance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2007
		return '[[' + [f.number(this._a), f.number(this._b),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2008
					f.number(this._tx)].join(', ') + '], ['
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2009
				+ [f.number(this._c), f.number(this._d),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2010
					f.number(this._ty)].join(', ') + ']]';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2011
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2012
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2013
	reset: function(_dontNotify) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2014
		this._a = this._d = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2015
		this._c = this._b = this._tx = this._ty = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2016
		if (!_dontNotify)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2017
			this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2018
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2019
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2020
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2021
	apply: function(recursively, _setApplyMatrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2022
		var owner = this._owner;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2023
		if (owner) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2024
			owner.transform(null, true, Base.pick(recursively, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2025
					_setApplyMatrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2026
			return this.isIdentity();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2027
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2028
		return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2029
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2030
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2031
	translate: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2032
		var point = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2033
			x = point.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2034
			y = point.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2035
		this._tx += x * this._a + y * this._b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2036
		this._ty += x * this._c + y * this._d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2037
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2038
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2039
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2040
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2041
	scale: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2042
		var scale = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2043
			center = Point.read(arguments, 0, { readNull: true });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2044
		if (center)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2045
			this.translate(center);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2046
		this._a *= scale.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2047
		this._c *= scale.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2048
		this._b *= scale.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2049
		this._d *= scale.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2050
		if (center)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2051
			this.translate(center.negate());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2052
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2053
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2054
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2055
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2056
	rotate: function(angle ) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2057
		angle *= Math.PI / 180;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2058
		var center = Point.read(arguments, 1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2059
			x = center.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2060
			y = center.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2061
			cos = Math.cos(angle),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2062
			sin = Math.sin(angle),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2063
			tx = x - x * cos + y * sin,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2064
			ty = y - x * sin - y * cos,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2065
			a = this._a,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2066
			b = this._b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2067
			c = this._c,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2068
			d = this._d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2069
		this._a = cos * a + sin * b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2070
		this._b = -sin * a + cos * b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2071
		this._c = cos * c + sin * d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2072
		this._d = -sin * c + cos * d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2073
		this._tx += tx * a + ty * b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2074
		this._ty += tx * c + ty * d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2075
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2076
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2077
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2078
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2079
	shear: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2080
		var shear = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2081
			center = Point.read(arguments, 0, { readNull: true });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2082
		if (center)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2083
			this.translate(center);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2084
		var a = this._a,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2085
			c = this._c;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2086
		this._a += shear.y * this._b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2087
		this._c += shear.y * this._d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2088
		this._b += shear.x * a;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2089
		this._d += shear.x * c;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2090
		if (center)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2091
			this.translate(center.negate());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2092
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2093
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2094
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2095
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2096
	skew: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2097
		var skew = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2098
			center = Point.read(arguments, 0, { readNull: true }),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2099
			toRadians = Math.PI / 180,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2100
			shear = new Point(Math.tan(skew.x * toRadians),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2101
				Math.tan(skew.y * toRadians));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2102
		return this.shear(shear, center);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2103
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2104
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2105
	concatenate: function(mx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2106
		var a1 = this._a,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2107
			b1 = this._b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2108
			c1 = this._c,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2109
			d1 = this._d,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2110
			a2 = mx._a,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2111
			b2 = mx._b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2112
			c2 = mx._c,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2113
			d2 = mx._d,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2114
			tx2 = mx._tx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2115
			ty2 = mx._ty;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2116
		this._a = a2 * a1 + c2 * b1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2117
		this._b = b2 * a1 + d2 * b1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2118
		this._c = a2 * c1 + c2 * d1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2119
		this._d = b2 * c1 + d2 * d1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2120
		this._tx += tx2 * a1 + ty2 * b1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2121
		this._ty += tx2 * c1 + ty2 * d1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2122
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2123
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2124
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2125
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2126
	preConcatenate: function(mx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2127
		var a1 = this._a,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2128
			b1 = this._b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2129
			c1 = this._c,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2130
			d1 = this._d,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2131
			tx1 = this._tx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2132
			ty1 = this._ty,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2133
			a2 = mx._a,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2134
			b2 = mx._b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2135
			c2 = mx._c,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2136
			d2 = mx._d,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2137
			tx2 = mx._tx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2138
			ty2 = mx._ty;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2139
		this._a = a2 * a1 + b2 * c1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2140
		this._b = a2 * b1 + b2 * d1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2141
		this._c = c2 * a1 + d2 * c1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2142
		this._d = c2 * b1 + d2 * d1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2143
		this._tx = a2 * tx1 + b2 * ty1 + tx2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2144
		this._ty = c2 * tx1 + d2 * ty1 + ty2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2145
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2146
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2147
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2148
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2149
	chain: function(mx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2150
		var a1 = this._a,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2151
			b1 = this._b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2152
			c1 = this._c,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2153
			d1 = this._d,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2154
			tx1 = this._tx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2155
			ty1 = this._ty,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2156
			a2 = mx._a,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2157
			b2 = mx._b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2158
			c2 = mx._c,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2159
			d2 = mx._d,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2160
			tx2 = mx._tx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2161
			ty2 = mx._ty;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2162
		return new Matrix(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2163
				a2 * a1 + c2 * b1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2164
				a2 * c1 + c2 * d1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2165
				b2 * a1 + d2 * b1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2166
				b2 * c1 + d2 * d1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2167
				tx1 + tx2 * a1 + ty2 * b1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2168
				ty1 + tx2 * c1 + ty2 * d1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2169
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2170
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2171
	isIdentity: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2172
		return this._a === 1 && this._c === 0 && this._b === 0 && this._d === 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2173
				&& this._tx === 0 && this._ty === 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2174
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2175
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2176
	orNullIfIdentity: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2177
		return this.isIdentity() ? null : this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2178
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2179
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2180
	isInvertible: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2181
		return !!this._getDeterminant();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2182
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2183
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2184
	isSingular: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2185
		return !this._getDeterminant();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2186
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2187
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2188
	transform: function( src, dst, count) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2189
		return arguments.length < 3
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2190
			? this._transformPoint(Point.read(arguments))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2191
			: this._transformCoordinates(src, dst, count);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2192
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2193
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2194
	_transformPoint: function(point, dest, _dontNotify) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2195
		var x = point.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2196
			y = point.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2197
		if (!dest)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2198
			dest = new Point();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2199
		return dest.set(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2200
			x * this._a + y * this._b + this._tx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2201
			x * this._c + y * this._d + this._ty,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2202
			_dontNotify
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2203
		);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2204
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2205
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2206
	_transformCoordinates: function(src, dst, count) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2207
		var i = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2208
			j = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2209
			max = 2 * count;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2210
		while (i < max) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2211
			var x = src[i++],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2212
				y = src[i++];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2213
			dst[j++] = x * this._a + y * this._b + this._tx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2214
			dst[j++] = x * this._c + y * this._d + this._ty;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2215
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2216
		return dst;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2217
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2218
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2219
	_transformCorners: function(rect) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2220
		var x1 = rect.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2221
			y1 = rect.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2222
			x2 = x1 + rect.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2223
			y2 = y1 + rect.height,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2224
			coords = [ x1, y1, x2, y1, x2, y2, x1, y2 ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2225
		return this._transformCoordinates(coords, coords, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2226
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2227
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2228
	_transformBounds: function(bounds, dest, _dontNotify) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2229
		var coords = this._transformCorners(bounds),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2230
			min = coords.slice(0, 2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2231
			max = coords.slice();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2232
		for (var i = 2; i < 8; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2233
			var val = coords[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2234
				j = i & 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2235
			if (val < min[j])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2236
				min[j] = val;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2237
			else if (val > max[j])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2238
				max[j] = val;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2239
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2240
		if (!dest)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2241
			dest = new Rectangle();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2242
		return dest.set(min[0], min[1], max[0] - min[0], max[1] - min[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2243
				_dontNotify);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2244
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2245
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2246
	inverseTransform: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2247
		return this._inverseTransform(Point.read(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2248
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2249
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2250
	_getDeterminant: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2251
		var det = this._a * this._d - this._b * this._c;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2252
		return isFinite(det) && !Numerical.isZero(det)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2253
				&& isFinite(this._tx) && isFinite(this._ty)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2254
				? det : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2255
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2256
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2257
	_inverseTransform: function(point, dest, _dontNotify) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2258
		var det = this._getDeterminant();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2259
		if (!det)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2260
			return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2261
		var x = point.x - this._tx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2262
			y = point.y - this._ty;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2263
		if (!dest)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2264
			dest = new Point();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2265
		return dest.set(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2266
			(x * this._d - y * this._b) / det,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2267
			(y * this._a - x * this._c) / det,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2268
			_dontNotify
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2269
		);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2270
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2271
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2272
	decompose: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2273
		var a = this._a, b = this._b, c = this._c, d = this._d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2274
		if (Numerical.isZero(a * d - b * c))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2275
			return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2276
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2277
		var scaleX = Math.sqrt(a * a + b * b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2278
		a /= scaleX;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2279
		b /= scaleX;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2280
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2281
		var shear = a * c + b * d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2282
		c -= a * shear;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2283
		d -= b * shear;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2284
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2285
		var scaleY = Math.sqrt(c * c + d * d);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2286
		c /= scaleY;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2287
		d /= scaleY;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2288
		shear /= scaleY;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2289
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2290
		if (a * d < b * c) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2291
			a = -a;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2292
			b = -b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2293
			shear = -shear;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2294
			scaleX = -scaleX;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2295
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2296
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2297
		return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2298
			scaling: new Point(scaleX, scaleY),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2299
			rotation: -Math.atan2(b, a) * 180 / Math.PI,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2300
			shearing: shear
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2301
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2302
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2303
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2304
	getValues: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2305
		return [ this._a, this._c, this._b, this._d, this._tx, this._ty ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2306
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2307
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2308
	getTranslation: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2309
		return new Point(this._tx, this._ty);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2310
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2311
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2312
	getScaling: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2313
		return (this.decompose() || {}).scaling;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2314
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2315
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2316
	getRotation: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2317
		return (this.decompose() || {}).rotation;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2318
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2319
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2320
	inverted: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2321
		var det = this._getDeterminant();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2322
		return det && new Matrix(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2323
				this._d / det,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2324
				-this._c / det,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2325
				-this._b / det,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2326
				this._a / det,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2327
				(this._b * this._ty - this._d * this._tx) / det,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2328
				(this._c * this._tx - this._a * this._ty) / det);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2329
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2330
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2331
	shiftless: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2332
		return new Matrix(this._a, this._c, this._b, this._d, 0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2333
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2334
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2335
	applyToContext: function(ctx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2336
		ctx.transform(this._a, this._c, this._b, this._d, this._tx, this._ty);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2337
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2338
}, Base.each(['a', 'c', 'b', 'd', 'tx', 'ty'], function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2339
	var part = Base.capitalize(name),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2340
		prop = '_' + name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2341
	this['get' + part] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2342
		return this[prop];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2343
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2344
	this['set' + part] = function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2345
		this[prop] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2346
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2347
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2348
}, {}));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2349
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2350
var Line = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2351
	_class: 'Line',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2352
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2353
	initialize: function Line(arg0, arg1, arg2, arg3, arg4) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2354
		var asVector = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2355
		if (arguments.length >= 4) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2356
			this._px = arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2357
			this._py = arg1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2358
			this._vx = arg2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2359
			this._vy = arg3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2360
			asVector = arg4;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2361
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2362
			this._px = arg0.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2363
			this._py = arg0.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2364
			this._vx = arg1.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2365
			this._vy = arg1.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2366
			asVector = arg2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2367
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2368
		if (!asVector) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2369
			this._vx -= this._px;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2370
			this._vy -= this._py;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2371
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2372
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2373
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2374
	getPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2375
		return new Point(this._px, this._py);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2376
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2377
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2378
	getVector: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2379
		return new Point(this._vx, this._vy);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2380
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2381
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2382
	getLength: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2383
		return this.getVector().getLength();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2384
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2385
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2386
	intersect: function(line, isInfinite) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2387
		return Line.intersect(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2388
				this._px, this._py, this._vx, this._vy,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2389
				line._px, line._py, line._vx, line._vy,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2390
				true, isInfinite);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2391
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2392
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2393
	getSide: function(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2394
		return Line.getSide(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2395
				this._px, this._py, this._vx, this._vy,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2396
				point.x, point.y, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2397
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2398
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2399
	getDistance: function(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2400
		return Math.abs(Line.getSignedDistance(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2401
				this._px, this._py, this._vx, this._vy,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2402
				point.x, point.y, true));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2403
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2404
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2405
	statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2406
		intersect: function(apx, apy, avx, avy, bpx, bpy, bvx, bvy, asVector,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2407
				isInfinite) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2408
			if (!asVector) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2409
				avx -= apx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2410
				avy -= apy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2411
				bvx -= bpx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2412
				bvy -= bpy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2413
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2414
			var cross = avx * bvy - avy * bvx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2415
			if (!Numerical.isZero(cross)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2416
				var dx = apx - bpx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2417
					dy = apy - bpy,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2418
					ta = (bvx * dy - bvy * dx) / cross,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2419
					tb = (avx * dy - avy * dx) / cross;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2420
				if (isInfinite || 0 <= ta && ta <= 1 && 0 <= tb && tb <= 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2421
					return new Point(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2422
								apx + ta * avx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2423
								apy + ta * avy);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2424
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2425
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2426
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2427
		getSide: function(px, py, vx, vy, x, y, asVector) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2428
			if (!asVector) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2429
				vx -= px;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2430
				vy -= py;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2431
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2432
			var v2x = x - px,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2433
				v2y = y - py,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2434
				ccw = v2x * vy - v2y * vx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2435
			if (ccw === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2436
				ccw = v2x * vx + v2y * vy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2437
				if (ccw > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2438
					v2x -= vx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2439
					v2y -= vy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2440
					ccw = v2x * vx + v2y * vy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2441
					if (ccw < 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2442
						ccw = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2443
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2444
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2445
			return ccw < 0 ? -1 : ccw > 0 ? 1 : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2446
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2447
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2448
		getSignedDistance: function(px, py, vx, vy, x, y, asVector) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2449
			if (!asVector) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2450
				vx -= px;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2451
				vy -= py;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2452
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2453
			return Numerical.isZero(vx)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2454
					? vy >= 0 ? px - x : x - px
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2455
					: Numerical.isZero(vy)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2456
						? vx >= 0 ? y - py : py - y
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2457
						: (vx * (y - py) - vy * (x - px)) / Math.sqrt(vx * vx + vy * vy);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2458
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2459
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2460
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2461
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2462
var Project = PaperScopeItem.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2463
	_class: 'Project',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2464
	_list: 'projects',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2465
	_reference: 'project',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2466
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2467
	initialize: function Project(element) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2468
		PaperScopeItem.call(this, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2469
		this.layers = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2470
		this._activeLayer = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2471
		this.symbols = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2472
		this._currentStyle = new Style(null, null, this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2473
		this._view = View.create(this,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2474
				element || CanvasProvider.getCanvas(1, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2475
		this._selectedItems = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2476
		this._selectedItemCount = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2477
		this._updateVersion = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2478
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2479
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2480
	_serialize: function(options, dictionary) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2481
		return Base.serialize(this.layers, options, true, dictionary);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2482
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2483
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2484
	clear: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2485
		for (var i = this.layers.length - 1; i >= 0; i--)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2486
			this.layers[i].remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2487
		this.symbols = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2488
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2489
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2490
	isEmpty: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2491
		return this.layers.length === 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2492
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2493
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2494
	remove: function remove() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2495
		if (!remove.base.call(this))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2496
			return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2497
		if (this._view)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2498
			this._view.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2499
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2500
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2501
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2502
	getView: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2503
		return this._view;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2504
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2505
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2506
	getCurrentStyle: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2507
		return this._currentStyle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2508
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2509
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2510
	setCurrentStyle: function(style) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2511
		this._currentStyle.initialize(style);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2512
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2513
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2514
	getIndex: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2515
		return this._index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2516
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2517
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2518
	getOptions: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2519
		return this._scope.settings;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2520
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2521
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2522
	getActiveLayer: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2523
		return this._activeLayer || new Layer({ project: this });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2524
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2525
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2526
	getSelectedItems: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2527
		var items = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2528
		for (var id in this._selectedItems) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2529
			var item = this._selectedItems[id];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2530
			if (item.isInserted())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2531
				items.push(item);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2532
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2533
		return items;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2534
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2535
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2536
	insertChild: function(index, item, _preserve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2537
		if (item instanceof Layer) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2538
			item._remove(false, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2539
			Base.splice(this.layers, [item], index, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2540
			item._setProject(this, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2541
			if (this._changes)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2542
				item._changed(5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2543
			if (!this._activeLayer)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2544
				this._activeLayer = item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2545
		} else if (item instanceof Item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2546
			(this._activeLayer
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2547
				|| this.insertChild(index, new Layer(Item.NO_INSERT)))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2548
					.insertChild(index, item, _preserve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2549
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2550
			item = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2551
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2552
		return item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2553
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2554
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2555
	addChild: function(item, _preserve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2556
		return this.insertChild(undefined, item, _preserve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2557
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2558
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2559
	_updateSelection: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2560
		var id = item._id,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2561
			selectedItems = this._selectedItems;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2562
		if (item._selected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2563
			if (selectedItems[id] !== item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2564
				this._selectedItemCount++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2565
				selectedItems[id] = item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2566
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2567
		} else if (selectedItems[id] === item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2568
			this._selectedItemCount--;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2569
			delete selectedItems[id];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2570
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2571
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2572
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2573
	selectAll: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2574
		var layers = this.layers;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2575
		for (var i = 0, l = layers.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2576
			layers[i].setFullySelected(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2577
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2578
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2579
	deselectAll: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2580
		var selectedItems = this._selectedItems;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2581
		for (var i in selectedItems)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2582
			selectedItems[i].setFullySelected(false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2583
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2584
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2585
	hitTest: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2586
		var point = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2587
			options = HitResult.getOptions(Base.read(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2588
		for (var i = this.layers.length - 1; i >= 0; i--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2589
			var res = this.layers[i]._hitTest(point, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2590
			if (res) return res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2591
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2592
		return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2593
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2594
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2595
	getItems: function(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2596
		return Item._getItems(this.layers, match);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2597
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2598
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2599
	getItem: function(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2600
		return Item._getItems(this.layers, match, null, null, true)[0] || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2601
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2602
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2603
	importJSON: function(json) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2604
		this.activate();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2605
		var layer = this._activeLayer;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2606
		return Base.importJSON(json, layer && layer.isEmpty() && layer);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2607
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2608
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2609
	draw: function(ctx, matrix, pixelRatio) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2610
		this._updateVersion++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2611
		ctx.save();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2612
		matrix.applyToContext(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2613
		var param = new Base({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2614
			offset: new Point(0, 0),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2615
			pixelRatio: pixelRatio,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2616
			viewMatrix: matrix.isIdentity() ? null : matrix,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2617
			matrices: [new Matrix()],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2618
			updateMatrix: true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2619
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2620
		for (var i = 0, layers = this.layers, l = layers.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2621
			layers[i].draw(ctx, param);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2622
		ctx.restore();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2623
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2624
		if (this._selectedItemCount > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2625
			ctx.save();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2626
			ctx.strokeWidth = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2627
			var items = this._selectedItems,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2628
				size = this._scope.settings.handleSize,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2629
				version = this._updateVersion;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2630
			for (var id in items)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2631
				items[id]._drawSelection(ctx, matrix, size, items, version);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2632
			ctx.restore();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2633
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2634
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2635
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2636
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2637
var Symbol = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2638
	_class: 'Symbol',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2639
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2640
	initialize: function Symbol(item, dontCenter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2641
		this._id = Symbol._id = (Symbol._id || 0) + 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2642
		this.project = paper.project;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2643
		this.project.symbols.push(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2644
		if (item)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2645
			this.setDefinition(item, dontCenter);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2646
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2647
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2648
	_serialize: function(options, dictionary) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2649
		return dictionary.add(this, function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2650
			return Base.serialize([this._class, this._definition],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2651
					options, false, dictionary);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2652
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2653
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2654
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2655
	_changed: function(flags) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2656
		if (flags & 8) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2657
			Item._clearBoundsCache(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2658
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2659
		if (flags & 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2660
			this.project._needsUpdate = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2661
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2662
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2663
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2664
	getDefinition: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2665
		return this._definition;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2666
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2667
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2668
	setDefinition: function(item, _dontCenter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2669
		if (item._parentSymbol)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2670
			item = item.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2671
		if (this._definition)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2672
			this._definition._parentSymbol = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2673
		this._definition = item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2674
		item.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2675
		item.setSelected(false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2676
		if (!_dontCenter)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2677
			item.setPosition(new Point());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2678
		item._parentSymbol = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2679
		this._changed(9);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2680
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2681
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2682
	place: function(position) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2683
		return new PlacedSymbol(this, position);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2684
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2685
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2686
	clone: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2687
		return new Symbol(this._definition.clone(false));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2688
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2689
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2690
	equals: function(symbol) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2691
		return symbol === this
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2692
				|| symbol && this.definition.equals(symbol.definition)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2693
				|| false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2694
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2695
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2696
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2697
var Item = Base.extend(Emitter, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2698
	statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2699
		extend: function extend(src) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2700
			if (src._serializeFields)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2701
				src._serializeFields = new Base(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2702
						this.prototype._serializeFields, src._serializeFields);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2703
			return extend.base.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2704
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2705
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2706
		NO_INSERT: { insert: false }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2707
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2708
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2709
	_class: 'Item',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2710
	_applyMatrix: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2711
	_canApplyMatrix: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2712
	_boundsSelected: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2713
	_selectChildren: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2714
	_serializeFields: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2715
		name: null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2716
		applyMatrix: null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2717
		matrix: new Matrix(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2718
		pivot: null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2719
		locked: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2720
		visible: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2721
		blendMode: 'normal',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2722
		opacity: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2723
		guide: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2724
		selected: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2725
		clipMask: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2726
		data: {}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2727
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2728
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2729
	initialize: function Item() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2730
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2731
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2732
	_initialize: function(props, point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2733
		var hasProps = props && Base.isPlainObject(props),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2734
			internal = hasProps && props.internal === true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2735
			matrix = this._matrix = new Matrix(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2736
			project = hasProps && props.project || paper.project;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2737
		if (!internal)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2738
			this._id = Item._id = (Item._id || 0) + 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2739
		this._applyMatrix = this._canApplyMatrix && paper.settings.applyMatrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2740
		if (point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2741
			matrix.translate(point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2742
		matrix._owner = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2743
		this._style = new Style(project._currentStyle, this, project);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2744
		if (!this._project) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2745
			if (internal || hasProps && props.insert === false) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2746
				this._setProject(project);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2747
			} else if (hasProps && props.parent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2748
				this.setParent(props.parent);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2749
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2750
				(project._activeLayer || new Layer()).addChild(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2751
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2752
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2753
		if (hasProps && props !== Item.NO_INSERT)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2754
			this._set(props, { insert: true, parent: true }, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2755
		return hasProps;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2756
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2757
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2758
	_events: new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2759
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2760
		var mouseFlags = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2761
			mousedown: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2762
				mousedown: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2763
				mousedrag: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2764
				click: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2765
				doubleclick: 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2766
			},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2767
			mouseup: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2768
				mouseup: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2769
				mousedrag: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2770
				click: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2771
				doubleclick: 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2772
			},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2773
			mousemove: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2774
				mousedrag: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2775
				mousemove: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2776
				mouseenter: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2777
				mouseleave: 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2778
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2779
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2780
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2781
		var mouseEvent = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2782
			install: function(type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2783
				var counters = this.getView()._eventCounters;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2784
				if (counters) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2785
					for (var key in mouseFlags) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2786
						counters[key] = (counters[key] || 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2787
								+ (mouseFlags[key][type] || 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2788
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2789
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2790
			},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2791
			uninstall: function(type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2792
				var counters = this.getView()._eventCounters;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2793
				if (counters) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2794
					for (var key in mouseFlags)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2795
						counters[key] -= mouseFlags[key][type] || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2796
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2797
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2798
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2799
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2800
		return Base.each(['onMouseDown', 'onMouseUp', 'onMouseDrag', 'onClick',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2801
			'onDoubleClick', 'onMouseMove', 'onMouseEnter', 'onMouseLeave'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2802
			function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2803
				this[name] = mouseEvent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2804
			}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2805
				onFrame: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2806
					install: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2807
						this._animateItem(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2808
					},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2809
					uninstall: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2810
						this._animateItem(false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2811
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2812
				},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2813
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2814
				onLoad: {}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2815
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2816
		);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2817
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2818
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2819
	_animateItem: function(animate) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2820
		this.getView()._animateItem(this, animate);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2821
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2822
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2823
	_serialize: function(options, dictionary) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2824
		var props = {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2825
			that = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2826
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2827
		function serialize(fields) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2828
			for (var key in fields) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2829
				var value = that[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2830
				if (!Base.equals(value, key === 'leading'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2831
						? fields.fontSize * 1.2 : fields[key])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2832
					props[key] = Base.serialize(value, options,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2833
							key !== 'data', dictionary);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2834
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2835
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2836
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2837
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2838
		serialize(this._serializeFields);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2839
		if (!(this instanceof Group))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2840
			serialize(this._style._defaults);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2841
		return [ this._class, props ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2842
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2843
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2844
	_changed: function(flags) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2845
		var symbol = this._parentSymbol,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2846
			cacheParent = this._parent || symbol,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2847
			project = this._project;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2848
		if (flags & 8) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2849
			this._bounds = this._position = this._decomposed =
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2850
					this._globalMatrix = this._currentPath = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2851
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2852
		if (cacheParent
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2853
				&& (flags & 40)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2854
			Item._clearBoundsCache(cacheParent);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2855
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2856
		if (flags & 2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2857
			Item._clearBoundsCache(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2858
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2859
		if (project) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2860
			if (flags & 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2861
				project._needsUpdate = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2862
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2863
			if (project._changes) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2864
				var entry = project._changesById[this._id];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2865
				if (entry) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2866
					entry.flags |= flags;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2867
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2868
					entry = { item: this, flags: flags };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2869
					project._changesById[this._id] = entry;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2870
					project._changes.push(entry);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2871
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2872
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2873
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2874
		if (symbol)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2875
			symbol._changed(flags);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2876
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2877
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2878
	set: function(props) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2879
		if (props)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2880
			this._set(props);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2881
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2882
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2883
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2884
	getId: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2885
		return this._id;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2886
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2887
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2888
	getName: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2889
		return this._name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2890
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2891
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2892
	setName: function(name, unique) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2893
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2894
		if (this._name)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2895
			this._removeNamed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2896
		if (name === (+name) + '')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2897
			throw new Error(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2898
					'Names consisting only of numbers are not supported.');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2899
		var parent = this._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2900
		if (name && parent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2901
			var children = parent._children,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2902
				namedChildren = parent._namedChildren,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2903
				orig = name,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2904
				i = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2905
			while (unique && children[name])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2906
				name = orig + ' ' + (i++);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2907
			(namedChildren[name] = namedChildren[name] || []).push(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2908
			children[name] = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2909
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2910
		this._name = name || undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2911
		this._changed(128);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2912
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2913
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2914
	getStyle: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2915
		return this._style;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2916
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2917
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2918
	setStyle: function(style) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2919
		this.getStyle().set(style);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2920
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2921
}, Base.each(['locked', 'visible', 'blendMode', 'opacity', 'guide'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2922
	function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2923
		var part = Base.capitalize(name),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2924
			name = '_' + name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2925
		this['get' + part] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2926
			return this[name];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2927
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2928
		this['set' + part] = function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2929
			if (value != this[name]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2930
				this[name] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2931
				this._changed(name === '_locked'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2932
						? 128 : 129);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2933
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2934
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2935
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2936
{}), {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2937
	beans: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2938
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2939
	_locked: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2940
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2941
	_visible: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2942
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2943
	_blendMode: 'normal',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2944
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2945
	_opacity: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2946
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2947
	_guide: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2948
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2949
	isSelected: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2950
		if (this._selectChildren) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2951
			var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2952
			for (var i = 0, l = children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2953
				if (children[i].isSelected())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2954
					return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2955
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2956
		return this._selected;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2957
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2958
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2959
	setSelected: function(selected, noChildren) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2960
		if (!noChildren && this._selectChildren) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2961
			var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2962
			for (var i = 0, l = children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2963
				children[i].setSelected(selected);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2964
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2965
		if ((selected = !!selected) ^ this._selected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2966
			this._selected = selected;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2967
			this._project._updateSelection(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2968
			this._changed(129);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2969
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2970
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2971
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2972
	_selected: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2973
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2974
	isFullySelected: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2975
		var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2976
		if (children && this._selected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2977
			for (var i = 0, l = children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2978
				if (!children[i].isFullySelected())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2979
					return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2980
			return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2981
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2982
		return this._selected;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2983
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2984
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2985
	setFullySelected: function(selected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2986
		var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2987
		if (children) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2988
			for (var i = 0, l = children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2989
				children[i].setFullySelected(selected);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2990
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2991
		this.setSelected(selected, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2992
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2993
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2994
	isClipMask: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2995
		return this._clipMask;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2996
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2997
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2998
	setClipMask: function(clipMask) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  2999
		if (this._clipMask != (clipMask = !!clipMask)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3000
			this._clipMask = clipMask;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3001
			if (clipMask) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3002
				this.setFillColor(null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3003
				this.setStrokeColor(null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3004
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3005
			this._changed(129);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3006
			if (this._parent)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3007
				this._parent._changed(1024);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3008
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3009
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3010
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3011
	_clipMask: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3012
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3013
	getData: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3014
		if (!this._data)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3015
			this._data = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3016
		return this._data;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3017
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3018
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3019
	setData: function(data) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3020
		this._data = data;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3021
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3022
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3023
	getPosition: function(_dontLink) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3024
		var position = this._position,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3025
			ctor = _dontLink ? Point : LinkedPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3026
		if (!position) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3027
			var pivot = this._pivot;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3028
			position = this._position = pivot
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3029
					? this._matrix._transformPoint(pivot)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3030
					: this.getBounds().getCenter(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3031
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3032
		return new ctor(position.x, position.y, this, 'setPosition');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3033
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3034
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3035
	setPosition: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3036
		this.translate(Point.read(arguments).subtract(this.getPosition(true)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3037
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3038
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3039
	getPivot: function(_dontLink) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3040
		var pivot = this._pivot;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3041
		if (pivot) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3042
			var ctor = _dontLink ? Point : LinkedPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3043
			pivot = new ctor(pivot.x, pivot.y, this, 'setPivot');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3044
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3045
		return pivot;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3046
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3047
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3048
	setPivot: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3049
		this._pivot = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3050
		this._position = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3051
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3052
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3053
	_pivot: null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3054
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3055
	getRegistration: '#getPivot',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3056
	setRegistration: '#setPivot'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3057
}, Base.each(['bounds', 'strokeBounds', 'handleBounds', 'roughBounds',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3058
		'internalBounds', 'internalRoughBounds'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3059
	function(key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3060
		var getter = 'get' + Base.capitalize(key),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3061
			match = key.match(/^internal(.*)$/),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3062
			internalGetter = match ? 'get' + match[1] : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3063
		this[getter] = function(_matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3064
			var boundsGetter = this._boundsGetter,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3065
				name = !internalGetter && (typeof boundsGetter === 'string'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3066
						? boundsGetter : boundsGetter && boundsGetter[getter])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3067
						|| getter,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3068
				bounds = this._getCachedBounds(name, _matrix, this,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3069
						internalGetter);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3070
			return key === 'bounds'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3071
					? new LinkedRectangle(bounds.x, bounds.y, bounds.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3072
							bounds.height, this, 'setBounds')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3073
					: bounds;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3074
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3075
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3076
{
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3077
	beans: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3078
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3079
	_getBounds: function(getter, matrix, cacheItem) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3080
		var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3081
		if (!children || children.length == 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3082
			return new Rectangle();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3083
		var x1 = Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3084
			x2 = -x1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3085
			y1 = x1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3086
			y2 = x2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3087
		for (var i = 0, l = children.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3088
			var child = children[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3089
			if (child._visible && !child.isEmpty()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3090
				var rect = child._getCachedBounds(getter,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3091
						matrix && matrix.chain(child._matrix), cacheItem);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3092
				x1 = Math.min(rect.x, x1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3093
				y1 = Math.min(rect.y, y1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3094
				x2 = Math.max(rect.x + rect.width, x2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3095
				y2 = Math.max(rect.y + rect.height, y2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3096
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3097
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3098
		return isFinite(x1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3099
				? new Rectangle(x1, y1, x2 - x1, y2 - y1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3100
				: new Rectangle();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3101
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3102
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3103
	setBounds: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3104
		var rect = Rectangle.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3105
			bounds = this.getBounds(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3106
			matrix = new Matrix(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3107
			center = rect.getCenter();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3108
		matrix.translate(center);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3109
		if (rect.width != bounds.width || rect.height != bounds.height) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3110
			matrix.scale(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3111
					bounds.width != 0 ? rect.width / bounds.width : 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3112
					bounds.height != 0 ? rect.height / bounds.height : 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3113
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3114
		center = bounds.getCenter();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3115
		matrix.translate(-center.x, -center.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3116
		this.transform(matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3117
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3118
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3119
	_getCachedBounds: function(getter, matrix, cacheItem, internalGetter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3120
		matrix = matrix && matrix.orNullIfIdentity();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3121
		var _matrix = internalGetter ? null : this._matrix.orNullIfIdentity(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3122
			cache = (!matrix || matrix.equals(_matrix)) && getter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3123
		var cacheParent = this._parent || this._parentSymbol;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3124
		if (cacheParent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3125
			var id = cacheItem._id,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3126
				ref = cacheParent._boundsCache = cacheParent._boundsCache || {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3127
					ids: {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3128
					list: []
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3129
				};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3130
			if (!ref.ids[id]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3131
				ref.list.push(cacheItem);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3132
				ref.ids[id] = cacheItem;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3133
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3134
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3135
		if (cache && this._bounds && this._bounds[cache])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3136
			return this._bounds[cache].clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3137
		var bounds = this._getBounds(internalGetter || getter,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3138
				matrix || _matrix, cacheItem);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3139
		if (cache) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3140
			if (!this._bounds)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3141
				this._bounds = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3142
			var cached = this._bounds[cache] = bounds.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3143
			cached._internal = !!internalGetter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3144
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3145
		return bounds;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3146
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3147
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3148
	statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3149
		_clearBoundsCache: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3150
			var cache = item._boundsCache;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3151
			if (cache) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3152
				item._bounds = item._position = item._boundsCache = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3153
				for (var i = 0, list = cache.list, l = list.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3154
					var other = list[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3155
					if (other !== item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3156
						other._bounds = other._position = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3157
						if (other._boundsCache)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3158
							Item._clearBoundsCache(other);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3159
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3160
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3161
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3162
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3163
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3164
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3165
}), {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3166
	beans: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3167
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3168
	_decompose: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3169
		return this._decomposed = this._matrix.decompose();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3170
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3171
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3172
	getRotation: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3173
		var decomposed = this._decomposed || this._decompose();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3174
		return decomposed && decomposed.rotation;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3175
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3176
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3177
	setRotation: function(rotation) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3178
		var current = this.getRotation();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3179
		if (current != null && rotation != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3180
			var decomposed = this._decomposed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3181
			this.rotate(rotation - current);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3182
			decomposed.rotation = rotation;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3183
			this._decomposed = decomposed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3184
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3185
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3186
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3187
	getScaling: function(_dontLink) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3188
		var decomposed = this._decomposed || this._decompose(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3189
			scaling = decomposed && decomposed.scaling,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3190
			ctor = _dontLink ? Point : LinkedPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3191
		return scaling && new ctor(scaling.x, scaling.y, this, 'setScaling');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3192
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3193
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3194
	setScaling: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3195
		var current = this.getScaling();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3196
		if (current) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3197
			var scaling = Point.read(arguments, 0, { clone: true }),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3198
				decomposed = this._decomposed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3199
			this.scale(scaling.x / current.x, scaling.y / current.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3200
			decomposed.scaling = scaling;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3201
			this._decomposed = decomposed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3202
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3203
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3204
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3205
	getMatrix: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3206
		return this._matrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3207
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3208
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3209
	setMatrix: function(matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3210
		this._matrix.initialize(matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3211
		if (this._applyMatrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3212
			this.transform(null, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3213
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3214
			this._changed(9);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3215
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3216
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3217
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3218
	getGlobalMatrix: function(_dontClone) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3219
		var matrix = this._globalMatrix,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3220
			updateVersion = this._project._updateVersion;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3221
		if (matrix && matrix._updateVersion !== updateVersion)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3222
			matrix = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3223
		if (!matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3224
			matrix = this._globalMatrix = this._matrix.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3225
			var parent = this._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3226
			if (parent)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3227
				matrix.preConcatenate(parent.getGlobalMatrix(true));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3228
			matrix._updateVersion = updateVersion;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3229
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3230
		return _dontClone ? matrix : matrix.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3231
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3232
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3233
	getApplyMatrix: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3234
		return this._applyMatrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3235
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3236
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3237
	setApplyMatrix: function(apply) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3238
		if (this._applyMatrix = this._canApplyMatrix && !!apply)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3239
			this.transform(null, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3240
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3241
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3242
	getTransformContent: '#getApplyMatrix',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3243
	setTransformContent: '#setApplyMatrix',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3244
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3245
	getProject: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3246
		return this._project;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3247
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3248
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3249
	_setProject: function(project, installEvents) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3250
		if (this._project !== project) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3251
			if (this._project)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3252
				this._installEvents(false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3253
			this._project = project;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3254
			var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3255
			for (var i = 0, l = children && children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3256
				children[i]._setProject(project);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3257
			installEvents = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3258
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3259
		if (installEvents)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3260
			this._installEvents(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3261
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3262
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3263
	getView: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3264
		return this._project.getView();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3265
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3266
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3267
	_installEvents: function _installEvents(install) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3268
		_installEvents.base.call(this, install);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3269
		var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3270
		for (var i = 0, l = children && children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3271
			children[i]._installEvents(install);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3272
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3273
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3274
	getLayer: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3275
		var parent = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3276
		while (parent = parent._parent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3277
			if (parent instanceof Layer)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3278
				return parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3279
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3280
		return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3281
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3282
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3283
	getParent: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3284
		return this._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3285
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3286
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3287
	setParent: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3288
		return item.addChild(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3289
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3290
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3291
	getChildren: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3292
		return this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3293
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3294
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3295
	setChildren: function(items) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3296
		this.removeChildren();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3297
		this.addChildren(items);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3298
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3299
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3300
	getFirstChild: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3301
		return this._children && this._children[0] || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3302
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3303
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3304
	getLastChild: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3305
		return this._children && this._children[this._children.length - 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3306
				|| null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3307
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3308
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3309
	getNextSibling: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3310
		return this._parent && this._parent._children[this._index + 1] || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3311
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3312
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3313
	getPreviousSibling: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3314
		return this._parent && this._parent._children[this._index - 1] || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3315
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3316
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3317
	getIndex: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3318
		return this._index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3319
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3320
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3321
	equals: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3322
		return item === this || item && this._class === item._class
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3323
				&& this._style.equals(item._style)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3324
				&& this._matrix.equals(item._matrix)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3325
				&& this._locked === item._locked
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3326
				&& this._visible === item._visible
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3327
				&& this._blendMode === item._blendMode
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3328
				&& this._opacity === item._opacity
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3329
				&& this._clipMask === item._clipMask
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3330
				&& this._guide === item._guide
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3331
				&& this._equals(item)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3332
				|| false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3333
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3334
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3335
	_equals: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3336
		return Base.equals(this._children, item._children);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3337
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3338
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3339
	clone: function(insert) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3340
		return this._clone(new this.constructor(Item.NO_INSERT), insert);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3341
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3342
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3343
	_clone: function(copy, insert) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3344
		copy.setStyle(this._style);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3345
		if (this._children) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3346
			for (var i = 0, l = this._children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3347
				copy.addChild(this._children[i].clone(false), true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3348
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3349
		if (insert || insert === undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3350
			copy.insertAbove(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3351
		var keys = ['_locked', '_visible', '_blendMode', '_opacity',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3352
				'_clipMask', '_guide', '_applyMatrix'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3353
		for (var i = 0, l = keys.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3354
			var key = keys[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3355
			if (this.hasOwnProperty(key))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3356
				copy[key] = this[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3357
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3358
		copy._matrix.initialize(this._matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3359
		copy._data = this._data ? Base.clone(this._data) : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3360
		copy.setSelected(this._selected);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3361
		if (this._name)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3362
			copy.setName(this._name, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3363
		return copy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3364
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3365
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3366
	copyTo: function(itemOrProject) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3367
		return itemOrProject.addChild(this.clone(false));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3368
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3369
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3370
	rasterize: function(resolution) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3371
		var bounds = this.getStrokeBounds(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3372
			scale = (resolution || this.getView().getResolution()) / 72,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3373
			topLeft = bounds.getTopLeft().floor(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3374
			bottomRight = bounds.getBottomRight().ceil(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3375
			size = new Size(bottomRight.subtract(topLeft)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3376
			canvas = CanvasProvider.getCanvas(size.multiply(scale)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3377
			ctx = canvas.getContext('2d'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3378
			matrix = new Matrix().scale(scale).translate(topLeft.negate());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3379
		ctx.save();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3380
		matrix.applyToContext(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3381
		this.draw(ctx, new Base({ matrices: [matrix] }));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3382
		ctx.restore();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3383
		var raster = new Raster(Item.NO_INSERT);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3384
		raster.setCanvas(canvas);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3385
		raster.transform(new Matrix().translate(topLeft.add(size.divide(2)))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3386
				.scale(1 / scale));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3387
		raster.insertAbove(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3388
		return raster;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3389
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3390
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3391
	contains: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3392
		return !!this._contains(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3393
				this._matrix._inverseTransform(Point.read(arguments)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3394
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3395
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3396
	_contains: function(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3397
		if (this._children) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3398
			for (var i = this._children.length - 1; i >= 0; i--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3399
				if (this._children[i].contains(point))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3400
					return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3401
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3402
			return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3403
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3404
		return point.isInside(this.getInternalBounds());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3405
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3406
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3407
	isInside: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3408
		return Rectangle.read(arguments).contains(this.getBounds());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3409
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3410
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3411
	_asPathItem: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3412
		return new Path.Rectangle({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3413
			rectangle: this.getInternalBounds(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3414
			matrix: this._matrix,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3415
			insert: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3416
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3417
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3418
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3419
	intersects: function(item, _matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3420
		if (!(item instanceof Item))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3421
			return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3422
		return this._asPathItem().getIntersections(item._asPathItem(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3423
				_matrix || item._matrix).length > 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3424
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3425
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3426
	hitTest: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3427
		return this._hitTest(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3428
				Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3429
				HitResult.getOptions(Base.read(arguments)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3430
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3431
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3432
	_hitTest: function(point, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3433
		if (this._locked || !this._visible || this._guide && !options.guides
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3434
				|| this.isEmpty())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3435
			return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3436
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3437
		var matrix = this._matrix,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3438
			parentTotalMatrix = options._totalMatrix,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3439
			view = this.getView(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3440
			totalMatrix = options._totalMatrix = parentTotalMatrix
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3441
					? parentTotalMatrix.chain(matrix)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3442
					: this.getGlobalMatrix().preConcatenate(view._matrix),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3443
			tolerancePadding = options._tolerancePadding = new Size(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3444
						Path._getPenPadding(1, totalMatrix.inverted())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3445
					).multiply(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3446
						Math.max(options.tolerance, 0.000001)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3447
					);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3448
		point = matrix._inverseTransform(point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3449
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3450
		if (!this._children && !this.getInternalRoughBounds()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3451
				.expand(tolerancePadding.multiply(2))._containsPoint(point))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3452
			return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3453
		var checkSelf = !(options.guides && !this._guide
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3454
				|| options.selected && !this._selected
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3455
				|| options.type && options.type !== Base.hyphenate(this._class)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3456
				|| options.class && !(this instanceof options.class)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3457
			that = this,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3458
			res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3459
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3460
		function checkBounds(type, part) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3461
			var pt = bounds['get' + part]();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3462
			if (point.subtract(pt).divide(tolerancePadding).length <= 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3463
				return new HitResult(type, that,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3464
						{ name: Base.hyphenate(part), point: pt });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3465
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3466
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3467
		if (checkSelf && (options.center || options.bounds) && this._parent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3468
			var bounds = this.getInternalBounds();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3469
			if (options.center)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3470
				res = checkBounds('center', 'Center');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3471
			if (!res && options.bounds) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3472
				var points = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3473
					'TopLeft', 'TopRight', 'BottomLeft', 'BottomRight',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3474
					'LeftCenter', 'TopCenter', 'RightCenter', 'BottomCenter'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3475
				];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3476
				for (var i = 0; i < 8 && !res; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3477
					res = checkBounds('bounds', points[i]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3478
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3479
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3480
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3481
		var children = !res && this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3482
		if (children) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3483
			var opts = this._getChildHitTestOptions(options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3484
			for (var i = children.length - 1; i >= 0 && !res; i--)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3485
				res = children[i]._hitTest(point, opts);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3486
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3487
		if (!res && checkSelf)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3488
			res = this._hitTestSelf(point, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3489
		if (res && res.point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3490
			res.point = matrix.transform(res.point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3491
		options._totalMatrix = parentTotalMatrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3492
		return res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3493
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3494
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3495
	_getChildHitTestOptions: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3496
		return options;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3497
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3498
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3499
	_hitTestSelf: function(point, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3500
		if (options.fill && this.hasFill() && this._contains(point))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3501
			return new HitResult('fill', this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3502
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3503
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3504
	matches: function(name, compare) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3505
		function matchObject(obj1, obj2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3506
			for (var i in obj1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3507
				if (obj1.hasOwnProperty(i)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3508
					var val1 = obj1[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3509
						val2 = obj2[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3510
					if (Base.isPlainObject(val1) && Base.isPlainObject(val2)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3511
						if (!matchObject(val1, val2))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3512
							return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3513
					} else if (!Base.equals(val1, val2)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3514
						return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3515
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3516
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3517
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3518
			return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3519
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3520
		if (typeof name === 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3521
			for (var key in name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3522
				if (name.hasOwnProperty(key) && !this.matches(key, name[key]))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3523
					return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3524
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3525
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3526
			var value = /^(empty|editable)$/.test(name)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3527
					? this['is' + Base.capitalize(name)]()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3528
					: name === 'type'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3529
						? Base.hyphenate(this._class)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3530
						: this[name];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3531
			if (/^(constructor|class)$/.test(name)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3532
				if (!(this instanceof compare))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3533
					return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3534
			} else if (compare instanceof RegExp) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3535
				if (!compare.test(value))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3536
					return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3537
			} else if (typeof compare === 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3538
				if (!compare(value))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3539
					return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3540
			} else if (Base.isPlainObject(compare)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3541
				if (!matchObject(compare, value))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3542
					return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3543
			} else if (!Base.equals(value, compare)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3544
				return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3545
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3546
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3547
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3548
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3549
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3550
	getItems: function(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3551
		return Item._getItems(this._children, match, this._matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3552
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3553
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3554
	getItem: function(match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3555
		return Item._getItems(this._children, match, this._matrix, null, true)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3556
				[0] || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3557
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3558
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3559
	statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3560
		_getItems: function _getItems(children, match, matrix, param,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3561
				firstOnly) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3562
			if (!param) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3563
				var overlapping = match.overlapping,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3564
					inside = match.inside,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3565
					bounds = overlapping || inside,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3566
					rect =	bounds && Rectangle.read([bounds]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3567
				param = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3568
					items: [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3569
					inside: rect,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3570
					overlapping: overlapping && new Path.Rectangle({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3571
						rectangle: rect,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3572
						insert: false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3573
					})
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3574
				};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3575
				if (bounds)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3576
					match = Base.set({}, match,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3577
							{ inside: true, overlapping: true });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3578
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3579
			var items = param.items,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3580
				inside = param.inside,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3581
				overlapping = param.overlapping;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3582
			matrix = inside && (matrix || new Matrix());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3583
			for (var i = 0, l = children && children.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3584
				var child = children[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3585
					childMatrix = matrix && matrix.chain(child._matrix),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3586
					add = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3587
				if (inside) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3588
					var bounds = child.getBounds(childMatrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3589
					if (!inside.intersects(bounds))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3590
						continue;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3591
					if (!(inside && inside.contains(bounds)) && !(overlapping
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3592
							&& overlapping.intersects(child, childMatrix)))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3593
						add = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3594
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3595
				if (add && child.matches(match)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3596
					items.push(child);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3597
					if (firstOnly)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3598
						break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3599
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3600
				_getItems(child._children, match,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3601
						childMatrix, param,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3602
						firstOnly);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3603
				if (firstOnly && items.length > 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3604
					break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3605
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3606
			return items;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3607
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3608
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3609
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3610
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3611
	importJSON: function(json) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3612
		var res = Base.importJSON(json, this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3613
		return res !== this
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3614
				? this.addChild(res)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3615
				: res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3616
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3617
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3618
	addChild: function(item, _preserve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3619
		return this.insertChild(undefined, item, _preserve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3620
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3621
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3622
	insertChild: function(index, item, _preserve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3623
		var res = item ? this.insertChildren(index, [item], _preserve) : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3624
		return res && res[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3625
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3626
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3627
	addChildren: function(items, _preserve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3628
		return this.insertChildren(this._children.length, items, _preserve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3629
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3630
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3631
	insertChildren: function(index, items, _preserve, _proto) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3632
		var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3633
		if (children && items && items.length > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3634
			items = Array.prototype.slice.apply(items);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3635
			for (var i = items.length - 1; i >= 0; i--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3636
				var item = items[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3637
				if (_proto && !(item instanceof _proto)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3638
					items.splice(i, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3639
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3640
					var shift = item._parent === this && item._index < index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3641
					if (item._remove(false, true) && shift)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3642
						index--;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3643
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3644
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3645
			Base.splice(children, items, index, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3646
			var project = this._project,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3647
				notifySelf = project && project._changes;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3648
			for (var i = 0, l = items.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3649
				var item = items[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3650
				item._parent = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3651
				item._setProject(this._project, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3652
				if (item._name)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3653
					item.setName(item._name);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3654
				if (notifySelf)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3655
					this._changed(5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3656
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3657
			this._changed(11);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3658
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3659
			items = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3660
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3661
		return items;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3662
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3663
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3664
	_insertSibling: function(index, item, _preserve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3665
		return this._parent
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3666
				? this._parent.insertChild(index, item, _preserve)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3667
				: null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3668
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3669
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3670
	insertAbove: function(item, _preserve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3671
		return item._insertSibling(item._index + 1, this, _preserve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3672
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3673
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3674
	insertBelow: function(item, _preserve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3675
		return item._insertSibling(item._index, this, _preserve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3676
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3677
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3678
	sendToBack: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3679
		return (this._parent || this instanceof Layer && this._project)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3680
				.insertChild(0, this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3681
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3682
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3683
	bringToFront: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3684
		return (this._parent || this instanceof Layer && this._project)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3685
				.addChild(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3686
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3687
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3688
	appendTop: '#addChild',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3689
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3690
	appendBottom: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3691
		return this.insertChild(0, item);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3692
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3693
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3694
	moveAbove: '#insertAbove',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3695
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3696
	moveBelow: '#insertBelow',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3697
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3698
	reduce: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3699
		if (this._children && this._children.length === 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3700
			var child = this._children[0].reduce();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3701
			child.insertAbove(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3702
			child.setStyle(this._style);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3703
			this.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3704
			return child;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3705
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3706
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3707
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3708
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3709
	_removeNamed: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3710
		var parent = this._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3711
		if (parent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3712
			var children = parent._children,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3713
				namedChildren = parent._namedChildren,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3714
				name = this._name,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3715
				namedArray = namedChildren[name],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3716
				index = namedArray ? namedArray.indexOf(this) : -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3717
			if (index !== -1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3718
				if (children[name] == this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3719
					delete children[name];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3720
				namedArray.splice(index, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3721
				if (namedArray.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3722
					children[name] = namedArray[namedArray.length - 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3723
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3724
					delete namedChildren[name];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3725
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3726
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3727
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3728
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3729
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3730
	_remove: function(notifySelf, notifyParent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3731
		var parent = this._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3732
		if (parent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3733
			if (this._name)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3734
				this._removeNamed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3735
			if (this._index != null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3736
				Base.splice(parent._children, null, this._index, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3737
			this._installEvents(false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3738
			if (notifySelf) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3739
				var project = this._project;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3740
				if (project && project._changes)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3741
					this._changed(5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3742
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3743
			if (notifyParent)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3744
				parent._changed(11);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3745
			this._parent = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3746
			return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3747
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3748
		return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3749
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3750
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3751
	remove: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3752
		return this._remove(true, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3753
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3754
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3755
	replaceWith: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3756
		var ok = item && item.insertBelow(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3757
		if (ok)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3758
			this.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3759
		return ok;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3760
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3761
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3762
	removeChildren: function(from, to) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3763
		if (!this._children)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3764
			return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3765
		from = from || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3766
		to = Base.pick(to, this._children.length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3767
		var removed = Base.splice(this._children, null, from, to - from);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3768
		for (var i = removed.length - 1; i >= 0; i--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3769
			removed[i]._remove(true, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3770
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3771
		if (removed.length > 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3772
			this._changed(11);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3773
		return removed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3774
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3775
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3776
	clear: '#removeChildren',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3777
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3778
	reverseChildren: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3779
		if (this._children) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3780
			this._children.reverse();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3781
			for (var i = 0, l = this._children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3782
				this._children[i]._index = i;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3783
			this._changed(11);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3784
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3785
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3786
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3787
	isEmpty: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3788
		return !this._children || this._children.length === 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3789
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3790
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3791
	isEditable: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3792
		var item = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3793
		while (item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3794
			if (!item._visible || item._locked)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3795
				return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3796
			item = item._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3797
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3798
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3799
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3800
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3801
	hasFill: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3802
		return this.getStyle().hasFill();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3803
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3804
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3805
	hasStroke: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3806
		return this.getStyle().hasStroke();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3807
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3808
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3809
	hasShadow: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3810
		return this.getStyle().hasShadow();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3811
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3812
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3813
	_getOrder: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3814
		function getList(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3815
			var list = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3816
			do {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3817
				list.unshift(item);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3818
			} while (item = item._parent);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3819
			return list;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3820
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3821
		var list1 = getList(this),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3822
			list2 = getList(item);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3823
		for (var i = 0, l = Math.min(list1.length, list2.length); i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3824
			if (list1[i] != list2[i]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3825
				return list1[i]._index < list2[i]._index ? 1 : -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3826
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3827
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3828
		return 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3829
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3830
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3831
	hasChildren: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3832
		return this._children && this._children.length > 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3833
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3834
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3835
	isInserted: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3836
		return this._parent ? this._parent.isInserted() : false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3837
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3838
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3839
	isAbove: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3840
		return this._getOrder(item) === -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3841
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3842
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3843
	isBelow: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3844
		return this._getOrder(item) === 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3845
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3846
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3847
	isParent: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3848
		return this._parent === item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3849
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3850
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3851
	isChild: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3852
		return item && item._parent === this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3853
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3854
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3855
	isDescendant: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3856
		var parent = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3857
		while (parent = parent._parent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3858
			if (parent == item)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3859
				return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3860
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3861
		return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3862
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3863
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3864
	isAncestor: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3865
		return item ? item.isDescendant(this) : false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3866
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3867
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3868
	isGroupedWith: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3869
		var parent = this._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3870
		while (parent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3871
			if (parent._parent
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3872
				&& /^(Group|Layer|CompoundPath)$/.test(parent._class)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3873
				&& item.isDescendant(parent))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3874
					return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3875
			parent = parent._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3876
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3877
		return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3878
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3879
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3880
	translate: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3881
		var mx = new Matrix();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3882
		return this.transform(mx.translate.apply(mx, arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3883
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3884
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3885
	rotate: function(angle ) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3886
		return this.transform(new Matrix().rotate(angle,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3887
				Point.read(arguments, 1, { readNull: true })
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3888
					|| this.getPosition(true)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3889
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3890
}, Base.each(['scale', 'shear', 'skew'], function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3891
	this[name] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3892
		var point = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3893
			center = Point.read(arguments, 0, { readNull: true });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3894
		return this.transform(new Matrix()[name](point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3895
				center || this.getPosition(true)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3896
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3897
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3898
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3899
}), {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3900
	transform: function(matrix, _applyMatrix, _applyRecursively,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3901
			_setApplyMatrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3902
		if (matrix && matrix.isIdentity())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3903
			matrix = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3904
		var _matrix = this._matrix,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3905
			applyMatrix = (_applyMatrix || this._applyMatrix)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3906
					&& ((!_matrix.isIdentity() || matrix)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3907
						|| _applyMatrix && _applyRecursively && this._children);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3908
		if (!matrix && !applyMatrix)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3909
			return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3910
		if (matrix)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3911
			_matrix.preConcatenate(matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3912
		if (applyMatrix = applyMatrix && this._transformContent(_matrix,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3913
					_applyRecursively, _setApplyMatrix)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3914
			var pivot = this._pivot,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3915
				style = this._style,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3916
				fillColor = style.getFillColor(true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3917
				strokeColor = style.getStrokeColor(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3918
			if (pivot)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3919
				_matrix._transformPoint(pivot, pivot, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3920
			if (fillColor)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3921
				fillColor.transform(_matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3922
			if (strokeColor)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3923
				strokeColor.transform(_matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3924
			_matrix.reset(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3925
			if (_setApplyMatrix && this._canApplyMatrix)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3926
				this._applyMatrix = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3927
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3928
		var bounds = this._bounds,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3929
			position = this._position;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3930
		this._changed(9);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3931
		var decomp = bounds && matrix && matrix.decompose();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3932
		if (decomp && !decomp.shearing && decomp.rotation % 90 === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3933
			for (var key in bounds) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3934
				var rect = bounds[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3935
				if (applyMatrix || !rect._internal)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3936
					matrix._transformBounds(rect, rect);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3937
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3938
			var getter = this._boundsGetter,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3939
				rect = bounds[getter && getter.getBounds || getter || 'getBounds'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3940
			if (rect)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3941
				this._position = rect.getCenter(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3942
			this._bounds = bounds;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3943
		} else if (matrix && position) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3944
			this._position = matrix._transformPoint(position, position);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3945
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3946
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3947
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3948
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3949
	_transformContent: function(matrix, applyRecursively, setApplyMatrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3950
		var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3951
		if (children) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3952
			for (var i = 0, l = children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3953
				children[i].transform(matrix, true, applyRecursively,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3954
						setApplyMatrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3955
			return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3956
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3957
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3958
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3959
	globalToLocal: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3960
		return this.getGlobalMatrix(true)._inverseTransform(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3961
				Point.read(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3962
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3963
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3964
	localToGlobal: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3965
		return this.getGlobalMatrix(true)._transformPoint(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3966
				Point.read(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3967
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3968
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3969
	parentToLocal: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3970
		return this._matrix._inverseTransform(Point.read(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3971
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3972
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3973
	localToParent: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3974
		return this._matrix._transformPoint(Point.read(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3975
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3976
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3977
	fitBounds: function(rectangle, fill) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3978
		rectangle = Rectangle.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3979
		var bounds = this.getBounds(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3980
			itemRatio = bounds.height / bounds.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3981
			rectRatio = rectangle.height / rectangle.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3982
			scale = (fill ? itemRatio > rectRatio : itemRatio < rectRatio)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3983
					? rectangle.width / bounds.width
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3984
					: rectangle.height / bounds.height,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3985
			newBounds = new Rectangle(new Point(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3986
					new Size(bounds.width * scale, bounds.height * scale));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3987
		newBounds.setCenter(rectangle.getCenter());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3988
		this.setBounds(newBounds);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3989
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3990
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3991
	_setStyles: function(ctx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3992
		var style = this._style,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3993
			fillColor = style.getFillColor(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3994
			strokeColor = style.getStrokeColor(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3995
			shadowColor = style.getShadowColor();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3996
		if (fillColor)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3997
			ctx.fillStyle = fillColor.toCanvasStyle(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3998
		if (strokeColor) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  3999
			var strokeWidth = style.getStrokeWidth();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4000
			if (strokeWidth > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4001
				ctx.strokeStyle = strokeColor.toCanvasStyle(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4002
				ctx.lineWidth = strokeWidth;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4003
				var strokeJoin = style.getStrokeJoin(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4004
					strokeCap = style.getStrokeCap(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4005
					miterLimit = style.getMiterLimit();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4006
				if (strokeJoin)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4007
					ctx.lineJoin = strokeJoin;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4008
				if (strokeCap)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4009
					ctx.lineCap = strokeCap;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4010
				if (miterLimit)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4011
					ctx.miterLimit = miterLimit;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4012
				if (paper.support.nativeDash) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4013
					var dashArray = style.getDashArray(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4014
						dashOffset = style.getDashOffset();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4015
					if (dashArray && dashArray.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4016
						if ('setLineDash' in ctx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4017
							ctx.setLineDash(dashArray);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4018
							ctx.lineDashOffset = dashOffset;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4019
						} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4020
							ctx.mozDash = dashArray;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4021
							ctx.mozDashOffset = dashOffset;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4022
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4023
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4024
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4025
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4026
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4027
		if (shadowColor) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4028
			var shadowBlur = style.getShadowBlur();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4029
			if (shadowBlur > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4030
				ctx.shadowColor = shadowColor.toCanvasStyle(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4031
				ctx.shadowBlur = shadowBlur;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4032
				var offset = this.getShadowOffset();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4033
				ctx.shadowOffsetX = offset.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4034
				ctx.shadowOffsetY = offset.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4035
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4036
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4037
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4038
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4039
	draw: function(ctx, param, parentStrokeMatrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4040
		var updateVersion = this._updateVersion = this._project._updateVersion;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4041
		if (!this._visible || this._opacity === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4042
			return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4043
		var matrices = param.matrices,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4044
			viewMatrix = param.viewMatrix,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4045
			matrix = this._matrix,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4046
			globalMatrix = matrices[matrices.length - 1].chain(matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4047
		if (!globalMatrix.isInvertible())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4048
			return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4049
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4050
		function getViewMatrix(matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4051
			return viewMatrix ? viewMatrix.chain(matrix) : matrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4052
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4053
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4054
		matrices.push(globalMatrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4055
		if (param.updateMatrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4056
			globalMatrix._updateVersion = updateVersion;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4057
			this._globalMatrix = globalMatrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4058
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4059
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4060
		var blendMode = this._blendMode,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4061
			opacity = this._opacity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4062
			normalBlend = blendMode === 'normal',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4063
			nativeBlend = BlendMode.nativeModes[blendMode],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4064
			direct = normalBlend && opacity === 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4065
					|| param.dontStart
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4066
					|| param.clip
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4067
					|| (nativeBlend || normalBlend && opacity < 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4068
						&& this._canComposite(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4069
			pixelRatio = param.pixelRatio,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4070
			mainCtx, itemOffset, prevOffset;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4071
		if (!direct) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4072
			var bounds = this.getStrokeBounds(getViewMatrix(globalMatrix));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4073
			if (!bounds.width || !bounds.height)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4074
				return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4075
			prevOffset = param.offset;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4076
			itemOffset = param.offset = bounds.getTopLeft().floor();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4077
			mainCtx = ctx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4078
			ctx = CanvasProvider.getContext(bounds.getSize().ceil().add(1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4079
					.multiply(pixelRatio));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4080
			if (pixelRatio !== 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4081
				ctx.scale(pixelRatio, pixelRatio);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4082
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4083
		ctx.save();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4084
		var strokeMatrix = parentStrokeMatrix
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4085
				? parentStrokeMatrix.chain(matrix)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4086
				: !this.getStrokeScaling(true) && getViewMatrix(globalMatrix),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4087
			clip = !direct && param.clipItem,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4088
			transform = !strokeMatrix || clip;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4089
		if (direct) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4090
			ctx.globalAlpha = opacity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4091
			if (nativeBlend)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4092
				ctx.globalCompositeOperation = blendMode;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4093
		} else if (transform) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4094
			ctx.translate(-itemOffset.x, -itemOffset.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4095
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4096
		if (transform)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4097
			(direct ? matrix : getViewMatrix(globalMatrix)).applyToContext(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4098
		if (clip)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4099
			param.clipItem.draw(ctx, param.extend({ clip: true }));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4100
		if (strokeMatrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4101
			ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4102
			var offset = param.offset;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4103
			if (offset)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4104
				ctx.translate(-offset.x, -offset.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4105
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4106
		this._draw(ctx, param, strokeMatrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4107
		ctx.restore();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4108
		matrices.pop();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4109
		if (param.clip && !param.dontFinish)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4110
			ctx.clip();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4111
		if (!direct) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4112
			BlendMode.process(blendMode, ctx, mainCtx, opacity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4113
					itemOffset.subtract(prevOffset).multiply(pixelRatio));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4114
			CanvasProvider.release(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4115
			param.offset = prevOffset;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4116
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4117
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4118
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4119
	_isUpdated: function(updateVersion) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4120
		var parent = this._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4121
		if (parent instanceof CompoundPath)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4122
			return parent._isUpdated(updateVersion);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4123
		var updated = this._updateVersion === updateVersion;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4124
		if (!updated && parent && parent._visible
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4125
				&& parent._isUpdated(updateVersion)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4126
			this._updateVersion = updateVersion;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4127
			updated = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4128
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4129
		return updated;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4130
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4131
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4132
	_drawSelection: function(ctx, matrix, size, selectedItems, updateVersion) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4133
		if ((this._drawSelected || this._boundsSelected)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4134
				&& this._isUpdated(updateVersion)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4135
			var color = this.getSelectedColor(true)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4136
					|| this.getLayer().getSelectedColor(true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4137
				mx = matrix.chain(this.getGlobalMatrix(true));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4138
			ctx.strokeStyle = ctx.fillStyle = color
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4139
					? color.toCanvasStyle(ctx) : '#009dec';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4140
			if (this._drawSelected)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4141
				this._drawSelected(ctx, mx, selectedItems);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4142
			if (this._boundsSelected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4143
				var half = size / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4144
					coords = mx._transformCorners(this.getInternalBounds());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4145
				ctx.beginPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4146
				for (var i = 0; i < 8; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4147
					ctx[i === 0 ? 'moveTo' : 'lineTo'](coords[i], coords[++i]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4148
				ctx.closePath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4149
				ctx.stroke();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4150
				for (var i = 0; i < 8; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4151
					ctx.fillRect(coords[i] - half, coords[++i] - half,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4152
							size, size);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4153
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4154
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4155
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4156
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4157
	_canComposite: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4158
		return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4159
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4160
}, Base.each(['down', 'drag', 'up', 'move'], function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4161
	this['removeOn' + Base.capitalize(name)] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4162
		var hash = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4163
		hash[name] = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4164
		return this.removeOn(hash);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4165
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4166
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4167
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4168
	removeOn: function(obj) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4169
		for (var name in obj) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4170
			if (obj[name]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4171
				var key = 'mouse' + name,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4172
					project = this._project,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4173
					sets = project._removeSets = project._removeSets || {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4174
				sets[key] = sets[key] || {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4175
				sets[key][this._id] = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4176
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4177
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4178
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4179
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4180
}));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4181
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4182
var Group = Item.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4183
	_class: 'Group',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4184
	_selectChildren: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4185
	_serializeFields: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4186
		children: []
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4187
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4188
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4189
	initialize: function Group(arg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4190
		this._children = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4191
		this._namedChildren = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4192
		if (!this._initialize(arg))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4193
			this.addChildren(Array.isArray(arg) ? arg : arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4194
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4195
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4196
	_changed: function _changed(flags) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4197
		_changed.base.call(this, flags);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4198
		if (flags & 1026) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4199
			this._clipItem = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4200
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4201
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4202
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4203
	_getClipItem: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4204
		var clipItem = this._clipItem;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4205
		if (clipItem === undefined) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4206
			clipItem = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4207
			for (var i = 0, l = this._children.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4208
				var child = this._children[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4209
				if (child._clipMask) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4210
					clipItem = child;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4211
					break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4212
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4213
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4214
			this._clipItem = clipItem;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4215
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4216
		return clipItem;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4217
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4218
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4219
	isClipped: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4220
		return !!this._getClipItem();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4221
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4222
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4223
	setClipped: function(clipped) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4224
		var child = this.getFirstChild();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4225
		if (child)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4226
			child.setClipMask(clipped);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4227
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4228
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4229
	_draw: function(ctx, param) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4230
		var clip = param.clip,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4231
			clipItem = !clip && this._getClipItem(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4232
			draw = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4233
		param = param.extend({ clipItem: clipItem, clip: false });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4234
		if (clip) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4235
			if (this._currentPath) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4236
				ctx.currentPath = this._currentPath;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4237
				draw = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4238
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4239
				ctx.beginPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4240
				param.dontStart = param.dontFinish = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4241
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4242
		} else if (clipItem) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4243
			clipItem.draw(ctx, param.extend({ clip: true }));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4244
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4245
		if (draw) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4246
			for (var i = 0, l = this._children.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4247
				var item = this._children[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4248
				if (item !== clipItem)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4249
					item.draw(ctx, param);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4250
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4251
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4252
		if (clip) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4253
			this._currentPath = ctx.currentPath;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4254
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4255
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4256
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4257
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4258
var Layer = Group.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4259
	_class: 'Layer',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4260
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4261
	initialize: function Layer(arg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4262
		var props = Base.isPlainObject(arg)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4263
				? new Base(arg)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4264
				: { children: Array.isArray(arg) ? arg : arguments },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4265
			insert = props.insert;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4266
		props.insert = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4267
		Group.call(this, props);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4268
		if (insert || insert === undefined) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4269
			this._project.addChild(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4270
			this.activate();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4271
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4272
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4273
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4274
	_remove: function _remove(notifySelf, notifyParent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4275
		if (this._parent)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4276
			return _remove.base.call(this, notifySelf, notifyParent);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4277
		if (this._index != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4278
			var project = this._project;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4279
			if (project._activeLayer === this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4280
				project._activeLayer = this.getNextSibling()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4281
						|| this.getPreviousSibling();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4282
			Base.splice(project.layers, null, this._index, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4283
			this._installEvents(false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4284
			if (notifySelf && project._changes)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4285
				this._changed(5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4286
			if (notifyParent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4287
				project._needsUpdate = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4288
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4289
			return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4290
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4291
		return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4292
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4293
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4294
	getNextSibling: function getNextSibling() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4295
		return this._parent ? getNextSibling.base.call(this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4296
				: this._project.layers[this._index + 1] || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4297
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4298
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4299
	getPreviousSibling: function getPreviousSibling() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4300
		return this._parent ? getPreviousSibling.base.call(this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4301
				: this._project.layers[this._index - 1] || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4302
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4303
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4304
	isInserted: function isInserted() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4305
		return this._parent ? isInserted.base.call(this) : this._index != null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4306
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4307
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4308
	activate: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4309
		this._project._activeLayer = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4310
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4311
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4312
	_insertSibling: function _insertSibling(index, item, _preserve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4313
		return !this._parent
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4314
				? this._project.insertChild(index, item, _preserve)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4315
				: _insertSibling.base.call(this, index, item, _preserve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4316
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4317
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4318
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4319
var Shape = Item.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4320
	_class: 'Shape',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4321
	_applyMatrix: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4322
	_canApplyMatrix: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4323
	_boundsSelected: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4324
	_serializeFields: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4325
		type: null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4326
		size: null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4327
		radius: null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4328
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4329
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4330
	initialize: function Shape(props) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4331
		this._initialize(props);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4332
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4333
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4334
	_equals: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4335
		return this._type === item._type
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4336
			&& this._size.equals(item._size)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4337
			&& Base.equals(this._radius, item._radius);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4338
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4339
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4340
	clone: function(insert) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4341
		var copy = new Shape(Item.NO_INSERT);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4342
		copy.setType(this._type);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4343
		copy.setSize(this._size);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4344
		copy.setRadius(this._radius);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4345
		return this._clone(copy, insert);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4346
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4347
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4348
	getType: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4349
		return this._type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4350
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4351
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4352
	setType: function(type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4353
		this._type = type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4354
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4355
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4356
	getShape: '#getType',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4357
	setShape: '#setType',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4358
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4359
	getSize: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4360
		var size = this._size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4361
		return new LinkedSize(size.width, size.height, this, 'setSize');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4362
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4363
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4364
	setSize: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4365
		var size = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4366
		if (!this._size) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4367
			this._size = size.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4368
		} else if (!this._size.equals(size)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4369
			var type = this._type,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4370
				width = size.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4371
				height = size.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4372
			if (type === 'rectangle') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4373
				var radius = Size.min(this._radius, size.divide(2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4374
				this._radius.set(radius.width, radius.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4375
			} else if (type === 'circle') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4376
				width = height = (width + height) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4377
				this._radius = width / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4378
			} else if (type === 'ellipse') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4379
				this._radius.set(width / 2, height / 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4380
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4381
			this._size.set(width, height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4382
			this._changed(9);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4383
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4384
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4385
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4386
	getRadius: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4387
		var rad = this._radius;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4388
		return this._type === 'circle'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4389
				? rad
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4390
				: new LinkedSize(rad.width, rad.height, this, 'setRadius');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4391
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4392
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4393
	setRadius: function(radius) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4394
		var type = this._type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4395
		if (type === 'circle') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4396
			if (radius === this._radius)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4397
				return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4398
			var size = radius * 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4399
			this._radius = radius;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4400
			this._size.set(size, size);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4401
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4402
			radius = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4403
			if (!this._radius) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4404
				this._radius = radius.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4405
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4406
				if (this._radius.equals(radius))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4407
					return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4408
				this._radius.set(radius.width, radius.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4409
				if (type === 'rectangle') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4410
					var size = Size.max(this._size, radius.multiply(2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4411
					this._size.set(size.width, size.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4412
				} else if (type === 'ellipse') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4413
					this._size.set(radius.width * 2, radius.height * 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4414
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4415
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4416
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4417
		this._changed(9);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4418
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4419
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4420
	isEmpty: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4421
		return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4422
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4423
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4424
	toPath: function(insert) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4425
		var path = new Path[Base.capitalize(this._type)]({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4426
			center: new Point(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4427
			size: this._size,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4428
			radius: this._radius,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4429
			insert: false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4430
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4431
		path.setStyle(this._style);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4432
		path.transform(this._matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4433
		if (insert || insert === undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4434
			path.insertAbove(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4435
		return path;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4436
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4437
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4438
	_draw: function(ctx, param, strokeMatrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4439
		var style = this._style,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4440
			hasFill = style.hasFill(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4441
			hasStroke = style.hasStroke(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4442
			dontPaint = param.dontFinish || param.clip,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4443
			untransformed = !strokeMatrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4444
		if (hasFill || hasStroke || dontPaint) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4445
			var type = this._type,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4446
				radius = this._radius,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4447
				isCircle = type === 'circle';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4448
			if (!param.dontStart)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4449
				ctx.beginPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4450
			if (untransformed && isCircle) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4451
				ctx.arc(0, 0, radius, 0, Math.PI * 2, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4452
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4453
				var rx = isCircle ? radius : radius.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4454
					ry = isCircle ? radius : radius.height,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4455
					size = this._size,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4456
					width = size.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4457
					height = size.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4458
				if (untransformed && type === 'rect' && rx === 0 && ry === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4459
					ctx.rect(-width / 2, -height / 2, width, height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4460
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4461
					var x = width / 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4462
						y = height / 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4463
						kappa = 1 - 0.5522847498307936,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4464
						cx = rx * kappa,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4465
						cy = ry * kappa,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4466
						c = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4467
							-x, -y + ry,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4468
							-x, -y + cy,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4469
							-x + cx, -y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4470
							-x + rx, -y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4471
							x - rx, -y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4472
							x - cx, -y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4473
							x, -y + cy,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4474
							x, -y + ry,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4475
							x, y - ry,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4476
							x, y - cy,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4477
							x - cx, y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4478
							x - rx, y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4479
							-x + rx, y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4480
							-x + cx, y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4481
							-x, y - cy,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4482
							-x, y - ry
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4483
						];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4484
					if (strokeMatrix)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4485
						strokeMatrix.transform(c, c, 32);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4486
					ctx.moveTo(c[0], c[1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4487
					ctx.bezierCurveTo(c[2], c[3], c[4], c[5], c[6], c[7]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4488
					if (x !== rx)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4489
						ctx.lineTo(c[8], c[9]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4490
					ctx.bezierCurveTo(c[10], c[11], c[12], c[13], c[14], c[15]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4491
					if (y !== ry)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4492
						ctx.lineTo(c[16], c[17]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4493
					ctx.bezierCurveTo(c[18], c[19], c[20], c[21], c[22], c[23]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4494
					if (x !== rx)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4495
						ctx.lineTo(c[24], c[25]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4496
					ctx.bezierCurveTo(c[26], c[27], c[28], c[29], c[30], c[31]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4497
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4498
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4499
			ctx.closePath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4500
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4501
		if (!dontPaint && (hasFill || hasStroke)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4502
			this._setStyles(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4503
			if (hasFill) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4504
				ctx.fill(style.getWindingRule());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4505
				ctx.shadowColor = 'rgba(0,0,0,0)';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4506
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4507
			if (hasStroke)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4508
				ctx.stroke();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4509
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4510
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4511
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4512
	_canComposite: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4513
		return !(this.hasFill() && this.hasStroke());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4514
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4515
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4516
	_getBounds: function(getter, matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4517
		var rect = new Rectangle(this._size).setCenter(0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4518
		if (getter !== 'getBounds' && this.hasStroke())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4519
			rect = rect.expand(this.getStrokeWidth());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4520
		return matrix ? matrix._transformBounds(rect) : rect;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4521
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4522
},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4523
new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4524
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4525
	function getCornerCenter(that, point, expand) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4526
		var radius = that._radius;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4527
		if (!radius.isZero()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4528
			var halfSize = that._size.divide(2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4529
			for (var i = 0; i < 4; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4530
				var dir = new Point(i & 1 ? 1 : -1, i > 1 ? 1 : -1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4531
					corner = dir.multiply(halfSize),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4532
					center = corner.subtract(dir.multiply(radius)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4533
					rect = new Rectangle(corner, center);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4534
				if ((expand ? rect.expand(expand) : rect).contains(point))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4535
					return center;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4536
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4537
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4538
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4539
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4540
	function getEllipseRadius(point, radius) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4541
		var angle = point.getAngleInRadians(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4542
			width = radius.width * 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4543
			height = radius.height * 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4544
			x = width * Math.sin(angle),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4545
			y = height * Math.cos(angle);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4546
		return width * height / (2 * Math.sqrt(x * x + y * y));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4547
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4548
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4549
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4550
		_contains: function _contains(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4551
			if (this._type === 'rectangle') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4552
				var center = getCornerCenter(this, point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4553
				return center
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4554
						? point.subtract(center).divide(this._radius)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4555
							.getLength() <= 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4556
						: _contains.base.call(this, point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4557
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4558
				return point.divide(this.size).getLength() <= 0.5;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4559
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4560
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4561
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4562
		_hitTestSelf: function _hitTestSelf(point, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4563
			var hit = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4564
			if (this.hasStroke()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4565
				var type = this._type,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4566
					radius = this._radius,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4567
					strokeWidth = this.getStrokeWidth() + 2 * options.tolerance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4568
				if (type === 'rectangle') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4569
					var center = getCornerCenter(this, point, strokeWidth);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4570
					if (center) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4571
						var pt = point.subtract(center);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4572
						hit = 2 * Math.abs(pt.getLength()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4573
								- getEllipseRadius(pt, radius)) <= strokeWidth;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4574
					} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4575
						var rect = new Rectangle(this._size).setCenter(0, 0),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4576
							outer = rect.expand(strokeWidth),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4577
							inner = rect.expand(-strokeWidth);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4578
						hit = outer._containsPoint(point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4579
								&& !inner._containsPoint(point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4580
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4581
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4582
					if (type === 'ellipse')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4583
						radius = getEllipseRadius(point, radius);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4584
					hit = 2 * Math.abs(point.getLength() - radius)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4585
							<= strokeWidth;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4586
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4587
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4588
			return hit
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4589
					? new HitResult('stroke', this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4590
					: _hitTestSelf.base.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4591
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4592
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4593
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4594
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4595
statics: new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4596
	function createShape(type, point, size, radius, args) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4597
		var item = new Shape(Base.getNamed(args));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4598
		item._type = type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4599
		item._size = size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4600
		item._radius = radius;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4601
		return item.translate(point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4602
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4603
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4604
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4605
		Circle: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4606
			var center = Point.readNamed(arguments, 'center'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4607
				radius = Base.readNamed(arguments, 'radius');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4608
			return createShape('circle', center, new Size(radius * 2), radius,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4609
					arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4610
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4611
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4612
		Rectangle: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4613
			var rect = Rectangle.readNamed(arguments, 'rectangle'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4614
				radius = Size.min(Size.readNamed(arguments, 'radius'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4615
						rect.getSize(true).divide(2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4616
			return createShape('rectangle', rect.getCenter(true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4617
					rect.getSize(true), radius, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4618
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4619
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4620
		Ellipse: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4621
			var ellipse = Shape._readEllipse(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4622
				radius = ellipse.radius;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4623
			return createShape('ellipse', ellipse.center, radius.multiply(2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4624
					radius, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4625
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4626
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4627
		_readEllipse: function(args) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4628
			var center,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4629
				radius;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4630
			if (Base.hasNamed(args, 'radius')) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4631
				center = Point.readNamed(args, 'center');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4632
				radius = Size.readNamed(args, 'radius');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4633
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4634
				var rect = Rectangle.readNamed(args, 'rectangle');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4635
				center = rect.getCenter(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4636
				radius = rect.getSize(true).divide(2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4637
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4638
			return { center: center, radius: radius };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4639
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4640
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4641
}});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4642
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4643
var Raster = Item.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4644
	_class: 'Raster',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4645
	_applyMatrix: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4646
	_canApplyMatrix: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4647
	_boundsGetter: 'getBounds',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4648
	_boundsSelected: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4649
	_serializeFields: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4650
		source: null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4651
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4652
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4653
	initialize: function Raster(object, position) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4654
		if (!this._initialize(object,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4655
				position !== undefined && Point.read(arguments, 1))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4656
			if (typeof object === 'string') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4657
				this.setSource(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4658
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4659
				this.setImage(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4660
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4661
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4662
		if (!this._size) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4663
			this._size = new Size();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4664
			this._loaded = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4665
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4666
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4667
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4668
	_equals: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4669
		return this.getSource() === item.getSource();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4670
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4671
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4672
	clone: function(insert) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4673
		var copy = new Raster(Item.NO_INSERT),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4674
			image = this._image,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4675
			canvas = this._canvas;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4676
		if (image) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4677
			copy.setImage(image);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4678
		} else if (canvas) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4679
			var copyCanvas = CanvasProvider.getCanvas(this._size);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4680
			copyCanvas.getContext('2d').drawImage(canvas, 0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4681
			copy.setImage(copyCanvas);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4682
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4683
		return this._clone(copy, insert);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4684
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4685
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4686
	getSize: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4687
		var size = this._size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4688
		return new LinkedSize(size ? size.width : 0, size ? size.height : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4689
				this, 'setSize');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4690
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4691
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4692
	setSize: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4693
		var size = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4694
		if (!size.equals(this._size)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4695
			if (size.width > 0 && size.height > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4696
				var element = this.getElement();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4697
				this.setImage(CanvasProvider.getCanvas(size));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4698
				if (element)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4699
					this.getContext(true).drawImage(element, 0, 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4700
							size.width, size.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4701
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4702
				if (this._canvas)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4703
					CanvasProvider.release(this._canvas);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4704
				this._size = size.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4705
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4706
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4707
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4708
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4709
	getWidth: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4710
		return this._size ? this._size.width : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4711
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4712
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4713
	setWidth: function(width) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4714
		this.setSize(width, this.getHeight());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4715
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4716
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4717
	getHeight: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4718
		return this._size ? this._size.height : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4719
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4720
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4721
	setHeight: function(height) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4722
		this.setSize(this.getWidth(), height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4723
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4724
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4725
	isEmpty: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4726
		var size = this._size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4727
		return !size || size.width === 0 && size.height === 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4728
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4729
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4730
	getResolution: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4731
		var matrix = this._matrix,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4732
			orig = new Point(0, 0).transform(matrix),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4733
			u = new Point(1, 0).transform(matrix).subtract(orig),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4734
			v = new Point(0, 1).transform(matrix).subtract(orig);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4735
		return new Size(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4736
			72 / u.getLength(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4737
			72 / v.getLength()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4738
		);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4739
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4740
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4741
	getPpi: '#getResolution',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4742
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4743
	getImage: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4744
		return this._image;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4745
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4746
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4747
	setImage: function(image) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4748
		if (this._canvas)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4749
			CanvasProvider.release(this._canvas);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4750
		if (image && image.getContext) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4751
			this._image = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4752
			this._canvas = image;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4753
			this._loaded = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4754
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4755
			this._image = image;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4756
			this._canvas = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4757
			this._loaded = image && image.complete;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4758
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4759
		this._size = new Size(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4760
				image ? image.naturalWidth || image.width : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4761
				image ? image.naturalHeight || image.height : 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4762
		this._context = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4763
		this._changed(521);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4764
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4765
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4766
	getCanvas: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4767
		if (!this._canvas) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4768
			var ctx = CanvasProvider.getContext(this._size);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4769
			try {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4770
				if (this._image)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4771
					ctx.drawImage(this._image, 0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4772
				this._canvas = ctx.canvas;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4773
			} catch (e) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4774
				CanvasProvider.release(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4775
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4776
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4777
		return this._canvas;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4778
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4779
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4780
	setCanvas: '#setImage',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4781
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4782
	getContext: function(modify) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4783
		if (!this._context)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4784
			this._context = this.getCanvas().getContext('2d');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4785
		if (modify) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4786
			this._image = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4787
			this._changed(513);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4788
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4789
		return this._context;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4790
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4791
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4792
	setContext: function(context) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4793
		this._context = context;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4794
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4795
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4796
	getSource: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4797
		return this._image && this._image.src || this.toDataURL();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4798
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4799
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4800
	setSource: function(src) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4801
		var that = this,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4802
			image;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4803
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4804
		function loaded() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4805
			var view = that.getView();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4806
			if (view) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4807
				paper = view._scope;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4808
				that.setImage(image);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4809
				that.emit('load');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4810
				view.update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4811
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4812
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4813
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4814
			image = document.getElementById(src) || new Image();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4815
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4816
		if (image.naturalWidth && image.naturalHeight) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4817
			setTimeout(loaded, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4818
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4819
			DomEvent.add(image, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4820
				load: loaded
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4821
			});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4822
			if (!image.src)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4823
				image.src = src;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4824
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4825
		this.setImage(image);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4826
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4827
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4828
	getElement: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4829
		return this._canvas || this._loaded && this._image;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4830
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4831
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4832
	beans: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4833
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4834
	getSubCanvas: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4835
		var rect = Rectangle.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4836
			ctx = CanvasProvider.getContext(rect.getSize());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4837
		ctx.drawImage(this.getCanvas(), rect.x, rect.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4838
				rect.width, rect.height, 0, 0, rect.width, rect.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4839
		return ctx.canvas;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4840
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4841
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4842
	getSubRaster: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4843
		var rect = Rectangle.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4844
			raster = new Raster(Item.NO_INSERT);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4845
		raster.setImage(this.getSubCanvas(rect));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4846
		raster.translate(rect.getCenter().subtract(this.getSize().divide(2)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4847
		raster._matrix.preConcatenate(this._matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4848
		raster.insertAbove(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4849
		return raster;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4850
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4851
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4852
	toDataURL: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4853
		var src = this._image && this._image.src;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4854
		if (/^data:/.test(src))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4855
			return src;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4856
		var canvas = this.getCanvas();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4857
		return canvas ? canvas.toDataURL() : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4858
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4859
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4860
	drawImage: function(image ) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4861
		var point = Point.read(arguments, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4862
		this.getContext(true).drawImage(image, point.x, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4863
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4864
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4865
	getAverageColor: function(object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4866
		var bounds, path;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4867
		if (!object) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4868
			bounds = this.getBounds();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4869
		} else if (object instanceof PathItem) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4870
			path = object;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4871
			bounds = object.getBounds();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4872
		} else if (object.width) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4873
			bounds = new Rectangle(object);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4874
		} else if (object.x) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4875
			bounds = new Rectangle(object.x - 0.5, object.y - 0.5, 1, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4876
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4877
		var sampleSize = 32,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4878
			width = Math.min(bounds.width, sampleSize),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4879
			height = Math.min(bounds.height, sampleSize);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4880
		var ctx = Raster._sampleContext;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4881
		if (!ctx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4882
			ctx = Raster._sampleContext = CanvasProvider.getContext(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4883
					new Size(sampleSize));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4884
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4885
			ctx.clearRect(0, 0, sampleSize + 1, sampleSize + 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4886
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4887
		ctx.save();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4888
		var matrix = new Matrix()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4889
				.scale(width / bounds.width, height / bounds.height)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4890
				.translate(-bounds.x, -bounds.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4891
		matrix.applyToContext(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4892
		if (path)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4893
			path.draw(ctx, new Base({ clip: true, matrices: [matrix] }));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4894
		this._matrix.applyToContext(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4895
		var element = this.getElement(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4896
			size = this._size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4897
		if (element)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4898
			ctx.drawImage(element, -size.width / 2, -size.height / 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4899
		ctx.restore();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4900
		var pixels = ctx.getImageData(0.5, 0.5, Math.ceil(width),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4901
				Math.ceil(height)).data,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4902
			channels = [0, 0, 0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4903
			total = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4904
		for (var i = 0, l = pixels.length; i < l; i += 4) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4905
			var alpha = pixels[i + 3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4906
			total += alpha;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4907
			alpha /= 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4908
			channels[0] += pixels[i] * alpha;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4909
			channels[1] += pixels[i + 1] * alpha;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4910
			channels[2] += pixels[i + 2] * alpha;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4911
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4912
		for (var i = 0; i < 3; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4913
			channels[i] /= total;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4914
		return total ? Color.read(channels) : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4915
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4916
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4917
	getPixel: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4918
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4919
		var data = this.getContext().getImageData(point.x, point.y, 1, 1).data;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4920
		return new Color('rgb', [data[0] / 255, data[1] / 255, data[2] / 255],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4921
				data[3] / 255);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4922
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4923
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4924
	setPixel: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4925
		var point = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4926
			color = Color.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4927
			components = color._convert('rgb'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4928
			alpha = color._alpha,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4929
			ctx = this.getContext(true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4930
			imageData = ctx.createImageData(1, 1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4931
			data = imageData.data;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4932
		data[0] = components[0] * 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4933
		data[1] = components[1] * 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4934
		data[2] = components[2] * 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4935
		data[3] = alpha != null ? alpha * 255 : 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4936
		ctx.putImageData(imageData, point.x, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4937
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4938
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4939
	createImageData: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4940
		var size = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4941
		return this.getContext().createImageData(size.width, size.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4942
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4943
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4944
	getImageData: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4945
		var rect = Rectangle.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4946
		if (rect.isEmpty())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4947
			rect = new Rectangle(this._size);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4948
		return this.getContext().getImageData(rect.x, rect.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4949
				rect.width, rect.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4950
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4951
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4952
	setImageData: function(data ) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4953
		var point = Point.read(arguments, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4954
		this.getContext(true).putImageData(data, point.x, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4955
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4956
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4957
	_getBounds: function(getter, matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4958
		var rect = new Rectangle(this._size).setCenter(0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4959
		return matrix ? matrix._transformBounds(rect) : rect;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4960
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4961
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4962
	_hitTestSelf: function(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4963
		if (this._contains(point)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4964
			var that = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4965
			return new HitResult('pixel', that, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4966
				offset: point.add(that._size.divide(2)).round(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4967
				color: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4968
					get: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4969
						return that.getPixel(this.offset);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4970
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4971
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4972
			});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4973
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4974
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4975
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4976
	_draw: function(ctx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4977
		var element = this.getElement();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4978
		if (element) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4979
			ctx.globalAlpha = this._opacity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4980
			ctx.drawImage(element,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4981
					-this._size.width / 2, -this._size.height / 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4982
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4983
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4984
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4985
	_canComposite: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4986
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4987
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4988
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4989
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4990
var PlacedSymbol = Item.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4991
	_class: 'PlacedSymbol',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4992
	_applyMatrix: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4993
	_canApplyMatrix: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4994
	_boundsGetter: { getBounds: 'getStrokeBounds' },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4995
	_boundsSelected: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4996
	_serializeFields: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4997
		symbol: null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4998
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  4999
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5000
	initialize: function PlacedSymbol(arg0, arg1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5001
		if (!this._initialize(arg0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5002
				arg1 !== undefined && Point.read(arguments, 1)))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5003
			this.setSymbol(arg0 instanceof Symbol ? arg0 : new Symbol(arg0));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5004
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5005
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5006
	_equals: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5007
		return this._symbol === item._symbol;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5008
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5009
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5010
	getSymbol: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5011
		return this._symbol;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5012
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5013
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5014
	setSymbol: function(symbol) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5015
		this._symbol = symbol;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5016
		this._changed(9);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5017
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5018
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5019
	clone: function(insert) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5020
		var copy = new PlacedSymbol(Item.NO_INSERT);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5021
		copy.setSymbol(this._symbol);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5022
		return this._clone(copy, insert);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5023
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5024
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5025
	isEmpty: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5026
		return this._symbol._definition.isEmpty();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5027
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5028
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5029
	_getBounds: function(getter, matrix, cacheItem) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5030
		var definition = this.symbol._definition;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5031
		return definition._getCachedBounds(getter,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5032
				matrix && matrix.chain(definition._matrix), cacheItem);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5033
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5034
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5035
	_hitTestSelf: function(point, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5036
		var res = this._symbol._definition._hitTest(point, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5037
		if (res)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5038
			res.item = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5039
		return res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5040
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5041
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5042
	_draw: function(ctx, param) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5043
		this.symbol._definition.draw(ctx, param);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5044
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5045
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5046
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5047
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5048
var HitResult = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5049
	_class: 'HitResult',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5050
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5051
	initialize: function HitResult(type, item, values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5052
		this.type = type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5053
		this.item = item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5054
		if (values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5055
			values.enumerable = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5056
			this.inject(values);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5057
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5058
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5059
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5060
	statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5061
		getOptions: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5062
			return new Base({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5063
				type: null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5064
				tolerance: paper.settings.hitTolerance,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5065
				fill: !options,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5066
				stroke: !options,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5067
				segments: !options,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5068
				handles: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5069
				ends: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5070
				center: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5071
				bounds: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5072
				guides: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5073
				selected: false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5074
			}, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5075
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5076
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5077
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5078
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5079
var Segment = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5080
	_class: 'Segment',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5081
	beans: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5082
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5083
	initialize: function Segment(arg0, arg1, arg2, arg3, arg4, arg5) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5084
		var count = arguments.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5085
			point, handleIn, handleOut;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5086
		if (count === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5087
		} else if (count === 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5088
			if (arg0.point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5089
				point = arg0.point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5090
				handleIn = arg0.handleIn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5091
				handleOut = arg0.handleOut;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5092
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5093
				point = arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5094
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5095
		} else if (count === 2 && typeof arg0 === 'number') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5096
			point = arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5097
		} else if (count <= 3) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5098
			point = arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5099
			handleIn = arg1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5100
			handleOut = arg2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5101
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5102
			point = arg0 !== undefined ? [ arg0, arg1 ] : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5103
			handleIn = arg2 !== undefined ? [ arg2, arg3 ] : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5104
			handleOut = arg4 !== undefined ? [ arg4, arg5 ] : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5105
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5106
		new SegmentPoint(point, this, '_point');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5107
		new SegmentPoint(handleIn, this, '_handleIn');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5108
		new SegmentPoint(handleOut, this, '_handleOut');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5109
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5110
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5111
	_serialize: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5112
		return Base.serialize(this.isLinear() ? this._point
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5113
				: [this._point, this._handleIn, this._handleOut],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5114
				options, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5115
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5116
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5117
	_changed: function(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5118
		var path = this._path;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5119
		if (!path)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5120
			return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5121
		var curves = path._curves,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5122
			index = this._index,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5123
			curve;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5124
		if (curves) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5125
			if ((!point || point === this._point || point === this._handleIn)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5126
					&& (curve = index > 0 ? curves[index - 1] : path._closed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5127
						? curves[curves.length - 1] : null))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5128
				curve._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5129
			if ((!point || point === this._point || point === this._handleOut)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5130
					&& (curve = curves[index]))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5131
				curve._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5132
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5133
		path._changed(25);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5134
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5135
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5136
	getPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5137
		return this._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5138
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5139
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5140
	setPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5141
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5142
		this._point.set(point.x, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5143
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5144
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5145
	getHandleIn: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5146
		return this._handleIn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5147
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5148
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5149
	setHandleIn: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5150
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5151
		this._handleIn.set(point.x, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5152
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5153
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5154
	getHandleOut: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5155
		return this._handleOut;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5156
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5157
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5158
	setHandleOut: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5159
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5160
		this._handleOut.set(point.x, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5161
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5162
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5163
	isLinear: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5164
		return this._handleIn.isZero() && this._handleOut.isZero();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5165
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5166
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5167
	setLinear: function(linear) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5168
		if (linear) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5169
			this._handleIn.set(0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5170
			this._handleOut.set(0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5171
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5172
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5173
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5174
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5175
	isColinear: function(segment) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5176
		var next1 = this.getNext(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5177
			next2 = segment.getNext();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5178
		return this._handleOut.isZero() && next1._handleIn.isZero()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5179
				&& segment._handleOut.isZero() && next2._handleIn.isZero()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5180
				&& next1._point.subtract(this._point).isColinear(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5181
					next2._point.subtract(segment._point));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5182
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5183
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5184
	isOrthogonal: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5185
		var prev = this.getPrevious(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5186
			next = this.getNext();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5187
		return prev._handleOut.isZero() && this._handleIn.isZero()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5188
			&& this._handleOut.isZero() && next._handleIn.isZero()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5189
			&& this._point.subtract(prev._point).isOrthogonal(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5190
					next._point.subtract(this._point));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5191
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5192
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5193
	isArc: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5194
		var next = this.getNext(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5195
			handle1 = this._handleOut,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5196
			handle2 = next._handleIn,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5197
			kappa = 0.5522847498307936;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5198
		if (handle1.isOrthogonal(handle2)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5199
			var from = this._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5200
				to = next._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5201
				corner = new Line(from, handle1, true).intersect(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5202
						new Line(to, handle2, true), true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5203
			return corner && Numerical.isZero(handle1.getLength() /
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5204
					corner.subtract(from).getLength() - kappa)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5205
				&& Numerical.isZero(handle2.getLength() /
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5206
					corner.subtract(to).getLength() - kappa);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5207
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5208
		return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5209
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5210
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5211
	_selectionState: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5212
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5213
	isSelected: function(_point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5214
		var state = this._selectionState;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5215
		return !_point ? !!(state & 7)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5216
			: _point === this._point ? !!(state & 4)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5217
			: _point === this._handleIn ? !!(state & 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5218
			: _point === this._handleOut ? !!(state & 2)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5219
			: false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5220
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5221
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5222
	setSelected: function(selected, _point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5223
		var path = this._path,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5224
			selected = !!selected,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5225
			state = this._selectionState,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5226
			oldState = state,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5227
			flag = !_point ? 7
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5228
					: _point === this._point ? 4
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5229
					: _point === this._handleIn ? 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5230
					: _point === this._handleOut ? 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5231
					: 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5232
		if (selected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5233
			state |= flag;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5234
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5235
			state &= ~flag;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5236
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5237
		this._selectionState = state;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5238
		if (path && state !== oldState) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5239
			path._updateSelection(this, oldState, state);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5240
			path._changed(129);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5241
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5242
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5243
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5244
	getIndex: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5245
		return this._index !== undefined ? this._index : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5246
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5247
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5248
	getPath: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5249
		return this._path || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5250
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5251
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5252
	getCurve: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5253
		var path = this._path,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5254
			index = this._index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5255
		if (path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5256
			if (index > 0 && !path._closed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5257
					&& index === path._segments.length - 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5258
				index--;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5259
			return path.getCurves()[index] || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5260
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5261
		return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5262
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5263
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5264
	getLocation: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5265
		var curve = this.getCurve();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5266
		return curve
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5267
				? new CurveLocation(curve, this === curve._segment1 ? 0 : 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5268
				: null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5269
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5270
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5271
	getNext: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5272
		var segments = this._path && this._path._segments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5273
		return segments && (segments[this._index + 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5274
				|| this._path._closed && segments[0]) || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5275
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5276
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5277
	getPrevious: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5278
		var segments = this._path && this._path._segments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5279
		return segments && (segments[this._index - 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5280
				|| this._path._closed && segments[segments.length - 1]) || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5281
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5282
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5283
	reverse: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5284
		return new Segment(this._point, this._handleOut, this._handleIn);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5285
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5286
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5287
	remove: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5288
		return this._path ? !!this._path.removeSegment(this._index) : false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5289
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5290
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5291
	clone: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5292
		return new Segment(this._point, this._handleIn, this._handleOut);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5293
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5294
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5295
	equals: function(segment) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5296
		return segment === this || segment && this._class === segment._class
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5297
				&& this._point.equals(segment._point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5298
				&& this._handleIn.equals(segment._handleIn)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5299
				&& this._handleOut.equals(segment._handleOut)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5300
				|| false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5301
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5302
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5303
	toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5304
		var parts = [ 'point: ' + this._point ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5305
		if (!this._handleIn.isZero())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5306
			parts.push('handleIn: ' + this._handleIn);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5307
		if (!this._handleOut.isZero())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5308
			parts.push('handleOut: ' + this._handleOut);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5309
		return '{ ' + parts.join(', ') + ' }';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5310
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5311
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5312
	transform: function(matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5313
		this._transformCoordinates(matrix, new Array(6), true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5314
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5315
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5316
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5317
	_transformCoordinates: function(matrix, coords, change) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5318
		var point = this._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5319
			handleIn = !change || !this._handleIn.isZero()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5320
					? this._handleIn : null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5321
			handleOut = !change || !this._handleOut.isZero()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5322
					? this._handleOut : null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5323
			x = point._x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5324
			y = point._y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5325
			i = 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5326
		coords[0] = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5327
		coords[1] = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5328
		if (handleIn) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5329
			coords[i++] = handleIn._x + x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5330
			coords[i++] = handleIn._y + y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5331
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5332
		if (handleOut) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5333
			coords[i++] = handleOut._x + x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5334
			coords[i++] = handleOut._y + y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5335
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5336
		if (matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5337
			matrix._transformCoordinates(coords, coords, i / 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5338
			x = coords[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5339
			y = coords[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5340
			if (change) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5341
				point._x = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5342
				point._y = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5343
				i  = 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5344
				if (handleIn) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5345
					handleIn._x = coords[i++] - x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5346
					handleIn._y = coords[i++] - y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5347
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5348
				if (handleOut) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5349
					handleOut._x = coords[i++] - x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5350
					handleOut._y = coords[i++] - y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5351
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5352
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5353
				if (!handleIn) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5354
					coords[i++] = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5355
					coords[i++] = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5356
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5357
				if (!handleOut) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5358
					coords[i++] = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5359
					coords[i++] = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5360
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5361
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5362
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5363
		return coords;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5364
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5365
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5366
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5367
var SegmentPoint = Point.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5368
	initialize: function SegmentPoint(point, owner, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5369
		var x, y, selected;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5370
		if (!point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5371
			x = y = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5372
		} else if ((x = point[0]) !== undefined) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5373
			y = point[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5374
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5375
			var pt = point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5376
			if ((x = pt.x) === undefined) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5377
				pt = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5378
				x = pt.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5379
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5380
			y = pt.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5381
			selected = pt.selected;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5382
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5383
		this._x = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5384
		this._y = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5385
		this._owner = owner;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5386
		owner[key] = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5387
		if (selected)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5388
			this.setSelected(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5389
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5390
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5391
	set: function(x, y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5392
		this._x = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5393
		this._y = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5394
		this._owner._changed(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5395
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5396
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5397
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5398
	_serialize: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5399
		var f = options.formatter,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5400
			x = f.number(this._x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5401
			y = f.number(this._y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5402
		return this.isSelected()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5403
				? { x: x, y: y, selected: true }
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5404
				: [x, y];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5405
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5406
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5407
	getX: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5408
		return this._x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5409
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5410
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5411
	setX: function(x) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5412
		this._x = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5413
		this._owner._changed(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5414
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5415
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5416
	getY: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5417
		return this._y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5418
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5419
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5420
	setY: function(y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5421
		this._y = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5422
		this._owner._changed(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5423
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5424
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5425
	isZero: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5426
		return Numerical.isZero(this._x) && Numerical.isZero(this._y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5427
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5428
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5429
	setSelected: function(selected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5430
		this._owner.setSelected(selected, this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5431
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5432
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5433
	isSelected: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5434
		return this._owner.isSelected(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5435
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5436
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5437
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5438
var Curve = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5439
	_class: 'Curve',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5440
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5441
	initialize: function Curve(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5442
		var count = arguments.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5443
		if (count === 3) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5444
			this._path = arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5445
			this._segment1 = arg1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5446
			this._segment2 = arg2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5447
		} else if (count === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5448
			this._segment1 = new Segment();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5449
			this._segment2 = new Segment();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5450
		} else if (count === 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5451
			this._segment1 = new Segment(arg0.segment1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5452
			this._segment2 = new Segment(arg0.segment2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5453
		} else if (count === 2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5454
			this._segment1 = new Segment(arg0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5455
			this._segment2 = new Segment(arg1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5456
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5457
			var point1, handle1, handle2, point2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5458
			if (count === 4) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5459
				point1 = arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5460
				handle1 = arg1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5461
				handle2 = arg2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5462
				point2 = arg3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5463
			} else if (count === 8) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5464
				point1 = [arg0, arg1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5465
				point2 = [arg6, arg7];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5466
				handle1 = [arg2 - arg0, arg3 - arg1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5467
				handle2 = [arg4 - arg6, arg5 - arg7];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5468
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5469
			this._segment1 = new Segment(point1, null, handle1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5470
			this._segment2 = new Segment(point2, handle2, null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5471
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5472
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5473
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5474
	_changed: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5475
		this._length = this._bounds = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5476
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5477
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5478
	getPoint1: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5479
		return this._segment1._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5480
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5481
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5482
	setPoint1: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5483
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5484
		this._segment1._point.set(point.x, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5485
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5486
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5487
	getPoint2: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5488
		return this._segment2._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5489
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5490
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5491
	setPoint2: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5492
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5493
		this._segment2._point.set(point.x, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5494
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5495
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5496
	getHandle1: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5497
		return this._segment1._handleOut;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5498
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5499
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5500
	setHandle1: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5501
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5502
		this._segment1._handleOut.set(point.x, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5503
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5504
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5505
	getHandle2: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5506
		return this._segment2._handleIn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5507
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5508
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5509
	setHandle2: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5510
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5511
		this._segment2._handleIn.set(point.x, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5512
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5513
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5514
	getSegment1: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5515
		return this._segment1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5516
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5517
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5518
	getSegment2: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5519
		return this._segment2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5520
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5521
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5522
	getPath: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5523
		return this._path;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5524
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5525
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5526
	getIndex: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5527
		return this._segment1._index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5528
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5529
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5530
	getNext: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5531
		var curves = this._path && this._path._curves;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5532
		return curves && (curves[this._segment1._index + 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5533
				|| this._path._closed && curves[0]) || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5534
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5535
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5536
	getPrevious: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5537
		var curves = this._path && this._path._curves;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5538
		return curves && (curves[this._segment1._index - 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5539
				|| this._path._closed && curves[curves.length - 1]) || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5540
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5541
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5542
	isSelected: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5543
		return this.getPoint1().isSelected()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5544
				&& this.getHandle2().isSelected()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5545
				&& this.getHandle2().isSelected()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5546
				&& this.getPoint2().isSelected();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5547
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5548
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5549
	setSelected: function(selected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5550
		this.getPoint1().setSelected(selected);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5551
		this.getHandle1().setSelected(selected);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5552
		this.getHandle2().setSelected(selected);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5553
		this.getPoint2().setSelected(selected);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5554
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5555
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5556
	getValues: function(matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5557
		return Curve.getValues(this._segment1, this._segment2, matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5558
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5559
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5560
	getPoints: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5561
		var coords = this.getValues(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5562
			points = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5563
		for (var i = 0; i < 8; i += 2)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5564
			points.push(new Point(coords[i], coords[i + 1]));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5565
		return points;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5566
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5567
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5568
	getLength: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5569
		if (this._length == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5570
			this._length = this.isLinear()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5571
				? this._segment2._point.getDistance(this._segment1._point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5572
				: Curve.getLength(this.getValues(), 0, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5573
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5574
		return this._length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5575
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5576
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5577
	getArea: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5578
		return Curve.getArea(this.getValues());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5579
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5580
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5581
	getPart: function(from, to) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5582
		return new Curve(Curve.getPart(this.getValues(), from, to));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5583
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5584
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5585
	getPartLength: function(from, to) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5586
		return Curve.getLength(this.getValues(), from, to);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5587
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5588
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5589
	isLinear: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5590
		return this._segment1._handleOut.isZero()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5591
				&& this._segment2._handleIn.isZero();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5592
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5593
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5594
	getIntersections: function(curve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5595
		return Curve.filterIntersections(Curve.getIntersections(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5596
				this.getValues(), curve.getValues(), this, curve, []));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5597
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5598
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5599
	_getParameter: function(offset, isParameter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5600
		return isParameter
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5601
				? offset
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5602
				: offset && offset.curve === this
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5603
					? offset.parameter
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5604
					: offset === undefined && isParameter === undefined
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5605
						? 0.5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5606
						: this.getParameterAt(offset, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5607
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5608
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5609
	divide: function(offset, isParameter, ignoreLinear) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5610
		var parameter = this._getParameter(offset, isParameter),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5611
			tolerance = 0.000001,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5612
			res = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5613
		if (parameter > tolerance && parameter < 1 - tolerance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5614
			var parts = Curve.subdivide(this.getValues(), parameter),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5615
				isLinear = ignoreLinear ? false : this.isLinear(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5616
				left = parts[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5617
				right = parts[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5618
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5619
			if (!isLinear) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5620
				this._segment1._handleOut.set(left[2] - left[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5621
						left[3] - left[1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5622
				this._segment2._handleIn.set(right[4] - right[6],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5623
						right[5] - right[7]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5624
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5625
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5626
			var x = left[6], y = left[7],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5627
				segment = new Segment(new Point(x, y),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5628
						!isLinear && new Point(left[4] - x, left[5] - y),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5629
						!isLinear && new Point(right[2] - x, right[3] - y));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5630
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5631
			if (this._path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5632
				if (this._segment1._index > 0 && this._segment2._index === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5633
					this._path.add(segment);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5634
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5635
					this._path.insert(this._segment2._index, segment);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5636
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5637
				res = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5638
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5639
				var end = this._segment2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5640
				this._segment2 = segment;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5641
				res = new Curve(segment, end);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5642
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5643
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5644
		return res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5645
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5646
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5647
	split: function(offset, isParameter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5648
		return this._path
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5649
			? this._path.split(this._segment1._index,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5650
					this._getParameter(offset, isParameter))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5651
			: null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5652
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5653
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5654
	reverse: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5655
		return new Curve(this._segment2.reverse(), this._segment1.reverse());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5656
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5657
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5658
	remove: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5659
		var removed = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5660
		if (this._path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5661
			var segment2 = this._segment2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5662
				handleOut = segment2._handleOut;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5663
			removed = segment2.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5664
			if (removed)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5665
				this._segment1._handleOut.set(handleOut.x, handleOut.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5666
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5667
		return removed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5668
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5669
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5670
	clone: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5671
		return new Curve(this._segment1, this._segment2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5672
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5673
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5674
	toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5675
		var parts = [ 'point1: ' + this._segment1._point ];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5676
		if (!this._segment1._handleOut.isZero())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5677
			parts.push('handle1: ' + this._segment1._handleOut);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5678
		if (!this._segment2._handleIn.isZero())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5679
			parts.push('handle2: ' + this._segment2._handleIn);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5680
		parts.push('point2: ' + this._segment2._point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5681
		return '{ ' + parts.join(', ') + ' }';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5682
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5683
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5684
statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5685
	getValues: function(segment1, segment2, matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5686
		var p1 = segment1._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5687
			h1 = segment1._handleOut,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5688
			h2 = segment2._handleIn,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5689
			p2 = segment2._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5690
			values = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5691
				p1._x, p1._y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5692
				p1._x + h1._x, p1._y + h1._y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5693
				p2._x + h2._x, p2._y + h2._y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5694
				p2._x, p2._y
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5695
			];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5696
		if (matrix)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5697
			matrix._transformCoordinates(values, values, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5698
		return values;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5699
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5700
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5701
	evaluate: function(v, t, type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5702
		var p1x = v[0], p1y = v[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5703
			c1x = v[2], c1y = v[3],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5704
			c2x = v[4], c2y = v[5],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5705
			p2x = v[6], p2y = v[7],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5706
			tolerance = 0.000001,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5707
			x, y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5708
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5709
		if (type === 0 && (t < tolerance || t > 1 - tolerance)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5710
			var isZero = t < tolerance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5711
			x = isZero ? p1x : p2x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5712
			y = isZero ? p1y : p2y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5713
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5714
			var cx = 3 * (c1x - p1x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5715
				bx = 3 * (c2x - c1x) - cx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5716
				ax = p2x - p1x - cx - bx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5717
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5718
				cy = 3 * (c1y - p1y),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5719
				by = 3 * (c2y - c1y) - cy,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5720
				ay = p2y - p1y - cy - by;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5721
			if (type === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5722
				x = ((ax * t + bx) * t + cx) * t + p1x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5723
				y = ((ay * t + by) * t + cy) * t + p1y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5724
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5725
				if (t < tolerance && c1x === p1x && c1y === p1y
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5726
						|| t > 1 - tolerance && c2x === p2x && c2y === p2y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5727
					x = c2x - c1x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5728
					y = c2y - c1y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5729
				} else if (t < tolerance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5730
					x = cx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5731
					y = cy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5732
				} else if (t > 1 - tolerance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5733
					x = 3 * (p2x - c2x);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5734
					y = 3 * (p2y - c2y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5735
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5736
					x = (3 * ax * t + 2 * bx) * t + cx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5737
					y = (3 * ay * t + 2 * by) * t + cy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5738
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5739
				if (type === 3) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5740
					var x2 = 6 * ax * t + 2 * bx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5741
						y2 = 6 * ay * t + 2 * by;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5742
					return (x * y2 - y * x2) / Math.pow(x * x + y * y, 3 / 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5743
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5744
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5745
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5746
		return type === 2 ? new Point(y, -x) : new Point(x, y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5747
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5748
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5749
	subdivide: function(v, t) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5750
		var p1x = v[0], p1y = v[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5751
			c1x = v[2], c1y = v[3],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5752
			c2x = v[4], c2y = v[5],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5753
			p2x = v[6], p2y = v[7];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5754
		if (t === undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5755
			t = 0.5;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5756
		var u = 1 - t,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5757
			p3x = u * p1x + t * c1x, p3y = u * p1y + t * c1y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5758
			p4x = u * c1x + t * c2x, p4y = u * c1y + t * c2y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5759
			p5x = u * c2x + t * p2x, p5y = u * c2y + t * p2y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5760
			p6x = u * p3x + t * p4x, p6y = u * p3y + t * p4y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5761
			p7x = u * p4x + t * p5x, p7y = u * p4y + t * p5y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5762
			p8x = u * p6x + t * p7x, p8y = u * p6y + t * p7y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5763
		return [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5764
			[p1x, p1y, p3x, p3y, p6x, p6y, p8x, p8y],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5765
			[p8x, p8y, p7x, p7y, p5x, p5y, p2x, p2y]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5766
		];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5767
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5768
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5769
	solveCubic: function (v, coord, val, roots, min, max) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5770
		var p1 = v[coord],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5771
			c1 = v[coord + 2],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5772
			c2 = v[coord + 4],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5773
			p2 = v[coord + 6],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5774
			c = 3 * (c1 - p1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5775
			b = 3 * (c2 - c1) - c,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5776
			a = p2 - p1 - c - b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5777
			isZero = Numerical.isZero;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5778
		if (isZero(a) && isZero(b))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5779
			a = b = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5780
		return Numerical.solveCubic(a, b, c, p1 - val, roots, min, max);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5781
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5782
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5783
	getParameterOf: function(v, x, y) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5784
		var tolerance = 0.000001;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5785
		if (Math.abs(v[0] - x) < tolerance && Math.abs(v[1] - y) < tolerance)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5786
			return 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5787
		if (Math.abs(v[6] - x) < tolerance && Math.abs(v[7] - y) < tolerance)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5788
			return 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5789
		var txs = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5790
			tys = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5791
			sx = Curve.solveCubic(v, 0, x, txs, 0, 1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5792
			sy = Curve.solveCubic(v, 1, y, tys, 0, 1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5793
			tx, ty;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5794
		for (var cx = 0;  sx == -1 || cx < sx;) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5795
			if (sx == -1 || (tx = txs[cx++]) >= 0 && tx <= 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5796
				for (var cy = 0; sy == -1 || cy < sy;) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5797
					if (sy == -1 || (ty = tys[cy++]) >= 0 && ty <= 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5798
						if (sx == -1) tx = ty;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5799
						else if (sy == -1) ty = tx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5800
						if (Math.abs(tx - ty) < tolerance)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5801
							return (tx + ty) * 0.5;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5802
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5803
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5804
				if (sx == -1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5805
					break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5806
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5807
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5808
		return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5809
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5810
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5811
	getPart: function(v, from, to) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5812
		if (from > 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5813
			v = Curve.subdivide(v, from)[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5814
		if (to < 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5815
			v = Curve.subdivide(v, (to - from) / (1 - from))[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5816
		return v;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5817
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5818
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5819
	isLinear: function(v) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5820
		var isZero = Numerical.isZero;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5821
		return isZero(v[0] - v[2]) && isZero(v[1] - v[3])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5822
				&& isZero(v[4] - v[6]) && isZero(v[5] - v[7]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5823
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5824
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5825
	isFlatEnough: function(v, tolerance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5826
		var p1x = v[0], p1y = v[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5827
			c1x = v[2], c1y = v[3],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5828
			c2x = v[4], c2y = v[5],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5829
			p2x = v[6], p2y = v[7],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5830
			ux = 3 * c1x - 2 * p1x - p2x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5831
			uy = 3 * c1y - 2 * p1y - p2y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5832
			vx = 3 * c2x - 2 * p2x - p1x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5833
			vy = 3 * c2y - 2 * p2y - p1y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5834
		return Math.max(ux * ux, vx * vx) + Math.max(uy * uy, vy * vy)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5835
				< 10 * tolerance * tolerance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5836
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5837
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5838
	getArea: function(v) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5839
		var p1x = v[0], p1y = v[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5840
			c1x = v[2], c1y = v[3],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5841
			c2x = v[4], c2y = v[5],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5842
			p2x = v[6], p2y = v[7];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5843
		return (  3.0 * c1y * p1x - 1.5 * c1y * c2x
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5844
				- 1.5 * c1y * p2x - 3.0 * p1y * c1x
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5845
				- 1.5 * p1y * c2x - 0.5 * p1y * p2x
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5846
				+ 1.5 * c2y * p1x + 1.5 * c2y * c1x
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5847
				- 3.0 * c2y * p2x + 0.5 * p2y * p1x
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5848
				+ 1.5 * p2y * c1x + 3.0 * p2y * c2x) / 10;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5849
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5850
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5851
	getEdgeSum: function(v) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5852
		return	  (v[0] - v[2]) * (v[3] + v[1])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5853
				+ (v[2] - v[4]) * (v[5] + v[3])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5854
				+ (v[4] - v[6]) * (v[7] + v[5]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5855
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5856
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5857
	getBounds: function(v) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5858
		var min = v.slice(0, 2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5859
			max = min.slice(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5860
			roots = [0, 0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5861
		for (var i = 0; i < 2; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5862
			Curve._addBounds(v[i], v[i + 2], v[i + 4], v[i + 6],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5863
					i, 0, min, max, roots);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5864
		return new Rectangle(min[0], min[1], max[0] - min[0], max[1] - min[1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5865
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5866
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5867
	_addBounds: function(v0, v1, v2, v3, coord, padding, min, max, roots) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5868
		function add(value, padding) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5869
			var left = value - padding,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5870
				right = value + padding;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5871
			if (left < min[coord])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5872
				min[coord] = left;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5873
			if (right > max[coord])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5874
				max[coord] = right;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5875
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5876
		var a = 3 * (v1 - v2) - v0 + v3,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5877
			b = 2 * (v0 + v2) - 4 * v1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5878
			c = v1 - v0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5879
			count = Numerical.solveQuadratic(a, b, c, roots),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5880
			tMin = 0.000001,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5881
			tMax = 1 - tMin;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5882
		add(v3, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5883
		for (var i = 0; i < count; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5884
			var t = roots[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5885
				u = 1 - t;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5886
			if (tMin < t && t < tMax)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5887
				add(u * u * u * v0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5888
					+ 3 * u * u * t * v1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5889
					+ 3 * u * t * t * v2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5890
					+ t * t * t * v3,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5891
					padding);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5892
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5893
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5894
}}, Base.each(['getBounds', 'getStrokeBounds', 'getHandleBounds', 'getRoughBounds'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5895
	function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5896
		this[name] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5897
			if (!this._bounds)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5898
				this._bounds = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5899
			var bounds = this._bounds[name];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5900
			if (!bounds) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5901
				bounds = this._bounds[name] = Path[name]([this._segment1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5902
						this._segment2], false, this._path.getStyle());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5903
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5904
			return bounds.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5905
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5906
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5907
{
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5908
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5909
}), Base.each(['getPoint', 'getTangent', 'getNormal', 'getCurvature'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5910
	function(name, index) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5911
		this[name + 'At'] = function(offset, isParameter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5912
			var values = this.getValues();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5913
			return Curve.evaluate(values, isParameter
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5914
					? offset : Curve.getParameterAt(values, offset, 0), index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5915
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5916
		this[name] = function(parameter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5917
			return Curve.evaluate(this.getValues(), parameter, index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5918
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5919
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5920
{
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5921
	beans: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5922
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5923
	getParameterAt: function(offset, start) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5924
		return Curve.getParameterAt(this.getValues(), offset, start);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5925
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5926
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5927
	getParameterOf: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5928
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5929
		return Curve.getParameterOf(this.getValues(), point.x, point.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5930
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5931
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5932
	getLocationAt: function(offset, isParameter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5933
		if (!isParameter)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5934
			offset = this.getParameterAt(offset);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5935
		return offset >= 0 && offset <= 1 && new CurveLocation(this, offset);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5936
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5937
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5938
	getLocationOf: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5939
		return this.getLocationAt(this.getParameterOf(Point.read(arguments)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5940
				true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5941
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5942
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5943
	getOffsetOf: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5944
		var loc = this.getLocationOf.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5945
		return loc ? loc.getOffset() : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5946
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5947
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5948
	getNearestLocation: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5949
		var point = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5950
			values = this.getValues(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5951
			count = 100,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5952
			minDist = Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5953
			minT = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5954
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5955
		function refine(t) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5956
			if (t >= 0 && t <= 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5957
				var dist = point.getDistance(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5958
						Curve.evaluate(values, t, 0), true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5959
				if (dist < minDist) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5960
					minDist = dist;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5961
					minT = t;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5962
					return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5963
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5964
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5965
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5966
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5967
		for (var i = 0; i <= count; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5968
			refine(i / count);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5969
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5970
		var step = 1 / (count * 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5971
		while (step > 0.000001) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5972
			if (!refine(minT - step) && !refine(minT + step))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5973
				step /= 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5974
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5975
		var pt = Curve.evaluate(values, minT, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5976
		return new CurveLocation(this, minT, pt, null, null, null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5977
				point.getDistance(pt));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5978
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5979
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5980
	getNearestPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5981
		return this.getNearestLocation.apply(this, arguments).getPoint();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5982
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5983
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5984
}),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5985
new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5986
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5987
	function getLengthIntegrand(v) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5988
		var p1x = v[0], p1y = v[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5989
			c1x = v[2], c1y = v[3],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5990
			c2x = v[4], c2y = v[5],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5991
			p2x = v[6], p2y = v[7],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5992
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5993
			ax = 9 * (c1x - c2x) + 3 * (p2x - p1x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5994
			bx = 6 * (p1x + c2x) - 12 * c1x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5995
			cx = 3 * (c1x - p1x),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5996
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5997
			ay = 9 * (c1y - c2y) + 3 * (p2y - p1y),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5998
			by = 6 * (p1y + c2y) - 12 * c1y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  5999
			cy = 3 * (c1y - p1y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6000
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6001
		return function(t) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6002
			var dx = (ax * t + bx) * t + cx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6003
				dy = (ay * t + by) * t + cy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6004
			return Math.sqrt(dx * dx + dy * dy);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6005
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6006
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6007
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6008
	function getIterations(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6009
		return Math.max(2, Math.min(16, Math.ceil(Math.abs(b - a) * 32)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6010
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6011
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6012
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6013
		statics: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6014
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6015
		getLength: function(v, a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6016
			if (a === undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6017
				a = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6018
			if (b === undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6019
				b = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6020
			var isZero = Numerical.isZero;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6021
			if (a === 0 && b === 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6022
					&& isZero(v[0] - v[2]) && isZero(v[1] - v[3])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6023
					&& isZero(v[6] - v[4]) && isZero(v[7] - v[5])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6024
				var dx = v[6] - v[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6025
					dy = v[7] - v[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6026
				return Math.sqrt(dx * dx + dy * dy);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6027
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6028
			var ds = getLengthIntegrand(v);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6029
			return Numerical.integrate(ds, a, b, getIterations(a, b));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6030
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6031
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6032
		getParameterAt: function(v, offset, start) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6033
			if (start === undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6034
				start = offset < 0 ? 1 : 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6035
			if (offset === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6036
				return start;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6037
			var forward = offset > 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6038
				a = forward ? start : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6039
				b = forward ? 1 : start,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6040
				ds = getLengthIntegrand(v),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6041
				rangeLength = Numerical.integrate(ds, a, b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6042
						getIterations(a, b));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6043
			if (Math.abs(offset) >= rangeLength)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6044
				return forward ? b : a;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6045
			var guess = offset / rangeLength,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6046
				length = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6047
			function f(t) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6048
				length += Numerical.integrate(ds, start, t,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6049
						getIterations(start, t));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6050
				start = t;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6051
				return length - offset;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6052
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6053
			return Numerical.findRoot(f, ds, start + guess, a, b, 16,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6054
					0.000001);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6055
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6056
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6057
}, new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6058
	function addLocation(locations, include, curve1, t1, point1, curve2, t2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6059
			point2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6060
		var loc = new CurveLocation(curve1, t1, point1, curve2, t2, point2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6061
		if (!include || include(loc))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6062
			locations.push(loc);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6063
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6064
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6065
	function addCurveIntersections(v1, v2, curve1, curve2, locations, include,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6066
			tMin, tMax, uMin, uMax, oldTDiff, reverse, recursion) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6067
		if (recursion > 32)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6068
			return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6069
		var q0x = v2[0], q0y = v2[1], q3x = v2[6], q3y = v2[7],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6070
			tolerance = 0.000001,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6071
			getSignedDistance = Line.getSignedDistance,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6072
			d1 = getSignedDistance(q0x, q0y, q3x, q3y, v2[2], v2[3]) || 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6073
			d2 = getSignedDistance(q0x, q0y, q3x, q3y, v2[4], v2[5]) || 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6074
			factor = d1 * d2 > 0 ? 3 / 4 : 4 / 9,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6075
			dMin = factor * Math.min(0, d1, d2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6076
			dMax = factor * Math.max(0, d1, d2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6077
			dp0 = getSignedDistance(q0x, q0y, q3x, q3y, v1[0], v1[1]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6078
			dp1 = getSignedDistance(q0x, q0y, q3x, q3y, v1[2], v1[3]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6079
			dp2 = getSignedDistance(q0x, q0y, q3x, q3y, v1[4], v1[5]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6080
			dp3 = getSignedDistance(q0x, q0y, q3x, q3y, v1[6], v1[7]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6081
			tMinNew, tMaxNew, tDiff;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6082
		if (q0x === q3x && uMax - uMin <= tolerance && recursion > 3) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6083
			tMaxNew = tMinNew = (tMax + tMin) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6084
			tDiff = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6085
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6086
			var hull = getConvexHull(dp0, dp1, dp2, dp3),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6087
				top = hull[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6088
				bottom = hull[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6089
				tMinClip, tMaxClip;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6090
			tMinClip = clipConvexHull(top, bottom, dMin, dMax);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6091
			top.reverse();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6092
			bottom.reverse();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6093
			tMaxClip = clipConvexHull(top, bottom, dMin, dMax);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6094
			if (tMinClip == null || tMaxClip == null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6095
				return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6096
			v1 = Curve.getPart(v1, tMinClip, tMaxClip);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6097
			tDiff = tMaxClip - tMinClip;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6098
			tMinNew = tMax * tMinClip + tMin * (1 - tMinClip);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6099
			tMaxNew = tMax * tMaxClip + tMin * (1 - tMaxClip);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6100
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6101
		if (oldTDiff > 0.5 && tDiff > 0.5) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6102
			if (tMaxNew - tMinNew > uMax - uMin) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6103
				var parts = Curve.subdivide(v1, 0.5),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6104
					t = tMinNew + (tMaxNew - tMinNew) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6105
				addCurveIntersections(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6106
					v2, parts[0], curve2, curve1, locations, include,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6107
					uMin, uMax, tMinNew, t, tDiff, !reverse, ++recursion);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6108
				addCurveIntersections(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6109
					v2, parts[1], curve2, curve1, locations, include,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6110
					uMin, uMax, t, tMaxNew, tDiff, !reverse, recursion);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6111
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6112
				var parts = Curve.subdivide(v2, 0.5),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6113
					t = uMin + (uMax - uMin) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6114
				addCurveIntersections(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6115
					parts[0], v1, curve2, curve1, locations, include,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6116
					uMin, t, tMinNew, tMaxNew, tDiff, !reverse, ++recursion);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6117
				addCurveIntersections(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6118
					parts[1], v1, curve2, curve1, locations, include,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6119
					t, uMax, tMinNew, tMaxNew, tDiff, !reverse, recursion);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6120
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6121
		} else if (Math.max(uMax - uMin, tMaxNew - tMinNew) < tolerance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6122
			var t1 = tMinNew + (tMaxNew - tMinNew) / 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6123
				t2 = uMin + (uMax - uMin) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6124
			if (reverse) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6125
				addLocation(locations, include,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6126
						curve2, t2, Curve.evaluate(v2, t2, 0),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6127
						curve1, t1, Curve.evaluate(v1, t1, 0));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6128
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6129
				addLocation(locations, include,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6130
						curve1, t1, Curve.evaluate(v1, t1, 0),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6131
						curve2, t2, Curve.evaluate(v2, t2, 0));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6132
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6133
		} else if (tDiff > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6134
			addCurveIntersections(v2, v1, curve2, curve1, locations, include,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6135
					uMin, uMax, tMinNew, tMaxNew, tDiff, !reverse, ++recursion);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6136
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6137
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6138
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6139
	function getConvexHull(dq0, dq1, dq2, dq3) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6140
		var p0 = [ 0, dq0 ],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6141
			p1 = [ 1 / 3, dq1 ],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6142
			p2 = [ 2 / 3, dq2 ],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6143
			p3 = [ 1, dq3 ],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6144
			getSignedDistance = Line.getSignedDistance,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6145
			dist1 = getSignedDistance(0, dq0, 1, dq3, 1 / 3, dq1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6146
			dist2 = getSignedDistance(0, dq0, 1, dq3, 2 / 3, dq2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6147
			flip = false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6148
			hull;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6149
		if (dist1 * dist2 < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6150
			hull = [[p0, p1, p3], [p0, p2, p3]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6151
			flip = dist1 < 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6152
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6153
			var pmax, cross = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6154
				distZero = dist1 === 0 || dist2 === 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6155
			if (Math.abs(dist1) > Math.abs(dist2)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6156
				pmax = p1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6157
				cross = (dq3 - dq2 - (dq3 - dq0) / 3)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6158
						* (2 * (dq3 - dq2) - dq3 + dq1) / 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6159
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6160
				pmax = p2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6161
				cross = (dq1 - dq0 + (dq0 - dq3) / 3)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6162
						* (-2 * (dq0 - dq1) + dq0 - dq2) / 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6163
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6164
			hull = cross < 0 || distZero
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6165
					? [[p0, pmax, p3], [p0, p3]]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6166
					: [[p0, p1, p2, p3], [p0, p3]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6167
			flip = dist1 ? dist1 < 0 : dist2 < 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6168
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6169
		return flip ? hull.reverse() : hull;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6170
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6171
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6172
	function clipConvexHull(hullTop, hullBottom, dMin, dMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6173
		if (hullTop[0][1] < dMin) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6174
			return clipConvexHullPart(hullTop, true, dMin);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6175
		} else if (hullBottom[0][1] > dMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6176
			return clipConvexHullPart(hullBottom, false, dMax);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6177
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6178
			return hullTop[0][0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6179
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6180
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6181
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6182
	function clipConvexHullPart(part, top, threshold) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6183
		var px = part[0][0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6184
			py = part[0][1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6185
		for (var i = 1, l = part.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6186
			var qx = part[i][0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6187
				qy = part[i][1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6188
			if (top ? qy >= threshold : qy <= threshold)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6189
				return px + (threshold - py) * (qx - px) / (qy - py);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6190
			px = qx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6191
			py = qy;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6192
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6193
		return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6194
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6195
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6196
	function addCurveLineIntersections(v1, v2, curve1, curve2, locations,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6197
			include) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6198
		var flip = Curve.isLinear(v1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6199
			vc = flip ? v2 : v1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6200
			vl = flip ? v1 : v2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6201
			lx1 = vl[0], ly1 = vl[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6202
			lx2 = vl[6], ly2 = vl[7],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6203
			ldx = lx2 - lx1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6204
			ldy = ly2 - ly1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6205
			angle = Math.atan2(-ldy, ldx),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6206
			sin = Math.sin(angle),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6207
			cos = Math.cos(angle),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6208
			rlx2 = ldx * cos - ldy * sin,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6209
			rvl = [0, 0, 0, 0, rlx2, 0, rlx2, 0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6210
			rvc = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6211
		for(var i = 0; i < 8; i += 2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6212
			var x = vc[i] - lx1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6213
				y = vc[i + 1] - ly1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6214
			rvc.push(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6215
				x * cos - y * sin,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6216
				y * cos + x * sin);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6217
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6218
		var roots = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6219
			count = Curve.solveCubic(rvc, 1, 0, roots, 0, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6220
		for (var i = 0; i < count; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6221
			var tc = roots[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6222
				x = Curve.evaluate(rvc, tc, 0).x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6223
			if (x >= 0 && x <= rlx2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6224
				var tl = Curve.getParameterOf(rvl, x, 0),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6225
					t1 = flip ? tl : tc,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6226
					t2 = flip ? tc : tl;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6227
				addLocation(locations, include,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6228
						curve1, t1, Curve.evaluate(v1, t1, 0),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6229
						curve2, t2, Curve.evaluate(v2, t2, 0));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6230
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6231
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6232
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6233
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6234
	function addLineIntersection(v1, v2, curve1, curve2, locations, include) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6235
		var point = Line.intersect(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6236
				v1[0], v1[1], v1[6], v1[7],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6237
				v2[0], v2[1], v2[6], v2[7]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6238
		if (point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6239
			var x = point.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6240
				y = point.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6241
			addLocation(locations, include,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6242
					curve1, Curve.getParameterOf(v1, x, y), point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6243
					curve2, Curve.getParameterOf(v2, x, y), point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6244
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6245
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6246
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6247
	return { statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6248
		getIntersections: function(v1, v2, c1, c2, locations, include) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6249
			var linear1 = Curve.isLinear(v1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6250
				linear2 = Curve.isLinear(v2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6251
				c1p1 = c1.getPoint1(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6252
				c1p2 = c1.getPoint2(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6253
				c2p1 = c2.getPoint1(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6254
				c2p2 = c2.getPoint2(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6255
				tolerance = 0.000001;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6256
			if (c1p1.isClose(c2p1, tolerance))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6257
				addLocation(locations, include, c1, 0, c1p1, c2, 0, c1p1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6258
			if (c1p1.isClose(c2p2, tolerance))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6259
				addLocation(locations, include, c1, 0, c1p1, c2, 1, c1p1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6260
			(linear1 && linear2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6261
				? addLineIntersection
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6262
				: linear1 || linear2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6263
					? addCurveLineIntersections
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6264
					: addCurveIntersections)(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6265
						v1, v2, c1, c2, locations, include,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6266
						0, 1, 0, 1, 0, false, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6267
			if (c1p2.isClose(c2p1, tolerance))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6268
				addLocation(locations, include, c1, 1, c1p2, c2, 0, c1p2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6269
			if (c1p2.isClose(c2p2, tolerance))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6270
				addLocation(locations, include, c1, 1, c1p2, c2, 1, c1p2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6271
			return locations;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6272
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6273
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6274
		filterIntersections: function(locations, _expand) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6275
			var last = locations.length - 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6276
				tMax = 1 - 0.000001;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6277
			for (var i = last; i >= 0; i--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6278
				var loc = locations[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6279
					next = loc._curve.getNext(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6280
					next2 = loc._curve2.getNext();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6281
				if (next && loc._parameter >= tMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6282
					loc._parameter = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6283
					loc._curve = next;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6284
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6285
				if (next2 && loc._parameter2 >= tMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6286
					loc._parameter2 = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6287
					loc._curve2 = next2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6288
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6289
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6290
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6291
			function compare(loc1, loc2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6292
				var path1 = loc1.getPath(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6293
					path2 = loc2.getPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6294
				return path1 === path2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6295
						? (loc1.getIndex() + loc1.getParameter())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6296
								- (loc2.getIndex() + loc2.getParameter())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6297
						: path1._id - path2._id;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6298
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6299
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6300
			if (last > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6301
				locations.sort(compare);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6302
				for (var i = last; i > 0; i--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6303
					if (locations[i].equals(locations[i - 1])) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6304
						locations.splice(i, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6305
						last--;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6306
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6307
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6308
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6309
			if (_expand) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6310
				for (var i = last; i >= 0; i--)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6311
					locations.push(locations[i].getIntersection());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6312
				locations.sort(compare);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6313
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6314
			return locations;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6315
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6316
	}};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6317
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6318
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6319
var CurveLocation = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6320
	_class: 'CurveLocation',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6321
	beans: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6322
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6323
	initialize: function CurveLocation(curve, parameter, point, _curve2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6324
			_parameter2, _point2, _distance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6325
		this._id = CurveLocation._id = (CurveLocation._id || 0) + 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6326
		this._curve = curve;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6327
		this._segment1 = curve._segment1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6328
		this._segment2 = curve._segment2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6329
		this._parameter = parameter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6330
		this._point = point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6331
		this._curve2 = _curve2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6332
		this._parameter2 = _parameter2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6333
		this._point2 = _point2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6334
		this._distance = _distance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6335
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6336
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6337
	getSegment: function(_preferFirst) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6338
		if (!this._segment) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6339
			var curve = this.getCurve(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6340
				parameter = this.getParameter();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6341
			if (parameter === 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6342
				this._segment = curve._segment2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6343
			} else if (parameter === 0 || _preferFirst) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6344
				this._segment = curve._segment1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6345
			} else if (parameter == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6346
				return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6347
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6348
				this._segment = curve.getPartLength(0, parameter)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6349
					< curve.getPartLength(parameter, 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6350
						? curve._segment1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6351
						: curve._segment2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6352
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6353
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6354
		return this._segment;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6355
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6356
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6357
	getCurve: function(_uncached) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6358
		if (!this._curve || _uncached) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6359
			this._curve = this._segment1.getCurve();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6360
			if (this._curve.getParameterOf(this._point) == null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6361
				this._curve = this._segment2.getPrevious().getCurve();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6362
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6363
		return this._curve;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6364
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6365
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6366
	getIntersection: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6367
		var intersection = this._intersection;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6368
		if (!intersection && this._curve2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6369
			var param = this._parameter2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6370
			this._intersection = intersection = new CurveLocation(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6371
					this._curve2, param, this._point2 || this._point, this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6372
			intersection._intersection = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6373
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6374
		return intersection;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6375
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6376
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6377
	getPath: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6378
		var curve = this.getCurve();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6379
		return curve && curve._path;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6380
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6381
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6382
	getIndex: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6383
		var curve = this.getCurve();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6384
		return curve && curve.getIndex();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6385
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6386
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6387
	getOffset: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6388
		var path = this.getPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6389
		return path ? path._getOffset(this) : this.getCurveOffset();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6390
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6391
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6392
	getCurveOffset: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6393
		var curve = this.getCurve(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6394
			parameter = this.getParameter();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6395
		return parameter != null && curve && curve.getPartLength(0, parameter);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6396
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6397
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6398
	getParameter: function(_uncached) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6399
		if ((this._parameter == null || _uncached) && this._point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6400
			var curve = this.getCurve(_uncached);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6401
			this._parameter = curve && curve.getParameterOf(this._point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6402
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6403
		return this._parameter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6404
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6405
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6406
	getPoint: function(_uncached) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6407
		if ((!this._point || _uncached) && this._parameter != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6408
			var curve = this.getCurve(_uncached);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6409
			this._point = curve && curve.getPointAt(this._parameter, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6410
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6411
		return this._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6412
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6413
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6414
	getDistance: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6415
		return this._distance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6416
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6417
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6418
	divide: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6419
		var curve = this.getCurve(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6420
		return curve && curve.divide(this.getParameter(true), true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6421
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6422
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6423
	split: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6424
		var curve = this.getCurve(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6425
		return curve && curve.split(this.getParameter(true), true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6426
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6427
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6428
	equals: function(loc) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6429
		var abs = Math.abs,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6430
			tolerance = 0.000001;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6431
		return this === loc
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6432
				|| loc
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6433
					&& this._curve === loc._curve
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6434
					&& this._curve2 === loc._curve2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6435
					&& abs(this._parameter - loc._parameter) <= tolerance
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6436
					&& abs(this._parameter2 - loc._parameter2) <= tolerance
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6437
				|| false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6438
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6439
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6440
	toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6441
		var parts = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6442
			point = this.getPoint(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6443
			f = Formatter.instance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6444
		if (point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6445
			parts.push('point: ' + point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6446
		var index = this.getIndex();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6447
		if (index != null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6448
			parts.push('index: ' + index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6449
		var parameter = this.getParameter();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6450
		if (parameter != null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6451
			parts.push('parameter: ' + f.number(parameter));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6452
		if (this._distance != null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6453
			parts.push('distance: ' + f.number(this._distance));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6454
		return '{ ' + parts.join(', ') + ' }';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6455
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6456
}, Base.each(['getTangent', 'getNormal', 'getCurvature'], function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6457
	var get = name + 'At';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6458
	this[name] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6459
		var parameter = this.getParameter(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6460
			curve = this.getCurve();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6461
		return parameter != null && curve && curve[get](parameter, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6462
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6463
}, {}));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6464
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6465
var PathItem = Item.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6466
	_class: 'PathItem',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6467
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6468
	initialize: function PathItem() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6469
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6470
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6471
	getIntersections: function(path, _matrix, _expand) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6472
		if (this === path)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6473
			path = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6474
		var locations = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6475
			curves1 = this.getCurves(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6476
			curves2 = path ? path.getCurves() : curves1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6477
			matrix1 = this._matrix.orNullIfIdentity(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6478
			matrix2 = path ? (_matrix || path._matrix).orNullIfIdentity()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6479
				: matrix1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6480
			length1 = curves1.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6481
			length2 = path ? curves2.length : length1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6482
			values2 = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6483
			tMin = 0.000001,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6484
			tMax = 1 - tMin;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6485
		if (path && !this.getBounds(matrix1).touches(path.getBounds(matrix2)))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6486
			return [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6487
		for (var i = 0; i < length2; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6488
			values2[i] = curves2[i].getValues(matrix2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6489
		for (var i = 0; i < length1; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6490
			var curve1 = curves1[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6491
				values1 = path ? curve1.getValues(matrix1) : values2[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6492
			if (!path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6493
				var seg1 = curve1.getSegment1(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6494
					seg2 = curve1.getSegment2(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6495
					h1 = seg1._handleOut,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6496
					h2 = seg2._handleIn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6497
				if (new Line(seg1._point.subtract(h1), h1.multiply(2), true)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6498
						.intersect(new Line(seg2._point.subtract(h2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6499
						h2.multiply(2), true), false)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6500
					var parts = Curve.subdivide(values1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6501
					Curve.getIntersections(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6502
						parts[0], parts[1], curve1, curve1, locations,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6503
						function(loc) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6504
							if (loc._parameter <= tMax) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6505
								loc._parameter /= 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6506
								loc._parameter2 = 0.5 + loc._parameter2 / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6507
								return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6508
							}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6509
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6510
					);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6511
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6512
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6513
			for (var j = path ? 0 : i + 1; j < length2; j++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6514
				Curve.getIntersections(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6515
					values1, values2[j], curve1, curves2[j], locations,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6516
					!path && (j === i + 1 || j === length2 - 1 && i === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6517
						&& function(loc) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6518
							var t = loc._parameter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6519
							return t >= tMin && t <= tMax;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6520
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6521
				);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6522
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6523
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6524
		return Curve.filterIntersections(locations, _expand);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6525
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6526
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6527
	_asPathItem: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6528
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6529
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6530
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6531
	setPathData: function(data) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6532
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6533
		var parts = data.match(/[mlhvcsqtaz][^mlhvcsqtaz]*/ig),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6534
			coords,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6535
			relative = false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6536
			previous,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6537
			control,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6538
			current = new Point(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6539
			start = new Point();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6540
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6541
		function getCoord(index, coord) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6542
			var val = +coords[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6543
			if (relative)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6544
				val += current[coord];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6545
			return val;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6546
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6547
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6548
		function getPoint(index) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6549
			return new Point(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6550
				getCoord(index, 'x'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6551
				getCoord(index + 1, 'y')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6552
			);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6553
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6554
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6555
		this.clear();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6556
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6557
		for (var i = 0, l = parts && parts.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6558
			var part = parts[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6559
				command = part[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6560
				lower = command.toLowerCase();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6561
			coords = part.match(/[+-]?(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?/g);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6562
			var length = coords && coords.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6563
			relative = command === lower;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6564
			if (previous === 'z' && !/[mz]/.test(lower))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6565
				this.moveTo(current = start);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6566
			switch (lower) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6567
			case 'm':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6568
			case 'l':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6569
				var move = lower === 'm';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6570
				if (move && previous && previous !== 'z')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6571
					this.closePath(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6572
				for (var j = 0; j < length; j += 2)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6573
					this[j === 0 && move ? 'moveTo' : 'lineTo'](
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6574
							current = getPoint(j));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6575
				control = current;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6576
				if (move)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6577
					start = current;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6578
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6579
			case 'h':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6580
			case 'v':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6581
				var coord = lower === 'h' ? 'x' : 'y';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6582
				for (var j = 0; j < length; j++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6583
					current[coord] = getCoord(j, coord);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6584
					this.lineTo(current);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6585
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6586
				control = current;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6587
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6588
			case 'c':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6589
				for (var j = 0; j < length; j += 6) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6590
					this.cubicCurveTo(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6591
							getPoint(j),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6592
							control = getPoint(j + 2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6593
							current = getPoint(j + 4));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6594
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6595
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6596
			case 's':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6597
				for (var j = 0; j < length; j += 4) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6598
					this.cubicCurveTo(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6599
							/[cs]/.test(previous)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6600
									? current.multiply(2).subtract(control)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6601
									: current,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6602
							control = getPoint(j),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6603
							current = getPoint(j + 2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6604
					previous = lower;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6605
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6606
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6607
			case 'q':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6608
				for (var j = 0; j < length; j += 4) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6609
					this.quadraticCurveTo(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6610
							control = getPoint(j),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6611
							current = getPoint(j + 2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6612
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6613
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6614
			case 't':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6615
				for (var j = 0; j < length; j += 2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6616
					this.quadraticCurveTo(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6617
							control = (/[qt]/.test(previous)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6618
									? current.multiply(2).subtract(control)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6619
									: current),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6620
							current = getPoint(j));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6621
					previous = lower;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6622
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6623
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6624
			case 'a':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6625
				for (var j = 0; j < length; j += 7) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6626
					this.arcTo(current = getPoint(j + 5),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6627
							new Size(+coords[j], +coords[j + 1]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6628
							+coords[j + 2], +coords[j + 4], +coords[j + 3]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6629
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6630
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6631
			case 'z':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6632
				this.closePath(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6633
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6634
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6635
			previous = lower;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6636
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6637
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6638
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6639
	_canComposite: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6640
		return !(this.hasFill() && this.hasStroke());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6641
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6642
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6643
	_contains: function(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6644
		var winding = this._getWinding(point, false, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6645
		return !!(this.getWindingRule() === 'evenodd' ? winding & 1 : winding);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6646
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6647
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6648
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6649
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6650
var Path = PathItem.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6651
	_class: 'Path',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6652
	_serializeFields: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6653
		segments: [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6654
		closed: false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6655
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6656
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6657
	initialize: function Path(arg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6658
		this._closed = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6659
		this._segments = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6660
		var segments = Array.isArray(arg)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6661
			? typeof arg[0] === 'object'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6662
				? arg
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6663
				: arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6664
			: arg && (arg.size === undefined && (arg.x !== undefined
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6665
					|| arg.point !== undefined))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6666
				? arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6667
				: null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6668
		if (segments && segments.length > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6669
			this.setSegments(segments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6670
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6671
			this._curves = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6672
			this._selectedSegmentState = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6673
			if (!segments && typeof arg === 'string') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6674
				this.setPathData(arg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6675
				arg = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6676
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6677
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6678
		this._initialize(!segments && arg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6679
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6680
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6681
	_equals: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6682
		return this._closed === item._closed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6683
				&& Base.equals(this._segments, item._segments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6684
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6685
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6686
	clone: function(insert) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6687
		var copy = new Path(Item.NO_INSERT);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6688
		copy.setSegments(this._segments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6689
		copy._closed = this._closed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6690
		if (this._clockwise !== undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6691
			copy._clockwise = this._clockwise;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6692
		return this._clone(copy, insert);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6693
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6694
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6695
	_changed: function _changed(flags) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6696
		_changed.base.call(this, flags);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6697
		if (flags & 8) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6698
			var parent = this._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6699
			if (parent)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6700
				parent._currentPath = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6701
			this._length = this._clockwise = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6702
			if (this._curves && !(flags & 16)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6703
				for (var i = 0, l = this._curves.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6704
					this._curves[i]._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6705
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6706
			this._monoCurves = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6707
		} else if (flags & 32) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6708
			this._bounds = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6709
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6710
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6711
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6712
	getStyle: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6713
		var parent = this._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6714
		return (parent instanceof CompoundPath ? parent : this)._style;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6715
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6716
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6717
	getSegments: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6718
		return this._segments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6719
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6720
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6721
	setSegments: function(segments) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6722
		var fullySelected = this.isFullySelected();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6723
		this._segments.length = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6724
		this._selectedSegmentState = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6725
		this._curves = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6726
		if (segments && segments.length > 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6727
			this._add(Segment.readAll(segments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6728
		if (fullySelected)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6729
			this.setFullySelected(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6730
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6731
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6732
	getFirstSegment: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6733
		return this._segments[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6734
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6735
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6736
	getLastSegment: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6737
		return this._segments[this._segments.length - 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6738
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6739
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6740
	getCurves: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6741
		var curves = this._curves,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6742
			segments = this._segments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6743
		if (!curves) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6744
			var length = this._countCurves();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6745
			curves = this._curves = new Array(length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6746
			for (var i = 0; i < length; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6747
				curves[i] = new Curve(this, segments[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6748
					segments[i + 1] || segments[0]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6749
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6750
		return curves;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6751
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6752
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6753
	getFirstCurve: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6754
		return this.getCurves()[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6755
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6756
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6757
	getLastCurve: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6758
		var curves = this.getCurves();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6759
		return curves[curves.length - 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6760
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6761
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6762
	isClosed: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6763
		return this._closed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6764
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6765
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6766
	setClosed: function(closed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6767
		if (this._closed != (closed = !!closed)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6768
			this._closed = closed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6769
			if (this._curves) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6770
				var length = this._curves.length = this._countCurves();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6771
				if (closed)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6772
					this._curves[length - 1] = new Curve(this,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6773
						this._segments[length - 1], this._segments[0]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6774
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6775
			this._changed(25);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6776
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6777
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6778
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6779
	beans: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6780
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6781
	getPathData: function(_matrix, _precision) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6782
		var segments = this._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6783
			length = segments.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6784
			f = new Formatter(_precision),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6785
			coords = new Array(6),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6786
			first = true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6787
			curX, curY,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6788
			prevX, prevY,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6789
			inX, inY,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6790
			outX, outY,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6791
			parts = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6792
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6793
		function addSegment(segment, skipLine) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6794
			segment._transformCoordinates(_matrix, coords, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6795
			curX = coords[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6796
			curY = coords[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6797
			if (first) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6798
				parts.push('M' + f.pair(curX, curY));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6799
				first = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6800
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6801
				inX = coords[2];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6802
				inY = coords[3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6803
				if (inX === curX && inY === curY
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6804
						&& outX === prevX && outY === prevY) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6805
					if (!skipLine)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6806
						parts.push('l' + f.pair(curX - prevX, curY - prevY));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6807
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6808
					parts.push('c' + f.pair(outX - prevX, outY - prevY)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6809
							+ ' ' + f.pair(inX - prevX, inY - prevY)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6810
							+ ' ' + f.pair(curX - prevX, curY - prevY));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6811
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6812
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6813
			prevX = curX;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6814
			prevY = curY;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6815
			outX = coords[4];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6816
			outY = coords[5];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6817
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6818
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6819
		if (length === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6820
			return '';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6821
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6822
		for (var i = 0; i < length; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6823
			addSegment(segments[i]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6824
		if (this._closed && length > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6825
			addSegment(segments[0], true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6826
			parts.push('z');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6827
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6828
		return parts.join('');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6829
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6830
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6831
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6832
	isEmpty: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6833
		return this._segments.length === 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6834
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6835
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6836
	isPolygon: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6837
		for (var i = 0, l = this._segments.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6838
			if (!this._segments[i].isLinear())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6839
				return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6840
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6841
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6842
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6843
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6844
	_transformContent: function(matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6845
		var coords = new Array(6);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6846
		for (var i = 0, l = this._segments.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6847
			this._segments[i]._transformCoordinates(matrix, coords, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6848
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6849
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6850
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6851
	_add: function(segs, index) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6852
		var segments = this._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6853
			curves = this._curves,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6854
			amount = segs.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6855
			append = index == null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6856
			index = append ? segments.length : index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6857
		for (var i = 0; i < amount; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6858
			var segment = segs[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6859
			if (segment._path)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6860
				segment = segs[i] = segment.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6861
			segment._path = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6862
			segment._index = index + i;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6863
			if (segment._selectionState)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6864
				this._updateSelection(segment, 0, segment._selectionState);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6865
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6866
		if (append) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6867
			segments.push.apply(segments, segs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6868
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6869
			segments.splice.apply(segments, [index, 0].concat(segs));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6870
			for (var i = index + amount, l = segments.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6871
				segments[i]._index = i;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6872
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6873
		if (curves || segs._curves) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6874
			if (!curves)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6875
				curves = this._curves = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6876
			var from = index > 0 ? index - 1 : index,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6877
				start = from,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6878
				to = Math.min(from + amount, this._countCurves());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6879
			if (segs._curves) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6880
				curves.splice.apply(curves, [from, 0].concat(segs._curves));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6881
				start += segs._curves.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6882
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6883
			for (var i = start; i < to; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6884
				curves.splice(i, 0, new Curve(this, null, null));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6885
			this._adjustCurves(from, to);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6886
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6887
		this._changed(25);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6888
		return segs;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6889
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6890
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6891
	_adjustCurves: function(from, to) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6892
		var segments = this._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6893
			curves = this._curves,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6894
			curve;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6895
		for (var i = from; i < to; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6896
			curve = curves[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6897
			curve._path = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6898
			curve._segment1 = segments[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6899
			curve._segment2 = segments[i + 1] || segments[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6900
			curve._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6901
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6902
		if (curve = curves[this._closed && from === 0 ? segments.length - 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6903
				: from - 1]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6904
			curve._segment2 = segments[from] || segments[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6905
			curve._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6906
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6907
		if (curve = curves[to]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6908
			curve._segment1 = segments[to];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6909
			curve._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6910
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6911
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6912
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6913
	_countCurves: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6914
		var length = this._segments.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6915
		return !this._closed && length > 0 ? length - 1 : length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6916
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6917
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6918
	add: function(segment1 ) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6919
		return arguments.length > 1 && typeof segment1 !== 'number'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6920
			? this._add(Segment.readAll(arguments))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6921
			: this._add([ Segment.read(arguments) ])[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6922
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6923
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6924
	insert: function(index, segment1 ) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6925
		return arguments.length > 2 && typeof segment1 !== 'number'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6926
			? this._add(Segment.readAll(arguments, 1), index)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6927
			: this._add([ Segment.read(arguments, 1) ], index)[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6928
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6929
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6930
	addSegment: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6931
		return this._add([ Segment.read(arguments) ])[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6932
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6933
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6934
	insertSegment: function(index ) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6935
		return this._add([ Segment.read(arguments, 1) ], index)[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6936
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6937
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6938
	addSegments: function(segments) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6939
		return this._add(Segment.readAll(segments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6940
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6941
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6942
	insertSegments: function(index, segments) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6943
		return this._add(Segment.readAll(segments), index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6944
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6945
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6946
	removeSegment: function(index) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6947
		return this.removeSegments(index, index + 1)[0] || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6948
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6949
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6950
	removeSegments: function(from, to, _includeCurves) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6951
		from = from || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6952
		to = Base.pick(to, this._segments.length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6953
		var segments = this._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6954
			curves = this._curves,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6955
			count = segments.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6956
			removed = segments.splice(from, to - from),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6957
			amount = removed.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6958
		if (!amount)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6959
			return removed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6960
		for (var i = 0; i < amount; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6961
			var segment = removed[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6962
			if (segment._selectionState)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6963
				this._updateSelection(segment, segment._selectionState, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6964
			segment._index = segment._path = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6965
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6966
		for (var i = from, l = segments.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6967
			segments[i]._index = i;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6968
		if (curves) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6969
			var index = from > 0 && to === count + (this._closed ? 1 : 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6970
					? from - 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6971
					: from,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6972
				curves = curves.splice(index, amount);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6973
			if (_includeCurves)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6974
				removed._curves = curves.slice(1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6975
			this._adjustCurves(index, index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6976
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6977
		this._changed(25);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6978
		return removed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6979
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6980
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6981
	clear: '#removeSegments',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6982
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6983
	getLength: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6984
		if (this._length == null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6985
			var curves = this.getCurves();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6986
			this._length = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6987
			for (var i = 0, l = curves.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6988
				this._length += curves[i].getLength();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6989
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6990
		return this._length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6991
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6992
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6993
	getArea: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6994
		var curves = this.getCurves();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6995
		var area = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6996
		for (var i = 0, l = curves.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6997
			area += curves[i].getArea();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6998
		return area;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  6999
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7000
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7001
	isFullySelected: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7002
		var length = this._segments.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7003
		return this._selected && length > 0 && this._selectedSegmentState
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7004
				=== length * 7;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7005
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7006
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7007
	setFullySelected: function(selected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7008
		if (selected)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7009
			this._selectSegments(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7010
		this.setSelected(selected);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7011
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7012
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7013
	setSelected: function setSelected(selected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7014
		if (!selected)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7015
			this._selectSegments(false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7016
		setSelected.base.call(this, selected);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7017
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7018
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7019
	_selectSegments: function(selected) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7020
		var length = this._segments.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7021
		this._selectedSegmentState = selected
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7022
				? length * 7 : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7023
		for (var i = 0; i < length; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7024
			this._segments[i]._selectionState = selected
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7025
					? 7 : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7026
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7027
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7028
	_updateSelection: function(segment, oldState, newState) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7029
		segment._selectionState = newState;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7030
		var total = this._selectedSegmentState += newState - oldState;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7031
		if (total > 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7032
			this.setSelected(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7033
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7034
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7035
	flatten: function(maxDistance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7036
		var iterator = new PathIterator(this, 64, 0.1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7037
			pos = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7038
			step = iterator.length / Math.ceil(iterator.length / maxDistance),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7039
			end = iterator.length + (this._closed ? -step : step) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7040
		var segments = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7041
		while (pos <= end) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7042
			segments.push(new Segment(iterator.evaluate(pos, 0)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7043
			pos += step;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7044
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7045
		this.setSegments(segments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7046
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7047
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7048
	reduce: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7049
		var curves = this.getCurves();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7050
		for (var i = curves.length - 1; i >= 0; i--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7051
			var curve = curves[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7052
			if (curve.isLinear() && curve.getLength() === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7053
				curve.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7054
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7055
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7056
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7057
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7058
	simplify: function(tolerance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7059
		if (this._segments.length > 2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7060
			var fitter = new PathFitter(this, tolerance || 2.5);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7061
			this.setSegments(fitter.fit());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7062
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7063
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7064
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7065
	split: function(index, parameter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7066
		if (parameter === null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7067
			return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7068
		if (arguments.length === 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7069
			var arg = index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7070
			if (typeof arg === 'number')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7071
				arg = this.getLocationAt(arg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7072
			if (!arg)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7073
				return null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7074
			index = arg.index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7075
			parameter = arg.parameter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7076
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7077
		var tolerance = 0.000001;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7078
		if (parameter >= 1 - tolerance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7079
			index++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7080
			parameter--;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7081
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7082
		var curves = this.getCurves();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7083
		if (index >= 0 && index < curves.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7084
			if (parameter > tolerance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7085
				curves[index++].divide(parameter, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7086
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7087
			var segs = this.removeSegments(index, this._segments.length, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7088
				path;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7089
			if (this._closed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7090
				this.setClosed(false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7091
				path = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7092
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7093
				path = this._clone(new Path().insertAbove(this, true));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7094
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7095
			path._add(segs, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7096
			this.addSegment(segs[0]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7097
			return path;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7098
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7099
		return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7100
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7101
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7102
	isClockwise: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7103
		if (this._clockwise !== undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7104
			return this._clockwise;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7105
		return Path.isClockwise(this._segments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7106
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7107
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7108
	setClockwise: function(clockwise) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7109
		if (this.isClockwise() != (clockwise = !!clockwise))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7110
			this.reverse();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7111
		this._clockwise = clockwise;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7112
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7113
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7114
	reverse: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7115
		this._segments.reverse();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7116
		for (var i = 0, l = this._segments.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7117
			var segment = this._segments[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7118
			var handleIn = segment._handleIn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7119
			segment._handleIn = segment._handleOut;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7120
			segment._handleOut = handleIn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7121
			segment._index = i;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7122
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7123
		this._curves = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7124
		if (this._clockwise !== undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7125
			this._clockwise = !this._clockwise;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7126
		this._changed(9);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7127
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7128
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7129
	join: function(path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7130
		if (path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7131
			var segments = path._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7132
				last1 = this.getLastSegment(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7133
				last2 = path.getLastSegment();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7134
			if (!last2)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7135
				return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7136
			if (last1 && last1._point.equals(last2._point))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7137
				path.reverse();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7138
			var first2 = path.getFirstSegment();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7139
			if (last1 && last1._point.equals(first2._point)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7140
				last1.setHandleOut(first2._handleOut);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7141
				this._add(segments.slice(1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7142
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7143
				var first1 = this.getFirstSegment();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7144
				if (first1 && first1._point.equals(first2._point))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7145
					path.reverse();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7146
				last2 = path.getLastSegment();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7147
				if (first1 && first1._point.equals(last2._point)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7148
					first1.setHandleIn(last2._handleIn);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7149
					this._add(segments.slice(0, segments.length - 1), 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7150
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7151
					this._add(segments.slice());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7152
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7153
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7154
			if (path.closed)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7155
				this._add([segments[0]]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7156
			path.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7157
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7158
		var first = this.getFirstSegment(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7159
			last = this.getLastSegment();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7160
		if (first !== last && first._point.equals(last._point)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7161
			first.setHandleIn(last._handleIn);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7162
			last.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7163
			this.setClosed(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7164
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7165
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7166
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7167
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7168
	toShape: function(insert) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7169
		if (!this._closed)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7170
			return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7171
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7172
		var segments = this._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7173
			type,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7174
			size,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7175
			radius,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7176
			topCenter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7177
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7178
		function isColinear(i, j) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7179
			return segments[i].isColinear(segments[j]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7180
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7181
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7182
		function isOrthogonal(i) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7183
			return segments[i].isOrthogonal();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7184
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7185
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7186
		function isArc(i) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7187
			return segments[i].isArc();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7188
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7189
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7190
		function getDistance(i, j) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7191
			return segments[i]._point.getDistance(segments[j]._point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7192
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7193
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7194
		if (this.isPolygon() && segments.length === 4
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7195
				&& isColinear(0, 2) && isColinear(1, 3) && isOrthogonal(1)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7196
			type = Shape.Rectangle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7197
			size = new Size(getDistance(0, 3), getDistance(0, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7198
			topCenter = segments[1]._point.add(segments[2]._point).divide(2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7199
		} else if (segments.length === 8 && isArc(0) && isArc(2) && isArc(4)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7200
				&& isArc(6) && isColinear(1, 5) && isColinear(3, 7)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7201
			type = Shape.Rectangle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7202
			size = new Size(getDistance(1, 6), getDistance(0, 3));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7203
			radius = size.subtract(new Size(getDistance(0, 7),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7204
					getDistance(1, 2))).divide(2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7205
			topCenter = segments[3]._point.add(segments[4]._point).divide(2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7206
		} else if (segments.length === 4
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7207
				&& isArc(0) && isArc(1) && isArc(2) && isArc(3)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7208
			if (Numerical.isZero(getDistance(0, 2) - getDistance(1, 3))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7209
				type = Shape.Circle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7210
				radius = getDistance(0, 2) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7211
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7212
				type = Shape.Ellipse;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7213
				radius = new Size(getDistance(2, 0) / 2, getDistance(3, 1) / 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7214
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7215
			topCenter = segments[1]._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7216
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7217
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7218
		if (type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7219
			var center = this.getPosition(true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7220
				shape = new type({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7221
					center: center,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7222
					size: size,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7223
					radius: radius,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7224
					insert: false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7225
				});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7226
			shape.rotate(topCenter.subtract(center).getAngle() + 90);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7227
			shape.setStyle(this._style);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7228
			if (insert || insert === undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7229
				shape.insertAbove(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7230
			return shape;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7231
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7232
		return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7233
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7234
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7235
	_hitTestSelf: function(point, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7236
		var that = this,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7237
			style = this.getStyle(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7238
			segments = this._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7239
			numSegments = segments.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7240
			closed = this._closed,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7241
			tolerancePadding = options._tolerancePadding,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7242
			strokePadding = tolerancePadding,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7243
			join, cap, miterLimit,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7244
			area, loc, res,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7245
			hitStroke = options.stroke && style.hasStroke(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7246
			hitFill = options.fill && style.hasFill(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7247
			hitCurves = options.curves,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7248
			radius = hitStroke
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7249
					? style.getStrokeWidth() / 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7250
					: hitFill && options.tolerance > 0 || hitCurves
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7251
						? 0 : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7252
		if (radius !== null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7253
			if (radius > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7254
				join = style.getStrokeJoin();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7255
				cap = style.getStrokeCap();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7256
				miterLimit = radius * style.getMiterLimit();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7257
				strokePadding = tolerancePadding.add(new Point(radius, radius));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7258
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7259
				join = cap = 'round';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7260
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7261
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7262
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7263
		function isCloseEnough(pt, padding) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7264
			return point.subtract(pt).divide(padding).length <= 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7265
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7266
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7267
		function checkSegmentPoint(seg, pt, name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7268
			if (!options.selected || pt.isSelected()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7269
				var anchor = seg._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7270
				if (pt !== anchor)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7271
					pt = pt.add(anchor);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7272
				if (isCloseEnough(pt, strokePadding)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7273
					return new HitResult(name, that, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7274
						segment: seg,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7275
						point: pt
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7276
					});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7277
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7278
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7279
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7280
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7281
		function checkSegmentPoints(seg, ends) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7282
			return (ends || options.segments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7283
				&& checkSegmentPoint(seg, seg._point, 'segment')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7284
				|| (!ends && options.handles) && (
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7285
					checkSegmentPoint(seg, seg._handleIn, 'handle-in') ||
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7286
					checkSegmentPoint(seg, seg._handleOut, 'handle-out'));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7287
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7288
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7289
		function addToArea(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7290
			area.add(point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7291
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7292
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7293
		function checkSegmentStroke(segment) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7294
			if (join !== 'round' || cap !== 'round') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7295
				area = new Path({ internal: true, closed: true });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7296
				if (closed || segment._index > 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7297
						&& segment._index < numSegments - 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7298
					if (join !== 'round' && (segment._handleIn.isZero()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7299
							|| segment._handleOut.isZero()))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7300
						Path._addBevelJoin(segment, join, radius, miterLimit,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7301
								addToArea, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7302
				} else if (cap !== 'round') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7303
					Path._addSquareCap(segment, cap, radius, addToArea, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7304
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7305
				if (!area.isEmpty()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7306
					var loc;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7307
					return area.contains(point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7308
						|| (loc = area.getNearestLocation(point))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7309
							&& isCloseEnough(loc.getPoint(), tolerancePadding);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7310
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7311
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7312
			return isCloseEnough(segment._point, strokePadding);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7313
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7314
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7315
		if (options.ends && !options.segments && !closed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7316
			if (res = checkSegmentPoints(segments[0], true)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7317
					|| checkSegmentPoints(segments[numSegments - 1], true))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7318
				return res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7319
		} else if (options.segments || options.handles) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7320
			for (var i = 0; i < numSegments; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7321
				if (res = checkSegmentPoints(segments[i]))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7322
					return res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7323
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7324
		if (radius !== null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7325
			loc = this.getNearestLocation(point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7326
			if (loc) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7327
				var parameter = loc.getParameter();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7328
				if (parameter === 0 || parameter === 1 && numSegments > 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7329
					if (!checkSegmentStroke(loc.getSegment()))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7330
						loc = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7331
				} else if (!isCloseEnough(loc.getPoint(), strokePadding)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7332
					loc = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7333
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7334
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7335
			if (!loc && join === 'miter' && numSegments > 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7336
				for (var i = 0; i < numSegments; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7337
					var segment = segments[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7338
					if (point.getDistance(segment._point) <= miterLimit
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7339
							&& checkSegmentStroke(segment)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7340
						loc = segment.getLocation();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7341
						break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7342
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7343
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7344
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7345
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7346
		return !loc && hitFill && this._contains(point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7347
				|| loc && !hitStroke && !hitCurves
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7348
					? new HitResult('fill', this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7349
					: loc
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7350
						? new HitResult(hitStroke ? 'stroke' : 'curve', this, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7351
							location: loc,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7352
							point: loc.getPoint()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7353
						})
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7354
						: null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7355
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7356
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7357
}, Base.each(['getPoint', 'getTangent', 'getNormal', 'getCurvature'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7358
	function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7359
		this[name + 'At'] = function(offset, isParameter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7360
			var loc = this.getLocationAt(offset, isParameter);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7361
			return loc && loc[name]();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7362
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7363
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7364
{
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7365
	beans: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7366
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7367
	_getOffset: function(location) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7368
		var index = location && location.getIndex();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7369
		if (index != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7370
			var curves = this.getCurves(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7371
				offset = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7372
			for (var i = 0; i < index; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7373
				offset += curves[i].getLength();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7374
			var curve = curves[index],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7375
				parameter = location.getParameter();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7376
			if (parameter > 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7377
				offset += curve.getPartLength(0, parameter);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7378
			return offset;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7379
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7380
		return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7381
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7382
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7383
	getLocationOf: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7384
		var point = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7385
			curves = this.getCurves();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7386
		for (var i = 0, l = curves.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7387
			var loc = curves[i].getLocationOf(point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7388
			if (loc)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7389
				return loc;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7390
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7391
		return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7392
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7393
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7394
	getOffsetOf: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7395
		var loc = this.getLocationOf.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7396
		return loc ? loc.getOffset() : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7397
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7398
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7399
	getLocationAt: function(offset, isParameter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7400
		var curves = this.getCurves(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7401
			length = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7402
		if (isParameter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7403
			var index = ~~offset;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7404
			return curves[index].getLocationAt(offset - index, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7405
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7406
		for (var i = 0, l = curves.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7407
			var start = length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7408
				curve = curves[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7409
			length += curve.getLength();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7410
			if (length > offset) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7411
				return curve.getLocationAt(offset - start);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7412
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7413
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7414
		if (offset <= this.getLength())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7415
			return new CurveLocation(curves[curves.length - 1], 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7416
		return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7417
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7418
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7419
	getNearestLocation: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7420
		var point = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7421
			curves = this.getCurves(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7422
			minDist = Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7423
			minLoc = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7424
		for (var i = 0, l = curves.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7425
			var loc = curves[i].getNearestLocation(point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7426
			if (loc._distance < minDist) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7427
				minDist = loc._distance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7428
				minLoc = loc;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7429
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7430
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7431
		return minLoc;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7432
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7433
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7434
	getNearestPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7435
		return this.getNearestLocation.apply(this, arguments).getPoint();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7436
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7437
}), new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7438
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7439
	function drawHandles(ctx, segments, matrix, size) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7440
		var half = size / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7441
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7442
		function drawHandle(index) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7443
			var hX = coords[index],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7444
				hY = coords[index + 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7445
			if (pX != hX || pY != hY) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7446
				ctx.beginPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7447
				ctx.moveTo(pX, pY);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7448
				ctx.lineTo(hX, hY);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7449
				ctx.stroke();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7450
				ctx.beginPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7451
				ctx.arc(hX, hY, half, 0, Math.PI * 2, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7452
				ctx.fill();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7453
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7454
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7455
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7456
		var coords = new Array(6);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7457
		for (var i = 0, l = segments.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7458
			var segment = segments[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7459
			segment._transformCoordinates(matrix, coords, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7460
			var state = segment._selectionState,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7461
				pX = coords[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7462
				pY = coords[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7463
			if (state & 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7464
				drawHandle(2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7465
			if (state & 2)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7466
				drawHandle(4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7467
			ctx.fillRect(pX - half, pY - half, size, size);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7468
			if (!(state & 4)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7469
				var fillStyle = ctx.fillStyle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7470
				ctx.fillStyle = '#ffffff';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7471
				ctx.fillRect(pX - half + 1, pY - half + 1, size - 2, size - 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7472
				ctx.fillStyle = fillStyle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7473
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7474
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7475
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7476
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7477
	function drawSegments(ctx, path, matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7478
		var segments = path._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7479
			length = segments.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7480
			coords = new Array(6),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7481
			first = true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7482
			curX, curY,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7483
			prevX, prevY,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7484
			inX, inY,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7485
			outX, outY;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7486
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7487
		function drawSegment(segment) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7488
			if (matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7489
				segment._transformCoordinates(matrix, coords, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7490
				curX = coords[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7491
				curY = coords[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7492
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7493
				var point = segment._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7494
				curX = point._x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7495
				curY = point._y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7496
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7497
			if (first) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7498
				ctx.moveTo(curX, curY);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7499
				first = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7500
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7501
				if (matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7502
					inX = coords[2];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7503
					inY = coords[3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7504
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7505
					var handle = segment._handleIn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7506
					inX = curX + handle._x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7507
					inY = curY + handle._y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7508
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7509
				if (inX === curX && inY === curY
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7510
						&& outX === prevX && outY === prevY) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7511
					ctx.lineTo(curX, curY);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7512
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7513
					ctx.bezierCurveTo(outX, outY, inX, inY, curX, curY);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7514
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7515
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7516
			prevX = curX;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7517
			prevY = curY;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7518
			if (matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7519
				outX = coords[4];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7520
				outY = coords[5];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7521
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7522
				var handle = segment._handleOut;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7523
				outX = prevX + handle._x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7524
				outY = prevY + handle._y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7525
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7526
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7527
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7528
		for (var i = 0; i < length; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7529
			drawSegment(segments[i]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7530
		if (path._closed && length > 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7531
			drawSegment(segments[0]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7532
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7533
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7534
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7535
		_draw: function(ctx, param, strokeMatrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7536
			var dontStart = param.dontStart,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7537
				dontPaint = param.dontFinish || param.clip,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7538
				style = this.getStyle(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7539
				hasFill = style.hasFill(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7540
				hasStroke = style.hasStroke(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7541
				dashArray = style.getDashArray(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7542
				dashLength = !paper.support.nativeDash && hasStroke
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7543
						&& dashArray && dashArray.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7544
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7545
			if (!dontStart)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7546
				ctx.beginPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7547
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7548
			if (!dontStart && this._currentPath) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7549
				ctx.currentPath = this._currentPath;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7550
			} else if (hasFill || hasStroke && !dashLength || dontPaint) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7551
				drawSegments(ctx, this, strokeMatrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7552
				if (this._closed)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7553
					ctx.closePath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7554
				if (!dontStart)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7555
					this._currentPath = ctx.currentPath;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7556
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7557
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7558
			function getOffset(i) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7559
				return dashArray[((i % dashLength) + dashLength) % dashLength];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7560
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7561
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7562
			if (!dontPaint && (hasFill || hasStroke)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7563
				this._setStyles(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7564
				if (hasFill) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7565
					ctx.fill(style.getWindingRule());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7566
					ctx.shadowColor = 'rgba(0,0,0,0)';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7567
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7568
				if (hasStroke) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7569
					if (dashLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7570
						if (!dontStart)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7571
							ctx.beginPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7572
						var iterator = new PathIterator(this, 32, 0.25,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7573
								strokeMatrix),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7574
							length = iterator.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7575
							from = -style.getDashOffset(), to,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7576
							i = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7577
						from = from % length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7578
						while (from > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7579
							from -= getOffset(i--) + getOffset(i--);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7580
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7581
						while (from < length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7582
							to = from + getOffset(i++);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7583
							if (from > 0 || to > 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7584
								iterator.drawPart(ctx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7585
										Math.max(from, 0), Math.max(to, 0));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7586
							from = to + getOffset(i++);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7587
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7588
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7589
					ctx.stroke();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7590
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7591
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7592
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7593
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7594
		_drawSelected: function(ctx, matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7595
			ctx.beginPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7596
			drawSegments(ctx, this, matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7597
			ctx.stroke();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7598
			drawHandles(ctx, this._segments, matrix, paper.settings.handleSize);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7599
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7600
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7601
}, new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7602
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7603
	function getFirstControlPoints(rhs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7604
		var n = rhs.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7605
			x = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7606
			tmp = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7607
			b = 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7608
		x[0] = rhs[0] / b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7609
		for (var i = 1; i < n; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7610
			tmp[i] = 1 / b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7611
			b = (i < n - 1 ? 4 : 2) - tmp[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7612
			x[i] = (rhs[i] - x[i - 1]) / b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7613
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7614
		for (var i = 1; i < n; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7615
			x[n - i - 1] -= tmp[n - i] * x[n - i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7616
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7617
		return x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7618
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7619
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7620
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7621
		smooth: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7622
			var segments = this._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7623
				size = segments.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7624
				closed = this._closed,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7625
				n = size,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7626
				overlap = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7627
			if (size <= 2)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7628
				return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7629
			if (closed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7630
				overlap = Math.min(size, 4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7631
				n += Math.min(size, overlap) * 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7632
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7633
			var knots = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7634
			for (var i = 0; i < size; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7635
				knots[i + overlap] = segments[i]._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7636
			if (closed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7637
				for (var i = 0; i < overlap; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7638
					knots[i] = segments[i + size - overlap]._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7639
					knots[i + size + overlap] = segments[i]._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7640
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7641
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7642
				n--;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7643
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7644
			var rhs = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7645
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7646
			for (var i = 1; i < n - 1; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7647
				rhs[i] = 4 * knots[i]._x + 2 * knots[i + 1]._x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7648
			rhs[0] = knots[0]._x + 2 * knots[1]._x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7649
			rhs[n - 1] = 3 * knots[n - 1]._x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7650
			var x = getFirstControlPoints(rhs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7651
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7652
			for (var i = 1; i < n - 1; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7653
				rhs[i] = 4 * knots[i]._y + 2 * knots[i + 1]._y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7654
			rhs[0] = knots[0]._y + 2 * knots[1]._y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7655
			rhs[n - 1] = 3 * knots[n - 1]._y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7656
			var y = getFirstControlPoints(rhs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7657
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7658
			if (closed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7659
				for (var i = 0, j = size; i < overlap; i++, j++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7660
					var f1 = i / overlap,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7661
						f2 = 1 - f1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7662
						ie = i + overlap,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7663
						je = j + overlap;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7664
					x[j] = x[i] * f1 + x[j] * f2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7665
					y[j] = y[i] * f1 + y[j] * f2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7666
					x[je] = x[ie] * f2 + x[je] * f1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7667
					y[je] = y[ie] * f2 + y[je] * f1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7668
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7669
				n--;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7670
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7671
			var handleIn = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7672
			for (var i = overlap; i <= n - overlap; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7673
				var segment = segments[i - overlap];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7674
				if (handleIn)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7675
					segment.setHandleIn(handleIn.subtract(segment._point));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7676
				if (i < n) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7677
					segment.setHandleOut(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7678
							new Point(x[i], y[i]).subtract(segment._point));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7679
					handleIn = i < n - 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7680
							? new Point(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7681
								2 * knots[i + 1]._x - x[i + 1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7682
								2 * knots[i + 1]._y - y[i + 1])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7683
							: new Point(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7684
								(knots[n]._x + x[n - 1]) / 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7685
								(knots[n]._y + y[n - 1]) / 2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7686
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7687
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7688
			if (closed && handleIn) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7689
				var segment = this._segments[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7690
				segment.setHandleIn(handleIn.subtract(segment._point));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7691
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7692
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7693
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7694
}, new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7695
	function getCurrentSegment(that) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7696
		var segments = that._segments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7697
		if (segments.length === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7698
			throw new Error('Use a moveTo() command first');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7699
		return segments[segments.length - 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7700
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7701
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7702
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7703
		moveTo: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7704
			var segments = this._segments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7705
			if (segments.length === 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7706
				this.removeSegment(0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7707
			if (!segments.length)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7708
				this._add([ new Segment(Point.read(arguments)) ]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7709
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7710
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7711
		moveBy: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7712
			throw new Error('moveBy() is unsupported on Path items.');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7713
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7714
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7715
		lineTo: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7716
			this._add([ new Segment(Point.read(arguments)) ]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7717
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7718
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7719
		cubicCurveTo: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7720
			var handle1 = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7721
				handle2 = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7722
				to = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7723
				current = getCurrentSegment(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7724
			current.setHandleOut(handle1.subtract(current._point));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7725
			this._add([ new Segment(to, handle2.subtract(to)) ]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7726
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7727
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7728
		quadraticCurveTo: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7729
			var handle = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7730
				to = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7731
				current = getCurrentSegment(this)._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7732
			this.cubicCurveTo(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7733
				handle.add(current.subtract(handle).multiply(1 / 3)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7734
				handle.add(to.subtract(handle).multiply(1 / 3)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7735
				to
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7736
			);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7737
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7738
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7739
		curveTo: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7740
			var through = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7741
				to = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7742
				t = Base.pick(Base.read(arguments), 0.5),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7743
				t1 = 1 - t,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7744
				current = getCurrentSegment(this)._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7745
				handle = through.subtract(current.multiply(t1 * t1))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7746
					.subtract(to.multiply(t * t)).divide(2 * t * t1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7747
			if (handle.isNaN())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7748
				throw new Error(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7749
					'Cannot put a curve through points with parameter = ' + t);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7750
			this.quadraticCurveTo(handle, to);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7751
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7752
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7753
		arcTo: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7754
			var current = getCurrentSegment(this),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7755
				from = current._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7756
				to = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7757
				through,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7758
				peek = Base.peek(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7759
				clockwise = Base.pick(peek, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7760
				center, extent, vector, matrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7761
			if (typeof clockwise === 'boolean') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7762
				var middle = from.add(to).divide(2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7763
				through = middle.add(middle.subtract(from).rotate(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7764
						clockwise ? -90 : 90));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7765
			} else if (Base.remain(arguments) <= 2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7766
				through = to;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7767
				to = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7768
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7769
				var radius = Size.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7770
				if (radius.isZero())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7771
					return this.lineTo(to);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7772
				var rotation = Base.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7773
					clockwise = !!Base.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7774
					large = !!Base.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7775
					middle = from.add(to).divide(2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7776
					pt = from.subtract(middle).rotate(-rotation),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7777
					x = pt.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7778
					y = pt.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7779
					abs = Math.abs,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7780
					epsilon = 1e-12,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7781
					rx = abs(radius.width),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7782
					ry = abs(radius.height),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7783
					rxSq = rx * rx,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7784
					rySq = ry * ry,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7785
					xSq =  x * x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7786
					ySq =  y * y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7787
				var factor = Math.sqrt(xSq / rxSq + ySq / rySq);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7788
				if (factor > 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7789
					rx *= factor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7790
					ry *= factor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7791
					rxSq = rx * rx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7792
					rySq = ry * ry;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7793
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7794
				factor = (rxSq * rySq - rxSq * ySq - rySq * xSq) /
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7795
						(rxSq * ySq + rySq * xSq);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7796
				if (abs(factor) < epsilon)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7797
					factor = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7798
				if (factor < 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7799
					throw new Error(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7800
							'Cannot create an arc with the given arguments');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7801
				center = new Point(rx * y / ry, -ry * x / rx)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7802
						.multiply((large === clockwise ? -1 : 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7803
							* Math.sqrt(factor))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7804
						.rotate(rotation).add(middle);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7805
				matrix = new Matrix().translate(center).rotate(rotation)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7806
						.scale(rx, ry);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7807
				vector = matrix._inverseTransform(from);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7808
				extent = vector.getDirectedAngle(matrix._inverseTransform(to));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7809
				if (!clockwise && extent > 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7810
					extent -= 360;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7811
				else if (clockwise && extent < 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7812
					extent += 360;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7813
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7814
			if (through) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7815
				var l1 = new Line(from.add(through).divide(2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7816
							through.subtract(from).rotate(90), true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7817
					l2 = new Line(through.add(to).divide(2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7818
							to.subtract(through).rotate(90), true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7819
					line = new Line(from, to),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7820
					throughSide = line.getSide(through);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7821
				center = l1.intersect(l2, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7822
				if (!center) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7823
					if (!throughSide)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7824
						return this.lineTo(to);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7825
					throw new Error(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7826
							'Cannot create an arc with the given arguments');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7827
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7828
				vector = from.subtract(center);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7829
				extent = vector.getDirectedAngle(to.subtract(center));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7830
				var centerSide = line.getSide(center);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7831
				if (centerSide === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7832
					extent = throughSide * Math.abs(extent);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7833
				} else if (throughSide === centerSide) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7834
					extent += extent < 0 ? 360 : -360;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7835
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7836
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7837
			var ext = Math.abs(extent),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7838
				count = ext >= 360 ? 4 : Math.ceil(ext / 90),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7839
				inc = extent / count,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7840
				half = inc * Math.PI / 360,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7841
				z = 4 / 3 * Math.sin(half) / (1 + Math.cos(half)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7842
				segments = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7843
			for (var i = 0; i <= count; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7844
				var pt = to,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7845
					out = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7846
				if (i < count) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7847
					out = vector.rotate(90).multiply(z);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7848
					if (matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7849
						pt = matrix._transformPoint(vector);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7850
						out = matrix._transformPoint(vector.add(out))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7851
								.subtract(pt);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7852
					} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7853
						pt = center.add(vector);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7854
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7855
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7856
				if (i === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7857
					current.setHandleOut(out);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7858
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7859
					var _in = vector.rotate(-90).multiply(z);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7860
					if (matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7861
						_in = matrix._transformPoint(vector.add(_in))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7862
								.subtract(pt);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7863
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7864
					segments.push(new Segment(pt, _in, out));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7865
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7866
				vector = vector.rotate(inc);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7867
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7868
			this._add(segments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7869
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7870
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7871
		lineBy: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7872
			var to = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7873
				current = getCurrentSegment(this)._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7874
			this.lineTo(current.add(to));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7875
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7876
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7877
		curveBy: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7878
			var through = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7879
				to = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7880
				parameter = Base.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7881
				current = getCurrentSegment(this)._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7882
			this.curveTo(current.add(through), current.add(to), parameter);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7883
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7884
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7885
		cubicCurveBy: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7886
			var handle1 = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7887
				handle2 = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7888
				to = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7889
				current = getCurrentSegment(this)._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7890
			this.cubicCurveTo(current.add(handle1), current.add(handle2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7891
					current.add(to));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7892
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7893
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7894
		quadraticCurveBy: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7895
			var handle = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7896
				to = Point.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7897
				current = getCurrentSegment(this)._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7898
			this.quadraticCurveTo(current.add(handle), current.add(to));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7899
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7900
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7901
		arcBy: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7902
			var current = getCurrentSegment(this)._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7903
				point = current.add(Point.read(arguments)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7904
				clockwise = Base.pick(Base.peek(arguments), true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7905
			if (typeof clockwise === 'boolean') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7906
				this.arcTo(point, clockwise);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7907
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7908
				this.arcTo(point, current.add(Point.read(arguments)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7909
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7910
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7911
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7912
		closePath: function(join) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7913
			this.setClosed(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7914
			if (join)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7915
				this.join();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7916
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7917
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7918
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7919
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7920
	_getBounds: function(getter, matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7921
		return Path[getter](this._segments, this._closed, this.getStyle(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7922
				matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7923
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7924
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7925
statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7926
	isClockwise: function(segments) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7927
		var sum = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7928
		for (var i = 0, l = segments.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7929
			sum += Curve.getEdgeSum(Curve.getValues(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7930
					segments[i], segments[i + 1 < l ? i + 1 : 0]));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7931
		return sum > 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7932
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7933
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7934
	getBounds: function(segments, closed, style, matrix, strokePadding) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7935
		var first = segments[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7936
		if (!first)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7937
			return new Rectangle();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7938
		var coords = new Array(6),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7939
			prevCoords = first._transformCoordinates(matrix, new Array(6), false),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7940
			min = prevCoords.slice(0, 2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7941
			max = min.slice(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7942
			roots = new Array(2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7943
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7944
		function processSegment(segment) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7945
			segment._transformCoordinates(matrix, coords, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7946
			for (var i = 0; i < 2; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7947
				Curve._addBounds(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7948
					prevCoords[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7949
					prevCoords[i + 4],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7950
					coords[i + 2],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7951
					coords[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7952
					i, strokePadding ? strokePadding[i] : 0, min, max, roots);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7953
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7954
			var tmp = prevCoords;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7955
			prevCoords = coords;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7956
			coords = tmp;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7957
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7958
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7959
		for (var i = 1, l = segments.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7960
			processSegment(segments[i]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7961
		if (closed)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7962
			processSegment(first);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7963
		return new Rectangle(min[0], min[1], max[0] - min[0], max[1] - min[1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7964
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7965
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7966
	getStrokeBounds: function(segments, closed, style, matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7967
		if (!style.hasStroke())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7968
			return Path.getBounds(segments, closed, style, matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7969
		var length = segments.length - (closed ? 0 : 1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7970
			radius = style.getStrokeWidth() / 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7971
			padding = Path._getPenPadding(radius, matrix),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7972
			bounds = Path.getBounds(segments, closed, style, matrix, padding),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7973
			join = style.getStrokeJoin(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7974
			cap = style.getStrokeCap(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7975
			miterLimit = radius * style.getMiterLimit();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7976
		var joinBounds = new Rectangle(new Size(padding).multiply(2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7977
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7978
		function add(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7979
			bounds = bounds.include(matrix
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7980
				? matrix._transformPoint(point, point) : point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7981
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7982
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7983
		function addRound(segment) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7984
			bounds = bounds.unite(joinBounds.setCenter(matrix
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7985
				? matrix._transformPoint(segment._point) : segment._point));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7986
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7987
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7988
		function addJoin(segment, join) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7989
			var handleIn = segment._handleIn,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7990
				handleOut = segment._handleOut;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7991
			if (join === 'round' || !handleIn.isZero() && !handleOut.isZero()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7992
					&& handleIn.isColinear(handleOut)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7993
				addRound(segment);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7994
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7995
				Path._addBevelJoin(segment, join, radius, miterLimit, add);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7996
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7997
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7998
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  7999
		function addCap(segment, cap) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8000
			if (cap === 'round') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8001
				addRound(segment);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8002
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8003
				Path._addSquareCap(segment, cap, radius, add);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8004
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8005
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8006
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8007
		for (var i = 1; i < length; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8008
			addJoin(segments[i], join);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8009
		if (closed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8010
			addJoin(segments[0], join);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8011
		} else if (length > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8012
			addCap(segments[0], cap);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8013
			addCap(segments[segments.length - 1], cap);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8014
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8015
		return bounds;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8016
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8017
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8018
	_getPenPadding: function(radius, matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8019
		if (!matrix)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8020
			return [radius, radius];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8021
		var mx = matrix.shiftless(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8022
			hor = mx.transform(new Point(radius, 0)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8023
			ver = mx.transform(new Point(0, radius)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8024
			phi = hor.getAngleInRadians(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8025
			a = hor.getLength(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8026
			b = ver.getLength();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8027
		var sin = Math.sin(phi),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8028
			cos = Math.cos(phi),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8029
			tan = Math.tan(phi),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8030
			tx = -Math.atan(b * tan / a),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8031
			ty = Math.atan(b / (tan * a));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8032
		return [Math.abs(a * Math.cos(tx) * cos - b * Math.sin(tx) * sin),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8033
				Math.abs(b * Math.sin(ty) * cos + a * Math.cos(ty) * sin)];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8034
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8035
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8036
	_addBevelJoin: function(segment, join, radius, miterLimit, addPoint, area) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8037
		var curve2 = segment.getCurve(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8038
			curve1 = curve2.getPrevious(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8039
			point = curve2.getPointAt(0, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8040
			normal1 = curve1.getNormalAt(1, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8041
			normal2 = curve2.getNormalAt(0, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8042
			step = normal1.getDirectedAngle(normal2) < 0 ? -radius : radius;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8043
		normal1.setLength(step);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8044
		normal2.setLength(step);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8045
		if (area) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8046
			addPoint(point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8047
			addPoint(point.add(normal1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8048
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8049
		if (join === 'miter') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8050
			var corner = new Line(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8051
					point.add(normal1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8052
					new Point(-normal1.y, normal1.x), true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8053
				).intersect(new Line(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8054
					point.add(normal2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8055
					new Point(-normal2.y, normal2.x), true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8056
				), true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8057
			if (corner && point.getDistance(corner) <= miterLimit) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8058
				addPoint(corner);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8059
				if (!area)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8060
					return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8061
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8062
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8063
		if (!area)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8064
			addPoint(point.add(normal1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8065
		addPoint(point.add(normal2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8066
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8067
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8068
	_addSquareCap: function(segment, cap, radius, addPoint, area) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8069
		var point = segment._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8070
			loc = segment.getLocation(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8071
			normal = loc.getNormal().normalize(radius);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8072
		if (area) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8073
			addPoint(point.subtract(normal));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8074
			addPoint(point.add(normal));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8075
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8076
		if (cap === 'square')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8077
			point = point.add(normal.rotate(loc.getParameter() === 0 ? -90 : 90));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8078
		addPoint(point.add(normal));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8079
		addPoint(point.subtract(normal));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8080
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8081
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8082
	getHandleBounds: function(segments, closed, style, matrix, strokePadding,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8083
			joinPadding) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8084
		var coords = new Array(6),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8085
			x1 = Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8086
			x2 = -x1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8087
			y1 = x1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8088
			y2 = x2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8089
		for (var i = 0, l = segments.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8090
			var segment = segments[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8091
			segment._transformCoordinates(matrix, coords, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8092
			for (var j = 0; j < 6; j += 2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8093
				var padding = j === 0 ? joinPadding : strokePadding,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8094
					paddingX = padding ? padding[0] : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8095
					paddingY = padding ? padding[1] : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8096
					x = coords[j],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8097
					y = coords[j + 1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8098
					xn = x - paddingX,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8099
					xx = x + paddingX,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8100
					yn = y - paddingY,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8101
					yx = y + paddingY;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8102
				if (xn < x1) x1 = xn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8103
				if (xx > x2) x2 = xx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8104
				if (yn < y1) y1 = yn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8105
				if (yx > y2) y2 = yx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8106
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8107
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8108
		return new Rectangle(x1, y1, x2 - x1, y2 - y1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8109
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8110
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8111
	getRoughBounds: function(segments, closed, style, matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8112
		var strokeRadius = style.hasStroke() ? style.getStrokeWidth() / 2 : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8113
			joinRadius = strokeRadius;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8114
		if (strokeRadius > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8115
			if (style.getStrokeJoin() === 'miter')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8116
				joinRadius = strokeRadius * style.getMiterLimit();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8117
			if (style.getStrokeCap() === 'square')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8118
				joinRadius = Math.max(joinRadius, strokeRadius * Math.sqrt(2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8119
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8120
		return Path.getHandleBounds(segments, closed, style, matrix,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8121
				Path._getPenPadding(strokeRadius, matrix),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8122
				Path._getPenPadding(joinRadius, matrix));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8123
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8124
}});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8125
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8126
Path.inject({ statics: new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8127
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8128
	var kappa = 0.5522847498307936,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8129
		ellipseSegments = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8130
			new Segment([-1, 0], [0, kappa ], [0, -kappa]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8131
			new Segment([0, -1], [-kappa, 0], [kappa, 0 ]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8132
			new Segment([1, 0], [0, -kappa], [0, kappa ]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8133
			new Segment([0, 1], [kappa, 0 ], [-kappa, 0])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8134
		];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8135
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8136
	function createPath(segments, closed, args) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8137
		var props = Base.getNamed(args),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8138
			path = new Path(props && props.insert === false && Item.NO_INSERT);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8139
		path._add(segments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8140
		path._closed = closed;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8141
		return path.set(props);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8142
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8143
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8144
	function createEllipse(center, radius, args) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8145
		var segments = new Array(4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8146
		for (var i = 0; i < 4; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8147
			var segment = ellipseSegments[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8148
			segments[i] = new Segment(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8149
				segment._point.multiply(radius).add(center),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8150
				segment._handleIn.multiply(radius),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8151
				segment._handleOut.multiply(radius)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8152
			);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8153
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8154
		return createPath(segments, true, args);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8155
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8156
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8157
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8158
		Line: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8159
			return createPath([
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8160
				new Segment(Point.readNamed(arguments, 'from')),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8161
				new Segment(Point.readNamed(arguments, 'to'))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8162
			], false, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8163
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8164
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8165
		Circle: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8166
			var center = Point.readNamed(arguments, 'center'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8167
				radius = Base.readNamed(arguments, 'radius');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8168
			return createEllipse(center, new Size(radius), arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8169
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8170
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8171
		Rectangle: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8172
			var rect = Rectangle.readNamed(arguments, 'rectangle'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8173
				radius = Size.readNamed(arguments, 'radius', 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8174
						{ readNull: true }),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8175
				bl = rect.getBottomLeft(true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8176
				tl = rect.getTopLeft(true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8177
				tr = rect.getTopRight(true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8178
				br = rect.getBottomRight(true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8179
				segments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8180
			if (!radius || radius.isZero()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8181
				segments = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8182
					new Segment(bl),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8183
					new Segment(tl),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8184
					new Segment(tr),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8185
					new Segment(br)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8186
				];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8187
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8188
				radius = Size.min(radius, rect.getSize(true).divide(2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8189
				var rx = radius.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8190
					ry = radius.height,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8191
					hx = rx * kappa,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8192
					hy = ry * kappa;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8193
				segments = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8194
					new Segment(bl.add(rx, 0), null, [-hx, 0]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8195
					new Segment(bl.subtract(0, ry), [0, hy]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8196
					new Segment(tl.add(0, ry), null, [0, -hy]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8197
					new Segment(tl.add(rx, 0), [-hx, 0], null),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8198
					new Segment(tr.subtract(rx, 0), null, [hx, 0]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8199
					new Segment(tr.add(0, ry), [0, -hy], null),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8200
					new Segment(br.subtract(0, ry), null, [0, hy]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8201
					new Segment(br.subtract(rx, 0), [hx, 0])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8202
				];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8203
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8204
			return createPath(segments, true, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8205
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8206
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8207
		RoundRectangle: '#Rectangle',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8208
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8209
		Ellipse: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8210
			var ellipse = Shape._readEllipse(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8211
			return createEllipse(ellipse.center, ellipse.radius, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8212
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8213
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8214
		Oval: '#Ellipse',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8215
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8216
		Arc: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8217
			var from = Point.readNamed(arguments, 'from'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8218
				through = Point.readNamed(arguments, 'through'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8219
				to = Point.readNamed(arguments, 'to'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8220
				props = Base.getNamed(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8221
				path = new Path(props && props.insert === false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8222
						&& Item.NO_INSERT);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8223
			path.moveTo(from);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8224
			path.arcTo(through, to);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8225
			return path.set(props);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8226
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8227
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8228
		RegularPolygon: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8229
			var center = Point.readNamed(arguments, 'center'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8230
				sides = Base.readNamed(arguments, 'sides'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8231
				radius = Base.readNamed(arguments, 'radius'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8232
				step = 360 / sides,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8233
				three = !(sides % 3),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8234
				vector = new Point(0, three ? -radius : radius),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8235
				offset = three ? -1 : 0.5,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8236
				segments = new Array(sides);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8237
			for (var i = 0; i < sides; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8238
				segments[i] = new Segment(center.add(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8239
					vector.rotate((i + offset) * step)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8240
			return createPath(segments, true, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8241
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8242
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8243
		Star: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8244
			var center = Point.readNamed(arguments, 'center'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8245
				points = Base.readNamed(arguments, 'points') * 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8246
				radius1 = Base.readNamed(arguments, 'radius1'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8247
				radius2 = Base.readNamed(arguments, 'radius2'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8248
				step = 360 / points,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8249
				vector = new Point(0, -1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8250
				segments = new Array(points);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8251
			for (var i = 0; i < points; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8252
				segments[i] = new Segment(center.add(vector.rotate(step * i)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8253
						.multiply(i % 2 ? radius2 : radius1)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8254
			return createPath(segments, true, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8255
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8256
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8257
}});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8258
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8259
var CompoundPath = PathItem.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8260
	_class: 'CompoundPath',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8261
	_serializeFields: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8262
		children: []
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8263
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8264
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8265
	initialize: function CompoundPath(arg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8266
		this._children = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8267
		this._namedChildren = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8268
		if (!this._initialize(arg)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8269
			if (typeof arg === 'string') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8270
				this.setPathData(arg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8271
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8272
				this.addChildren(Array.isArray(arg) ? arg : arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8273
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8274
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8275
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8276
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8277
	insertChildren: function insertChildren(index, items, _preserve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8278
		items = insertChildren.base.call(this, index, items, _preserve, Path);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8279
		for (var i = 0, l = !_preserve && items && items.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8280
			var item = items[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8281
			if (item._clockwise === undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8282
				item.setClockwise(item._index === 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8283
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8284
		return items;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8285
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8286
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8287
	reverse: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8288
		var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8289
		for (var i = 0, l = children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8290
			children[i].reverse();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8291
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8292
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8293
	smooth: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8294
		for (var i = 0, l = this._children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8295
			this._children[i].smooth();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8296
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8297
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8298
	reduce: function reduce() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8299
		if (this._children.length === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8300
			var path = new Path(Item.NO_INSERT);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8301
			path.insertAbove(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8302
			path.setStyle(this._style);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8303
			this.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8304
			return path;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8305
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8306
			return reduce.base.call(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8307
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8308
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8309
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8310
	isClockwise: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8311
		var child = this.getFirstChild();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8312
		return child && child.isClockwise();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8313
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8314
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8315
	setClockwise: function(clockwise) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8316
		if (this.isClockwise() !== !!clockwise)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8317
			this.reverse();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8318
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8319
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8320
	getFirstSegment: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8321
		var first = this.getFirstChild();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8322
		return first && first.getFirstSegment();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8323
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8324
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8325
	getLastSegment: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8326
		var last = this.getLastChild();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8327
		return last && last.getLastSegment();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8328
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8329
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8330
	getCurves: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8331
		var children = this._children,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8332
			curves = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8333
		for (var i = 0, l = children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8334
			curves.push.apply(curves, children[i].getCurves());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8335
		return curves;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8336
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8337
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8338
	getFirstCurve: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8339
		var first = this.getFirstChild();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8340
		return first && first.getFirstCurve();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8341
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8342
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8343
	getLastCurve: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8344
		var last = this.getLastChild();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8345
		return last && last.getFirstCurve();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8346
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8347
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8348
	getArea: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8349
		var children = this._children,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8350
			area = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8351
		for (var i = 0, l = children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8352
			area += children[i].getArea();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8353
		return area;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8354
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8355
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8356
	beans: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8357
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8358
	getPathData: function(_matrix, _precision) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8359
		var children = this._children,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8360
			paths = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8361
		for (var i = 0, l = children.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8362
			var child = children[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8363
				mx = child._matrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8364
			paths.push(child.getPathData(_matrix && !mx.isIdentity()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8365
					? _matrix.chain(mx) : mx, _precision));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8366
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8367
		return paths.join(' ');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8368
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8369
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8370
	_getChildHitTestOptions: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8371
		return options.class === Path || options.type === 'path'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8372
				? options
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8373
				: new Base(options, { fill: false });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8374
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8375
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8376
	_draw: function(ctx, param, strokeMatrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8377
		var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8378
		if (children.length === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8379
			return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8380
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8381
		if (this._currentPath) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8382
			ctx.currentPath = this._currentPath;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8383
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8384
			param = param.extend({ dontStart: true, dontFinish: true });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8385
			ctx.beginPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8386
			for (var i = 0, l = children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8387
				children[i].draw(ctx, param, strokeMatrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8388
			this._currentPath = ctx.currentPath;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8389
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8390
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8391
		if (!param.clip) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8392
			this._setStyles(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8393
			var style = this._style;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8394
			if (style.hasFill()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8395
				ctx.fill(style.getWindingRule());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8396
				ctx.shadowColor = 'rgba(0,0,0,0)';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8397
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8398
			if (style.hasStroke())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8399
				ctx.stroke();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8400
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8401
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8402
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8403
	_drawSelected: function(ctx, matrix, selectedItems) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8404
		var children = this._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8405
		for (var i = 0, l = children.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8406
			var child = children[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8407
				mx = child._matrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8408
			if (!selectedItems[child._id])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8409
				child._drawSelected(ctx, mx.isIdentity() ? matrix
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8410
						: matrix.chain(mx));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8411
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8412
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8413
}, new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8414
	function getCurrentPath(that, check) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8415
		var children = that._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8416
		if (check && children.length === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8417
			throw new Error('Use a moveTo() command first');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8418
		return children[children.length - 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8419
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8420
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8421
	var fields = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8422
		moveTo: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8423
			var current = getCurrentPath(this),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8424
				path = current && current.isEmpty() ? current : new Path();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8425
			if (path !== current)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8426
				this.addChild(path);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8427
			path.moveTo.apply(path, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8428
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8429
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8430
		moveBy: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8431
			var current = getCurrentPath(this, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8432
				last = current && current.getLastSegment(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8433
				point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8434
			this.moveTo(last ? point.add(last._point) : point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8435
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8436
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8437
		closePath: function(join) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8438
			getCurrentPath(this, true).closePath(join);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8439
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8440
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8441
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8442
	Base.each(['lineTo', 'cubicCurveTo', 'quadraticCurveTo', 'curveTo', 'arcTo',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8443
			'lineBy', 'cubicCurveBy', 'quadraticCurveBy', 'curveBy', 'arcBy'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8444
			function(key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8445
				fields[key] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8446
					var path = getCurrentPath(this, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8447
					path[key].apply(path, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8448
				};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8449
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8450
	);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8451
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8452
	return fields;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8453
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8454
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8455
PathItem.inject(new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8456
	var operators = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8457
		unite: function(w) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8458
			return w === 1 || w === 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8459
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8460
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8461
		intersect: function(w) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8462
			return w === 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8463
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8464
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8465
		subtract: function(w) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8466
			return w === 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8467
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8468
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8469
		exclude: function(w) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8470
			return w === 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8471
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8472
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8473
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8474
	function computeBoolean(path1, path2, operation) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8475
		var operator = operators[operation];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8476
		function preparePath(path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8477
			return path.clone(false).reduce().reorient().transform(null, true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8478
					true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8479
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8480
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8481
		var _path1 = preparePath(path1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8482
			_path2 = path2 && path1 !== path2 && preparePath(path2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8483
		if (_path2 && /^(subtract|exclude)$/.test(operation)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8484
				^ (_path2.isClockwise() !== _path1.isClockwise()))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8485
			_path2.reverse();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8486
		splitPath(_path1.getIntersections(_path2, null, true));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8487
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8488
		var chain = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8489
			segments = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8490
			monoCurves = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8491
			tolerance = 0.000001;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8492
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8493
		function collect(paths) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8494
			for (var i = 0, l = paths.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8495
				var path = paths[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8496
				segments.push.apply(segments, path._segments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8497
				monoCurves.push.apply(monoCurves, path._getMonoCurves());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8498
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8499
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8500
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8501
		collect(_path1._children || [_path1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8502
		if (_path2)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8503
			collect(_path2._children || [_path2]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8504
		segments.sort(function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8505
			var _a = a._intersection,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8506
				_b = b._intersection;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8507
			return !_a && !_b || _a && _b ? 0 : _a ? -1 : 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8508
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8509
		for (var i = 0, l = segments.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8510
			var segment = segments[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8511
			if (segment._winding != null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8512
				continue;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8513
			chain.length = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8514
			var startSeg = segment,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8515
				totalLength = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8516
				windingSum = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8517
			do {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8518
				var length = segment.getCurve().getLength();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8519
				chain.push({ segment: segment, length: length });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8520
				totalLength += length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8521
				segment = segment.getNext();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8522
			} while (segment && !segment._intersection && segment !== startSeg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8523
			for (var j = 0; j < 3; j++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8524
				var length = totalLength * (j + 1) / 4;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8525
				for (k = 0, m = chain.length; k < m; k++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8526
					var node = chain[k],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8527
						curveLength = node.length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8528
					if (length <= curveLength) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8529
						if (length <= tolerance
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8530
								|| curveLength - length <= tolerance)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8531
							length = curveLength / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8532
						var curve = node.segment.getCurve(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8533
							pt = curve.getPointAt(length),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8534
							hor = curve.isLinear() && Math.abs(curve
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8535
									.getTangentAt(0.5, true).y) <= tolerance,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8536
							path = curve._path;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8537
						if (path._parent instanceof CompoundPath)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8538
							path = path._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8539
						windingSum += operation === 'subtract' && _path2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8540
							&& (path === _path1 && _path2._getWinding(pt, hor)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8541
							|| path === _path2 && !_path1._getWinding(pt, hor))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8542
							? 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8543
							: getWinding(pt, monoCurves, hor);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8544
						break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8545
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8546
					length -= curveLength;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8547
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8548
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8549
			var winding = Math.round(windingSum / 3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8550
			for (var j = chain.length - 1; j >= 0; j--)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8551
				chain[j].segment._winding = winding;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8552
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8553
		var result = new CompoundPath(Item.NO_INSERT);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8554
		result.insertAbove(path1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8555
		result.addChildren(tracePaths(segments, operator), true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8556
		result = result.reduce();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8557
		result.setStyle(path1._style);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8558
		return result;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8559
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8560
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8561
	function splitPath(intersections) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8562
		var tMin = 0.000001,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8563
			tMax = 1 - tMin,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8564
			linearHandles;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8565
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8566
		function resetLinear() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8567
			for (var i = 0, l = linearHandles.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8568
				linearHandles[i].set(0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8569
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8570
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8571
		for (var i = intersections.length - 1, curve, prev; i >= 0; i--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8572
			var loc = intersections[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8573
				t = loc._parameter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8574
			if (prev && prev._curve === loc._curve && prev._parameter > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8575
				t /= prev._parameter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8576
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8577
				curve = loc._curve;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8578
				if (linearHandles)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8579
					resetLinear();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8580
				linearHandles = curve.isLinear() ? [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8581
						curve._segment1._handleOut,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8582
						curve._segment2._handleIn
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8583
					] : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8584
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8585
			var newCurve,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8586
				segment;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8587
			if (newCurve = curve.divide(t, true, true)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8588
				segment = newCurve._segment1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8589
				curve = newCurve.getPrevious();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8590
				if (linearHandles)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8591
					linearHandles.push(segment._handleOut, segment._handleIn);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8592
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8593
				segment = t < tMin
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8594
					? curve._segment1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8595
					: t > tMax
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8596
						? curve._segment2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8597
						: curve.getPartLength(0, t) < curve.getPartLength(t, 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8598
							? curve._segment1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8599
							: curve._segment2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8600
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8601
			segment._intersection = loc.getIntersection();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8602
			loc._segment = segment;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8603
			prev = loc;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8604
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8605
		if (linearHandles)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8606
			resetLinear();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8607
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8608
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8609
	function getWinding(point, curves, horizontal, testContains) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8610
		var tolerance = 0.000001,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8611
			tMin = tolerance,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8612
			tMax = 1 - tMin,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8613
			px = point.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8614
			py = point.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8615
			windLeft = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8616
			windRight = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8617
			roots = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8618
			abs = Math.abs;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8619
		if (horizontal) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8620
			var yTop = -Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8621
				yBottom = Infinity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8622
				yBefore = py - tolerance,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8623
				yAfter = py + tolerance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8624
			for (var i = 0, l = curves.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8625
				var values = curves[i].values;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8626
				if (Curve.solveCubic(values, 0, px, roots, 0, 1) > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8627
					for (var j = roots.length - 1; j >= 0; j--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8628
						var y = Curve.evaluate(values, roots[j], 0).y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8629
						if (y < yBefore && y > yTop) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8630
							yTop = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8631
						} else if (y > yAfter && y < yBottom) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8632
							yBottom = y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8633
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8634
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8635
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8636
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8637
			yTop = (yTop + py) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8638
			yBottom = (yBottom + py) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8639
			if (yTop > -Infinity)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8640
				windLeft = getWinding(new Point(px, yTop), curves);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8641
			if (yBottom < Infinity)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8642
				windRight = getWinding(new Point(px, yBottom), curves);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8643
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8644
			var xBefore = px - tolerance,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8645
				xAfter = px + tolerance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8646
			for (var i = 0, l = curves.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8647
				var curve = curves[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8648
					values = curve.values,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8649
					winding = curve.winding,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8650
					prevT,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8651
					prevX;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8652
				if (winding && (winding === 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8653
						&& py >= values[1] && py <= values[7]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8654
						|| py >= values[7] && py <= values[1])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8655
					&& Curve.solveCubic(values, 1, py, roots, 0, 1) === 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8656
					var t = roots[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8657
						x = Curve.evaluate(values, t, 0).x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8658
						slope = Curve.evaluate(values, t, 1).y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8659
					if (!(t > tMax
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8660
							&& (i === l - 1 || curve.next !== curves[i + 1])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8661
							&& abs(Curve.evaluate(curve.next.values, 0, 0).x -x)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8662
								<= tolerance
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8663
						|| i > 0 && curve.previous === curves[i - 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8664
							&& abs(prevX - x) < tolerance
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8665
							&& prevT > tMax && t < tMin)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8666
						if (Numerical.isZero(slope) && !Curve.isLinear(values)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8667
								|| t < tMin && slope * Curve.evaluate(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8668
									curve.previous.values, 1, 1).y < 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8669
								|| t > tMax && slope * Curve.evaluate(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8670
									curve.next.values, 0, 1).y < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8671
							if (testContains && x >= xBefore && x <= xAfter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8672
								++windLeft;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8673
								++windRight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8674
							}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8675
						} else if (x <= xBefore) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8676
							windLeft += winding;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8677
						} else if (x >= xAfter) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8678
							windRight += winding;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8679
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8680
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8681
					prevT = t;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8682
					prevX = x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8683
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8684
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8685
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8686
		return Math.max(abs(windLeft), abs(windRight));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8687
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8688
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8689
	function tracePaths(segments, operator, selfOp) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8690
		var paths = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8691
			tMin = 0.000001,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8692
			tMax = 1 - tMin;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8693
		for (var i = 0, seg, startSeg, l = segments.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8694
			seg = startSeg = segments[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8695
			if (seg._visited || !operator(seg._winding))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8696
				continue;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8697
			var path = new Path(Item.NO_INSERT),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8698
				inter = seg._intersection,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8699
				startInterSeg = inter && inter._segment,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8700
				added = false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8701
				dir = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8702
			do {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8703
				var handleIn = dir > 0 ? seg._handleIn : seg._handleOut,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8704
					handleOut = dir > 0 ? seg._handleOut : seg._handleIn,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8705
					interSeg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8706
				if (added && (!operator(seg._winding) || selfOp)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8707
						&& (inter = seg._intersection)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8708
						&& (interSeg = inter._segment)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8709
						&& interSeg !== startSeg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8710
					if (selfOp) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8711
						seg._visited = interSeg._visited;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8712
						seg = interSeg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8713
						dir = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8714
					} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8715
						var c1 = seg.getCurve();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8716
						if (dir > 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8717
							c1 = c1.getPrevious();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8718
						var t1 = c1.getTangentAt(dir < 1 ? tMin : tMax, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8719
							c4 = interSeg.getCurve(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8720
							c3 = c4.getPrevious(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8721
							t3 = c3.getTangentAt(tMax, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8722
							t4 = c4.getTangentAt(tMin, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8723
							w3 = t1.cross(t3),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8724
							w4 = t1.cross(t4);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8725
						if (w3 * w4 !== 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8726
							var curve = w3 < w4 ? c3 : c4,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8727
								nextCurve = operator(curve._segment1._winding)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8728
									? curve
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8729
									: w3 < w4 ? c4 : c3,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8730
								nextSeg = nextCurve._segment1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8731
							dir = nextCurve === c3 ? -1 : 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8732
							if (nextSeg._visited && seg._path !== nextSeg._path
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8733
										|| !operator(nextSeg._winding)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8734
								dir = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8735
							} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8736
								seg._visited = interSeg._visited;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8737
								seg = interSeg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8738
								if (nextSeg._visited)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8739
									dir = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8740
							}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8741
						} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8742
							dir = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8743
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8744
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8745
					handleOut = dir > 0 ? seg._handleOut : seg._handleIn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8746
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8747
				path.add(new Segment(seg._point, added && handleIn, handleOut));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8748
				added = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8749
				seg._visited = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8750
				seg = dir > 0 ? seg.getNext() : seg. getPrevious();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8751
			} while (seg && !seg._visited
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8752
					&& seg !== startSeg && seg !== startInterSeg
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8753
					&& (seg._intersection || operator(seg._winding)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8754
			if (seg && (seg === startSeg || seg === startInterSeg)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8755
				path.firstSegment.setHandleIn((seg === startInterSeg
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8756
						? startInterSeg : seg)._handleIn);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8757
				path.setClosed(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8758
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8759
				path.lastSegment._handleOut.set(0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8760
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8761
			if (path._segments.length >
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8762
					(path._closed ? path.isPolygon() ? 2 : 0 : 1))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8763
				paths.push(path);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8764
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8765
		return paths;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8766
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8767
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8768
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8769
		_getWinding: function(point, horizontal, testContains) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8770
			return getWinding(point, this._getMonoCurves(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8771
					horizontal, testContains);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8772
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8773
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8774
		unite: function(path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8775
			return computeBoolean(this, path, 'unite');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8776
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8777
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8778
		intersect: function(path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8779
			return computeBoolean(this, path, 'intersect');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8780
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8781
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8782
		subtract: function(path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8783
			return computeBoolean(this, path, 'subtract');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8784
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8785
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8786
		exclude: function(path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8787
			return computeBoolean(this, path, 'exclude');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8788
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8789
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8790
		divide: function(path) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8791
			return new Group([this.subtract(path), this.intersect(path)]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8792
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8793
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8794
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8795
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8796
Path.inject({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8797
	_getMonoCurves: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8798
		var monoCurves = this._monoCurves,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8799
			prevCurve;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8800
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8801
		function insertCurve(v) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8802
			var y0 = v[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8803
				y1 = v[7],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8804
				curve = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8805
					values: v,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8806
					winding: y0 === y1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8807
						? 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8808
						: y0 > y1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8809
							? -1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8810
							: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8811
					previous: prevCurve,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8812
					next: null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8813
				};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8814
			if (prevCurve)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8815
				prevCurve.next = curve;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8816
			monoCurves.push(curve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8817
			prevCurve = curve;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8818
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8819
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8820
		function handleCurve(v) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8821
			if (Curve.getLength(v) === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8822
				return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8823
			var y0 = v[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8824
				y1 = v[3],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8825
				y2 = v[5],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8826
				y3 = v[7];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8827
			if (Curve.isLinear(v)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8828
				insertCurve(v);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8829
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8830
				var a = 3 * (y1 - y2) - y0 + y3,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8831
					b = 2 * (y0 + y2) - 4 * y1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8832
					c = y1 - y0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8833
					tolerance = 0.000001,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8834
					roots = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8835
				var count = Numerical.solveQuadratic(a, b, c, roots, tolerance,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8836
						1 - tolerance);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8837
				if (count === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8838
					insertCurve(v);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8839
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8840
					roots.sort();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8841
					var t = roots[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8842
						parts = Curve.subdivide(v, t);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8843
					insertCurve(parts[0]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8844
					if (count > 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8845
						t = (roots[1] - t) / (1 - t);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8846
						parts = Curve.subdivide(parts[1], t);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8847
						insertCurve(parts[0]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8848
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8849
					insertCurve(parts[1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8850
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8851
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8852
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8853
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8854
		if (!monoCurves) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8855
			monoCurves = this._monoCurves = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8856
			var curves = this.getCurves(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8857
				segments = this._segments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8858
			for (var i = 0, l = curves.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8859
				handleCurve(curves[i].getValues());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8860
			if (!this._closed && segments.length > 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8861
				var p1 = segments[segments.length - 1]._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8862
					p2 = segments[0]._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8863
					p1x = p1._x, p1y = p1._y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8864
					p2x = p2._x, p2y = p2._y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8865
				handleCurve([p1x, p1y, p1x, p1y, p2x, p2y, p2x, p2y]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8866
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8867
			if (monoCurves.length > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8868
				var first = monoCurves[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8869
					last = monoCurves[monoCurves.length - 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8870
				first.previous = last;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8871
				last.next = first;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8872
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8873
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8874
		return monoCurves;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8875
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8876
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8877
	getInteriorPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8878
		var bounds = this.getBounds(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8879
			point = bounds.getCenter(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8880
		if (!this.contains(point)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8881
			var curves = this._getMonoCurves(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8882
				roots = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8883
				y = point.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8884
				xIntercepts = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8885
			for (var i = 0, l = curves.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8886
				var values = curves[i].values;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8887
				if ((curves[i].winding === 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8888
						&& y >= values[1] && y <= values[7]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8889
						|| y >= values[7] && y <= values[1])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8890
						&& Curve.solveCubic(values, 1, y, roots, 0, 1) > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8891
					for (var j = roots.length - 1; j >= 0; j--)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8892
						xIntercepts.push(Curve.evaluate(values, roots[j], 0).x);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8893
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8894
				if (xIntercepts.length > 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8895
					break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8896
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8897
			point.x = (xIntercepts[0] + xIntercepts[1]) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8898
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8899
		return point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8900
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8901
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8902
	reorient: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8903
		this.setClockwise(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8904
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8905
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8906
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8907
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8908
CompoundPath.inject({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8909
	_getMonoCurves: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8910
		var children = this._children,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8911
			monoCurves = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8912
		for (var i = 0, l = children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8913
			monoCurves.push.apply(monoCurves, children[i]._getMonoCurves());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8914
		return monoCurves;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8915
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8916
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8917
	reorient: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8918
		var children = this.removeChildren().sort(function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8919
			return b.getBounds().getArea() - a.getBounds().getArea();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8920
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8921
		if (children.length > 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8922
			this.addChildren(children);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8923
			var clockwise = children[0].isClockwise();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8924
			for (var i = 1, l = children.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8925
				var point = children[i].getInteriorPoint(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8926
					counters = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8927
				for (var j = i - 1; j >= 0; j--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8928
					if (children[j].contains(point))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8929
						counters++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8930
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8931
				children[i].setClockwise(counters % 2 === 0 && clockwise);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8932
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8933
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8934
		return this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8935
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8936
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8937
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8938
var PathIterator = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8939
	_class: 'PathIterator',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8940
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8941
	initialize: function(path, maxRecursion, tolerance, matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8942
		var curves = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8943
			parts = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8944
			length = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8945
			minDifference = 1 / (maxRecursion || 32),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8946
			segments = path._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8947
			segment1 = segments[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8948
			segment2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8949
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8950
		function addCurve(segment1, segment2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8951
			var curve = Curve.getValues(segment1, segment2, matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8952
			curves.push(curve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8953
			computeParts(curve, segment1._index, 0, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8954
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8955
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8956
		function computeParts(curve, index, minT, maxT) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8957
			if ((maxT - minT) > minDifference
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8958
					&& !Curve.isFlatEnough(curve, tolerance || 0.25)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8959
				var split = Curve.subdivide(curve),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8960
					halfT = (minT + maxT) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8961
				computeParts(split[0], index, minT, halfT);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8962
				computeParts(split[1], index, halfT, maxT);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8963
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8964
				var x = curve[6] - curve[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8965
					y = curve[7] - curve[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8966
					dist = Math.sqrt(x * x + y * y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8967
				if (dist > 0.000001) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8968
					length += dist;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8969
					parts.push({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8970
						offset: length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8971
						value: maxT,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8972
						index: index
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8973
					});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8974
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8975
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8976
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8977
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8978
		for (var i = 1, l = segments.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8979
			segment2 = segments[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8980
			addCurve(segment1, segment2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8981
			segment1 = segment2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8982
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8983
		if (path._closed)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8984
			addCurve(segment2, segments[0]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8985
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8986
		this.curves = curves;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8987
		this.parts = parts;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8988
		this.length = length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8989
		this.index = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8990
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8991
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8992
	getParameterAt: function(offset) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8993
		var i, j = this.index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8994
		for (;;) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8995
			i = j;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8996
			if (j == 0 || this.parts[--j].offset < offset)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8997
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8998
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  8999
		for (var l = this.parts.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9000
			var part = this.parts[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9001
			if (part.offset >= offset) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9002
				this.index = i;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9003
				var prev = this.parts[i - 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9004
				var prevVal = prev && prev.index == part.index ? prev.value : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9005
					prevLen = prev ? prev.offset : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9006
				return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9007
					value: prevVal + (part.value - prevVal)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9008
						* (offset - prevLen) / (part.offset - prevLen),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9009
					index: part.index
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9010
				};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9011
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9012
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9013
		var part = this.parts[this.parts.length - 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9014
		return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9015
			value: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9016
			index: part.index
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9017
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9018
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9019
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9020
	evaluate: function(offset, type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9021
		var param = this.getParameterAt(offset);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9022
		return Curve.evaluate(this.curves[param.index], param.value, type);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9023
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9024
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9025
	drawPart: function(ctx, from, to) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9026
		from = this.getParameterAt(from);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9027
		to = this.getParameterAt(to);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9028
		for (var i = from.index; i <= to.index; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9029
			var curve = Curve.getPart(this.curves[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9030
					i == from.index ? from.value : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9031
					i == to.index ? to.value : 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9032
			if (i == from.index)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9033
				ctx.moveTo(curve[0], curve[1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9034
			ctx.bezierCurveTo.apply(ctx, curve.slice(2));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9035
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9036
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9037
}, Base.each(['getPoint', 'getTangent', 'getNormal', 'getCurvature'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9038
	function(name, index) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9039
		this[name + 'At'] = function(offset) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9040
			return this.evaluate(offset, index);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9041
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9042
	}, {})
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9043
);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9044
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9045
var PathFitter = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9046
	initialize: function(path, error) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9047
		var points = this.points = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9048
			segments = path._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9049
			prev;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9050
		for (var i = 0, l = segments.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9051
			var point = segments[i].point.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9052
			if (!prev || !prev.equals(point)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9053
				points.push(point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9054
				prev = point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9055
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9056
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9057
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9058
		if (path._closed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9059
			this.closed = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9060
			points.unshift(points[points.length - 1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9061
			points.push(points[1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9062
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9063
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9064
		this.error = error;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9065
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9066
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9067
	fit: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9068
		var points = this.points,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9069
			length = points.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9070
			segments = this.segments = length > 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9071
					? [new Segment(points[0])] : [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9072
		if (length > 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9073
			this.fitCubic(0, length - 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9074
				points[1].subtract(points[0]).normalize(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9075
				points[length - 2].subtract(points[length - 1]).normalize());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9076
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9077
		if (this.closed) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9078
			segments.shift();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9079
			segments.pop();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9080
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9081
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9082
		return segments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9083
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9084
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9085
	fitCubic: function(first, last, tan1, tan2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9086
		if (last - first == 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9087
			var pt1 = this.points[first],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9088
				pt2 = this.points[last],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9089
				dist = pt1.getDistance(pt2) / 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9090
			this.addCurve([pt1, pt1.add(tan1.normalize(dist)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9091
					pt2.add(tan2.normalize(dist)), pt2]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9092
			return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9093
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9094
		var uPrime = this.chordLengthParameterize(first, last),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9095
			maxError = Math.max(this.error, this.error * this.error),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9096
			split;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9097
		for (var i = 0; i <= 4; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9098
			var curve = this.generateBezier(first, last, uPrime, tan1, tan2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9099
			var max = this.findMaxError(first, last, curve, uPrime);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9100
			if (max.error < this.error) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9101
				this.addCurve(curve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9102
				return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9103
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9104
			split = max.index;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9105
			if (max.error >= maxError)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9106
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9107
			this.reparameterize(first, last, uPrime, curve);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9108
			maxError = max.error;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9109
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9110
		var V1 = this.points[split - 1].subtract(this.points[split]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9111
			V2 = this.points[split].subtract(this.points[split + 1]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9112
			tanCenter = V1.add(V2).divide(2).normalize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9113
		this.fitCubic(first, split, tan1, tanCenter);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9114
		this.fitCubic(split, last, tanCenter.negate(), tan2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9115
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9116
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9117
	addCurve: function(curve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9118
		var prev = this.segments[this.segments.length - 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9119
		prev.setHandleOut(curve[1].subtract(curve[0]));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9120
		this.segments.push(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9121
				new Segment(curve[3], curve[2].subtract(curve[3])));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9122
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9123
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9124
	generateBezier: function(first, last, uPrime, tan1, tan2) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9125
		var epsilon = 1e-12,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9126
			pt1 = this.points[first],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9127
			pt2 = this.points[last],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9128
			C = [[0, 0], [0, 0]],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9129
			X = [0, 0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9130
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9131
		for (var i = 0, l = last - first + 1; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9132
			var u = uPrime[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9133
				t = 1 - u,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9134
				b = 3 * u * t,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9135
				b0 = t * t * t,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9136
				b1 = b * t,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9137
				b2 = b * u,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9138
				b3 = u * u * u,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9139
				a1 = tan1.normalize(b1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9140
				a2 = tan2.normalize(b2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9141
				tmp = this.points[first + i]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9142
					.subtract(pt1.multiply(b0 + b1))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9143
					.subtract(pt2.multiply(b2 + b3));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9144
			C[0][0] += a1.dot(a1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9145
			C[0][1] += a1.dot(a2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9146
			C[1][0] = C[0][1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9147
			C[1][1] += a2.dot(a2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9148
			X[0] += a1.dot(tmp);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9149
			X[1] += a2.dot(tmp);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9150
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9151
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9152
		var detC0C1 = C[0][0] * C[1][1] - C[1][0] * C[0][1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9153
			alpha1, alpha2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9154
		if (Math.abs(detC0C1) > epsilon) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9155
			var detC0X	= C[0][0] * X[1]	- C[1][0] * X[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9156
				detXC1	= X[0]	  * C[1][1] - X[1]	  * C[0][1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9157
			alpha1 = detXC1 / detC0C1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9158
			alpha2 = detC0X / detC0C1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9159
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9160
			var c0 = C[0][0] + C[0][1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9161
				c1 = C[1][0] + C[1][1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9162
			if (Math.abs(c0) > epsilon) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9163
				alpha1 = alpha2 = X[0] / c0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9164
			} else if (Math.abs(c1) > epsilon) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9165
				alpha1 = alpha2 = X[1] / c1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9166
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9167
				alpha1 = alpha2 = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9168
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9169
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9170
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9171
		var segLength = pt2.getDistance(pt1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9172
		epsilon *= segLength;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9173
		if (alpha1 < epsilon || alpha2 < epsilon) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9174
			alpha1 = alpha2 = segLength / 3;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9175
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9176
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9177
		return [pt1, pt1.add(tan1.normalize(alpha1)),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9178
				pt2.add(tan2.normalize(alpha2)), pt2];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9179
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9180
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9181
	reparameterize: function(first, last, u, curve) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9182
		for (var i = first; i <= last; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9183
			u[i - first] = this.findRoot(curve, this.points[i], u[i - first]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9184
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9185
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9186
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9187
	findRoot: function(curve, point, u) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9188
		var curve1 = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9189
			curve2 = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9190
		for (var i = 0; i <= 2; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9191
			curve1[i] = curve[i + 1].subtract(curve[i]).multiply(3);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9192
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9193
		for (var i = 0; i <= 1; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9194
			curve2[i] = curve1[i + 1].subtract(curve1[i]).multiply(2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9195
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9196
		var pt = this.evaluate(3, curve, u),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9197
			pt1 = this.evaluate(2, curve1, u),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9198
			pt2 = this.evaluate(1, curve2, u),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9199
			diff = pt.subtract(point),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9200
			df = pt1.dot(pt1) + diff.dot(pt2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9201
		if (Math.abs(df) < 0.000001)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9202
			return u;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9203
		return u - diff.dot(pt1) / df;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9204
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9205
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9206
	evaluate: function(degree, curve, t) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9207
		var tmp = curve.slice();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9208
		for (var i = 1; i <= degree; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9209
			for (var j = 0; j <= degree - i; j++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9210
				tmp[j] = tmp[j].multiply(1 - t).add(tmp[j + 1].multiply(t));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9211
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9212
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9213
		return tmp[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9214
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9215
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9216
	chordLengthParameterize: function(first, last) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9217
		var u = [0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9218
		for (var i = first + 1; i <= last; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9219
			u[i - first] = u[i - first - 1]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9220
					+ this.points[i].getDistance(this.points[i - 1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9221
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9222
		for (var i = 1, m = last - first; i <= m; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9223
			u[i] /= u[m];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9224
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9225
		return u;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9226
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9227
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9228
	findMaxError: function(first, last, curve, u) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9229
		var index = Math.floor((last - first + 1) / 2),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9230
			maxDist = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9231
		for (var i = first + 1; i < last; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9232
			var P = this.evaluate(3, curve, u[i - first]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9233
			var v = P.subtract(this.points[i]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9234
			var dist = v.x * v.x + v.y * v.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9235
			if (dist >= maxDist) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9236
				maxDist = dist;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9237
				index = i;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9238
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9239
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9240
		return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9241
			error: maxDist,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9242
			index: index
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9243
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9244
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9245
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9246
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9247
var TextItem = Item.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9248
	_class: 'TextItem',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9249
	_boundsSelected: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9250
	_applyMatrix: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9251
	_canApplyMatrix: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9252
	_serializeFields: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9253
		content: null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9254
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9255
	_boundsGetter: 'getBounds',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9256
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9257
	initialize: function TextItem(arg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9258
		this._content = '';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9259
		this._lines = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9260
		var hasProps = arg && Base.isPlainObject(arg)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9261
				&& arg.x === undefined && arg.y === undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9262
		this._initialize(hasProps && arg, !hasProps && Point.read(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9263
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9264
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9265
	_equals: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9266
		return this._content === item._content;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9267
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9268
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9269
	_clone: function _clone(copy, insert) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9270
		copy.setContent(this._content);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9271
		return _clone.base.call(this, copy, insert);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9272
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9273
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9274
	getContent: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9275
		return this._content;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9276
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9277
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9278
	setContent: function(content) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9279
		this._content = '' + content;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9280
		this._lines = this._content.split(/\r\n|\n|\r/mg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9281
		this._changed(265);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9282
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9283
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9284
	isEmpty: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9285
		return !this._content;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9286
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9287
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9288
	getCharacterStyle: '#getStyle',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9289
	setCharacterStyle: '#setStyle',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9290
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9291
	getParagraphStyle: '#getStyle',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9292
	setParagraphStyle: '#setStyle'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9293
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9294
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9295
var PointText = TextItem.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9296
	_class: 'PointText',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9297
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9298
	initialize: function PointText() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9299
		TextItem.apply(this, arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9300
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9301
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9302
	clone: function(insert) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9303
		return this._clone(new PointText(Item.NO_INSERT), insert);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9304
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9305
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9306
	getPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9307
		var point = this._matrix.getTranslation();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9308
		return new LinkedPoint(point.x, point.y, this, 'setPoint');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9309
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9310
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9311
	setPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9312
		var point = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9313
		this.translate(point.subtract(this._matrix.getTranslation()));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9314
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9315
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9316
	_draw: function(ctx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9317
		if (!this._content)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9318
			return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9319
		this._setStyles(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9320
		var style = this._style,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9321
			lines = this._lines,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9322
			leading = style.getLeading(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9323
			shadowColor = ctx.shadowColor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9324
		ctx.font = style.getFontStyle();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9325
		ctx.textAlign = style.getJustification();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9326
		for (var i = 0, l = lines.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9327
			ctx.shadowColor = shadowColor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9328
			var line = lines[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9329
			if (style.hasFill()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9330
				ctx.fillText(line, 0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9331
				ctx.shadowColor = 'rgba(0,0,0,0)';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9332
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9333
			if (style.hasStroke())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9334
				ctx.strokeText(line, 0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9335
			ctx.translate(0, leading);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9336
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9337
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9338
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9339
	_getBounds: function(getter, matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9340
		var style = this._style,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9341
			lines = this._lines,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9342
			numLines = lines.length,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9343
			justification = style.getJustification(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9344
			leading = style.getLeading(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9345
			width = this.getView().getTextWidth(style.getFontStyle(), lines),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9346
			x = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9347
		if (justification !== 'left')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9348
			x -= width / (justification === 'center' ? 2: 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9349
		var bounds = new Rectangle(x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9350
					numLines ? - 0.75 * leading : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9351
					width, numLines * leading);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9352
		return matrix ? matrix._transformBounds(bounds, bounds) : bounds;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9353
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9354
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9355
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9356
var Color = Base.extend(new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9357
	var types = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9358
		gray: ['gray'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9359
		rgb: ['red', 'green', 'blue'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9360
		hsb: ['hue', 'saturation', 'brightness'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9361
		hsl: ['hue', 'saturation', 'lightness'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9362
		gradient: ['gradient', 'origin', 'destination', 'highlight']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9363
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9364
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9365
	var componentParsers = {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9366
		colorCache = {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9367
		colorCtx;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9368
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9369
	function fromCSS(string) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9370
		var match = string.match(/^#(\w{1,2})(\w{1,2})(\w{1,2})$/),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9371
			components;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9372
		if (match) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9373
			components = [0, 0, 0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9374
			for (var i = 0; i < 3; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9375
				var value = match[i + 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9376
				components[i] = parseInt(value.length == 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9377
						? value + value : value, 16) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9378
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9379
		} else if (match = string.match(/^rgba?\((.*)\)$/)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9380
			components = match[1].split(',');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9381
			for (var i = 0, l = components.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9382
				var value = +components[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9383
				components[i] = i < 3 ? value / 255 : value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9384
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9385
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9386
			var cached = colorCache[string];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9387
			if (!cached) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9388
				if (!colorCtx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9389
					colorCtx = CanvasProvider.getContext(1, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9390
					colorCtx.globalCompositeOperation = 'copy';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9391
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9392
				colorCtx.fillStyle = 'rgba(0,0,0,0)';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9393
				colorCtx.fillStyle = string;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9394
				colorCtx.fillRect(0, 0, 1, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9395
				var data = colorCtx.getImageData(0, 0, 1, 1).data;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9396
				cached = colorCache[string] = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9397
					data[0] / 255,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9398
					data[1] / 255,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9399
					data[2] / 255
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9400
				];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9401
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9402
			components = cached.slice();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9403
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9404
		return components;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9405
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9406
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9407
	var hsbIndices = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9408
		[0, 3, 1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9409
		[2, 0, 1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9410
		[1, 0, 3],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9411
		[1, 2, 0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9412
		[3, 1, 0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9413
		[0, 1, 2]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9414
	];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9415
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9416
	var converters = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9417
		'rgb-hsb': function(r, g, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9418
			var max = Math.max(r, g, b),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9419
				min = Math.min(r, g, b),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9420
				delta = max - min,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9421
				h = delta === 0 ? 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9422
					:	( max == r ? (g - b) / delta + (g < b ? 6 : 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9423
						: max == g ? (b - r) / delta + 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9424
						:			 (r - g) / delta + 4) * 60;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9425
			return [h, max === 0 ? 0 : delta / max, max];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9426
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9427
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9428
		'hsb-rgb': function(h, s, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9429
			h = (((h / 60) % 6) + 6) % 6;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9430
			var i = Math.floor(h),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9431
				f = h - i,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9432
				i = hsbIndices[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9433
				v = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9434
					b,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9435
					b * (1 - s),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9436
					b * (1 - s * f),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9437
					b * (1 - s * (1 - f))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9438
				];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9439
			return [v[i[0]], v[i[1]], v[i[2]]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9440
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9441
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9442
		'rgb-hsl': function(r, g, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9443
			var max = Math.max(r, g, b),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9444
				min = Math.min(r, g, b),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9445
				delta = max - min,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9446
				achromatic = delta === 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9447
				h = achromatic ? 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9448
					:	( max == r ? (g - b) / delta + (g < b ? 6 : 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9449
						: max == g ? (b - r) / delta + 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9450
						:			 (r - g) / delta + 4) * 60,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9451
				l = (max + min) / 2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9452
				s = achromatic ? 0 : l < 0.5
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9453
						? delta / (max + min)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9454
						: delta / (2 - max - min);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9455
			return [h, s, l];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9456
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9457
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9458
		'hsl-rgb': function(h, s, l) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9459
			h = (((h / 360) % 1) + 1) % 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9460
			if (s === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9461
				return [l, l, l];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9462
			var t3s = [ h + 1 / 3, h, h - 1 / 3 ],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9463
				t2 = l < 0.5 ? l * (1 + s) : l + s - l * s,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9464
				t1 = 2 * l - t2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9465
				c = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9466
			for (var i = 0; i < 3; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9467
				var t3 = t3s[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9468
				if (t3 < 0) t3 += 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9469
				if (t3 > 1) t3 -= 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9470
				c[i] = 6 * t3 < 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9471
					? t1 + (t2 - t1) * 6 * t3
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9472
					: 2 * t3 < 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9473
						? t2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9474
						: 3 * t3 < 2
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9475
							? t1 + (t2 - t1) * ((2 / 3) - t3) * 6
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9476
							: t1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9477
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9478
			return c;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9479
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9480
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9481
		'rgb-gray': function(r, g, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9482
			return [r * 0.2989 + g * 0.587 + b * 0.114];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9483
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9484
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9485
		'gray-rgb': function(g) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9486
			return [g, g, g];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9487
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9488
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9489
		'gray-hsb': function(g) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9490
			return [0, 0, g];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9491
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9492
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9493
		'gray-hsl': function(g) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9494
			return [0, 0, g];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9495
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9496
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9497
		'gradient-rgb': function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9498
			return [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9499
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9500
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9501
		'rgb-gradient': function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9502
			return [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9503
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9504
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9505
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9506
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9507
	return Base.each(types, function(properties, type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9508
		componentParsers[type] = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9509
		Base.each(properties, function(name, index) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9510
			var part = Base.capitalize(name),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9511
				hasOverlap = /^(hue|saturation)$/.test(name),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9512
				parser = componentParsers[type][index] = name === 'gradient'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9513
					? function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9514
						var current = this._components[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9515
						value = Gradient.read(Array.isArray(value) ? value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9516
								: arguments, 0, { readNull: true });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9517
						if (current !== value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9518
							if (current)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9519
								current._removeOwner(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9520
							if (value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9521
								value._addOwner(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9522
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9523
						return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9524
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9525
					: type === 'gradient'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9526
						? function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9527
							return Point.read(arguments, 0, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9528
									readNull: name === 'highlight',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9529
									clone: true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9530
							});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9531
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9532
						: function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9533
							return value == null || isNaN(value) ? 0 : value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9534
						};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9535
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9536
			this['get' + part] = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9537
				return this._type === type
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9538
					|| hasOverlap && /^hs[bl]$/.test(this._type)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9539
						? this._components[index]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9540
						: this._convert(type)[index];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9541
			};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9542
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9543
			this['set' + part] = function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9544
				if (this._type !== type
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9545
						&& !(hasOverlap && /^hs[bl]$/.test(this._type))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9546
					this._components = this._convert(type);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9547
					this._properties = types[type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9548
					this._type = type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9549
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9550
				value = parser.call(this, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9551
				if (value != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9552
					this._components[index] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9553
					this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9554
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9555
			};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9556
		}, this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9557
	}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9558
		_class: 'Color',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9559
		_readIndex: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9560
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9561
		initialize: function Color(arg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9562
			var slice = Array.prototype.slice,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9563
				args = arguments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9564
				read = 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9565
				type,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9566
				components,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9567
				alpha,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9568
				values;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9569
			if (Array.isArray(arg)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9570
				args = arg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9571
				arg = args[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9572
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9573
			var argType = arg != null && typeof arg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9574
			if (argType === 'string' && arg in types) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9575
				type = arg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9576
				arg = args[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9577
				if (Array.isArray(arg)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9578
					components = arg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9579
					alpha = args[2];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9580
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9581
					if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9582
						read = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9583
					args = slice.call(args, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9584
					argType = typeof arg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9585
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9586
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9587
			if (!components) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9588
				values = argType === 'number'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9589
						? args
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9590
						: argType === 'object' && arg.length != null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9591
							? arg
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9592
							: null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9593
				if (values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9594
					if (!type)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9595
						type = values.length >= 3
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9596
								? 'rgb'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9597
								: 'gray';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9598
					var length = types[type].length;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9599
					alpha = values[length];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9600
					if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9601
						read += values === arguments
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9602
							? length + (alpha != null ? 1 : 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9603
							: 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9604
					if (values.length > length)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9605
						values = slice.call(values, 0, length);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9606
				} else if (argType === 'string') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9607
					type = 'rgb';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9608
					components = fromCSS(arg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9609
					if (components.length === 4) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9610
						alpha = components[3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9611
						components.length--;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9612
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9613
				} else if (argType === 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9614
					if (arg.constructor === Color) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9615
						type = arg._type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9616
						components = arg._components.slice();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9617
						alpha = arg._alpha;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9618
						if (type === 'gradient') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9619
							for (var i = 1, l = components.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9620
								var point = components[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9621
								if (point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9622
									components[i] = point.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9623
							}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9624
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9625
					} else if (arg.constructor === Gradient) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9626
						type = 'gradient';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9627
						values = args;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9628
					} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9629
						type = 'hue' in arg
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9630
							? 'lightness' in arg
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9631
								? 'hsl'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9632
								: 'hsb'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9633
							: 'gradient' in arg || 'stops' in arg
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9634
									|| 'radial' in arg
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9635
								? 'gradient'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9636
								: 'gray' in arg
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9637
									? 'gray'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9638
									: 'rgb';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9639
						var properties = types[type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9640
							parsers = componentParsers[type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9641
						this._components = components = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9642
						for (var i = 0, l = properties.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9643
							var value = arg[properties[i]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9644
							if (value == null && i === 0 && type === 'gradient'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9645
									&& 'stops' in arg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9646
								value = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9647
									stops: arg.stops,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9648
									radial: arg.radial
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9649
								};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9650
							}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9651
							value = parsers[i].call(this, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9652
							if (value != null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9653
								components[i] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9654
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9655
						alpha = arg.alpha;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9656
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9657
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9658
				if (this.__read && type)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9659
					read = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9660
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9661
			this._type = type || 'rgb';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9662
			if (type === 'gradient')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9663
				this._id = Color._id = (Color._id || 0) + 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9664
			if (!components) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9665
				this._components = components = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9666
				var parsers = componentParsers[this._type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9667
				for (var i = 0, l = parsers.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9668
					var value = parsers[i].call(this, values && values[i]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9669
					if (value != null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9670
						components[i] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9671
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9672
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9673
			this._components = components;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9674
			this._properties = types[this._type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9675
			this._alpha = alpha;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9676
			if (this.__read)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9677
				this.__read = read;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9678
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9679
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9680
		_serialize: function(options, dictionary) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9681
			var components = this.getComponents();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9682
			return Base.serialize(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9683
					/^(gray|rgb)$/.test(this._type)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9684
						? components
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9685
						: [this._type].concat(components),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9686
					options, true, dictionary);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9687
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9688
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9689
		_changed: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9690
			this._canvasStyle = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9691
			if (this._owner)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9692
				this._owner._changed(65);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9693
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9694
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9695
		_convert: function(type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9696
			var converter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9697
			return this._type === type
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9698
					? this._components.slice()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9699
					: (converter = converters[this._type + '-' + type])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9700
						? converter.apply(this, this._components)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9701
						: converters['rgb-' + type].apply(this,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9702
							converters[this._type + '-rgb'].apply(this,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9703
								this._components));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9704
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9705
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9706
		convert: function(type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9707
			return new Color(type, this._convert(type), this._alpha);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9708
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9709
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9710
		getType: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9711
			return this._type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9712
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9713
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9714
		setType: function(type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9715
			this._components = this._convert(type);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9716
			this._properties = types[type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9717
			this._type = type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9718
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9719
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9720
		getComponents: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9721
			var components = this._components.slice();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9722
			if (this._alpha != null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9723
				components.push(this._alpha);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9724
			return components;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9725
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9726
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9727
		getAlpha: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9728
			return this._alpha != null ? this._alpha : 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9729
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9730
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9731
		setAlpha: function(alpha) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9732
			this._alpha = alpha == null ? null : Math.min(Math.max(alpha, 0), 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9733
			this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9734
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9735
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9736
		hasAlpha: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9737
			return this._alpha != null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9738
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9739
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9740
		equals: function(color) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9741
			var col = Base.isPlainValue(color, true)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9742
					? Color.read(arguments)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9743
					: color;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9744
			return col === this || col && this._class === col._class
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9745
					&& this._type === col._type
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9746
					&& this._alpha === col._alpha
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9747
					&& Base.equals(this._components, col._components)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9748
					|| false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9749
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9750
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9751
		toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9752
			var properties = this._properties,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9753
				parts = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9754
				isGradient = this._type === 'gradient',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9755
				f = Formatter.instance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9756
			for (var i = 0, l = properties.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9757
				var value = this._components[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9758
				if (value != null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9759
					parts.push(properties[i] + ': '
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9760
							+ (isGradient ? value : f.number(value)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9761
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9762
			if (this._alpha != null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9763
				parts.push('alpha: ' + f.number(this._alpha));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9764
			return '{ ' + parts.join(', ') + ' }';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9765
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9766
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9767
		toCSS: function(hex) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9768
			var components = this._convert('rgb'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9769
				alpha = hex || this._alpha == null ? 1 : this._alpha;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9770
			function convert(val) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9771
				return Math.round((val < 0 ? 0 : val > 1 ? 1 : val) * 255);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9772
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9773
			components = [
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9774
				convert(components[0]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9775
				convert(components[1]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9776
				convert(components[2])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9777
			];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9778
			if (alpha < 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9779
				components.push(alpha < 0 ? 0 : alpha);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9780
			return hex
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9781
					? '#' + ((1 << 24) + (components[0] << 16)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9782
						+ (components[1] << 8)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9783
						+ components[2]).toString(16).slice(1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9784
					: (components.length == 4 ? 'rgba(' : 'rgb(')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9785
						+ components.join(',') + ')';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9786
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9787
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9788
		toCanvasStyle: function(ctx) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9789
			if (this._canvasStyle)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9790
				return this._canvasStyle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9791
			if (this._type !== 'gradient')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9792
				return this._canvasStyle = this.toCSS();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9793
			var components = this._components,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9794
				gradient = components[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9795
				stops = gradient._stops,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9796
				origin = components[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9797
				destination = components[2],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9798
				canvasGradient;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9799
			if (gradient._radial) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9800
				var radius = destination.getDistance(origin),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9801
					highlight = components[3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9802
				if (highlight) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9803
					var vector = highlight.subtract(origin);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9804
					if (vector.getLength() > radius)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9805
						highlight = origin.add(vector.normalize(radius - 0.1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9806
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9807
				var start = highlight || origin;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9808
				canvasGradient = ctx.createRadialGradient(start.x, start.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9809
						0, origin.x, origin.y, radius);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9810
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9811
				canvasGradient = ctx.createLinearGradient(origin.x, origin.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9812
						destination.x, destination.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9813
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9814
			for (var i = 0, l = stops.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9815
				var stop = stops[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9816
				canvasGradient.addColorStop(stop._rampPoint,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9817
						stop._color.toCanvasStyle());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9818
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9819
			return this._canvasStyle = canvasGradient;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9820
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9821
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9822
		transform: function(matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9823
			if (this._type === 'gradient') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9824
				var components = this._components;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9825
				for (var i = 1, l = components.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9826
					var point = components[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9827
					matrix._transformPoint(point, point, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9828
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9829
				this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9830
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9831
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9832
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9833
		statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9834
			_types: types,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9835
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9836
			random: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9837
				var random = Math.random;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9838
				return new Color(random(), random(), random());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9839
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9840
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9841
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9842
}, new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9843
	var operators = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9844
		add: function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9845
			return a + b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9846
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9847
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9848
		subtract: function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9849
			return a - b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9850
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9851
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9852
		multiply: function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9853
			return a * b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9854
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9855
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9856
		divide: function(a, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9857
			return a / b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9858
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9859
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9860
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9861
	return Base.each(operators, function(operator, name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9862
		this[name] = function(color) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9863
			color = Color.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9864
			var type = this._type,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9865
				components1 = this._components,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9866
				components2 = color._convert(type);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9867
			for (var i = 0, l = components1.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9868
				components2[i] = operator(components1[i], components2[i]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9869
			return new Color(type, components2,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9870
					this._alpha != null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9871
							? operator(this._alpha, color.getAlpha())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9872
							: null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9873
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9874
	}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9875
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9876
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9877
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9878
Base.each(Color._types, function(properties, type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9879
	var ctor = this[Base.capitalize(type) + 'Color'] = function(arg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9880
			var argType = arg != null && typeof arg,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9881
				components = argType === 'object' && arg.length != null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9882
					? arg
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9883
					: argType === 'string'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9884
						? null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9885
						: arguments;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9886
			return components
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9887
					? new Color(type, components)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9888
					: new Color(arg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9889
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9890
	if (type.length == 3) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9891
		var acronym = type.toUpperCase();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9892
		Color[acronym] = this[acronym + 'Color'] = ctor;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9893
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9894
}, Base.exports);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9895
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9896
var Gradient = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9897
	_class: 'Gradient',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9898
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9899
	initialize: function Gradient(stops, radial) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9900
		this._id = Gradient._id = (Gradient._id || 0) + 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9901
		if (stops && this._set(stops))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9902
			stops = radial = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9903
		if (!this._stops)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9904
			this.setStops(stops || ['white', 'black']);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9905
		if (this._radial == null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9906
			this.setRadial(typeof radial === 'string' && radial === 'radial'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9907
					|| radial || false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9908
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9909
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9910
	_serialize: function(options, dictionary) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9911
		return dictionary.add(this, function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9912
			return Base.serialize([this._stops, this._radial],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9913
					options, true, dictionary);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9914
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9915
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9916
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9917
	_changed: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9918
		for (var i = 0, l = this._owners && this._owners.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9919
			this._owners[i]._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9920
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9921
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9922
	_addOwner: function(color) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9923
		if (!this._owners)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9924
			this._owners = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9925
		this._owners.push(color);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9926
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9927
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9928
	_removeOwner: function(color) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9929
		var index = this._owners ? this._owners.indexOf(color) : -1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9930
		if (index != -1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9931
			this._owners.splice(index, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9932
			if (this._owners.length === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9933
				this._owners = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9934
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9935
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9936
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9937
	clone: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9938
		var stops = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9939
		for (var i = 0, l = this._stops.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9940
			stops[i] = this._stops[i].clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9941
		return new Gradient(stops);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9942
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9943
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9944
	getStops: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9945
		return this._stops;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9946
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9947
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9948
	setStops: function(stops) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9949
		if (this.stops) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9950
			for (var i = 0, l = this._stops.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9951
				this._stops[i]._owner = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9952
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9953
		if (stops.length < 2)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9954
			throw new Error(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9955
					'Gradient stop list needs to contain at least two stops.');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9956
		this._stops = GradientStop.readAll(stops, 0, { clone: true });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9957
		for (var i = 0, l = this._stops.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9958
			var stop = this._stops[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9959
			stop._owner = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9960
			if (stop._defaultRamp)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9961
				stop.setRampPoint(i / (l - 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9962
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9963
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9964
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9965
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9966
	getRadial: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9967
		return this._radial;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9968
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9969
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9970
	setRadial: function(radial) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9971
		this._radial = radial;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9972
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9973
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9974
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9975
	equals: function(gradient) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9976
		if (gradient === this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9977
			return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9978
		if (gradient && this._class === gradient._class
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9979
				&& this._stops.length === gradient._stops.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9980
			for (var i = 0, l = this._stops.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9981
				if (!this._stops[i].equals(gradient._stops[i]))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9982
					return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9983
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9984
			return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9985
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9986
		return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9987
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9988
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9989
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9990
var GradientStop = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9991
	_class: 'GradientStop',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9992
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9993
	initialize: function GradientStop(arg0, arg1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9994
		if (arg0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9995
			var color, rampPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9996
			if (arg1 === undefined && Array.isArray(arg0)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9997
				color = arg0[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9998
				rampPoint = arg0[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
  9999
			} else if (arg0.color) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10000
				color = arg0.color;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10001
				rampPoint = arg0.rampPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10002
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10003
				color = arg0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10004
				rampPoint = arg1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10005
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10006
			this.setColor(color);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10007
			this.setRampPoint(rampPoint);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10008
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10009
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10010
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10011
	clone: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10012
		return new GradientStop(this._color.clone(), this._rampPoint);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10013
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10014
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10015
	_serialize: function(options, dictionary) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10016
		return Base.serialize([this._color, this._rampPoint], options, true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10017
				dictionary);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10018
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10019
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10020
	_changed: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10021
		if (this._owner)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10022
			this._owner._changed(65);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10023
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10024
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10025
	getRampPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10026
		return this._rampPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10027
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10028
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10029
	setRampPoint: function(rampPoint) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10030
		this._defaultRamp = rampPoint == null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10031
		this._rampPoint = rampPoint || 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10032
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10033
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10034
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10035
	getColor: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10036
		return this._color;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10037
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10038
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10039
	setColor: function(color) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10040
		this._color = Color.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10041
		if (this._color === color)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10042
			this._color = color.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10043
		this._color._owner = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10044
		this._changed();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10045
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10046
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10047
	equals: function(stop) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10048
		return stop === this || stop && this._class === stop._class
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10049
				&& this._color.equals(stop._color)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10050
				&& this._rampPoint == stop._rampPoint
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10051
				|| false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10052
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10053
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10054
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10055
var Style = Base.extend(new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10056
	var defaults = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10057
		fillColor: undefined,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10058
		strokeColor: undefined,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10059
		strokeWidth: 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10060
		strokeCap: 'butt',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10061
		strokeJoin: 'miter',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10062
		strokeScaling: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10063
		miterLimit: 10,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10064
		dashOffset: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10065
		dashArray: [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10066
		windingRule: 'nonzero',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10067
		shadowColor: undefined,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10068
		shadowBlur: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10069
		shadowOffset: new Point(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10070
		selectedColor: undefined,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10071
		fontFamily: 'sans-serif',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10072
		fontWeight: 'normal',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10073
		fontSize: 12,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10074
		font: 'sans-serif',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10075
		leading: null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10076
		justification: 'left'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10077
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10078
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10079
	var flags = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10080
		strokeWidth: 97,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10081
		strokeCap: 97,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10082
		strokeJoin: 97,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10083
		strokeScaling: 105,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10084
		miterLimit: 97,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10085
		fontFamily: 9,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10086
		fontWeight: 9,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10087
		fontSize: 9,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10088
		font: 9,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10089
		leading: 9,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10090
		justification: 9
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10091
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10092
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10093
	var item = { beans: true },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10094
		fields = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10095
			_defaults: defaults,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10096
			_textDefaults: new Base(defaults, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10097
				fillColor: new Color()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10098
			}),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10099
			beans: true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10100
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10101
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10102
	Base.each(defaults, function(value, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10103
		var isColor = /Color$/.test(key),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10104
			isPoint = key === 'shadowOffset',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10105
			part = Base.capitalize(key),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10106
			flag = flags[key],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10107
			set = 'set' + part,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10108
			get = 'get' + part;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10109
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10110
		fields[set] = function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10111
			var owner = this._owner,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10112
				children = owner && owner._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10113
			if (children && children.length > 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10114
					&& !(owner instanceof CompoundPath)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10115
				for (var i = 0, l = children.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10116
					children[i]._style[set](value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10117
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10118
				var old = this._values[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10119
				if (old !== value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10120
					if (isColor) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10121
						if (old)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10122
							old._owner = undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10123
						if (value && value.constructor === Color) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10124
							if (value._owner)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10125
								value = value.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10126
							value._owner = owner;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10127
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10128
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10129
					this._values[key] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10130
					if (owner)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10131
						owner._changed(flag || 65);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10132
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10133
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10134
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10135
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10136
		fields[get] = function(_dontMerge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10137
			var owner = this._owner,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10138
				children = owner && owner._children,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10139
				value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10140
			if (!children || children.length === 0 || _dontMerge
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10141
					|| owner instanceof CompoundPath) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10142
				var value = this._values[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10143
				if (value === undefined) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10144
					value = this._defaults[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10145
					if (value && value.clone)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10146
						value = value.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10147
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10148
					var ctor = isColor ? Color : isPoint ? Point : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10149
					if (ctor && !(value && value.constructor === ctor)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10150
						this._values[key] = value = ctor.read([value], 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10151
								{ readNull: true, clone: true });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10152
						if (value && isColor)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10153
							value._owner = owner;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10154
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10155
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10156
				return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10157
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10158
			for (var i = 0, l = children.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10159
				var childValue = children[i]._style[get]();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10160
				if (i === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10161
					value = childValue;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10162
				} else if (!Base.equals(value, childValue)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10163
					return undefined;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10164
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10165
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10166
			return value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10167
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10168
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10169
		item[get] = function(_dontMerge) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10170
			return this._style[get](_dontMerge);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10171
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10172
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10173
		item[set] = function(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10174
			this._style[set](value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10175
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10176
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10177
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10178
	Item.inject(item);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10179
	return fields;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10180
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10181
	_class: 'Style',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10182
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10183
	initialize: function Style(style, _owner, _project) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10184
		this._values = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10185
		this._owner = _owner;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10186
		this._project = _owner && _owner._project || _project || paper.project;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10187
		if (_owner instanceof TextItem)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10188
			this._defaults = this._textDefaults;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10189
		if (style)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10190
			this.set(style);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10191
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10192
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10193
	set: function(style) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10194
		var isStyle = style instanceof Style,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10195
			values = isStyle ? style._values : style;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10196
		if (values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10197
			for (var key in values) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10198
				if (key in this._defaults) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10199
					var value = values[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10200
					this[key] = value && isStyle && value.clone
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10201
							? value.clone() : value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10202
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10203
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10204
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10205
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10206
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10207
	equals: function(style) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10208
		return style === this || style && this._class === style._class
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10209
				&& Base.equals(this._values, style._values)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10210
				|| false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10211
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10212
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10213
	hasFill: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10214
		return !!this.getFillColor();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10215
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10216
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10217
	hasStroke: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10218
		return !!this.getStrokeColor() && this.getStrokeWidth() > 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10219
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10220
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10221
	hasShadow: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10222
		return !!this.getShadowColor() && this.getShadowBlur() > 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10223
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10224
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10225
	getView: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10226
		return this._project.getView();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10227
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10228
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10229
	getFontStyle: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10230
		var fontSize = this.getFontSize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10231
		return this.getFontWeight()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10232
				+ ' ' + fontSize + (/[a-z]/i.test(fontSize + '') ? ' ' : 'px ')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10233
				+ this.getFontFamily();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10234
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10235
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10236
	getFont: '#getFontFamily',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10237
	setFont: '#setFontFamily',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10238
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10239
	getLeading: function getLeading() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10240
		var leading = getLeading.base.call(this),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10241
			fontSize = this.getFontSize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10242
		if (/pt|em|%|px/.test(fontSize))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10243
			fontSize = this.getView().getPixelSize(fontSize);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10244
		return leading != null ? leading : fontSize * 1.2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10245
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10246
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10247
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10248
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10249
var DomElement = new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10250
	function handlePrefix(el, name, set, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10251
		var prefixes = ['', 'webkit', 'moz', 'Moz', 'ms', 'o'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10252
			suffix = name[0].toUpperCase() + name.substring(1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10253
		for (var i = 0; i < 6; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10254
			var prefix = prefixes[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10255
				key = prefix ? prefix + suffix : name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10256
			if (key in el) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10257
				if (set) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10258
					el[key] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10259
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10260
					return el[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10261
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10262
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10263
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10264
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10265
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10266
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10267
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10268
		getStyles: function(el) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10269
			var doc = el && el.nodeType !== 9 ? el.ownerDocument : el,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10270
				view = doc && doc.defaultView;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10271
			return view && view.getComputedStyle(el, '');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10272
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10273
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10274
		getBounds: function(el, viewport) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10275
			var doc = el.ownerDocument,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10276
				body = doc.body,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10277
				html = doc.documentElement,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10278
				rect;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10279
			try {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10280
				rect = el.getBoundingClientRect();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10281
			} catch (e) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10282
				rect = { left: 0, top: 0, width: 0, height: 0 };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10283
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10284
			var x = rect.left - (html.clientLeft || body.clientLeft || 0),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10285
				y = rect.top - (html.clientTop || body.clientTop || 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10286
			if (!viewport) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10287
				var view = doc.defaultView;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10288
				x += view.pageXOffset || html.scrollLeft || body.scrollLeft;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10289
				y += view.pageYOffset || html.scrollTop || body.scrollTop;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10290
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10291
			return new Rectangle(x, y, rect.width, rect.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10292
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10293
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10294
		getViewportBounds: function(el) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10295
			var doc = el.ownerDocument,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10296
				view = doc.defaultView,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10297
				html = doc.documentElement;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10298
			return new Rectangle(0, 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10299
				view.innerWidth || html.clientWidth,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10300
				view.innerHeight || html.clientHeight
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10301
			);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10302
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10303
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10304
		getOffset: function(el, viewport) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10305
			return DomElement.getBounds(el, viewport).getPoint();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10306
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10307
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10308
		getSize: function(el) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10309
			return DomElement.getBounds(el, true).getSize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10310
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10311
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10312
		isInvisible: function(el) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10313
			return DomElement.getSize(el).equals(new Size(0, 0));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10314
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10315
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10316
		isInView: function(el) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10317
			return !DomElement.isInvisible(el)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10318
					&& DomElement.getViewportBounds(el).intersects(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10319
						DomElement.getBounds(el, true));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10320
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10321
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10322
		getPrefixed: function(el, name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10323
			return handlePrefix(el, name);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10324
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10325
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10326
		setPrefixed: function(el, name, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10327
			if (typeof name === 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10328
				for (var key in name)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10329
					handlePrefix(el, key, true, name[key]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10330
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10331
				handlePrefix(el, name, true, value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10332
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10333
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10334
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10335
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10336
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10337
var DomEvent = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10338
	add: function(el, events) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10339
		for (var type in events) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10340
			var func = events[type],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10341
				parts = type.split(/[\s,]+/g);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10342
			for (var i = 0, l = parts.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10343
				el.addEventListener(parts[i], func, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10344
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10345
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10346
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10347
	remove: function(el, events) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10348
		for (var type in events) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10349
			var func = events[type],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10350
				parts = type.split(/[\s,]+/g);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10351
			for (var i = 0, l = parts.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10352
				el.removeEventListener(parts[i], func, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10353
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10354
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10355
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10356
	getPoint: function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10357
		var pos = event.targetTouches
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10358
				? event.targetTouches.length
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10359
					? event.targetTouches[0]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10360
					: event.changedTouches[0]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10361
				: event;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10362
		return new Point(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10363
			pos.pageX || pos.clientX + document.documentElement.scrollLeft,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10364
			pos.pageY || pos.clientY + document.documentElement.scrollTop
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10365
		);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10366
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10367
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10368
	getTarget: function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10369
		return event.target || event.srcElement;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10370
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10371
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10372
	getRelatedTarget: function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10373
		return event.relatedTarget || event.toElement;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10374
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10375
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10376
	getOffset: function(event, target) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10377
		return DomEvent.getPoint(event).subtract(DomElement.getOffset(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10378
				target || DomEvent.getTarget(event)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10379
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10380
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10381
	stop: function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10382
		event.stopPropagation();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10383
		event.preventDefault();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10384
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10385
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10386
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10387
DomEvent.requestAnimationFrame = new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10388
	var nativeRequest = DomElement.getPrefixed(window, 'requestAnimationFrame'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10389
		requested = false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10390
		callbacks = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10391
		focused = true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10392
		timer;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10393
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10394
	DomEvent.add(window, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10395
		focus: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10396
			focused = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10397
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10398
		blur: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10399
			focused = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10400
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10401
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10402
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10403
	function handleCallbacks() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10404
		for (var i = callbacks.length - 1; i >= 0; i--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10405
			var entry = callbacks[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10406
				func = entry[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10407
				el = entry[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10408
			if (!el || (PaperScope.getAttribute(el, 'keepalive') == 'true'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10409
					|| focused) && DomElement.isInView(el)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10410
				callbacks.splice(i, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10411
				func();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10412
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10413
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10414
		if (nativeRequest) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10415
			if (callbacks.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10416
				nativeRequest(handleCallbacks);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10417
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10418
				requested = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10419
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10420
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10421
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10422
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10423
	return function(callback, element) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10424
		callbacks.push([callback, element]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10425
		if (nativeRequest) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10426
			if (!requested) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10427
				nativeRequest(handleCallbacks);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10428
				requested = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10429
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10430
		} else if (!timer) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10431
			timer = setInterval(handleCallbacks, 1000 / 60);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10432
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10433
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10434
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10435
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10436
var View = Base.extend(Emitter, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10437
	_class: 'View',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10438
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10439
	initialize: function View(project, element) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10440
		this._project = project;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10441
		this._scope = project._scope;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10442
		this._element = element;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10443
		var size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10444
		if (!this._pixelRatio)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10445
			this._pixelRatio = window.devicePixelRatio || 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10446
		this._id = element.getAttribute('id');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10447
		if (this._id == null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10448
			element.setAttribute('id', this._id = 'view-' + View._id++);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10449
		DomEvent.add(element, this._viewEvents);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10450
		var none = 'none';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10451
		DomElement.setPrefixed(element.style, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10452
			userSelect: none,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10453
			touchAction: none,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10454
			touchCallout: none,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10455
			contentZooming: none,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10456
			userDrag: none,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10457
			tapHighlightColor: 'rgba(0,0,0,0)'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10458
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10459
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10460
		function getSize(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10461
			return element[name] || parseInt(element.getAttribute(name), 10);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10462
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10463
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10464
		function getCanvasSize() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10465
			var size = DomElement.getSize(element);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10466
			return size.isNaN() || size.isZero()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10467
					? new Size(getSize('width'), getSize('height'))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10468
					: size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10469
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10470
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10471
		if (PaperScope.hasAttribute(element, 'resize')) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10472
			var that = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10473
			DomEvent.add(window, this._windowEvents = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10474
				resize: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10475
					that.setViewSize(getCanvasSize());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10476
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10477
			});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10478
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10479
		this._setViewSize(size = getCanvasSize());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10480
		if (PaperScope.hasAttribute(element, 'stats')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10481
				&& typeof Stats !== 'undefined') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10482
			this._stats = new Stats();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10483
			var stats = this._stats.domElement,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10484
				style = stats.style,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10485
				offset = DomElement.getOffset(element);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10486
			style.position = 'absolute';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10487
			style.left = offset.x + 'px';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10488
			style.top = offset.y + 'px';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10489
			document.body.appendChild(stats);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10490
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10491
		View._views.push(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10492
		View._viewsById[this._id] = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10493
		this._viewSize = size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10494
		(this._matrix = new Matrix())._owner = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10495
		this._zoom = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10496
		if (!View._focused)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10497
			View._focused = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10498
		this._frameItems = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10499
		this._frameItemCount = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10500
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10501
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10502
	remove: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10503
		if (!this._project)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10504
			return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10505
		if (View._focused === this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10506
			View._focused = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10507
		View._views.splice(View._views.indexOf(this), 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10508
		delete View._viewsById[this._id];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10509
		if (this._project._view === this)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10510
			this._project._view = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10511
		DomEvent.remove(this._element, this._viewEvents);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10512
		DomEvent.remove(window, this._windowEvents);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10513
		this._element = this._project = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10514
		this.off('frame');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10515
		this._animate = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10516
		this._frameItems = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10517
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10518
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10519
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10520
	_events: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10521
		onFrame: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10522
			install: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10523
				this.play();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10524
			},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10525
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10526
			uninstall: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10527
				this.pause();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10528
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10529
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10530
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10531
		onResize: {}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10532
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10533
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10534
	_animate: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10535
	_time: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10536
	_count: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10537
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10538
	_requestFrame: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10539
		var that = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10540
		DomEvent.requestAnimationFrame(function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10541
			that._requested = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10542
			if (!that._animate)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10543
				return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10544
			that._requestFrame();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10545
			that._handleFrame();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10546
		}, this._element);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10547
		this._requested = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10548
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10549
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10550
	_handleFrame: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10551
		paper = this._scope;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10552
		var now = Date.now() / 1000,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10553
			delta = this._before ? now - this._before : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10554
		this._before = now;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10555
		this._handlingFrame = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10556
		this.emit('frame', new Base({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10557
			delta: delta,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10558
			time: this._time += delta,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10559
			count: this._count++
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10560
		}));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10561
		if (this._stats)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10562
			this._stats.update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10563
		this._handlingFrame = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10564
		this.update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10565
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10566
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10567
	_animateItem: function(item, animate) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10568
		var items = this._frameItems;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10569
		if (animate) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10570
			items[item._id] = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10571
				item: item,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10572
				time: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10573
				count: 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10574
			};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10575
			if (++this._frameItemCount === 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10576
				this.on('frame', this._handleFrameItems);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10577
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10578
			delete items[item._id];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10579
			if (--this._frameItemCount === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10580
				this.off('frame', this._handleFrameItems);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10581
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10582
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10583
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10584
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10585
	_handleFrameItems: function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10586
		for (var i in this._frameItems) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10587
			var entry = this._frameItems[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10588
			entry.item.emit('frame', new Base(event, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10589
				time: entry.time += event.delta,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10590
				count: entry.count++
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10591
			}));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10592
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10593
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10594
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10595
	_update: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10596
		this._project._needsUpdate = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10597
		if (this._handlingFrame)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10598
			return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10599
		if (this._animate) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10600
			this._handleFrame();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10601
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10602
			this.update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10603
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10604
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10605
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10606
	_changed: function(flags) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10607
		if (flags & 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10608
			this._project._needsUpdate = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10609
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10610
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10611
	_transform: function(matrix) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10612
		this._matrix.concatenate(matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10613
		this._bounds = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10614
		this._update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10615
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10616
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10617
	getElement: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10618
		return this._element;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10619
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10620
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10621
	getPixelRatio: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10622
		return this._pixelRatio;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10623
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10624
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10625
	getResolution: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10626
		return this._pixelRatio * 72;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10627
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10628
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10629
	getViewSize: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10630
		var size = this._viewSize;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10631
		return new LinkedSize(size.width, size.height, this, 'setViewSize');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10632
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10633
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10634
	setViewSize: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10635
		var size = Size.read(arguments),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10636
			delta = size.subtract(this._viewSize);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10637
		if (delta.isZero())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10638
			return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10639
		this._viewSize.set(size.width, size.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10640
		this._setViewSize(size);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10641
		this._bounds = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10642
		this.emit('resize', {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10643
			size: size,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10644
			delta: delta
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10645
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10646
		this._update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10647
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10648
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10649
	_setViewSize: function(size) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10650
		var element = this._element;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10651
		element.width = size.width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10652
		element.height = size.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10653
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10654
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10655
	getBounds: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10656
		if (!this._bounds)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10657
			this._bounds = this._matrix.inverted()._transformBounds(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10658
					new Rectangle(new Point(), this._viewSize));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10659
		return this._bounds;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10660
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10661
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10662
	getSize: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10663
		return this.getBounds().getSize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10664
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10665
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10666
	getCenter: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10667
		return this.getBounds().getCenter();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10668
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10669
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10670
	setCenter: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10671
		var center = Point.read(arguments);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10672
		this.scrollBy(center.subtract(this.getCenter()));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10673
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10674
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10675
	getZoom: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10676
		return this._zoom;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10677
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10678
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10679
	setZoom: function(zoom) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10680
		this._transform(new Matrix().scale(zoom / this._zoom,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10681
			this.getCenter()));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10682
		this._zoom = zoom;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10683
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10684
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10685
	isVisible: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10686
		return DomElement.isInView(this._element);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10687
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10688
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10689
	scrollBy: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10690
		this._transform(new Matrix().translate(Point.read(arguments).negate()));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10691
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10692
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10693
	play: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10694
		this._animate = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10695
		if (!this._requested)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10696
			this._requestFrame();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10697
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10698
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10699
	pause: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10700
		this._animate = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10701
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10702
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10703
	draw: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10704
		this.update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10705
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10706
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10707
	projectToView: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10708
		return this._matrix._transformPoint(Point.read(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10709
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10710
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10711
	viewToProject: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10712
		return this._matrix._inverseTransform(Point.read(arguments));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10713
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10714
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10715
}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10716
	statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10717
		_views: [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10718
		_viewsById: {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10719
		_id: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10720
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10721
		create: function(project, element) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10722
			if (typeof element === 'string')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10723
				element = document.getElementById(element);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10724
			return new CanvasView(project, element);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10725
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10726
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10727
}, new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10728
	var tool,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10729
		prevFocus,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10730
		tempFocus,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10731
		dragging = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10732
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10733
	function getView(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10734
		var target = DomEvent.getTarget(event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10735
		return target.getAttribute && View._viewsById[target.getAttribute('id')];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10736
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10737
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10738
	function viewToProject(view, event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10739
		return view.viewToProject(DomEvent.getOffset(event, view._element));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10740
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10741
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10742
	function updateFocus() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10743
		if (!View._focused || !View._focused.isVisible()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10744
			for (var i = 0, l = View._views.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10745
				var view = View._views[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10746
				if (view && view.isVisible()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10747
					View._focused = tempFocus = view;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10748
					break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10749
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10750
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10751
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10752
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10753
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10754
	function handleMouseMove(view, point, event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10755
		view._handleEvent('mousemove', point, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10756
		var tool = view._scope.tool;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10757
		if (tool) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10758
			tool._handleEvent(dragging && tool.responds('mousedrag')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10759
					? 'mousedrag' : 'mousemove', point, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10760
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10761
		view.update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10762
		return tool;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10763
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10764
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10765
	var navigator = window.navigator,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10766
		mousedown, mousemove, mouseup;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10767
	if (navigator.pointerEnabled || navigator.msPointerEnabled) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10768
		mousedown = 'pointerdown MSPointerDown';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10769
		mousemove = 'pointermove MSPointerMove';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10770
		mouseup = 'pointerup pointercancel MSPointerUp MSPointerCancel';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10771
	} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10772
		mousedown = 'touchstart';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10773
		mousemove = 'touchmove';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10774
		mouseup = 'touchend touchcancel';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10775
		if (!('ontouchstart' in window && navigator.userAgent.match(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10776
				/mobile|tablet|ip(ad|hone|od)|android|silk/i))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10777
			mousedown += ' mousedown';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10778
			mousemove += ' mousemove';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10779
			mouseup += ' mouseup';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10780
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10781
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10782
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10783
	var viewEvents = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10784
		'selectstart dragstart': function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10785
			if (dragging)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10786
				event.preventDefault();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10787
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10788
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10789
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10790
	var docEvents = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10791
		mouseout: function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10792
			var view = View._focused,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10793
				target = DomEvent.getRelatedTarget(event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10794
			if (view && (!target || target.nodeName === 'HTML'))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10795
				handleMouseMove(view, viewToProject(view, event), event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10796
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10797
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10798
		scroll: updateFocus
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10799
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10800
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10801
	viewEvents[mousedown] = function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10802
		var view = View._focused = getView(event),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10803
			point = viewToProject(view, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10804
		dragging = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10805
		view._handleEvent('mousedown', point, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10806
		if (tool = view._scope.tool)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10807
			tool._handleEvent('mousedown', point, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10808
		view.update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10809
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10810
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10811
	docEvents[mousemove] = function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10812
		var view = View._focused;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10813
		if (!dragging) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10814
			var target = getView(event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10815
			if (target) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10816
				if (view !== target)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10817
					handleMouseMove(view, viewToProject(view, event), event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10818
				prevFocus = view;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10819
				view = View._focused = tempFocus = target;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10820
			} else if (tempFocus && tempFocus === view) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10821
				view = View._focused = prevFocus;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10822
				updateFocus();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10823
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10824
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10825
		if (view) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10826
			var point = viewToProject(view, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10827
			if (dragging || view.getBounds().contains(point))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10828
				tool = handleMouseMove(view, point, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10829
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10830
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10831
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10832
	docEvents[mouseup] = function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10833
		var view = View._focused;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10834
		if (!view || !dragging)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10835
			return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10836
		var point = viewToProject(view, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10837
		dragging = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10838
		view._handleEvent('mouseup', point, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10839
		if (tool)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10840
			tool._handleEvent('mouseup', point, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10841
		view.update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10842
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10843
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10844
	DomEvent.add(document, docEvents);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10845
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10846
	DomEvent.add(window, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10847
		load: updateFocus
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10848
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10849
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10850
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10851
		_viewEvents: viewEvents,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10852
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10853
		_handleEvent: function() {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10854
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10855
		statics: {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10856
			updateFocus: updateFocus
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10857
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10858
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10859
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10860
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10861
var CanvasView = View.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10862
	_class: 'CanvasView',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10863
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10864
	initialize: function CanvasView(project, canvas) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10865
		if (!(canvas instanceof HTMLCanvasElement)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10866
			var size = Size.read(arguments, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10867
			if (size.isZero())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10868
				throw new Error(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10869
						'Cannot create CanvasView with the provided argument: '
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10870
						+ [].slice.call(arguments, 1));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10871
			canvas = CanvasProvider.getCanvas(size);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10872
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10873
		this._context = canvas.getContext('2d');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10874
		this._eventCounters = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10875
		this._pixelRatio = 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10876
		if (!/^off|false$/.test(PaperScope.getAttribute(canvas, 'hidpi'))) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10877
			var deviceRatio = window.devicePixelRatio || 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10878
				backingStoreRatio = DomElement.getPrefixed(this._context,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10879
						'backingStorePixelRatio') || 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10880
			this._pixelRatio = deviceRatio / backingStoreRatio;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10881
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10882
		View.call(this, project, canvas);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10883
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10884
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10885
	_setViewSize: function(size) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10886
		var element = this._element,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10887
			pixelRatio = this._pixelRatio,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10888
			width = size.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10889
			height = size.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10890
		element.width = width * pixelRatio;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10891
		element.height = height * pixelRatio;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10892
		if (pixelRatio !== 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10893
			if (!PaperScope.hasAttribute(element, 'resize')) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10894
				var style = element.style;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10895
				style.width = width + 'px';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10896
				style.height = height + 'px';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10897
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10898
			this._context.scale(pixelRatio, pixelRatio);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10899
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10900
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10901
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10902
	getPixelSize: function(size) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10903
		var ctx = this._context,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10904
			prevFont = ctx.font;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10905
		ctx.font = size + ' serif';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10906
		size = parseFloat(ctx.font);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10907
		ctx.font = prevFont;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10908
		return size;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10909
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10910
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10911
	getTextWidth: function(font, lines) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10912
		var ctx = this._context,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10913
			prevFont = ctx.font,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10914
			width = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10915
		ctx.font = font;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10916
		for (var i = 0, l = lines.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10917
			width = Math.max(width, ctx.measureText(lines[i]).width);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10918
		ctx.font = prevFont;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10919
		return width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10920
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10921
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10922
	update: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10923
		var project = this._project;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10924
		if (!project || !project._needsUpdate)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10925
			return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10926
		var ctx = this._context,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10927
			size = this._viewSize;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10928
		ctx.clearRect(0, 0, size.width + 1, size.height + 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10929
		project.draw(ctx, this._matrix, this._pixelRatio);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10930
		project._needsUpdate = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10931
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10932
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10933
}, new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10934
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10935
	var downPoint,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10936
		lastPoint,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10937
		overPoint,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10938
		downItem,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10939
		lastItem,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10940
		overItem,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10941
		dragItem,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10942
		dblClick,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10943
		clickTime;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10944
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10945
	function callEvent(view, type, event, point, target, lastPoint) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10946
		var item = target,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10947
			mouseEvent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10948
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10949
		function call(obj) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10950
			if (obj.responds(type)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10951
				if (!mouseEvent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10952
					mouseEvent = new MouseEvent(type, event, point, target,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10953
							lastPoint ? point.subtract(lastPoint) : null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10954
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10955
				if (obj.emit(type, mouseEvent) && mouseEvent.isStopped) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10956
					event.preventDefault();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10957
					return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10958
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10959
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10960
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10961
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10962
		while (item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10963
			if (call(item))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10964
				return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10965
			item = item.getParent();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10966
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10967
		if (call(view))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10968
			return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10969
		return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10970
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10971
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10972
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10973
		_handleEvent: function(type, point, event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10974
			if (!this._eventCounters[type])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10975
				return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10976
			var project = this._project,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10977
				hit = project.hitTest(point, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10978
					tolerance: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10979
					fill: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10980
					stroke: true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10981
				}),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10982
				item = hit && hit.item,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10983
				stopped = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10984
			switch (type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10985
			case 'mousedown':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10986
				stopped = callEvent(this, type, event, point, item);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10987
				dblClick = lastItem == item && (Date.now() - clickTime < 300);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10988
				downItem = lastItem = item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10989
				downPoint = lastPoint = overPoint = point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10990
				dragItem = !stopped && item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10991
				while (dragItem && !dragItem.responds('mousedrag'))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10992
					dragItem = dragItem._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10993
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10994
			case 'mouseup':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10995
				stopped = callEvent(this, type, event, point, item, downPoint);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10996
				if (dragItem) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10997
					if (lastPoint && !lastPoint.equals(point))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10998
						callEvent(this, 'mousedrag', event, point, dragItem,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 10999
								lastPoint);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11000
					if (item !== dragItem) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11001
						overPoint = point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11002
						callEvent(this, 'mousemove', event, point, item,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11003
								overPoint);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11004
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11005
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11006
				if (!stopped && item && item === downItem) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11007
					clickTime = Date.now();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11008
					callEvent(this, dblClick && downItem.responds('doubleclick')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11009
							? 'doubleclick' : 'click', event, downPoint, item);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11010
					dblClick = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11011
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11012
				downItem = dragItem = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11013
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11014
			case 'mousemove':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11015
				if (dragItem)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11016
					stopped = callEvent(this, 'mousedrag', event, point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11017
							dragItem, lastPoint);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11018
				if (!stopped) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11019
					if (item !== overItem)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11020
						overPoint = point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11021
					stopped = callEvent(this, type, event, point, item,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11022
							overPoint);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11023
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11024
				lastPoint = overPoint = point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11025
				if (item !== overItem) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11026
					callEvent(this, 'mouseleave', event, point, overItem);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11027
					overItem = item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11028
					callEvent(this, 'mouseenter', event, point, item);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11029
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11030
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11031
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11032
			return stopped;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11033
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11034
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11035
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11036
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11037
var Event = Base.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11038
	_class: 'Event',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11039
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11040
	initialize: function Event(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11041
		this.event = event;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11042
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11043
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11044
	isPrevented: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11045
	isStopped: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11046
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11047
	preventDefault: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11048
		this.isPrevented = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11049
		this.event.preventDefault();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11050
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11051
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11052
	stopPropagation: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11053
		this.isStopped = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11054
		this.event.stopPropagation();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11055
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11056
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11057
	stop: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11058
		this.stopPropagation();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11059
		this.preventDefault();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11060
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11061
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11062
	getModifiers: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11063
		return Key.modifiers;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11064
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11065
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11066
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11067
var KeyEvent = Event.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11068
	_class: 'KeyEvent',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11069
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11070
	initialize: function KeyEvent(down, key, character, event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11071
		Event.call(this, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11072
		this.type = down ? 'keydown' : 'keyup';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11073
		this.key = key;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11074
		this.character = character;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11075
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11076
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11077
	toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11078
		return "{ type: '" + this.type
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11079
				+ "', key: '" + this.key
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11080
				+ "', character: '" + this.character
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11081
				+ "', modifiers: " + this.getModifiers()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11082
				+ " }";
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11083
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11084
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11085
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11086
var Key = new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11087
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11088
	var specialKeys = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11089
		8: 'backspace',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11090
		9: 'tab',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11091
		13: 'enter',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11092
		16: 'shift',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11093
		17: 'control',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11094
		18: 'option',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11095
		19: 'pause',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11096
		20: 'caps-lock',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11097
		27: 'escape',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11098
		32: 'space',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11099
		35: 'end',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11100
		36: 'home',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11101
		37: 'left',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11102
		38: 'up',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11103
		39: 'right',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11104
		40: 'down',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11105
		46: 'delete',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11106
		91: 'command',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11107
		93: 'command',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11108
		224: 'command'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11109
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11110
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11111
	specialChars = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11112
		9: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11113
		13: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11114
		32: true
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11115
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11116
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11117
	modifiers = new Base({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11118
		shift: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11119
		control: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11120
		option: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11121
		command: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11122
		capsLock: false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11123
		space: false
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11124
	}),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11125
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11126
	charCodeMap = {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11127
	keyMap = {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11128
	downCode;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11129
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11130
	function handleKey(down, keyCode, charCode, event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11131
		var character = charCode ? String.fromCharCode(charCode) : '',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11132
			specialKey = specialKeys[keyCode],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11133
			key = specialKey || character.toLowerCase(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11134
			type = down ? 'keydown' : 'keyup',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11135
			view = View._focused,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11136
			scope = view && view.isVisible() && view._scope,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11137
			tool = scope && scope.tool,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11138
			name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11139
		keyMap[key] = down;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11140
		if (specialKey && (name = Base.camelize(specialKey)) in modifiers)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11141
			modifiers[name] = down;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11142
		if (down) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11143
			charCodeMap[keyCode] = charCode;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11144
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11145
			delete charCodeMap[keyCode];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11146
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11147
		if (tool && tool.responds(type)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11148
			paper = scope;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11149
			tool.emit(type, new KeyEvent(down, key, character, event));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11150
			if (view)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11151
				view.update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11152
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11153
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11154
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11155
	DomEvent.add(document, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11156
		keydown: function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11157
			var code = event.which || event.keyCode;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11158
			if (code in specialKeys || modifiers.command) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11159
				handleKey(true, code,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11160
						code in specialChars || modifiers.command ? code : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11161
						event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11162
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11163
				downCode = code;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11164
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11165
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11166
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11167
		keypress: function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11168
			if (downCode != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11169
				handleKey(true, downCode, event.which || event.keyCode, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11170
				downCode = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11171
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11172
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11173
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11174
		keyup: function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11175
			var code = event.which || event.keyCode;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11176
			if (code in charCodeMap)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11177
				handleKey(false, code, charCodeMap[code], event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11178
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11179
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11180
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11181
	DomEvent.add(window, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11182
		blur: function(event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11183
			for (var code in charCodeMap)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11184
				handleKey(false, code, charCodeMap[code], event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11185
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11186
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11187
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11188
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11189
		modifiers: modifiers,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11190
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11191
		isDown: function(key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11192
			return !!keyMap[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11193
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11194
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11195
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11196
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11197
var MouseEvent = Event.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11198
	_class: 'MouseEvent',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11199
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11200
	initialize: function MouseEvent(type, event, point, target, delta) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11201
		Event.call(this, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11202
		this.type = type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11203
		this.point = point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11204
		this.target = target;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11205
		this.delta = delta;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11206
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11207
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11208
	toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11209
		return "{ type: '" + this.type
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11210
				+ "', point: " + this.point
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11211
				+ ', target: ' + this.target
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11212
				+ (this.delta ? ', delta: ' + this.delta : '')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11213
				+ ', modifiers: ' + this.getModifiers()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11214
				+ ' }';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11215
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11216
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11217
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11218
var ToolEvent = Event.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11219
	_class: 'ToolEvent',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11220
	_item: null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11221
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11222
	initialize: function ToolEvent(tool, type, event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11223
		this.tool = tool;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11224
		this.type = type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11225
		this.event = event;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11226
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11227
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11228
	_choosePoint: function(point, toolPoint) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11229
		return point ? point : toolPoint ? toolPoint.clone() : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11230
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11231
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11232
	getPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11233
		return this._choosePoint(this._point, this.tool._point);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11234
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11235
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11236
	setPoint: function(point) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11237
		this._point = point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11238
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11239
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11240
	getLastPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11241
		return this._choosePoint(this._lastPoint, this.tool._lastPoint);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11242
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11243
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11244
	setLastPoint: function(lastPoint) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11245
		this._lastPoint = lastPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11246
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11247
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11248
	getDownPoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11249
		return this._choosePoint(this._downPoint, this.tool._downPoint);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11250
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11251
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11252
	setDownPoint: function(downPoint) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11253
		this._downPoint = downPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11254
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11255
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11256
	getMiddlePoint: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11257
		if (!this._middlePoint && this.tool._lastPoint) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11258
			return this.tool._point.add(this.tool._lastPoint).divide(2);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11259
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11260
		return this._middlePoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11261
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11262
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11263
	setMiddlePoint: function(middlePoint) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11264
		this._middlePoint = middlePoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11265
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11266
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11267
	getDelta: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11268
		return !this._delta && this.tool._lastPoint
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11269
				? this.tool._point.subtract(this.tool._lastPoint)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11270
				: this._delta;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11271
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11272
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11273
	setDelta: function(delta) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11274
		this._delta = delta;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11275
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11276
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11277
	getCount: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11278
		return /^mouse(down|up)$/.test(this.type)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11279
				? this.tool._downCount
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11280
				: this.tool._count;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11281
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11282
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11283
	setCount: function(count) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11284
		this.tool[/^mouse(down|up)$/.test(this.type) ? 'downCount' : 'count']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11285
			= count;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11286
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11287
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11288
	getItem: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11289
		if (!this._item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11290
			var result = this.tool._scope.project.hitTest(this.getPoint());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11291
			if (result) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11292
				var item = result.item,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11293
					parent = item._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11294
				while (/^(Group|CompoundPath)$/.test(parent._class)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11295
					item = parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11296
					parent = parent._parent;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11297
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11298
				this._item = item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11299
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11300
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11301
		return this._item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11302
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11303
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11304
	setItem: function(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11305
		this._item = item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11306
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11307
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11308
	toString: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11309
		return '{ type: ' + this.type
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11310
				+ ', point: ' + this.getPoint()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11311
				+ ', count: ' + this.getCount()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11312
				+ ', modifiers: ' + this.getModifiers()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11313
				+ ' }';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11314
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11315
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11316
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11317
var Tool = PaperScopeItem.extend({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11318
	_class: 'Tool',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11319
	_list: 'tools',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11320
	_reference: 'tool',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11321
	_events: [ 'onActivate', 'onDeactivate', 'onEditOptions',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11322
			'onMouseDown', 'onMouseUp', 'onMouseDrag', 'onMouseMove',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11323
			'onKeyDown', 'onKeyUp' ],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11324
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11325
	initialize: function Tool(props) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11326
		PaperScopeItem.call(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11327
		this._firstMove = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11328
		this._count = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11329
		this._downCount = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11330
		this._set(props);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11331
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11332
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11333
	getMinDistance: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11334
		return this._minDistance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11335
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11336
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11337
	setMinDistance: function(minDistance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11338
		this._minDistance = minDistance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11339
		if (this._minDistance != null && this._maxDistance != null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11340
				&& this._minDistance > this._maxDistance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11341
			this._maxDistance = this._minDistance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11342
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11343
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11344
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11345
	getMaxDistance: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11346
		return this._maxDistance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11347
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11348
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11349
	setMaxDistance: function(maxDistance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11350
		this._maxDistance = maxDistance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11351
		if (this._minDistance != null && this._maxDistance != null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11352
				&& this._maxDistance < this._minDistance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11353
			this._minDistance = maxDistance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11354
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11355
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11356
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11357
	getFixedDistance: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11358
		return this._minDistance == this._maxDistance
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11359
			? this._minDistance : null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11360
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11361
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11362
	setFixedDistance: function(distance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11363
		this._minDistance = distance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11364
		this._maxDistance = distance;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11365
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11366
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11367
	_updateEvent: function(type, point, minDistance, maxDistance, start,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11368
			needsChange, matchMaxDistance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11369
		if (!start) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11370
			if (minDistance != null || maxDistance != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11371
				var minDist = minDistance != null ? minDistance : 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11372
					vector = point.subtract(this._point),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11373
					distance = vector.getLength();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11374
				if (distance < minDist)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11375
					return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11376
				var maxDist = maxDistance != null ? maxDistance : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11377
				if (maxDist != 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11378
					if (distance > maxDist) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11379
						point = this._point.add(vector.normalize(maxDist));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11380
					} else if (matchMaxDistance) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11381
						return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11382
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11383
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11384
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11385
			if (needsChange && point.equals(this._point))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11386
				return false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11387
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11388
		this._lastPoint = start && type == 'mousemove' ? point : this._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11389
		this._point = point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11390
		switch (type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11391
		case 'mousedown':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11392
			this._lastPoint = this._downPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11393
			this._downPoint = this._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11394
			this._downCount++;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11395
			break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11396
		case 'mouseup':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11397
			this._lastPoint = this._downPoint;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11398
			break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11399
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11400
		this._count = start ? 0 : this._count + 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11401
		return true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11402
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11403
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11404
	_fireEvent: function(type, event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11405
		var sets = paper.project._removeSets;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11406
		if (sets) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11407
			if (type === 'mouseup')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11408
				sets.mousedrag = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11409
			var set = sets[type];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11410
			if (set) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11411
				for (var id in set) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11412
					var item = set[id];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11413
					for (var key in sets) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11414
						var other = sets[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11415
						if (other && other != set)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11416
							delete other[item._id];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11417
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11418
					item.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11419
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11420
				sets[type] = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11421
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11422
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11423
		return this.responds(type)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11424
				&& this.emit(type, new ToolEvent(this, type, event));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11425
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11426
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11427
	_handleEvent: function(type, point, event) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11428
		paper = this._scope;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11429
		var called = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11430
		switch (type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11431
		case 'mousedown':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11432
			this._updateEvent(type, point, null, null, true, false, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11433
			called = this._fireEvent(type, event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11434
			break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11435
		case 'mousedrag':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11436
			var needsChange = false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11437
				matchMaxDistance = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11438
			while (this._updateEvent(type, point, this.minDistance,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11439
					this.maxDistance, false, needsChange, matchMaxDistance)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11440
				called = this._fireEvent(type, event) || called;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11441
				needsChange = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11442
				matchMaxDistance = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11443
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11444
			break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11445
		case 'mouseup':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11446
			if (!point.equals(this._point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11447
					&& this._updateEvent('mousedrag', point, this.minDistance,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11448
							this.maxDistance, false, false, false)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11449
				called = this._fireEvent('mousedrag', event);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11450
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11451
			this._updateEvent(type, point, null, this.maxDistance, false,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11452
					false, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11453
			called = this._fireEvent(type, event) || called;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11454
			this._updateEvent(type, point, null, null, true, false, false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11455
			this._firstMove = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11456
			break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11457
		case 'mousemove':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11458
			while (this._updateEvent(type, point, this.minDistance,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11459
					this.maxDistance, this._firstMove, true, false)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11460
				called = this._fireEvent(type, event) || called;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11461
				this._firstMove = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11462
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11463
			break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11464
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11465
		if (called)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11466
			event.preventDefault();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11467
		return called;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11468
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11469
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11470
});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11471
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11472
var Http = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11473
	request: function(method, url, callback) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11474
		var xhr = new (window.ActiveXObject || XMLHttpRequest)(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11475
					'Microsoft.XMLHTTP');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11476
		xhr.open(method.toUpperCase(), url, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11477
		if ('overrideMimeType' in xhr)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11478
			xhr.overrideMimeType('text/plain');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11479
		xhr.onreadystatechange = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11480
			if (xhr.readyState === 4) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11481
				var status = xhr.status;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11482
				if (status === 0 || status === 200) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11483
					callback.call(xhr, xhr.responseText);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11484
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11485
					throw new Error('Could not load ' + url + ' (Error '
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11486
							+ status + ')');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11487
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11488
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11489
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11490
		return xhr.send(null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11491
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11492
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11493
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11494
var CanvasProvider = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11495
	canvases: [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11496
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11497
	getCanvas: function(width, height) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11498
		var canvas,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11499
			clear = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11500
		if (typeof width === 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11501
			height = width.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11502
			width = width.width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11503
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11504
		if (this.canvases.length) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11505
			canvas = this.canvases.pop();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11506
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11507
			canvas = document.createElement('canvas');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11508
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11509
		var ctx = canvas.getContext('2d');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11510
		if (canvas.width === width && canvas.height === height) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11511
			if (clear)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11512
				ctx.clearRect(0, 0, width + 1, height + 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11513
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11514
			canvas.width = width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11515
			canvas.height = height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11516
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11517
		ctx.save();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11518
		return canvas;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11519
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11520
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11521
	getContext: function(width, height) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11522
		return this.getCanvas(width, height).getContext('2d');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11523
	},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11524
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11525
	release: function(obj) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11526
		var canvas = obj.canvas ? obj.canvas : obj;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11527
		canvas.getContext('2d').restore();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11528
		this.canvases.push(canvas);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11529
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11530
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11531
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11532
var BlendMode = new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11533
	var min = Math.min,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11534
		max = Math.max,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11535
		abs = Math.abs,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11536
		sr, sg, sb, sa,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11537
		br, bg, bb, ba,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11538
		dr, dg, db;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11539
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11540
	function getLum(r, g, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11541
		return 0.2989 * r + 0.587 * g + 0.114 * b;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11542
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11543
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11544
	function setLum(r, g, b, l) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11545
		var d = l - getLum(r, g, b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11546
		dr = r + d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11547
		dg = g + d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11548
		db = b + d;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11549
		var l = getLum(dr, dg, db),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11550
			mn = min(dr, dg, db),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11551
			mx = max(dr, dg, db);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11552
		if (mn < 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11553
			var lmn = l - mn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11554
			dr = l + (dr - l) * l / lmn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11555
			dg = l + (dg - l) * l / lmn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11556
			db = l + (db - l) * l / lmn;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11557
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11558
		if (mx > 255) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11559
			var ln = 255 - l,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11560
				mxl = mx - l;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11561
			dr = l + (dr - l) * ln / mxl;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11562
			dg = l + (dg - l) * ln / mxl;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11563
			db = l + (db - l) * ln / mxl;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11564
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11565
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11566
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11567
	function getSat(r, g, b) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11568
		return max(r, g, b) - min(r, g, b);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11569
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11570
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11571
	function setSat(r, g, b, s) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11572
		var col = [r, g, b],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11573
			mx = max(r, g, b),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11574
			mn = min(r, g, b),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11575
			md;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11576
		mn = mn === r ? 0 : mn === g ? 1 : 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11577
		mx = mx === r ? 0 : mx === g ? 1 : 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11578
		md = min(mn, mx) === 0 ? max(mn, mx) === 1 ? 2 : 1 : 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11579
		if (col[mx] > col[mn]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11580
			col[md] = (col[md] - col[mn]) * s / (col[mx] - col[mn]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11581
			col[mx] = s;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11582
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11583
			col[md] = col[mx] = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11584
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11585
		col[mn] = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11586
		dr = col[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11587
		dg = col[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11588
		db = col[2];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11589
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11590
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11591
	var modes = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11592
		multiply: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11593
			dr = br * sr / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11594
			dg = bg * sg / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11595
			db = bb * sb / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11596
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11597
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11598
		screen: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11599
			dr = br + sr - (br * sr / 255);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11600
			dg = bg + sg - (bg * sg / 255);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11601
			db = bb + sb - (bb * sb / 255);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11602
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11603
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11604
		overlay: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11605
			dr = br < 128 ? 2 * br * sr / 255 : 255 - 2 * (255 - br) * (255 - sr) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11606
			dg = bg < 128 ? 2 * bg * sg / 255 : 255 - 2 * (255 - bg) * (255 - sg) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11607
			db = bb < 128 ? 2 * bb * sb / 255 : 255 - 2 * (255 - bb) * (255 - sb) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11608
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11609
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11610
		'soft-light': function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11611
			var t = sr * br / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11612
			dr = t + br * (255 - (255 - br) * (255 - sr) / 255 - t) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11613
			t = sg * bg / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11614
			dg = t + bg * (255 - (255 - bg) * (255 - sg) / 255 - t) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11615
			t = sb * bb / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11616
			db = t + bb * (255 - (255 - bb) * (255 - sb) / 255 - t) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11617
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11618
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11619
		'hard-light': function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11620
			dr = sr < 128 ? 2 * sr * br / 255 : 255 - 2 * (255 - sr) * (255 - br) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11621
			dg = sg < 128 ? 2 * sg * bg / 255 : 255 - 2 * (255 - sg) * (255 - bg) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11622
			db = sb < 128 ? 2 * sb * bb / 255 : 255 - 2 * (255 - sb) * (255 - bb) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11623
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11624
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11625
		'color-dodge': function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11626
			dr = br === 0 ? 0 : sr === 255 ? 255 : min(255, 255 * br / (255 - sr));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11627
			dg = bg === 0 ? 0 : sg === 255 ? 255 : min(255, 255 * bg / (255 - sg));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11628
			db = bb === 0 ? 0 : sb === 255 ? 255 : min(255, 255 * bb / (255 - sb));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11629
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11630
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11631
		'color-burn': function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11632
			dr = br === 255 ? 255 : sr === 0 ? 0 : max(0, 255 - (255 - br) * 255 / sr);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11633
			dg = bg === 255 ? 255 : sg === 0 ? 0 : max(0, 255 - (255 - bg) * 255 / sg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11634
			db = bb === 255 ? 255 : sb === 0 ? 0 : max(0, 255 - (255 - bb) * 255 / sb);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11635
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11636
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11637
		darken: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11638
			dr = br < sr ? br : sr;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11639
			dg = bg < sg ? bg : sg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11640
			db = bb < sb ? bb : sb;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11641
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11642
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11643
		lighten: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11644
			dr = br > sr ? br : sr;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11645
			dg = bg > sg ? bg : sg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11646
			db = bb > sb ? bb : sb;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11647
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11648
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11649
		difference: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11650
			dr = br - sr;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11651
			if (dr < 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11652
				dr = -dr;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11653
			dg = bg - sg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11654
			if (dg < 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11655
				dg = -dg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11656
			db = bb - sb;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11657
			if (db < 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11658
				db = -db;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11659
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11660
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11661
		exclusion: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11662
			dr = br + sr * (255 - br - br) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11663
			dg = bg + sg * (255 - bg - bg) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11664
			db = bb + sb * (255 - bb - bb) / 255;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11665
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11666
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11667
		hue: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11668
			setSat(sr, sg, sb, getSat(br, bg, bb));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11669
			setLum(dr, dg, db, getLum(br, bg, bb));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11670
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11671
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11672
		saturation: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11673
			setSat(br, bg, bb, getSat(sr, sg, sb));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11674
			setLum(dr, dg, db, getLum(br, bg, bb));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11675
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11676
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11677
		luminosity: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11678
			setLum(br, bg, bb, getLum(sr, sg, sb));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11679
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11680
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11681
		color: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11682
			setLum(sr, sg, sb, getLum(br, bg, bb));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11683
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11684
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11685
		add: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11686
			dr = min(br + sr, 255);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11687
			dg = min(bg + sg, 255);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11688
			db = min(bb + sb, 255);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11689
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11690
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11691
		subtract: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11692
			dr = max(br - sr, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11693
			dg = max(bg - sg, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11694
			db = max(bb - sb, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11695
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11696
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11697
		average: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11698
			dr = (br + sr) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11699
			dg = (bg + sg) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11700
			db = (bb + sb) / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11701
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11702
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11703
		negation: function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11704
			dr = 255 - abs(255 - sr - br);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11705
			dg = 255 - abs(255 - sg - bg);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11706
			db = 255 - abs(255 - sb - bb);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11707
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11708
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11709
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11710
	var nativeModes = this.nativeModes = Base.each([
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11711
		'source-over', 'source-in', 'source-out', 'source-atop',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11712
		'destination-over', 'destination-in', 'destination-out',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11713
		'destination-atop', 'lighter', 'darker', 'copy', 'xor'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11714
	], function(mode) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11715
		this[mode] = true;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11716
	}, {});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11717
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11718
	var ctx = CanvasProvider.getContext(1, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11719
	Base.each(modes, function(func, mode) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11720
		var darken = mode === 'darken',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11721
			ok = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11722
		ctx.save();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11723
		try {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11724
			ctx.fillStyle = darken ? '#300' : '#a00';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11725
			ctx.fillRect(0, 0, 1, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11726
			ctx.globalCompositeOperation = mode;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11727
			if (ctx.globalCompositeOperation === mode) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11728
				ctx.fillStyle = darken ? '#a00' : '#300';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11729
				ctx.fillRect(0, 0, 1, 1);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11730
				ok = ctx.getImageData(0, 0, 1, 1).data[0] !== darken ? 170 : 51;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11731
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11732
		} catch (e) {}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11733
		ctx.restore();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11734
		nativeModes[mode] = ok;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11735
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11736
	CanvasProvider.release(ctx);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11737
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11738
	this.process = function(mode, srcContext, dstContext, alpha, offset) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11739
		var srcCanvas = srcContext.canvas,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11740
			normal = mode === 'normal';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11741
		if (normal || nativeModes[mode]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11742
			dstContext.save();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11743
			dstContext.setTransform(1, 0, 0, 1, 0, 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11744
			dstContext.globalAlpha = alpha;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11745
			if (!normal)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11746
				dstContext.globalCompositeOperation = mode;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11747
			dstContext.drawImage(srcCanvas, offset.x, offset.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11748
			dstContext.restore();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11749
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11750
			var process = modes[mode];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11751
			if (!process)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11752
				return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11753
			var dstData = dstContext.getImageData(offset.x, offset.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11754
					srcCanvas.width, srcCanvas.height),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11755
				dst = dstData.data,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11756
				src = srcContext.getImageData(0, 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11757
					srcCanvas.width, srcCanvas.height).data;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11758
			for (var i = 0, l = dst.length; i < l; i += 4) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11759
				sr = src[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11760
				br = dst[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11761
				sg = src[i + 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11762
				bg = dst[i + 1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11763
				sb = src[i + 2];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11764
				bb = dst[i + 2];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11765
				sa = src[i + 3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11766
				ba = dst[i + 3];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11767
				process();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11768
				var a1 = sa * alpha / 255,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11769
					a2 = 1 - a1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11770
				dst[i] = a1 * dr + a2 * br;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11771
				dst[i + 1] = a1 * dg + a2 * bg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11772
				dst[i + 2] = a1 * db + a2 * bb;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11773
				dst[i + 3] = sa * alpha + a2 * ba;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11774
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11775
			dstContext.putImageData(dstData, offset.x, offset.y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11776
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11777
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11778
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11779
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11780
var SVGStyles = Base.each({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11781
	fillColor: ['fill', 'color'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11782
	strokeColor: ['stroke', 'color'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11783
	strokeWidth: ['stroke-width', 'number'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11784
	strokeCap: ['stroke-linecap', 'string'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11785
	strokeJoin: ['stroke-linejoin', 'string'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11786
	strokeScaling: ['vector-effect', 'lookup', {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11787
		true: 'none',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11788
		false: 'non-scaling-stroke'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11789
	}, function(item, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11790
		return !value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11791
				&& (item instanceof PathItem
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11792
					|| item instanceof Shape
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11793
					|| item instanceof TextItem);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11794
	}],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11795
	miterLimit: ['stroke-miterlimit', 'number'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11796
	dashArray: ['stroke-dasharray', 'array'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11797
	dashOffset: ['stroke-dashoffset', 'number'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11798
	fontFamily: ['font-family', 'string'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11799
	fontWeight: ['font-weight', 'string'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11800
	fontSize: ['font-size', 'number'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11801
	justification: ['text-anchor', 'lookup', {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11802
		left: 'start',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11803
		center: 'middle',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11804
		right: 'end'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11805
	}],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11806
	opacity: ['opacity', 'number'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11807
	blendMode: ['mix-blend-mode', 'string']
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11808
}, function(entry, key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11809
	var part = Base.capitalize(key),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11810
		lookup = entry[2];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11811
	this[key] = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11812
		type: entry[1],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11813
		property: key,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11814
		attribute: entry[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11815
		toSVG: lookup,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11816
		fromSVG: lookup && Base.each(lookup, function(value, name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11817
			this[value] = name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11818
		}, {}),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11819
		exportFilter: entry[3],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11820
		get: 'get' + part,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11821
		set: 'set' + part
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11822
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11823
}, {});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11824
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11825
var SVGNamespaces = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11826
	href: 'http://www.w3.org/1999/xlink',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11827
	xlink: 'http://www.w3.org/2000/xmlns'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11828
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11829
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11830
new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11831
	var formatter;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11832
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11833
	function setAttributes(node, attrs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11834
		for (var key in attrs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11835
			var val = attrs[key],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11836
				namespace = SVGNamespaces[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11837
			if (typeof val === 'number')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11838
				val = formatter.number(val);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11839
			if (namespace) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11840
				node.setAttributeNS(namespace, key, val);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11841
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11842
				node.setAttribute(key, val);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11843
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11844
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11845
		return node;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11846
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11847
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11848
	function createElement(tag, attrs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11849
		return setAttributes(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11850
			document.createElementNS('http://www.w3.org/2000/svg', tag), attrs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11851
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11852
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11853
	function getTransform(matrix, coordinates, center) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11854
		var attrs = new Base(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11855
			trans = matrix.getTranslation();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11856
		if (coordinates) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11857
			matrix = matrix.shiftless();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11858
			var point = matrix._inverseTransform(trans);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11859
			attrs[center ? 'cx' : 'x'] = point.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11860
			attrs[center ? 'cy' : 'y'] = point.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11861
			trans = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11862
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11863
		if (!matrix.isIdentity()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11864
			var decomposed = matrix.decompose();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11865
			if (decomposed && !decomposed.shearing) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11866
				var parts = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11867
					angle = decomposed.rotation,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11868
					scale = decomposed.scaling;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11869
				if (trans && !trans.isZero())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11870
					parts.push('translate(' + formatter.point(trans) + ')');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11871
				if (!Numerical.isZero(scale.x - 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11872
						|| !Numerical.isZero(scale.y - 1))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11873
					parts.push('scale(' + formatter.point(scale) +')');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11874
				if (angle)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11875
					parts.push('rotate(' + formatter.number(angle) + ')');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11876
				attrs.transform = parts.join(' ');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11877
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11878
				attrs.transform = 'matrix(' + matrix.getValues().join(',') + ')';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11879
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11880
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11881
		return attrs;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11882
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11883
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11884
	function exportGroup(item, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11885
		var attrs = getTransform(item._matrix),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11886
			children = item._children;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11887
		var node = createElement('g', attrs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11888
		for (var i = 0, l = children.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11889
			var child = children[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11890
			var childNode = exportSVG(child, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11891
			if (childNode) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11892
				if (child.isClipMask()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11893
					var clip = createElement('clipPath');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11894
					clip.appendChild(childNode);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11895
					setDefinition(child, clip, 'clip');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11896
					setAttributes(node, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11897
						'clip-path': 'url(#' + clip.id + ')'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11898
					});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11899
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11900
					node.appendChild(childNode);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11901
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11902
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11903
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11904
		return node;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11905
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11906
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11907
	function exportRaster(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11908
		var attrs = getTransform(item._matrix, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11909
			size = item.getSize();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11910
		attrs.x -= size.width / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11911
		attrs.y -= size.height / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11912
		attrs.width = size.width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11913
		attrs.height = size.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11914
		attrs.href = item.toDataURL();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11915
		return createElement('image', attrs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11916
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11917
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11918
	function exportPath(item, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11919
		if (options.matchShapes) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11920
			var shape = item.toShape(false);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11921
			if (shape)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11922
				return exportShape(shape, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11923
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11924
		var segments = item._segments,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11925
			type,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11926
			attrs = getTransform(item._matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11927
		if (segments.length === 0)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11928
			return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11929
		if (item.isPolygon()) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11930
			if (segments.length >= 3) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11931
				type = item._closed ? 'polygon' : 'polyline';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11932
				var parts = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11933
				for(i = 0, l = segments.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11934
					parts.push(formatter.point(segments[i]._point));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11935
				attrs.points = parts.join(' ');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11936
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11937
				type = 'line';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11938
				var first = segments[0]._point,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11939
					last = segments[segments.length - 1]._point;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11940
				attrs.set({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11941
					x1: first.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11942
					y1: first.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11943
					x2: last.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11944
					y2: last.y
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11945
				});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11946
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11947
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11948
			type = 'path';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11949
			attrs.d = item.getPathData(null, options.precision);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11950
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11951
		return createElement(type, attrs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11952
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11953
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11954
	function exportShape(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11955
		var type = item._type,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11956
			radius = item._radius,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11957
			attrs = getTransform(item._matrix, true, type !== 'rectangle');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11958
		if (type === 'rectangle') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11959
			type = 'rect';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11960
			var size = item._size,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11961
				width = size.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11962
				height = size.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11963
			attrs.x -= width / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11964
			attrs.y -= height / 2;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11965
			attrs.width = width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11966
			attrs.height = height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11967
			if (radius.isZero())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11968
				radius = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11969
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11970
		if (radius) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11971
			if (type === 'circle') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11972
				attrs.r = radius;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11973
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11974
				attrs.rx = radius.width;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11975
				attrs.ry = radius.height;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11976
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11977
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11978
		return createElement(type, attrs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11979
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11980
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11981
	function exportCompoundPath(item, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11982
		var attrs = getTransform(item._matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11983
		var data = item.getPathData(null, options.precision);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11984
		if (data)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11985
			attrs.d = data;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11986
		return createElement('path', attrs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11987
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11988
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11989
	function exportPlacedSymbol(item, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11990
		var attrs = getTransform(item._matrix, true),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11991
			symbol = item.getSymbol(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11992
			symbolNode = getDefinition(symbol, 'symbol'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11993
			definition = symbol.getDefinition(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11994
			bounds = definition.getBounds();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11995
		if (!symbolNode) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11996
			symbolNode = createElement('symbol', {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11997
				viewBox: formatter.rectangle(bounds)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11998
			});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 11999
			symbolNode.appendChild(exportSVG(definition, options));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12000
			setDefinition(symbol, symbolNode, 'symbol');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12001
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12002
		attrs.href = '#' + symbolNode.id;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12003
		attrs.x += bounds.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12004
		attrs.y += bounds.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12005
		attrs.width = formatter.number(bounds.width);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12006
		attrs.height = formatter.number(bounds.height);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12007
		attrs.overflow = 'visible';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12008
		return createElement('use', attrs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12009
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12010
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12011
	function exportGradient(color) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12012
		var gradientNode = getDefinition(color, 'color');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12013
		if (!gradientNode) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12014
			var gradient = color.getGradient(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12015
				radial = gradient._radial,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12016
				origin = color.getOrigin().transform(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12017
				destination = color.getDestination().transform(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12018
				attrs;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12019
			if (radial) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12020
				attrs = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12021
					cx: origin.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12022
					cy: origin.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12023
					r: origin.getDistance(destination)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12024
				};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12025
				var highlight = color.getHighlight();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12026
				if (highlight) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12027
					highlight = highlight.transform();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12028
					attrs.fx = highlight.x;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12029
					attrs.fy = highlight.y;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12030
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12031
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12032
				attrs = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12033
					x1: origin.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12034
					y1: origin.y,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12035
					x2: destination.x,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12036
					y2: destination.y
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12037
				};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12038
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12039
			attrs.gradientUnits = 'userSpaceOnUse';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12040
			gradientNode = createElement(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12041
					(radial ? 'radial' : 'linear') + 'Gradient', attrs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12042
			var stops = gradient._stops;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12043
			for (var i = 0, l = stops.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12044
				var stop = stops[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12045
					stopColor = stop._color,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12046
					alpha = stopColor.getAlpha();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12047
				attrs = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12048
					offset: stop._rampPoint,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12049
					'stop-color': stopColor.toCSS(true)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12050
				};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12051
				if (alpha < 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12052
					attrs['stop-opacity'] = alpha;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12053
				gradientNode.appendChild(createElement('stop', attrs));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12054
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12055
			setDefinition(color, gradientNode, 'color');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12056
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12057
		return 'url(#' + gradientNode.id + ')';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12058
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12059
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12060
	function exportText(item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12061
		var node = createElement('text', getTransform(item._matrix, true));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12062
		node.textContent = item._content;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12063
		return node;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12064
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12065
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12066
	var exporters = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12067
		Group: exportGroup,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12068
		Layer: exportGroup,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12069
		Raster: exportRaster,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12070
		Path: exportPath,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12071
		Shape: exportShape,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12072
		CompoundPath: exportCompoundPath,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12073
		PlacedSymbol: exportPlacedSymbol,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12074
		PointText: exportText
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12075
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12076
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12077
	function applyStyle(item, node, isRoot) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12078
		var attrs = {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12079
			parent = !isRoot && item.getParent();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12080
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12081
		if (item._name != null)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12082
			attrs.id = item._name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12083
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12084
		Base.each(SVGStyles, function(entry) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12085
			var get = entry.get,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12086
				type = entry.type,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12087
				value = item[get]();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12088
			if (entry.exportFilter
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12089
					? entry.exportFilter(item, value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12090
					: !parent || !Base.equals(parent[get](), value)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12091
				if (type === 'color' && value != null) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12092
					var alpha = value.getAlpha();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12093
					if (alpha < 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12094
						attrs[entry.attribute + '-opacity'] = alpha;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12095
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12096
				attrs[entry.attribute] = value == null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12097
					? 'none'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12098
					: type === 'number'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12099
						? formatter.number(value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12100
						: type === 'color'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12101
							? value.gradient
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12102
								? exportGradient(value, item)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12103
								: value.toCSS(true)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12104
							: type === 'array'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12105
								? value.join(',')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12106
								: type === 'lookup'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12107
									? entry.toSVG[value]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12108
									: value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12109
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12110
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12111
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12112
		if (attrs.opacity === 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12113
			delete attrs.opacity;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12114
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12115
		if (!item._visible)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12116
			attrs.visibility = 'hidden';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12117
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12118
		return setAttributes(node, attrs);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12119
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12120
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12121
	var definitions;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12122
	function getDefinition(item, type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12123
		if (!definitions)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12124
			definitions = { ids: {}, svgs: {} };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12125
		return item && definitions.svgs[type + '-' + item._id];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12126
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12127
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12128
	function setDefinition(item, node, type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12129
		if (!definitions)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12130
			getDefinition();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12131
		var id = definitions.ids[type] = (definitions.ids[type] || 0) + 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12132
		node.id = type + '-' + id;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12133
		definitions.svgs[type + '-' + item._id] = node;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12134
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12135
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12136
	function exportDefinitions(node, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12137
		var svg = node,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12138
			defs = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12139
		if (definitions) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12140
			svg = node.nodeName.toLowerCase() === 'svg' && node;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12141
			for (var i in definitions.svgs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12142
				if (!defs) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12143
					if (!svg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12144
						svg = createElement('svg');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12145
						svg.appendChild(node);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12146
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12147
					defs = svg.insertBefore(createElement('defs'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12148
							svg.firstChild);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12149
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12150
				defs.appendChild(definitions.svgs[i]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12151
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12152
			definitions = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12153
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12154
		return options.asString
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12155
				? new XMLSerializer().serializeToString(svg)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12156
				: svg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12157
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12158
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12159
	function exportSVG(item, options, isRoot) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12160
		var exporter = exporters[item._class],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12161
			node = exporter && exporter(item, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12162
		if (node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12163
			var onExport = options.onExport;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12164
			if (onExport)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12165
				node = onExport(item, node, options) || node;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12166
			var data = JSON.stringify(item._data);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12167
			if (data && data !== '{}' && data !== 'null')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12168
				node.setAttribute('data-paper-data', data);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12169
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12170
		return node && applyStyle(item, node, isRoot);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12171
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12172
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12173
	function setOptions(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12174
		if (!options)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12175
			options = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12176
		formatter = new Formatter(options.precision);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12177
		return options;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12178
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12179
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12180
	Item.inject({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12181
		exportSVG: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12182
			options = setOptions(options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12183
			return exportDefinitions(exportSVG(this, options, true), options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12184
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12185
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12186
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12187
	Project.inject({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12188
		exportSVG: function(options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12189
			options = setOptions(options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12190
			var layers = this.layers,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12191
				view = this.getView(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12192
				size = view.getViewSize(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12193
				node = createElement('svg', {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12194
					x: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12195
					y: 0,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12196
					width: size.width,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12197
					height: size.height,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12198
					version: '1.1',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12199
					xmlns: 'http://www.w3.org/2000/svg',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12200
					'xmlns:xlink': 'http://www.w3.org/1999/xlink'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12201
				}),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12202
				parent = node,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12203
				matrix = view._matrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12204
			if (!matrix.isIdentity())
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12205
				parent = node.appendChild(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12206
						createElement('g', getTransform(matrix)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12207
			for (var i = 0, l = layers.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12208
				parent.appendChild(exportSVG(layers[i], options, true));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12209
			return exportDefinitions(node, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12210
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12211
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12212
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12213
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12214
new function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12215
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12216
	function getValue(node, name, isString, allowNull) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12217
		var namespace = SVGNamespaces[name],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12218
			value = namespace
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12219
				? node.getAttributeNS(namespace, name)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12220
				: node.getAttribute(name);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12221
		if (value === 'null')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12222
			value = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12223
		return value == null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12224
				? allowNull
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12225
					? null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12226
					: isString
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12227
						? ''
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12228
						: 0
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12229
				: isString
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12230
					? value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12231
					: parseFloat(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12232
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12233
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12234
	function getPoint(node, x, y, allowNull) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12235
		x = getValue(node, x, false, allowNull);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12236
		y = getValue(node, y, false, allowNull);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12237
		return allowNull && (x == null || y == null) ? null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12238
				: new Point(x, y);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12239
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12240
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12241
	function getSize(node, w, h, allowNull) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12242
		w = getValue(node, w, false, allowNull);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12243
		h = getValue(node, h, false, allowNull);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12244
		return allowNull && (w == null || h == null) ? null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12245
				: new Size(w, h);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12246
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12247
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12248
	function convertValue(value, type, lookup) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12249
		return value === 'none'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12250
				? null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12251
				: type === 'number'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12252
					? parseFloat(value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12253
					: type === 'array'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12254
						? value ? value.split(/[\s,]+/g).map(parseFloat) : []
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12255
						: type === 'color'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12256
							? getDefinition(value) || value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12257
							: type === 'lookup'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12258
								? lookup[value]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12259
								: value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12260
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12261
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12262
	function importGroup(node, type, options, isRoot) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12263
		var nodes = node.childNodes,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12264
			isClip = type === 'clippath',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12265
			item = new Group(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12266
			project = item._project,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12267
			currentStyle = project._currentStyle,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12268
			children = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12269
		if (!isClip) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12270
			item = applyAttributes(item, node, isRoot);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12271
			project._currentStyle = item._style.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12272
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12273
		for (var i = 0, l = nodes.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12274
			var childNode = nodes[i],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12275
				child;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12276
			if (childNode.nodeType === 1
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12277
					&& (child = importSVG(childNode, options, false))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12278
					&& !(child instanceof Symbol))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12279
				children.push(child);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12280
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12281
		item.addChildren(children);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12282
		if (isClip)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12283
			item = applyAttributes(item.reduce(), node, isRoot);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12284
		project._currentStyle = currentStyle;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12285
		if (isClip || type === 'defs') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12286
			item.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12287
			item = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12288
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12289
		return item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12290
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12291
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12292
	function importPoly(node, type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12293
		var coords = node.getAttribute('points').match(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12294
					/[+-]?(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?/g),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12295
			points = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12296
		for (var i = 0, l = coords.length; i < l; i += 2)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12297
			points.push(new Point(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12298
					parseFloat(coords[i]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12299
					parseFloat(coords[i + 1])));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12300
		var path = new Path(points);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12301
		if (type === 'polygon')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12302
			path.closePath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12303
		return path;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12304
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12305
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12306
	function importPath(node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12307
		var data = node.getAttribute('d'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12308
			param = { pathData: data };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12309
		return (data.match(/m/gi) || []).length > 1 || /z\S+/i.test(data)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12310
				? new CompoundPath(param)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12311
				: new Path(param);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12312
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12313
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12314
	function importGradient(node, type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12315
		var id = (getValue(node, 'href', true) || '').substring(1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12316
			isRadial = type === 'radialgradient',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12317
			gradient;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12318
		if (id) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12319
			gradient = definitions[id].getGradient();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12320
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12321
			var nodes = node.childNodes,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12322
				stops = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12323
			for (var i = 0, l = nodes.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12324
				var child = nodes[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12325
				if (child.nodeType === 1)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12326
					stops.push(applyAttributes(new GradientStop(), child));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12327
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12328
			gradient = new Gradient(stops, isRadial);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12329
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12330
		var origin, destination, highlight;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12331
		if (isRadial) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12332
			origin = getPoint(node, 'cx', 'cy');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12333
			destination = origin.add(getValue(node, 'r'), 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12334
			highlight = getPoint(node, 'fx', 'fy', true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12335
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12336
			origin = getPoint(node, 'x1', 'y1');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12337
			destination = getPoint(node, 'x2', 'y2');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12338
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12339
		applyAttributes(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12340
			new Color(gradient, origin, destination, highlight), node);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12341
		return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12342
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12343
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12344
	var importers = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12345
		'#document': function (node, type, options, isRoot) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12346
			var nodes = node.childNodes;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12347
			for (var i = 0, l = nodes.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12348
				var child = nodes[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12349
				if (child.nodeType === 1) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12350
					var next = child.nextSibling;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12351
					document.body.appendChild(child);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12352
					var item = importSVG(child, options, isRoot);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12353
					if (next) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12354
						node.insertBefore(child, next);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12355
					} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12356
						node.appendChild(child);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12357
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12358
					return item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12359
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12360
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12361
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12362
		g: importGroup,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12363
		svg: importGroup,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12364
		clippath: importGroup,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12365
		polygon: importPoly,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12366
		polyline: importPoly,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12367
		path: importPath,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12368
		lineargradient: importGradient,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12369
		radialgradient: importGradient,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12370
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12371
		image: function (node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12372
			var raster = new Raster(getValue(node, 'href', true));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12373
			raster.on('load', function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12374
				var size = getSize(node, 'width', 'height');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12375
				this.setSize(size);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12376
				var center = this._matrix._transformPoint(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12377
						getPoint(node, 'x', 'y').add(size.divide(2)));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12378
				this.translate(center);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12379
			});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12380
			return raster;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12381
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12382
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12383
		symbol: function(node, type, options, isRoot) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12384
			return new Symbol(importGroup(node, type, options, isRoot), true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12385
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12386
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12387
		defs: importGroup,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12388
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12389
		use: function(node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12390
			var id = (getValue(node, 'href', true) || '').substring(1),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12391
				definition = definitions[id],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12392
				point = getPoint(node, 'x', 'y');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12393
			return definition
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12394
					? definition instanceof Symbol
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12395
						? definition.place(point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12396
						: definition.clone().translate(point)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12397
					: null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12398
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12399
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12400
		circle: function(node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12401
			return new Shape.Circle(getPoint(node, 'cx', 'cy'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12402
					getValue(node, 'r'));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12403
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12404
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12405
		ellipse: function(node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12406
			return new Shape.Ellipse({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12407
				center: getPoint(node, 'cx', 'cy'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12408
				radius: getSize(node, 'rx', 'ry')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12409
			});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12410
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12411
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12412
		rect: function(node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12413
			var point = getPoint(node, 'x', 'y'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12414
				size = getSize(node, 'width', 'height'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12415
				radius = getSize(node, 'rx', 'ry');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12416
			return new Shape.Rectangle(new Rectangle(point, size), radius);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12417
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12418
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12419
		line: function(node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12420
			return new Path.Line(getPoint(node, 'x1', 'y1'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12421
					getPoint(node, 'x2', 'y2'));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12422
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12423
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12424
		text: function(node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12425
			var text = new PointText(getPoint(node, 'x', 'y')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12426
					.add(getPoint(node, 'dx', 'dy')));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12427
			text.setContent(node.textContent.trim() || '');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12428
			return text;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12429
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12430
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12431
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12432
	function applyTransform(item, value, name, node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12433
		var transforms = (node.getAttribute(name) || '').split(/\)\s*/g),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12434
			matrix = new Matrix();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12435
		for (var i = 0, l = transforms.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12436
			var transform = transforms[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12437
			if (!transform)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12438
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12439
			var parts = transform.split(/\(\s*/),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12440
				command = parts[0],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12441
				v = parts[1].split(/[\s,]+/g);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12442
			for (var j = 0, m = v.length; j < m; j++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12443
				v[j] = parseFloat(v[j]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12444
			switch (command) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12445
			case 'matrix':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12446
				matrix.concatenate(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12447
						new Matrix(v[0], v[1], v[2], v[3], v[4], v[5]));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12448
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12449
			case 'rotate':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12450
				matrix.rotate(v[0], v[1], v[2]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12451
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12452
			case 'translate':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12453
				matrix.translate(v[0], v[1]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12454
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12455
			case 'scale':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12456
				matrix.scale(v);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12457
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12458
			case 'skewX':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12459
				matrix.skew(v[0], 0);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12460
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12461
			case 'skewY':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12462
				matrix.skew(0, v[0]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12463
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12464
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12465
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12466
		item.transform(matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12467
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12468
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12469
	function applyOpacity(item, value, name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12470
		var color = item[name === 'fill-opacity' ? 'getFillColor'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12471
				: 'getStrokeColor']();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12472
		if (color)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12473
			color.setAlpha(parseFloat(value));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12474
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12475
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12476
	var attributes = Base.each(SVGStyles, function(entry) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12477
		this[entry.attribute] = function(item, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12478
			item[entry.set](convertValue(value, entry.type, entry.fromSVG));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12479
			if (entry.type === 'color' && item instanceof Shape) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12480
				var color = item[entry.get]();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12481
				if (color)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12482
					color.transform(new Matrix().translate(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12483
							item.getPosition(true).negate()));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12484
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12485
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12486
	}, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12487
		id: function(item, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12488
			definitions[value] = item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12489
			if (item.setName)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12490
				item.setName(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12491
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12492
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12493
		'clip-path': function(item, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12494
			var clip = getDefinition(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12495
			if (clip) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12496
				clip = clip.clone();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12497
				clip.setClipMask(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12498
				if (item instanceof Group) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12499
					item.insertChild(0, clip);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12500
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12501
					return new Group(clip, item);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12502
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12503
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12504
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12505
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12506
		gradientTransform: applyTransform,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12507
		transform: applyTransform,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12508
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12509
		'fill-opacity': applyOpacity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12510
		'stroke-opacity': applyOpacity,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12511
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12512
		visibility: function(item, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12513
			item.setVisible(value === 'visible');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12514
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12515
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12516
		display: function(item, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12517
			item.setVisible(value !== null);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12518
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12519
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12520
		'stop-color': function(item, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12521
			if (item.setColor)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12522
				item.setColor(value);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12523
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12524
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12525
		'stop-opacity': function(item, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12526
			if (item._color)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12527
				item._color.setAlpha(parseFloat(value));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12528
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12529
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12530
		offset: function(item, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12531
			var percentage = value.match(/(.*)%$/);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12532
			item.setRampPoint(percentage
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12533
					? percentage[1] / 100
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12534
					: parseFloat(value));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12535
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12536
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12537
		viewBox: function(item, value, name, node, styles) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12538
			var rect = new Rectangle(convertValue(value, 'array')),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12539
				size = getSize(node, 'width', 'height', true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12540
			if (item instanceof Group) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12541
				var scale = size ? rect.getSize().divide(size) : 1,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12542
					matrix = new Matrix().translate(rect.getPoint()).scale(scale);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12543
				item.transform(matrix.inverted());
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12544
			} else if (item instanceof Symbol) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12545
				if (size)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12546
					rect.setSize(size);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12547
				var clip = getAttribute(node, 'overflow', styles) != 'visible',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12548
					group = item._definition;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12549
				if (clip && !rect.contains(group.getBounds())) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12550
					clip = new Shape.Rectangle(rect).transform(group._matrix);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12551
					clip.setClipMask(true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12552
					group.addChild(clip);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12553
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12554
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12555
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12556
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12557
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12558
	function getAttribute(node, name, styles) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12559
		var attr = node.attributes[name],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12560
			value = attr && attr.value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12561
		if (!value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12562
			var style = Base.camelize(name);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12563
			value = node.style[style];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12564
			if (!value && styles.node[style] !== styles.parent[style])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12565
				value = styles.node[style];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12566
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12567
		return !value
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12568
				? undefined
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12569
				: value === 'none'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12570
					? null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12571
					: value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12572
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12573
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12574
	function applyAttributes(item, node, isRoot) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12575
		var styles = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12576
			node: DomElement.getStyles(node) || {},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12577
			parent: !isRoot && DomElement.getStyles(node.parentNode) || {}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12578
		};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12579
		Base.each(attributes, function(apply, name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12580
			var value = getAttribute(node, name, styles);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12581
			if (value !== undefined)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12582
				item = Base.pick(apply(item, value, name, node, styles), item);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12583
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12584
		return item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12585
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12586
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12587
	var definitions = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12588
	function getDefinition(value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12589
		var match = value && value.match(/\((?:#|)([^)']+)/);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12590
		return match && definitions[match[1]];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12591
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12592
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12593
	function importSVG(source, options, isRoot) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12594
		if (!source)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12595
			return null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12596
		if (!options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12597
			options = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12598
		} else if (typeof options === 'function') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12599
			options = { onLoad: options };
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12600
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12601
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12602
		var node = source,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12603
			scope = paper;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12604
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12605
		function onLoadCallback(svg) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12606
			paper = scope;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12607
			var item = importSVG(svg, options, isRoot),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12608
				onLoad = options.onLoad,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12609
				view = scope.project && scope.getView();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12610
			if (onLoad)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12611
				onLoad.call(this, item);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12612
			view.update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12613
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12614
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12615
		if (isRoot) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12616
			if (typeof source === 'string' && !/^.*</.test(source)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12617
				node = document.getElementById(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12618
				if (node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12619
					source = null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12620
				} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12621
					return Http.request('get', source, onLoadCallback);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12622
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12623
			} else if (typeof File !== 'undefined' && source instanceof File) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12624
				var reader = new FileReader();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12625
				reader.onload = function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12626
					onLoadCallback(reader.result);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12627
				};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12628
				return reader.readAsText(source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12629
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12630
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12631
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12632
		if (typeof source === 'string')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12633
			node = new DOMParser().parseFromString(source, 'image/svg+xml');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12634
		if (!node.nodeName)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12635
			throw new Error('Unsupported SVG source: ' + source);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12636
		var type = node.nodeName.toLowerCase(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12637
			importer = importers[type],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12638
			item,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12639
			data = node.getAttribute && node.getAttribute('data-paper-data'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12640
			settings = scope.settings,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12641
			applyMatrix = settings.applyMatrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12642
		settings.applyMatrix = false;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12643
		item = importer && importer(node, type, options, isRoot) || null;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12644
		settings.applyMatrix = applyMatrix;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12645
		if (item) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12646
			if (type !== '#document' && !(item instanceof Group))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12647
				item = applyAttributes(item, node, isRoot);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12648
			var onImport = options.onImport;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12649
			if (onImport)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12650
				item = onImport(node, item, options) || item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12651
			if (options.expandShapes && item instanceof Shape) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12652
				item.remove();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12653
				item = item.toPath();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12654
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12655
			if (data)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12656
				item._data = JSON.parse(data);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12657
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12658
		if (isRoot) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12659
			definitions = {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12660
			if (applyMatrix && item)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12661
				item.matrix.apply(true, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12662
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12663
		return item;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12664
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12665
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12666
	Item.inject({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12667
		importSVG: function(node, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12668
			return this.addChild(importSVG(node, options, true));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12669
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12670
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12671
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12672
	Project.inject({
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12673
		importSVG: function(node, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12674
			this.activate();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12675
			return importSVG(node, options, true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12676
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12677
	});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12678
};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12679
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12680
Base.exports.PaperScript = (function() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12681
	var exports, define,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12682
		scope = this;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12683
!function(e,r){return"object"==typeof exports&&"object"==typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):(r(e.acorn||(e.acorn={})),void 0)}(this,function(e){"use strict";function r(e){fr=e||{};for(var r in mr)Object.prototype.hasOwnProperty.call(fr,r)||(fr[r]=mr[r]);hr=fr.sourceFile||null}function t(e,r){var t=vr(dr,e);r+=" ("+t.line+":"+t.column+")";var n=new SyntaxError(r);throw n.pos=e,n.loc=t,n.raisedAt=br,n}function n(e){function r(e){if(1==e.length)return t+="return str === "+JSON.stringify(e[0])+";";t+="switch(str){";for(var r=0;r<e.length;++r)t+="case "+JSON.stringify(e[r])+":";t+="return true}return false;"}e=e.split(" ");var t="",n=[];e:for(var a=0;a<e.length;++a){for(var o=0;o<n.length;++o)if(n[o][0].length==e[a].length){n[o].push(e[a]);continue e}n.push([e[a]])}if(n.length>3){n.sort(function(e,r){return r.length-e.length}),t+="switch(str.length){";for(var a=0;a<n.length;++a){var i=n[a];t+="case "+i[0].length+":",r(i)}t+="}"}else r(e);return new Function("str",t)}function a(){this.line=Ar,this.column=br-Sr}function o(){Ar=1,br=Sr=0,Er=!0,u()}function i(e,r){gr=br,fr.locations&&(kr=new a),wr=e,u(),Cr=r,Er=e.beforeExpr}function s(){var e=fr.onComment&&fr.locations&&new a,r=br,n=dr.indexOf("*/",br+=2);if(-1===n&&t(br-2,"Unterminated comment"),br=n+2,fr.locations){Kt.lastIndex=r;for(var o;(o=Kt.exec(dr))&&o.index<br;)++Ar,Sr=o.index+o[0].length}fr.onComment&&fr.onComment(!0,dr.slice(r+2,n),r,br,e,fr.locations&&new a)}function c(){for(var e=br,r=fr.onComment&&fr.locations&&new a,t=dr.charCodeAt(br+=2);pr>br&&10!==t&&13!==t&&8232!==t&&8233!==t;)++br,t=dr.charCodeAt(br);fr.onComment&&fr.onComment(!1,dr.slice(e+2,br),e,br,r,fr.locations&&new a)}function u(){for(;pr>br;){var e=dr.charCodeAt(br);if(32===e)++br;else if(13===e){++br;var r=dr.charCodeAt(br);10===r&&++br,fr.locations&&(++Ar,Sr=br)}else if(10===e||8232===e||8233===e)++br,fr.locations&&(++Ar,Sr=br);else if(e>8&&14>e)++br;else if(47===e){var r=dr.charCodeAt(br+1);if(42===r)s();else{if(47!==r)break;c()}}else if(160===e)++br;else{if(!(e>=5760&&Jt.test(String.fromCharCode(e))))break;++br}}}function l(){var e=dr.charCodeAt(br+1);return e>=48&&57>=e?E(!0):(++br,i(xt))}function f(){var e=dr.charCodeAt(br+1);return Er?(++br,k()):61===e?x(Et,2):x(wt,1)}function d(){var e=dr.charCodeAt(br+1);return 61===e?x(Et,2):x(Dt,1)}function p(e){var r=dr.charCodeAt(br+1);return r===e?x(124===e?Lt:Ut,2):61===r?x(Et,2):x(124===e?Rt:Tt,1)}function h(){var e=dr.charCodeAt(br+1);return 61===e?x(Et,2):x(Vt,1)}function m(e){var r=dr.charCodeAt(br+1);return r===e?45==r&&62==dr.charCodeAt(br+2)&&Gt.test(dr.slice(Lr,br))?(br+=3,c(),u(),g()):x(St,2):61===r?x(Et,2):x(At,1)}function v(e){var r=dr.charCodeAt(br+1),t=1;return r===e?(t=62===e&&62===dr.charCodeAt(br+2)?3:2,61===dr.charCodeAt(br+t)?x(Et,t+1):x(jt,t)):33==r&&60==e&&45==dr.charCodeAt(br+2)&&45==dr.charCodeAt(br+3)?(br+=4,c(),u(),g()):(61===r&&(t=61===dr.charCodeAt(br+2)?3:2),x(Ot,t))}function b(e){var r=dr.charCodeAt(br+1);return 61===r?x(qt,61===dr.charCodeAt(br+2)?3:2):x(61===e?Ct:It,1)}function y(e){switch(e){case 46:return l();case 40:return++br,i(mt);case 41:return++br,i(vt);case 59:return++br,i(yt);case 44:return++br,i(bt);case 91:return++br,i(ft);case 93:return++br,i(dt);case 123:return++br,i(pt);case 125:return++br,i(ht);case 58:return++br,i(gt);case 63:return++br,i(kt);case 48:var r=dr.charCodeAt(br+1);if(120===r||88===r)return C();case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return E(!1);case 34:case 39:return A(e);case 47:return f(e);case 37:case 42:return d();case 124:case 38:return p(e);case 94:return h();case 43:case 45:return m(e);case 60:case 62:return v(e);case 61:case 33:return b(e);case 126:return x(It,1)}return!1}function g(e){if(e?br=yr+1:yr=br,fr.locations&&(xr=new a),e)return k();if(br>=pr)return i(Br);var r=dr.charCodeAt(br);if(Qt(r)||92===r)return L();var n=y(r);if(n===!1){var o=String.fromCharCode(r);if("\\"===o||$t.test(o))return L();t(br,"Unexpected character '"+o+"'")}return n}function x(e,r){var t=dr.slice(br,br+r);br+=r,i(e,t)}function k(){for(var e,r,n="",a=br;;){br>=pr&&t(a,"Unterminated regular expression");var o=dr.charAt(br);if(Gt.test(o)&&t(a,"Unterminated regular expression"),e)e=!1;else{if("["===o)r=!0;else if("]"===o&&r)r=!1;else if("/"===o&&!r)break;e="\\"===o}++br}var n=dr.slice(a,br);++br;var s=I();return s&&!/^[gmsiy]*$/.test(s)&&t(a,"Invalid regexp flag"),i(jr,new RegExp(n,s))}function w(e,r){for(var t=br,n=0,a=0,o=null==r?1/0:r;o>a;++a){var i,s=dr.charCodeAt(br);if(i=s>=97?s-97+10:s>=65?s-65+10:s>=48&&57>=s?s-48:1/0,i>=e)break;++br,n=n*e+i}return br===t||null!=r&&br-t!==r?null:n}function C(){br+=2;var e=w(16);return null==e&&t(yr+2,"Expected hexadecimal number"),Qt(dr.charCodeAt(br))&&t(br,"Identifier directly after number"),i(Or,e)}function E(e){var r=br,n=!1,a=48===dr.charCodeAt(br);e||null!==w(10)||t(r,"Invalid number"),46===dr.charCodeAt(br)&&(++br,w(10),n=!0);var o=dr.charCodeAt(br);(69===o||101===o)&&(o=dr.charCodeAt(++br),(43===o||45===o)&&++br,null===w(10)&&t(r,"Invalid number"),n=!0),Qt(dr.charCodeAt(br))&&t(br,"Identifier directly after number");var s,c=dr.slice(r,br);return n?s=parseFloat(c):a&&1!==c.length?/[89]/.test(c)||Tr?t(r,"Invalid number"):s=parseInt(c,8):s=parseInt(c,10),i(Or,s)}function A(e){br++;for(var r="";;){br>=pr&&t(yr,"Unterminated string constant");var n=dr.charCodeAt(br);if(n===e)return++br,i(Dr,r);if(92===n){n=dr.charCodeAt(++br);var a=/^[0-7]+/.exec(dr.slice(br,br+3));for(a&&(a=a[0]);a&&parseInt(a,8)>255;)a=a.slice(0,a.length-1);if("0"===a&&(a=null),++br,a)Tr&&t(br-2,"Octal literal in strict mode"),r+=String.fromCharCode(parseInt(a,8)),br+=a.length-1;else switch(n){case 110:r+="\n";break;case 114:r+="\r";break;case 120:r+=String.fromCharCode(S(2));break;case 117:r+=String.fromCharCode(S(4));break;case 85:r+=String.fromCharCode(S(8));break;case 116:r+="	";break;case 98:r+="\b";break;case 118:r+="";break;case 102:r+="\f";break;case 48:r+="\0";break;case 13:10===dr.charCodeAt(br)&&++br;case 10:fr.locations&&(Sr=br,++Ar);break;default:r+=String.fromCharCode(n)}}else(13===n||10===n||8232===n||8233===n)&&t(yr,"Unterminated string constant"),r+=String.fromCharCode(n),++br}}function S(e){var r=w(16,e);return null===r&&t(yr,"Bad character escape sequence"),r}function I(){Bt=!1;for(var e,r=!0,n=br;;){var a=dr.charCodeAt(br);if(Yt(a))Bt&&(e+=dr.charAt(br)),++br;else{if(92!==a)break;Bt||(e=dr.slice(n,br)),Bt=!0,117!=dr.charCodeAt(++br)&&t(br,"Expecting Unicode escape sequence \\uXXXX"),++br;var o=S(4),i=String.fromCharCode(o);i||t(br-1,"Invalid Unicode escape"),(r?Qt(o):Yt(o))||t(br-4,"Invalid Unicode escape"),e+=i}r=!1}return Bt?e:dr.slice(n,br)}function L(){var e=I(),r=Fr;return Bt||(Wt(e)?r=lt[e]:(fr.forbidReserved&&(3===fr.ecmaVersion?Mt:zt)(e)||Tr&&Xt(e))&&t(yr,"The keyword '"+e+"' is reserved")),i(r,e)}function U(){Ir=yr,Lr=gr,Ur=kr,g()}function R(e){if(Tr=e,br=Lr,fr.locations)for(;Sr>br;)Sr=dr.lastIndexOf("\n",Sr-2)+1,--Ar;u(),g()}function V(){this.type=null,this.start=yr,this.end=null}function T(){this.start=xr,this.end=null,null!==hr&&(this.source=hr)}function q(){var e=new V;return fr.locations&&(e.loc=new T),fr.ranges&&(e.range=[yr,0]),e}function O(e){var r=new V;return r.start=e.start,fr.locations&&(r.loc=new T,r.loc.start=e.loc.start),fr.ranges&&(r.range=[e.range[0],0]),r}function j(e,r){return e.type=r,e.end=Lr,fr.locations&&(e.loc.end=Ur),fr.ranges&&(e.range[1]=Lr),e}function D(e){return fr.ecmaVersion>=5&&"ExpressionStatement"===e.type&&"Literal"===e.expression.type&&"use strict"===e.expression.value}function F(e){return wr===e?(U(),!0):void 0}function B(){return!fr.strictSemicolons&&(wr===Br||wr===ht||Gt.test(dr.slice(Lr,yr)))}function M(){F(yt)||B()||X()}function z(e){wr===e?U():X()}function X(){t(yr,"Unexpected token")}function N(e){"Identifier"!==e.type&&"MemberExpression"!==e.type&&t(e.start,"Assigning to rvalue"),Tr&&"Identifier"===e.type&&Nt(e.name)&&t(e.start,"Assigning to "+e.name+" in strict mode")}function W(e){Ir=Lr=br,fr.locations&&(Ur=new a),Rr=Tr=null,Vr=[],g();var r=e||q(),t=!0;for(e||(r.body=[]);wr!==Br;){var n=J();r.body.push(n),t&&D(n)&&R(!0),t=!1}return j(r,"Program")}function J(){(wr===wt||wr===Et&&"/="==Cr)&&g(!0);var e=wr,r=q();switch(e){case Mr:case Nr:U();var n=e===Mr;F(yt)||B()?r.label=null:wr!==Fr?X():(r.label=lr(),M());for(var a=0;a<Vr.length;++a){var o=Vr[a];if(null==r.label||o.name===r.label.name){if(null!=o.kind&&(n||"loop"===o.kind))break;if(r.label&&n)break}}return a===Vr.length&&t(r.start,"Unsyntactic "+e.keyword),j(r,n?"BreakStatement":"ContinueStatement");case Wr:return U(),M(),j(r,"DebuggerStatement");case Pr:return U(),Vr.push(Zt),r.body=J(),Vr.pop(),z(tt),r.test=P(),M(),j(r,"DoWhileStatement");case _r:if(U(),Vr.push(Zt),z(mt),wr===yt)return $(r,null);if(wr===rt){var i=q();return U(),G(i,!0),j(i,"VariableDeclaration"),1===i.declarations.length&&F(ut)?_(r,i):$(r,i)}var i=K(!1,!0);return F(ut)?(N(i),_(r,i)):$(r,i);case Gr:return U(),cr(r,!0);case Kr:return U(),r.test=P(),r.consequent=J(),r.alternate=F(Hr)?J():null,j(r,"IfStatement");case Qr:return Rr||t(yr,"'return' outside of function"),U(),F(yt)||B()?r.argument=null:(r.argument=K(),M()),j(r,"ReturnStatement");case Yr:U(),r.discriminant=P(),r.cases=[],z(pt),Vr.push(en);for(var s,c;wr!=ht;)if(wr===zr||wr===Jr){var u=wr===zr;s&&j(s,"SwitchCase"),r.cases.push(s=q()),s.consequent=[],U(),u?s.test=K():(c&&t(Ir,"Multiple default clauses"),c=!0,s.test=null),z(gt)}else s||X(),s.consequent.push(J());return s&&j(s,"SwitchCase"),U(),Vr.pop(),j(r,"SwitchStatement");case Zr:return U(),Gt.test(dr.slice(Lr,yr))&&t(Lr,"Illegal newline after throw"),r.argument=K(),M(),j(r,"ThrowStatement");case et:if(U(),r.block=H(),r.handler=null,wr===Xr){var l=q();U(),z(mt),l.param=lr(),Tr&&Nt(l.param.name)&&t(l.param.start,"Binding "+l.param.name+" in strict mode"),z(vt),l.guard=null,l.body=H(),r.handler=j(l,"CatchClause")}return r.guardedHandlers=qr,r.finalizer=F($r)?H():null,r.handler||r.finalizer||t(r.start,"Missing catch or finally clause"),j(r,"TryStatement");case rt:return U(),G(r),M(),j(r,"VariableDeclaration");case tt:return U(),r.test=P(),Vr.push(Zt),r.body=J(),Vr.pop(),j(r,"WhileStatement");case nt:return Tr&&t(yr,"'with' in strict mode"),U(),r.object=P(),r.body=J(),j(r,"WithStatement");case pt:return H();case yt:return U(),j(r,"EmptyStatement");default:var f=Cr,d=K();if(e===Fr&&"Identifier"===d.type&&F(gt)){for(var a=0;a<Vr.length;++a)Vr[a].name===f&&t(d.start,"Label '"+f+"' is already declared");var p=wr.isLoop?"loop":wr===Yr?"switch":null;return Vr.push({name:f,kind:p}),r.body=J(),Vr.pop(),r.label=d,j(r,"LabeledStatement")}return r.expression=d,M(),j(r,"ExpressionStatement")}}function P(){z(mt);var e=K();return z(vt),e}function H(e){var r,t=q(),n=!0,a=!1;for(t.body=[],z(pt);!F(ht);){var o=J();t.body.push(o),n&&e&&D(o)&&(r=a,R(a=!0)),n=!1}return a&&!r&&R(!1),j(t,"BlockStatement")}function $(e,r){return e.init=r,z(yt),e.test=wr===yt?null:K(),z(yt),e.update=wr===vt?null:K(),z(vt),e.body=J(),Vr.pop(),j(e,"ForStatement")}function _(e,r){return e.left=r,e.right=K(),z(vt),e.body=J(),Vr.pop(),j(e,"ForInStatement")}function G(e,r){for(e.declarations=[],e.kind="var";;){var n=q();if(n.id=lr(),Tr&&Nt(n.id.name)&&t(n.id.start,"Binding "+n.id.name+" in strict mode"),n.init=F(Ct)?K(!0,r):null,e.declarations.push(j(n,"VariableDeclarator")),!F(bt))break}return e}function K(e,r){var t=Q(r);if(!e&&wr===bt){var n=O(t);for(n.expressions=[t];F(bt);)n.expressions.push(Q(r));return j(n,"SequenceExpression")}return t}function Q(e){var r=Y(e);if(wr.isAssign){var t=O(r);return t.operator=Cr,t.left=r,U(),t.right=Q(e),N(r),j(t,"AssignmentExpression")}return r}function Y(e){var r=Z(e);if(F(kt)){var t=O(r);return t.test=r,t.consequent=K(!0),z(gt),t.alternate=K(!0,e),j(t,"ConditionalExpression")}return r}function Z(e){return er(rr(),-1,e)}function er(e,r,t){var n=wr.binop;if(null!=n&&(!t||wr!==ut)&&n>r){var a=O(e);a.left=e,a.operator=Cr,U(),a.right=er(rr(),n,t);var o=j(a,/&&|\|\|/.test(a.operator)?"LogicalExpression":"BinaryExpression");return er(o,r,t)}return e}function rr(){if(wr.prefix){var e=q(),r=wr.isUpdate;return e.operator=Cr,e.prefix=!0,Er=!0,U(),e.argument=rr(),r?N(e.argument):Tr&&"delete"===e.operator&&"Identifier"===e.argument.type&&t(e.start,"Deleting local variable in strict mode"),j(e,r?"UpdateExpression":"UnaryExpression")}for(var n=tr();wr.postfix&&!B();){var e=O(n);e.operator=Cr,e.prefix=!1,e.argument=n,N(n),U(),n=j(e,"UpdateExpression")}return n}function tr(){return nr(ar())}function nr(e,r){if(F(xt)){var t=O(e);return t.object=e,t.property=lr(!0),t.computed=!1,nr(j(t,"MemberExpression"),r)}if(F(ft)){var t=O(e);return t.object=e,t.property=K(),t.computed=!0,z(dt),nr(j(t,"MemberExpression"),r)}if(!r&&F(mt)){var t=O(e);return t.callee=e,t.arguments=ur(vt,!1),nr(j(t,"CallExpression"),r)}return e}function ar(){switch(wr){case ot:var e=q();return U(),j(e,"ThisExpression");case Fr:return lr();case Or:case Dr:case jr:var e=q();return e.value=Cr,e.raw=dr.slice(yr,gr),U(),j(e,"Literal");case it:case st:case ct:var e=q();return e.value=wr.atomValue,e.raw=wr.keyword,U(),j(e,"Literal");case mt:var r=xr,t=yr;U();var n=K();return n.start=t,n.end=gr,fr.locations&&(n.loc.start=r,n.loc.end=kr),fr.ranges&&(n.range=[t,gr]),z(vt),n;case ft:var e=q();return U(),e.elements=ur(dt,!0,!0),j(e,"ArrayExpression");case pt:return ir();case Gr:var e=q();return U(),cr(e,!1);case at:return or();default:X()}}function or(){var e=q();return U(),e.callee=nr(ar(),!0),e.arguments=F(mt)?ur(vt,!1):qr,j(e,"NewExpression")}function ir(){var e=q(),r=!0,n=!1;for(e.properties=[],U();!F(ht);){if(r)r=!1;else if(z(bt),fr.allowTrailingCommas&&F(ht))break;var a,o={key:sr()},i=!1;if(F(gt)?(o.value=K(!0),a=o.kind="init"):fr.ecmaVersion>=5&&"Identifier"===o.key.type&&("get"===o.key.name||"set"===o.key.name)?(i=n=!0,a=o.kind=o.key.name,o.key=sr(),wr!==mt&&X(),o.value=cr(q(),!1)):X(),"Identifier"===o.key.type&&(Tr||n))for(var s=0;s<e.properties.length;++s){var c=e.properties[s];if(c.key.name===o.key.name){var u=a==c.kind||i&&"init"===c.kind||"init"===a&&("get"===c.kind||"set"===c.kind);u&&!Tr&&"init"===a&&"init"===c.kind&&(u=!1),u&&t(o.key.start,"Redefinition of property")}}e.properties.push(o)}return j(e,"ObjectExpression")}function sr(){return wr===Or||wr===Dr?ar():lr(!0)}function cr(e,r){wr===Fr?e.id=lr():r?X():e.id=null,e.params=[];var n=!0;for(z(mt);!F(vt);)n?n=!1:z(bt),e.params.push(lr());var a=Rr,o=Vr;if(Rr=!0,Vr=[],e.body=H(!0),Rr=a,Vr=o,Tr||e.body.body.length&&D(e.body.body[0]))for(var i=e.id?-1:0;i<e.params.length;++i){var s=0>i?e.id:e.params[i];if((Xt(s.name)||Nt(s.name))&&t(s.start,"Defining '"+s.name+"' in strict mode"),i>=0)for(var c=0;i>c;++c)s.name===e.params[c].name&&t(s.start,"Argument name clash in strict mode")}return j(e,r?"FunctionDeclaration":"FunctionExpression")}function ur(e,r,t){for(var n=[],a=!0;!F(e);){if(a)a=!1;else if(z(bt),r&&fr.allowTrailingCommas&&F(e))break;t&&wr===bt?n.push(null):n.push(K(!0))}return n}function lr(e){var r=q();return r.name=wr===Fr?Cr:e&&!fr.forbidReserved&&wr.keyword||X(),Er=!1,U(),j(r,"Identifier")}e.version="0.4.0";var fr,dr,pr,hr;e.parse=function(e,t){return dr=String(e),pr=dr.length,r(t),o(),W(fr.program)};var mr=e.defaultOptions={ecmaVersion:5,strictSemicolons:!1,allowTrailingCommas:!0,forbidReserved:!1,locations:!1,onComment:null,ranges:!1,program:null,sourceFile:null},vr=e.getLineInfo=function(e,r){for(var t=1,n=0;;){Kt.lastIndex=n;var a=Kt.exec(e);if(!(a&&a.index<r))break;++t,n=a.index+a[0].length}return{line:t,column:r-n}};e.tokenize=function(e,t){function n(e){return g(e),a.start=yr,a.end=gr,a.startLoc=xr,a.endLoc=kr,a.type=wr,a.value=Cr,a}dr=String(e),pr=dr.length,r(t),o();var a={};return n.jumpTo=function(e,r){if(br=e,fr.locations){Ar=1,Sr=Kt.lastIndex=0;for(var t;(t=Kt.exec(dr))&&t.index<e;)++Ar,Sr=t.index+t[0].length}Er=r,u()},n};var br,yr,gr,xr,kr,wr,Cr,Er,Ar,Sr,Ir,Lr,Ur,Rr,Vr,Tr,qr=[],Or={type:"num"},jr={type:"regexp"},Dr={type:"string"},Fr={type:"name"},Br={type:"eof"},Mr={keyword:"break"},zr={keyword:"case",beforeExpr:!0},Xr={keyword:"catch"},Nr={keyword:"continue"},Wr={keyword:"debugger"},Jr={keyword:"default"},Pr={keyword:"do",isLoop:!0},Hr={keyword:"else",beforeExpr:!0},$r={keyword:"finally"},_r={keyword:"for",isLoop:!0},Gr={keyword:"function"},Kr={keyword:"if"},Qr={keyword:"return",beforeExpr:!0},Yr={keyword:"switch"},Zr={keyword:"throw",beforeExpr:!0},et={keyword:"try"},rt={keyword:"var"},tt={keyword:"while",isLoop:!0},nt={keyword:"with"},at={keyword:"new",beforeExpr:!0},ot={keyword:"this"},it={keyword:"null",atomValue:null},st={keyword:"true",atomValue:!0},ct={keyword:"false",atomValue:!1},ut={keyword:"in",binop:7,beforeExpr:!0},lt={"break":Mr,"case":zr,"catch":Xr,"continue":Nr,"debugger":Wr,"default":Jr,"do":Pr,"else":Hr,"finally":$r,"for":_r,"function":Gr,"if":Kr,"return":Qr,"switch":Yr,"throw":Zr,"try":et,"var":rt,"while":tt,"with":nt,"null":it,"true":st,"false":ct,"new":at,"in":ut,"instanceof":{keyword:"instanceof",binop:7,beforeExpr:!0},"this":ot,"typeof":{keyword:"typeof",prefix:!0,beforeExpr:!0},"void":{keyword:"void",prefix:!0,beforeExpr:!0},"delete":{keyword:"delete",prefix:!0,beforeExpr:!0}},ft={type:"[",beforeExpr:!0},dt={type:"]"},pt={type:"{",beforeExpr:!0},ht={type:"}"},mt={type:"(",beforeExpr:!0},vt={type:")"},bt={type:",",beforeExpr:!0},yt={type:";",beforeExpr:!0},gt={type:":",beforeExpr:!0},xt={type:"."},kt={type:"?",beforeExpr:!0},wt={binop:10,beforeExpr:!0},Ct={isAssign:!0,beforeExpr:!0},Et={isAssign:!0,beforeExpr:!0},At={binop:9,prefix:!0,beforeExpr:!0},St={postfix:!0,prefix:!0,isUpdate:!0},It={prefix:!0,beforeExpr:!0},Lt={binop:1,beforeExpr:!0},Ut={binop:2,beforeExpr:!0},Rt={binop:3,beforeExpr:!0},Vt={binop:4,beforeExpr:!0},Tt={binop:5,beforeExpr:!0},qt={binop:6,beforeExpr:!0},Ot={binop:7,beforeExpr:!0},jt={binop:8,beforeExpr:!0},Dt={binop:10,beforeExpr:!0};e.tokTypes={bracketL:ft,bracketR:dt,braceL:pt,braceR:ht,parenL:mt,parenR:vt,comma:bt,semi:yt,colon:gt,dot:xt,question:kt,slash:wt,eq:Ct,name:Fr,eof:Br,num:Or,regexp:jr,string:Dr};for(var Ft in lt)e.tokTypes["_"+Ft]=lt[Ft];var Bt,Mt=n("abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile"),zt=n("class enum extends super const export import"),Xt=n("implements interface let package private protected public static yield"),Nt=n("eval arguments"),Wt=n("break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this"),Jt=/[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/,Pt="\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",Ht="\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u0620-\u0649\u0672-\u06d3\u06e7-\u06e8\u06fb-\u06fc\u0730-\u074a\u0800-\u0814\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0840-\u0857\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962-\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09d7\u09df-\u09e0\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5f-\u0b60\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2-\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d46-\u0d48\u0d57\u0d62-\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e34-\u0e3a\u0e40-\u0e45\u0e50-\u0e59\u0eb4-\u0eb9\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f41-\u0f47\u0f71-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1029\u1040-\u1049\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u170e-\u1710\u1720-\u1730\u1740-\u1750\u1772\u1773\u1780-\u17b2\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1920-\u192b\u1930-\u193b\u1951-\u196d\u19b0-\u19c0\u19c8-\u19c9\u19d0-\u19d9\u1a00-\u1a15\u1a20-\u1a53\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b46-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1bb0-\u1bb9\u1be6-\u1bf3\u1c00-\u1c22\u1c40-\u1c49\u1c5b-\u1c7d\u1cd0-\u1cd2\u1d00-\u1dbe\u1e01-\u1f15\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2d81-\u2d96\u2de0-\u2dff\u3021-\u3028\u3099\u309a\ua640-\ua66d\ua674-\ua67d\ua69f\ua6f0-\ua6f1\ua7f8-\ua800\ua806\ua80b\ua823-\ua827\ua880-\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8f3-\ua8f7\ua900-\ua909\ua926-\ua92d\ua930-\ua945\ua980-\ua983\ua9b3-\ua9c0\uaa00-\uaa27\uaa40-\uaa41\uaa4c-\uaa4d\uaa50-\uaa59\uaa7b\uaae0-\uaae9\uaaf2-\uaaf3\uabc0-\uabe1\uabec\uabed\uabf0-\uabf9\ufb20-\ufb28\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f",$t=new RegExp("["+Pt+"]"),_t=new RegExp("["+Pt+Ht+"]"),Gt=/[\n\r\u2028\u2029]/,Kt=/\r\n|[\n\r\u2028\u2029]/g,Qt=e.isIdentifierStart=function(e){return 65>e?36===e:91>e?!0:97>e?95===e:123>e?!0:e>=170&&$t.test(String.fromCharCode(e))},Yt=e.isIdentifierChar=function(e){return 48>e?36===e:58>e?!0:65>e?!1:91>e?!0:97>e?95===e:123>e?!0:e>=170&&_t.test(String.fromCharCode(e))},Zt={kind:"loop"},en={kind:"switch"}});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12684
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12685
	var binaryOperators = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12686
		'+': '__add',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12687
		'-': '__subtract',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12688
		'*': '__multiply',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12689
		'/': '__divide',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12690
		'%': '__modulo',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12691
		'==': 'equals',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12692
		'!=': 'equals'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12693
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12694
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12695
	var unaryOperators = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12696
		'-': '__negate',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12697
		'+': null
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12698
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12699
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12700
	var fields = Base.each(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12701
		['add', 'subtract', 'multiply', 'divide', 'modulo', 'negate'],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12702
		function(name) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12703
			this['__' + name] = '#' + name;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12704
		},
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12705
		{}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12706
	);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12707
	Point.inject(fields);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12708
	Size.inject(fields);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12709
	Color.inject(fields);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12710
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12711
	function __$__(left, operator, right) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12712
		var handler = binaryOperators[operator];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12713
		if (left && left[handler]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12714
			var res = left[handler](right);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12715
			return operator === '!=' ? !res : res;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12716
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12717
		switch (operator) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12718
		case '+': return left + right;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12719
		case '-': return left - right;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12720
		case '*': return left * right;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12721
		case '/': return left / right;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12722
		case '%': return left % right;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12723
		case '==': return left == right;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12724
		case '!=': return left != right;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12725
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12726
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12727
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12728
	function $__(operator, value) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12729
		var handler = unaryOperators[operator];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12730
		if (handler && value && value[handler])
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12731
			return value[handler]();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12732
		switch (operator) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12733
		case '+': return +value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12734
		case '-': return -value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12735
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12736
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12737
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12738
	function parse(code, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12739
		return scope.acorn.parse(code, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12740
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12741
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12742
	function compile(code, url, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12743
		if (!code)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12744
			return '';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12745
		options = options || {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12746
		url = url || '';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12747
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12748
		var insertions = [];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12749
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12750
		function getOffset(offset) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12751
			for (var i = 0, l = insertions.length; i < l; i++) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12752
				var insertion = insertions[i];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12753
				if (insertion[0] >= offset)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12754
					break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12755
				offset += insertion[1];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12756
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12757
			return offset;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12758
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12759
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12760
		function getCode(node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12761
			return code.substring(getOffset(node.range[0]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12762
					getOffset(node.range[1]));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12763
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12764
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12765
		function getBetween(left, right) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12766
			return code.substring(getOffset(left.range[1]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12767
					getOffset(right.range[0]));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12768
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12769
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12770
		function replaceCode(node, str) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12771
			var start = getOffset(node.range[0]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12772
				end = getOffset(node.range[1]),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12773
				insert = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12774
			for (var i = insertions.length - 1; i >= 0; i--) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12775
				if (start > insertions[i][0]) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12776
					insert = i + 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12777
					break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12778
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12779
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12780
			insertions.splice(insert, 0, [start, str.length - end + start]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12781
			code = code.substring(0, start) + str + code.substring(end);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12782
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12783
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12784
		function walkAST(node, parent) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12785
			if (!node)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12786
				return;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12787
			for (var key in node) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12788
				if (key === 'range' || key === 'loc')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12789
					continue;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12790
				var value = node[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12791
				if (Array.isArray(value)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12792
					for (var i = 0, l = value.length; i < l; i++)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12793
						walkAST(value[i], node);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12794
				} else if (value && typeof value === 'object') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12795
					walkAST(value, node);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12796
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12797
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12798
			switch (node.type) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12799
			case 'UnaryExpression':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12800
				if (node.operator in unaryOperators
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12801
						&& node.argument.type !== 'Literal') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12802
					var arg = getCode(node.argument);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12803
					replaceCode(node, '$__("' + node.operator + '", '
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12804
							+ arg + ')');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12805
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12806
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12807
			case 'BinaryExpression':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12808
				if (node.operator in binaryOperators
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12809
						&& node.left.type !== 'Literal') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12810
					var left = getCode(node.left),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12811
						right = getCode(node.right),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12812
						between = getBetween(node.left, node.right),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12813
						operator = node.operator;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12814
					replaceCode(node, '__$__(' + left + ','
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12815
							+ between.replace(new RegExp('\\' + operator),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12816
								'"' + operator + '"')
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12817
							+ ', ' + right + ')');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12818
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12819
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12820
			case 'UpdateExpression':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12821
			case 'AssignmentExpression':
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12822
				var parentType = parent && parent.type;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12823
				if (!(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12824
						parentType === 'ForStatement'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12825
						|| parentType === 'BinaryExpression'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12826
							&& /^[=!<>]/.test(parent.operator)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12827
						|| parentType === 'MemberExpression' && parent.computed
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12828
				)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12829
					if (node.type === 'UpdateExpression') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12830
						var arg = getCode(node.argument);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12831
						var str = arg + ' = __$__(' + arg
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12832
								+ ', "' + node.operator[0] + '", 1)';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12833
						if (!node.prefix
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12834
								&& (parentType === 'AssignmentExpression'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12835
									|| parentType === 'VariableDeclarator'))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12836
							str = arg + '; ' + str;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12837
						replaceCode(node, str);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12838
					} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12839
						if (/^.=$/.test(node.operator)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12840
								&& node.left.type !== 'Literal') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12841
							var left = getCode(node.left),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12842
								right = getCode(node.right);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12843
							replaceCode(node, left + ' = __$__(' + left + ', "'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12844
									+ node.operator[0] + '", ' + right + ')');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12845
						}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12846
					}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12847
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12848
				break;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12849
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12850
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12851
		var sourceMap = null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12852
			browser = paper.browser,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12853
			version = browser.versionNumber,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12854
			lineBreaks = /\r\n|\n|\r/mg;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12855
		if (browser.chrome && version >= 30
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12856
				|| browser.webkit && version >= 537.76
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12857
				|| browser.firefox && version >= 23) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12858
			var offset = 0;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12859
			if (window.location.href.indexOf(url) === 0) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12860
				var html = document.getElementsByTagName('html')[0].innerHTML;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12861
				offset = html.substr(0, html.indexOf(code) + 1).match(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12862
						lineBreaks).length + 1;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12863
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12864
			var mappings = ['AAAA'];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12865
			mappings.length = (code.match(lineBreaks) || []).length + 1 + offset;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12866
			sourceMap = {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12867
				version: 3,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12868
				file: url,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12869
				names:[],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12870
				mappings: mappings.join(';AACA'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12871
				sourceRoot: '',
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12872
				sources: [url]
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12873
			};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12874
			var source = options.source || !url && code;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12875
			if (source)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12876
				sourceMap.sourcesContent = [source];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12877
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12878
		walkAST(parse(code, { ranges: true }));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12879
		if (sourceMap) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12880
			code = new Array(offset + 1).join('\n') + code
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12881
					+ "\n//# sourceMappingURL=data:application/json;base64,"
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12882
					+ (btoa(unescape(encodeURIComponent(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12883
						JSON.stringify(sourceMap)))))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12884
					+ "\n//# sourceURL=" + (url || 'paperscript');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12885
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12886
		return code;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12887
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12888
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12889
	function execute(code, scope, url, options) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12890
		paper = scope;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12891
		var view = scope.getView(),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12892
			tool = /\s+on(?:Key|Mouse)(?:Up|Down|Move|Drag)\b/.test(code)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12893
					? new Tool()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12894
					: null,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12895
			toolHandlers = tool ? tool._events : [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12896
			handlers = ['onFrame', 'onResize'].concat(toolHandlers),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12897
			params = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12898
			args = [],
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12899
			func;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12900
		code = compile(code, url, options);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12901
		function expose(scope, hidden) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12902
			for (var key in scope) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12903
				if ((hidden || !/^_/.test(key)) && new RegExp('([\\b\\s\\W]|^)'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12904
						+ key.replace(/\$/g, '\\$') + '\\b').test(code)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12905
					params.push(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12906
					args.push(scope[key]);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12907
				}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12908
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12909
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12910
		expose({ __$__: __$__, $__: $__, paper: scope, view: view, tool: tool },
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12911
				true);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12912
		expose(scope);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12913
		handlers = Base.each(handlers, function(key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12914
			if (new RegExp('\\s+' + key + '\\b').test(code)) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12915
				params.push(key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12916
				this.push(key + ': ' + key);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12917
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12918
		}, []).join(', ');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12919
		if (handlers)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12920
			code += '\nreturn { ' + handlers + ' };';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12921
		var browser = paper.browser;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12922
		if (browser.chrome || browser.firefox) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12923
			var script = document.createElement('script'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12924
				head = document.head || document.getElementsByTagName('head')[0];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12925
			if (browser.firefox)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12926
				code = '\n' + code;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12927
			script.appendChild(document.createTextNode(
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12928
				'paper._execute = function(' + params + ') {' + code + '\n}'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12929
			));
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12930
			head.appendChild(script);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12931
			func = paper._execute;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12932
			delete paper._execute;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12933
			head.removeChild(script);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12934
		} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12935
			func = Function(params, code);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12936
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12937
		var res = func.apply(scope, args) || {};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12938
		Base.each(toolHandlers, function(key) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12939
			var value = res[key];
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12940
			if (value)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12941
				tool[key] = value;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12942
		});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12943
		if (view) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12944
			if (res.onResize)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12945
				view.setOnResize(res.onResize);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12946
			view.emit('resize', {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12947
				size: view.size,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12948
				delta: new Point()
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12949
			});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12950
			if (res.onFrame)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12951
				view.setOnFrame(res.onFrame);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12952
			view.update();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12953
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12954
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12955
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12956
	function loadScript(script) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12957
		if (/^text\/(?:x-|)paperscript$/.test(script.type)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12958
				&& PaperScope.getAttribute(script, 'ignore') !== 'true') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12959
			var canvasId = PaperScope.getAttribute(script, 'canvas'),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12960
				canvas = document.getElementById(canvasId),
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12961
				src = script.src,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12962
				scopeAttribute = 'data-paper-scope';
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12963
			if (!canvas)
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12964
				throw new Error('Unable to find canvas with id "'
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12965
						+ canvasId + '"');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12966
			var scope = PaperScope.get(canvas.getAttribute(scopeAttribute))
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12967
						|| new PaperScope().setup(canvas);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12968
			canvas.setAttribute(scopeAttribute, scope._id);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12969
			if (src) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12970
				Http.request('get', src, function(code) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12971
					execute(code, scope, src);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12972
				});
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12973
			} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12974
				execute(script.innerHTML, scope, script.baseURI);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12975
			}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12976
			script.setAttribute('data-paper-ignore', 'true');
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12977
			return scope;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12978
		}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12979
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12980
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12981
	function loadAll() {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12982
		Base.each(document.getElementsByTagName('script'), loadScript);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12983
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12984
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12985
	function load(script) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12986
		return script ? loadScript(script) : loadAll();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12987
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12988
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12989
	if (document.readyState === 'complete') {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12990
		setTimeout(loadAll);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12991
	} else {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12992
		DomEvent.add(window, { load: loadAll });
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12993
	}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12994
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12995
	return {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12996
		compile: compile,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12997
		execute: execute,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12998
		load: load,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 12999
		parse: parse
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13000
	};
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13001
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13002
}).call(this);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13003
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13004
paper = new (PaperScope.inject(Base.exports, {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13005
	enumerable: true,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13006
	Base: Base,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13007
	Numerical: Numerical,
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13008
	Key: Key
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13009
}))();
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13010
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13011
if (typeof define === 'function' && define.amd) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13012
	define('paper', paper);
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13013
} else if (typeof module === 'object' && module) {
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13014
	module.exports = paper;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13015
}
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13016
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13017
return paper;
adb907bba956 add server php example
ymh <ymh.work@gmail.com>
parents:
diff changeset
 13018
};