scieee Science in your language
[sp] (orig)

Gráfico interactivo de las relaciones derivativas entre palabras del español

Abstract

La aplicación Gráfico interactivo de las relaciones derivativas entre palabras del español se centra en realizar un tratamiento a la información recabada en la tesis Sistema computacional de la gestión morfológica del español, de toda la información que contiene esta tesis este proyecto hace uso recogiendo cualquier palabra introducida por el usuario, buscando su forma canónica y devolviendo en forma gráfica la familia de palabras relacionada con esta, mediante un grafo. Esta aplicación web tiene como objetivo hacer amena la legibilidad y consulta de la información mencionada. Para lograr este objetivo se ha desarrollado una interfaz muy sencilla para el usuario, en la que éste solo tiene que introducir una palabra y relacionarla mediante un click. Una vez realizada la búsqueda, la aplicación permite al usuario interactuar con el grafo, pudiendo moverlo por la pantalla a su antojo, también tiene la función de mostrar los hijos de un nodo hoja al pasar el puntero por encima de éste y al hacer doble click sobre un nodo hoja, sea hijo o nieto de la raíz, devolviendo un nuevo grafo con el nodo seleccionado como raíz del mismo y mostrando sus hijos y nietos si los tuviera.

Read accessible full text

Gráfico interactivo de las relaciones derivativas entre palabras del español

Author: Segura Quintana, Enrique
Year: 2013
Source: https://accedacris.ulpgc.es/jspui/bitstream/10553/11121/2/0693019_00000_0000.pdf
G á ico in e ac i o de las
elaciones de i a i as
en e palab as del español
T abajo de in de g ado
28/11/2013
G ado en ingenie ía in o má ica
En ique Segu a Quin ana
Tu o : F ancisco Ca e as Riuda e s
2
3
T abajo in de g ado en Ingenie ía In o má ica
(especialización en Tecnología de la In o mación)
de la uni e sidad de Las Palmas de G an Cana ia,
p esen ado po el alumno:
En ique Segu a Quin ana
Tí ulo del abajo:
G á ico in e ac i o de las elaciones de i a i as
en e palab as del español
Tu o :
F ancisco Ca e as Riuda e s
4
5
“A odos los que me han apoyado y ayudado en es a e apa.
G acias.”

6
7
Ag adecimien os
A odas las pe sonas que me han apoyado, animado y aguan ado. Quie o ag adece les
la ayuda y consejos que me han dado mien as ealizaba es e p oyec o.
La p ime a pe sona que debo menciona es mi u o F ancisco Ca e as Riuda e s,
quién siemp e ha es ado pa a esol e me dudas, aconseja me y ayuda me en odo lo
necesa io. G acias a él y a odos los p o eso es que me han o mado, pa a consegui es a
me a.
A mis pad es y es o de amilia, que me han ayudado en odo lo que han podido y me
han alen ado a supe a odos los e os encon ado.
Po úl imo quisie a ag adece a mis compañe os y amigos el apoyo y los consejos
p ác icos.
Muchas g acias a odos.
8
9
Resumen
En el p ime apa ado, como explicación del es ado ac ual y los obje i os que
se pe siguen, se desc iben los emas que se han enido en cuen a a la ho a de
desa olla es e p oyec o, como son los an eceden es de dicha aplicación; las
di e en es opciones de lenguajes de p og amación, que se maneja on, pa a lle a a
cabo la aplicación; los se icios web, que su en a la aplicación de los da os necesa ios;
y inalmen e el p ocesamien o g á ico de la aplicación que es la base y obje i o de
es e p oyec o.
En el segundo apa ado, como guía, se p ocede a de ini especí icamen e el
p oyec o median e las compe encias que se han cubie o.
En el e ce apa ado se desc ibi án las apo aciones socio-económicas y
écnicas al en o no gene al, además de comen a el es ado ac ual de las aplicaciones
dedicadas a las elaciones mo oléxicas.
En el siguien e apa ado se epasa la no ma i a igen e, sob e aplicaciones de
es e ipo, que a ec an o pueden a ec a di ec amen e al p oyec o.
En el quin o apa ado, se ealiza á la ase de análisis, donde se desc iben el
o ma o de las ablas Hash de los que la aplicación ob iene los da os y la o ma de
accede a las mismas median e se icios web, además de la explicación y de inición de
un se icio web. También se de inen los casos de uso del so wa e esul an e.
Una ez hecho el análisis se p ocede a la ase diseño, donde apa e de inclui
los diag amas de clase y de ac i idades, se desc ibe el diseño de la in e az g á ica.
An es de comenza con la implemen ación se ealiza el análisis de equisi os de
so wa e y usua io, no se á necesa io hace un análisis de equisi os de ha dwa e ya
que se a a de una aplicación web.
A con inuación, se desc ibe la ase de desa ollo, indicando cómo se ha
implemen ado la aplicación so wa e de es e p oyec o señalando las lib e ías usadas y
los módulos so wa e gene ado.
En los siguien es apa ados se pod án e los esul ados ob enidos as la
implemen ación, p ueba y e i icación del so wa e y el p esupues o es imado pa a la
ealización de es e p oyec o.
Y inalmen e se p esen a án las conclusiones ob enidas, el posible abajo
u u o y la bibliog a ía u ilizada.
16
1. Es ado ac ual y obje i os
1.1 Es ado ac ual
La aplicación ac ual ealiza el p ocesamien o de o mas elacionales mo oléxicas del
lenguaje español. Dicha aplicación ob iene la amilia de palab as elacionadas y mues a, al
usua io, es a amilia sea cual sea la ca ego ía g ama ical a la que pe enezca.
Dicha aplicación es á desa ollada en lenguaje C++ y en el en o no desa ollado en
Ja a, po an o, ap o echando que se es á ac ualizando el depa amen o de In o má ica y
Sis emas de la ULPGC, ambién se es án ac ualizando sus aplicaciones, implemen ación y
alojamien o.
La aplicación ac ual se encuen a en el an iguo po al del depa amen o de In o má ica
y Sis emas de la ULPGC siendo su di ección URL:
h p://www.gedlc.ulpgc.es/in es igacion/scogeme02/ elmo o.h m
Es a aplicación es á basada en la esis doc o al de F ancisco Ca e as Riuda e s,
P o eso del Depa amen o de In o má ica y Sis emas de la Uni e sidad de Las Palmas de G an
Cana ia, la esis se cen a en desa olla un sis ema capaz de esol e y esponde a cualquie
aspec o mo ológico de una palab a del español que aba ca odo lo elacionado con la
mo ología lexi a, la de i a i a y g an pa e de la composi i a, de cualquie palab a del
español, pa a el es ablecimien o de elaciones mo oléxicas. Pe mi e el econocimien o, la
gene ación y la manipulación de las elaciones mo oléxicas a pa i de cualquie palab a, así
como el del campo mo osemán ico al que pe enece, ca ego ía g ama ical de la base y de sus
palab as elacionadas, incluye la ecupe ación de oda su in o mación lexicogené ica has a
llega a una p imi i a, la ges ión y con ol de los a ijos en el a amien o de sus elaciones, así
como la egula idad en la elación es ablecida y o os aspec os.
La in o mación que con iene es a esis se o ganiza, sob e un co pus su icien emen e
amplio, un es udio axonómico, exhaus i o y sis emá ico de los a ijos u ilizados en las
elaciones mo osemán icas que p opo ciona una isión global del compo amien o y
p oduc i idad de las palab as del español en los p incipales p ocesos de o mación
su ijación, p e ijación, pa asín esis, sup esión, eg esión, modi icación-ce o, apócope,
me á esis y o os no clasi icables que gene an g a ías al e na i as— y se es ablece una
desc ipción po meno izada de las elaciones en e palab a y a ijo en el ma co de la
uncionalidad, o malidad y semán ica.
Ob eniéndose así un amplio almacén de da os ácilmen e accesibles de o ma
o denada que necesi an de una ep esen ación e in e az g á ica más ac ualizada y adecuada a
las necesidades de los usua ios de la misma.
Dado que la aplicación ac ual es á desa ollada en lenguaje C++ y en el en o no
desa ollado en Ja a, po an o, ap o echando que se es á ac ualizando el depa amen o de
In o má ica y Sis emas de la ULPGC, ambién se es án ac ualizando sus aplicaciones,
implemen ación y alojamien o.

17
La aplicación ac ual se encuen a en el an iguo po al del depa amen o de In o má ica
y Sis emas de la ULPGC siendo su di ección URL:
h p://www.gedlc.ulpgc.es/in es igacion/scogeme02/ elmo o.h m
La in o mación que alimen a la aplicación es á con enida en unas ablas
hash, es uc u a de da os que asocian lla es o cla es con alo es. Dicha in o mación es á
ac ualizada y an o la aplicación como los da os es án con enidos en un se ido con
ecnología Windows Web Se e R2 6.1.
El se ido Windows Web Se e R2 6.1 unciona con el conjun o de se icios In e ne
In o ma ion Se ice 7.5 o IIS 7.5, el cual se basa en a ios módulos que le dan capacidad pa a
p ocesa dis in os ipos de páginas.
Po an o queda es ablecido que an o la in o mación de la base de da os como el
se ido en el que se alojan la misma y la aplicación es án con enien emen e ac ualizadas,
quedando como obje i o eno a la aplicación.
1.2 Obje i os
Los obje i os que se a an de cub i con es e p oyec o son, p incipalmen e, c ea una
aplicación web amigable pa a el usua io, capaz de ex ae la in o mación mo ológica de cada
palab a que el usua io in oduzca, an o en o ma de lis a de allada como en una
ep esen ación g á ica de dicha palab a en o ma de á bol con oda la in o mación ami icada
a pa i de la misma. De o ma dinámica la in o mación que se mues a pod á se il ada, po
el usua io, en odo momen o, mejo ando así a la aplicación p edeceso a, la cual mues a la
in o mación en un modo más simple y no pe mi e modi ica la mues a de la misma en
cualquie momen o.
El obje i o de mejo a la in e ac uación del usua io con la aplicación se ha concebido
pa a que la in o mación que apo a sea más concisa y acili a la legibilidad po pa e de los
mismos, haciendo posible indaga en dicha in o mación igualmen e de o ma in e ac i a y
amigable, haciendo así más amena las consul as.
1.3 Es uc u a del documen o
Con el obje i o de acili a la lec u a del p esen e documen o se p esen a en es e apa ado
la es uc u a gene al del mismo.
Es e documen o se o ganiza en 10 capí ulos:
 Es ado ac ual y obje i os: epaso al es ado inicial del aplica i o y exposición de las
mejo as que se ealiza án al mismo así como los hi os que se p e enden alcanza en
cada una de las e apas y apa ados en los que es á di idido el TFG.
18
 Compe encias: se exponen las compe encias cubie as con es e abajo, indicando los
apa ados en las que és as se en sa is echas.
 Apo aciones: análisis de las con ibuciones que el TFG apo a a nues o en o no
social, cien í ico y écnico.
 No ma i a y legislación: se ci an las no ma i as y legislaciones que a ec an al p esen e
abajo y al desa ollo web ac ual.
 Me odología y plan de abajo: en es e capí ulo se expone la me odología seguida a la
ho a de desa olla el TFG y la plani icación lle ada a cabo pa a cumpli obje i os.
 Análisis: se desc iben en de alle el análisis ealizado pa a selecciona las he amien as,
en base a los ecu sos de los que se dispone, explicando su uncionamien o, en ajas
que p esen an y a gumen ando su elección.
 Requisi os: se especi ican los equisi os an os ha dwa e como so wa e asociados al
p oyec o.
 Diseño: odos los de alles ela i os al diseño de la aplicación se encuen an en es e
capí ulo.
 Desa ollo: odos los de alles ela i os a los aspec os elacionados con el desa ollo de
la aplicación se encuen an en es e capí ulo.
 Anexos.
En cada uno de los capí ulos p esen ados en es e documen o se pod án encon a di e en es
apa ados, o ganizados de mane a que se acili e la lec u a y comp esión de los mismos. A lo
la go del documen o ambién se ci a án las e e encias bibliog á icas consul adas.
19
2. Compe encias a cub i
Es e apa ado se di ide en cua o sub-apa ados independien es, CII01 donde se
documen an: la capacidad pa a diseña , desa olla , e alua y selecciona sis emas
in o má icos y aplicaciones; e aluación de segu idad y calidad; compa ando odo ello con la
legislación y no ma i a igen e. El segundo apa ado llamado CII02 documen a la capacidad de
plani icación, concesión, de despliegue y di ección de p oyec os, se icios y sis emas
in o má icos en odos los ámbi os, alo ando siemp e su pues a cos e de pues a en ma cha y
su impac o económico y social. El e ce apa ado, CII04, plasma la capacidad de elabo a el
pliego de condiciones écnicas de una ins alación in o má ica que cumpla la no ma i a igen e.
En el úl imo sub-apa ado se de allan los conocimien os de la no ma i a y los conocimien os
de la egulación de la in o má ica en el ámbi o nacional, eu opeo e in e con inen al.
2.1.- CII01
La compe encia CII01 aba ca a ios apa ados de es a memo ia y en ellos se
especi ican además las esponsabilidades que se deben cub i pa a la co ec a ejecución de
es a compe encia.
En los apa ados de “Es ado Ac ual y Obje i os”, “Análisis”, “Requisi os ecnológicos”,
“Diseño” y “Desa ollo”, se desa olla es a compe encia en p o undidad.
Como es udian e, se deben cumpli una se ie de esponsabilidades:
Análisis
El es udian e debe in e i y analiza los equisi os pa a su pos e io especi icación y
alidación.
Diseño
El es udian e debe de ini y diseña la es uc u a de da os, la a qui ec u a y la in e az
de usua io.
Implemen ación
El es udian e debe ap ende a usa las he amien as necesa ias pa a el desa ollo del
p oyec o, in es iga ecnologías ex e nas que le puedan ayuda con el desa ollo y gene a un
código op imizado y de calidad.
2.2.- CII02
La compe encia CII02 se en iende como la capacidad de concebi , diseña y ejecu a un
plan de abajo pa a calcula y alo a los cos es del p oyec o así como su impac o económico
y social.
La plani icación es un elemen o cla e en la ges ión de p oyec os. Sin una adecuada
plani icación, el p oyec o puede no sa is ace odos sus equisi os, lo que epe cu e en la
calidad de la aplicación inal y en los plazos de inalización.
20
Pa a el desa ollo de es e p oyec o, se ha ealizado una plani icación óp ima g acias a
la cual se ha inalizado el p oyec o en los plazos es ablecidos, consiguiendo sa is ace odos los
obje i os de inidos inicialmen e. La plani icación cub e la compe encia CII02, como se puede
obse a en el apa ado “Me odología y plan de abajo”. Asimismo, en el apa ado
“Apo aciones” se puede ap ecia el impac o del abajo en el en o no social y écnico.
Una especial mención al u o po sus apo aciones pa a mejo a el p oyec o du an e
su desa ollo.
2.3.- CII04
La compe encia CII04 engloba la “capacidad pa a elabo a el pliego de condiciones
écnicas de una ins alación in o má ica que cumpla los es ánda es y no ma i as igen es”.
Es e p oyec o no necesi a cub i es a compe encia.
2.4.- CII08
La compe encia CII08 cub e el “conocimien o de la no ma i a y la egulación de la
in o má ica en los ámbi os nacional, eu opeo e in e nacional”.
Es e p oyec o no necesi a cub i es a compe encia.
2.5.- TFG01
La úl ima compe encia es la TFG01, que ep esen a el eje cicio de ealiza una
p esen ación y de ensa an e un ibunal compues o po p o eso es de la comunidad
uni e si a ia de la Uni e sidad de Las Palmas de G an Cana ia, que se á designado po la
Escuela de Ingenie ía In o má ica de dicha uni e sidad.
Es a úl ima compe encia es la suma de odos los apa ados de es e documen o,
llamado TFG, y se da á po sa is echa as su p esen ación an e el ibunal co espondien e.
21
3. Apo aciones
La in e az g á ica que p opo ciona los esul ados isuales del sis ema de esolución de
aspec os mo ológicos de las palab as del lenguaje español desa ollado en la esis doc o al del
p o eso F ancisco Ca e as Riuda e s, ep esen a el pun o de pa ida de es e p oyec o.
En apa ados an e io es, se ha podido comp oba que la in e az g á ica es aba
obsole a, an igua, muy simple y sin uncionalidades. Po lo que el desa ollo de es e p oyec o
supone una op imización de la aplicación an e io de modo que p opo cione al usua io una
he amien a inno ado a y comple a que posibili e su in e acción con la nue a in e az.
En e las nue as uncionalidades des aca la isualización en o ma de á bol de la
amilia de una palab a has a dos subni eles. A pa i del á bol o mado, se pueden aplica
ope aciones de il o pa a isualiza di e en es pa es de dicho á bol, y gene a un nue o á bol
pa iendo de alguna de las palab as de la amilia. Todo es o se ecoge en la aplicación web
‘Familias TIP’, obje i o de es e p oyec o.
A í ulo pe sonal, es e TFG ha supues o una opo unidad idónea pa a pone a p ueba
los conocimien os adqui idos du an e es os años de es udio. La opo unidad de desa olla un
p oyec o que a a es a de ca a al público ha supues o un e o ya que a a se pues o a p ueba
en la ealidad. La oma de decisiones a lo la go del desa ollo y la solución de los posibles
imp e is os que pueden su gi en odo p oyec o, me han p opo cionado una g an can idad de
nue os conocimien os y expe iencia a la ho a de u iliza ecnologías que a día de hoy son
pun e as en el me cado.

22
4. No ma i a y legislación
En es e apa ado se es udia la no ma i a y legislación igen e sob e p oyec os
in o má icos. A la aplicación de nues o p oyec o no le a ec a ningún ipo de legislación, ya que
no se equie en da os pe sonales ni ningún ipo de in o mación sensible que debamos
conside a .
En cambio, pa a el desa ollo enemos que ene en cuen a las licencias de las
aplicaciones y lib e ías que u ilizamos, al y como se mues a a con inuación:
 Licencia MIT
La licencia MIT es una de las muchas licencias de so wa e que ha empleado el
Ins i u o Tecnológico de Massachuse s (MIT). Es un licencia de so wa e lib e-
pe misi a que pe mi e la eu ilización y modi icación del so wa e p opie a io siemp e
que odas las copias del so wa e incluyan una copia de los é minos de la licencia MIT.
Las lib e ías A bo .js y Json.NET hacen uso de es e ipo de licencia.
 Licencia MSDN
MSDN (del inglés, Mic oso De elope Ne wo k) se e ie e a los se icios web
(basados en pla a o mas Mic oso ) o ien ados a desa ollado es de so wa e y al
so wa e incluido con sus compilado es (Visual S udio) y cie os SDK. Tal y como
Mic oso lo de ine, "con iene una g an can idad de in o mación écnica de
p og amación, incluidos código de ejemplo, documen ación, a ículos écnicos y guías
de e e encia".
De o ma his ó ica, MSDN pone a disposición del público un paque e de
susc ipción según el cual los desa ollado es ienen acceso y licencias de uso de casi
odo el so wa e de Mic oso .
Mic oso O ice, Windows Se e , Visual S udio 2010 y ASP.NET-C# hacen
uso de es e ipo de licencia
23
5. Me odología y plan de abajo
5.1. – Me odología de desa ollo
En el desa ollo de cualquie p oyec o de desa ollo de so wa e es
undamen al el uso de un mé odo de desa ollo sob e el que abaja pa a conside a
odos los aspec os c í icos de los que depende el éxi o de dicho p oyec o, ya que és e
debe gene a un p oduc o e icien e y óp imo que cumpla con los equisi os de inidos y
es é acabado den o de los plazos de en ega aco dados.
La me odología de desa ollo pe mi e de ini , plani ica y con ola el desa ollo
de cualquie p oyec o, según su en e gadu a y el iempo de en ega, en e o os.
Pa a desa olla el so wa e de p ocesamien o es adís ico de los eleg amas de
comunicación, hemos usado como me odología de desa ollo so wa e el modelo de
ciclo de ida en cascada, que es uno de los más u ilizados en la ac ualidad po su
e icacia y simplicidad.
Figu a 1. Modelo de ciclo de ida en cascada
G acias a la e oalimen ación en cada una de las e apas, podemos co egi e o es
de ec ados o ealiza cambios pa a mejo a el p oyec o en cualquie a de las ases.
ANÁLISIS
DISEÑO
IMPLEMENTACIÓN
PRUEBA
MANTENIMIENTO
24
El modelo de ciclo de ida se compone de las siguien es e apas:
5.1.1 - Análisis
En es a ase se analizan las necesidades de los usua ios inales del so wa e pa a
de ini los equisi os que debe cumpli el so wa e.
5.1.2 - Diseño
Du an e el diseño se descompone y o ganiza el sis ema en elemen os sepa ados pa a
ob ene una desc ipción de la es uc u a global del sis ema y la especi icación de equisi os del
sis ema.
5.1.3 - Implemen ación
En es a ase se implemen a el código uen e gene ando p o o ipos.
5.1.4 - P ueba
En la ase de p uebas se comp ueba que el sis ema uncione co ec amen e
cumpliendo con odos los equisi os de usua io.
5.1.5 - Man enimien o
En la úl ima ase se man iene y mejo a el so wa e pa a co egi e o es o añadi
nue os equisi os.
5.2. – Plan de abajo
Du an e el desa ollo de es e TFG, se han cubie o las siguien es e apas:
5.2.1 - Visión global del sis ema
Inicialmen e, es udiamos la documen ación y la aplicación ya desa ollada po el
p o eso de la ULPGC Juan Ca los Rod íguez del Pino, con el obje i o de mejo a su in e az y
añadi más uncionalidades.
5.2.2 - Selección de he amien as
Ins ala emos las he amien as so wa e necesa ia pa a desa olla el TFG.
5.2.3 - Análisis y diseño del sis ema
Se idea án los nue os módulos que compond án la aplicación. También se decidi á qué
he amien as u iliza , se inspecciona án las dependencias exis en es en e módulos y los
di e en es ecu sos de los que se compond á el sis ema.
25
5.2.4 - Implemen ación del sis ema
En es a e apa implemen amos el código según análisis y diseño plan eados, u ilizando
el so wa e ins alado.
5.2.5 - P uebas
Pa a comp oba el sis ema implemen ado y comp oba que cumple con los equisi os
especi icados du an e el análisis, se ealiza on di e sas p uebas pa a asegu a la calidad del
sis ema.
5.2.6 -Documen ación y de ensa
A pa i de oda la in o mación ob enida a lo la go del desa ollo del TFG se ha
con eccionado el p esen e documen o de TFG y se p epa a la de ensa del mismo.
32
6.6.1 – Pa asin é icas
Es e ipo de de i ación ocu e cuando la palab a ha añadido a su cue po an o su ijo
como p e ijo como mues a el siguien e ejemplo:
Au omo ilis a: (p e ijo) au o-, (núcleo o palab a) -mo il-, (Su ijo) –is a.
6.6.2 – P e ijales
De i aciones echas a pa i de la adición de un p e ijo al núcleo de la palab a como se
mues a a con inuación:
Desconce a : (p e ijo) des-, (núcleo o palab a) -conce a .
6.6.3 – Su ijales
De i aciones nacidas de ag ega al núcleo de la palab a un su ijo a con inuación:
Coche a: (núcleo o palab a) coche-, (su ijo) - a.
6.6.4 – O as
De i aciones nacidas, an o, de ag ega al núcleo de la palab a un su ijo o de ag ega
un p e ijo al núcleo, pe o que po sus ca ac e ís icas u o ígenes es án clasi icadas como
a é esis, me á esis, síncopas, apócopes y algunos cambios no clasi icados.
En la siguien e abla, se ecogen odas las de i aciones que se a an en el p oyec o y
la e ique a que se les ha dado pa a mejo a la isualización de la misma en la ep esen ación
del g a o:
Núcleo
P e ijo
Su ijo
Núcleo
P e ijo
Su ijo
Núcleo

33
Un ejemplo de palab a que se co esponde con es e caso es el siguien e:
Incuba posee una acepción, en e o as, equi alen e al signi icado comple o de encoba y las
dos p oceden e imológicamen e del la ín incuba e.
6.7 – In o mación a almacena
En is a de oda la in o mación que de uel en odos los se icios u ilizados y la
necesi ada pa a lle a a cabo el p oyec o, hay que de ini un ipo de es uc u a que almacene
odos los da os o denados, pa a que sean accesibles. Pa a ealiza es a a ea hay que ene en
cuen a la in o mación necesa ia de cada palab a que se necesi a á.
La siguien e abla mues a cómo se es uc u a dicha in o mación y que ipo de da o
con iene cada campo:
Campo
Con enido
Ca ac e ís ica del elemen o
Indican a ibu os como la o ma del nodo que depende á
del ni el de p o undidad que ocupe en el g a o, la
ipog a ía de le as, el o den den o del g a o y su colo .
Palab a
El con enido del nodo, la palab a en sí que ep esen a ese
nodo.
Su ijo
Su ijo de la palab a, es a á acío no iene su ijo.
P e ijo
P e ijo de la palab a, es a á acío no iene p e ijo.
pad e
Indica el nodo pad e, odos menos la aíz, ienen pad e.
Tipo de amilia
Indica el ipo de palab a que ep esen a el nodo. Pueden
se sus an i o, Adje i o, Ad e bio o Ve bo.
Hijos
De ine los hijos que iene un nodo en conc e o.
34
6.8 – Aplicación mul ilenguaje
Un pun o a ene en cuen a en el análisis de la aplicación se á da le sopo e
mul ilenguaje, como mínimo en español – lenguaje po de ec o e inglés pa a acili a el acceso
a la aplicación a usua ios de habla no cas ellana.
Pa a lle a a cabo es e ipo de a ea los lenguajes Asp.Ne y Visual C# disponen de
almacenamien o llamados a chi os de ecu sos, que pe mi en almacena el ex o
mul ilenguaje de las aplicaciones en ablas – compues as po pa ejas de da os cla e o key y
alo o alue –las cuales pueden se accedidas desde la in e az po medio de un simple
nomencla u a.
35
7. Requisi os de ha dwa e y so wa e
Du an e el desa ollo de es e abajo de in de g ado se han u ilizado una se ie de
ecu sos ecnológicos pa a cumpli con los obje i os del p oyec o p e iamen e de inidos. Los
ecu sos se clasi ican en ecu sos ha dwa e y so wa e, espec i amen e. La selección de cada
ecu so ha dependido de los siguien es í ems:
 Uso gene alizado.
 Disposición de una amplia documen ación.
 Sopo e de lenguajes de p og amación web.
 Po encia y acilidad de uso de la he amien a.
En los siguien es apa ados, analizamos algunas de las he amien as disponibles en el
me cado, desc ibiendo los pun os ue es de cada una pa a inalmen e selecciona los ecu sos
más adecuados pa a es e p oyec o, en base a los c i e ios p e iamen e nomb ados.
7.1 - Requisi os ha dwa e
7.1.1 - Se ido Web
Es a aplicación web de es e abajo se aloja á en el se ido de depa amen o de TIP.
El se ido que u ilizan es el Windows Se e 2008, que es el nomb e de un sis ema ope a i o
de Mic oso diseñado pa a se ido es.
Windows Se e 2008 se basa en el núcleo Windows NT 6.1., y en e las mejo as de
es a e sión des acan nue as uncionalidades pa a el Ac i e Di ec o y, mejo as en el
endimien o de la i ualización y adminis ación de sis emas, la inclusión de IIS 7.5, el sopo e
pa a más de 256 p ocesado es, un nue o p oceso de epa ación de sis emas NTFS, la c eación
de sesiones de usua io en pa alelo, la consola Powe Shell y el núcleo del sis ema eno ado
Se e Co e, en e o as muchas uncionalidad.
7.1.2 – Equipo de abajo
Se ha usado un o denado po á il ACER Aspi e 5542G pa a el desa ollo de es a
aplicación web, cuyas p incipales ca ac e ís icas son las siguien es:
Memo ia
500GB HDD
Pan alla
15.6’’ HD LED LCD
P ocesado y RAM
AMD A hlonTM II X2 P ocesso M320 (2.1GHz, 1 MB L2 CACHE)
6GB RAM DDR3
SO
Windows 7
Ta je a g á ica
ATI Mobili y RadeonTM HD4570
36
7.2. Requisi os so wa e
Dada la amplia a iedad de he amien as so wa e que podemos encon a en el
me cado, nos hemos limi ado a selecciona y desc ibi las he amien as más conocidas en cada
campo pa a inalmen e decidi nos po la más adecuada pa a nues o abajo alo ando sus
p os y sus con as.
An es de segui explicando las he amien as y las azones po las que se ha decan ado
la balanza hacia un lenguaje y un en o no de p og amación idóneos pa a es e p oyec o, es
con enien e apun a que la aplicación a a ene de inida una es uc u a de p og amación
clien e-se ido .
La a qui ec u a clien e-se ido es un modelo de aplicación dis ibuida en el que las
a eas se epa en en e los se ido es y los clien es. Di e sas aplicaciones se ejecu an en un
en o no clien e/se ido . Es o signi ica que los equipos clien es (equipos que o man pa e de
una ed) con ac an a un se ido , un equipo gene almen e muy po en e en ma e ia de
capacidad de en ada/salida, que p opo ciona se icios a los equipos clien es. Es os se icios
son p og amas que p opo cionan da os como la ho a, a chi os, una conexión, e c. El siguien e
diag ama, igu a X.X, mues a cómo unciona el sis ema clien e/se ido median e el p o ocolo
TCP/IP.
37
Figu a 5 - Modelo Clien e/Se ido
El diag ama an e io mues a como el clien e en ía una solici ud al se ido median e
su di ección IP y el pue o, que es á ese ado pa a un se icio en pa icula que se ejecu a en
el se ido . Es a solici ud es ecibida po el se ido y esponde con la di ección IP del equipo
clien e y su pue o.
A con inuación, se de allan las he amien as más ep esen a i as de cada campo y se
p ocede a selecciona la más idónea:
7.2.1 - Edi o es
7.2.1.1- Mic oso O ice Wo d 2010
Es a he amien a de edición de ex os se ha u ilizado a lo la go del desa ollo de la
aplicación web pa a documen a las dis in as ases del p oyec o y elabo a un manual de
ayuda de la aplicación des inado al usua io inal.
Mic oso O ice 2010 es una e sión del paque e o imá ico Mic oso O ice de
Mic oso y suceso a de Mic oso O ice 2007. O ece compa ibilidad ex endida pa a di e sos
o ma os de a chi os, ac ualizaciones de la in e az de usua io y una expe iencia de usua io
e inada.
Es compa ible con los sis emas ope a i os Windows XP, Windows Vis a y Windows 7.
Además, el paque e es á disponible en una compilación pa a a qui ec u as de 64 bi s, aunque
sólo pa a los sis emas ope a i os de núcleo NT 6.x en adelan e, como Windows Vis a,
Windows 7 y Windows Se e 2008/2008.
7.2.1.2 - No epad++
En di e en es pun os del desa ollo hemos u ilizado el edi o de ex o No epad++. Es e
p og ama es de código lib e con sopo e pa a una g an can idad de lenguajes de p og amación
y p opo ciona muchas acilidades pa a los p og amado es.
Es un edi o de código o almen e g a ui o que acep a odos los lenguajes
con emplados pa a el desa ollo de es a aplicación, como po ejemplo HTML, XML, CSS y
Ja aSc ip .
Exis en o os en o nos como Ul aEdi con simila es ca ac e ís icas al No epad++ en
cuan o a p es aciones y lenguajes sopo ados, pe o debido a que po cos umb e ya

38
u ilizábamos No epad++ y cumple con nues os equisi os, no hubo ninguna duda en su
selección.
7.2.2 – Lenguajes de p og amación
7.2.2.1 - Ja a – J2EE
J2EE es una pla a o ma de p og amación pa a desa olla y ejecu a so wa e de
aplicaciones en el lenguaje de p og amación Ja a. Pe mi e u iliza a qui ec u as de N capas
dis ibuidas y se apoya ampliamen e en componen es de so wa e modula es ejecu ándose
sob e se ido es de aplicación Ja a EE.
En e las especi icaciones API de es e lenguaje encon amos:
 JBDC: API que pe mi e la ejecución de ope aciones sob e base de da os desde el
lenguaje de aplicación Ja a. Es una colección de in e aces Ja a y mé odos de ges ión
de manejado es de conexión hacia cada modelo especí ico de base de da os.
 RMI: mecanismo de Ja a que p opo ciona un mecanismo simple pa a la comunicación
de se ido es en aplicaciones dis ibuidas basadas exclusi amen e en Ja a.
 Ja aMail: es una expansión que acili a el en ío y ecepción de e-mail desde código
Ja a.
 Ja a Message Se ice o JMS: es una API pa a c ea , en ia , ecibi y lee mensajes a
los componen es de aplicaciones basados en la pla a o ma.
 Se icios Web: es una ecnología que u iliza un conjun o de p o ocolos y es ánda es
que si en pa a in e cambia da os en e aplicaciones, que pueden es a desa olladas
en dis in os lenguajes de p og amación, y ejecu adas sob e cualquie pla a o ma.
 XML: es un lenguaje de ma cado pa a almacena da os en o ma legible.
A pa e de las ca ac e ís icas básicas de implemen ación y desa ollo de la API de Ja a,
ambién se ha de ene en cuen a su po encial en cuan o a lib e ías g á icas pa a lle a a cabo
pa e del p oyec o que nos ocupa. Pa a es e ipo de se icios Ja a implemen a la ecnología
Ja a Se e Faces (JSF), que simpli ica el desa ollo de in e aces de usua io en aplicaciones
J2EE. Las lib e ías más conocidas y que más se ajus an a las ca ac e ís icas necesa ias pa a es e
p oyec o son:
 RichFaces: Ag ega componen es isuales y sopo e pa a AJAX, lenguaje en el que nos
cen a emos más adelan e.
 ICE aces: Con iene di e sos componen es pa a in e aces de usua ios más
en iquecidas, ales como edi o es de ex o en iquecidos, ep oduc o es de
mul imedia, en e o os.
 jQue y4js : Con iene di e sos componen es sob e la base de uno de los más popula es
amewo k ja asc ip jQue y.
 P imeFaces: Es una lib e ía muy li iana, odas las decisiones hechas son basadas en
man ene a P imeFaces lo más li iano posible, de código abie o que cuen a con un
conjun o de componen es en iquecidos que acili an la c eación de las aplicaciones
web. Es á bajo la licencia de Apache License V2, además pe mi e la in eg ación con
o os componen es como po ejemplo, el ya mencionado, RichFaces.
39
 OpenFaces: Lib e ía open sou ce que con iene di e en es componen es JSF, un
F amewo k Ajax y un F amewo k de alidación po pa e del clien e.
7.2.2.2 - PHP
PHP es un lenguaje de p og amación de uso gene al de código del lado del se ido
o iginalmen e diseñado pa a el desa ollo web de con enido dinámico. Fue uno de los
p ime os lenguajes de p og amación del lado del se ido que se podían inco po a
di ec amen e en el documen o HTML en luga de llama a un a chi o ex e no que p ocese los
da os. El código es in e p e ado po un se ido web con un módulo de p ocesado de PHP que
gene a la página Web esul an e. Puede se desplegado en la mayo ía de los se ido es web y
en casi odos los sis emas ope a i os y pla a o mas sin cos o alguno.
Las ca ac e ís icas más eseñables de es e lenguaje de p og amación que apo a ían
soluciones al desa ollo de es a aplicación son:
 O ien ado al desa ollo de aplicaciones web dinámicas con acceso a in o mación
almacenada en una base de da os.
 El código uen e esc i o es in isible al na egado web y al clien e.
 Capacidad de conexión con la mayo ía de los mo o es de base de da os.
 Capacidad de expandi su po encial u ilizando módulos o ex ensiones.
 Posee una amplia documen ación en su si io web o icial.
 Es lib e, po lo que se p esen a como una al e na i a de ácil acceso pa a odos.
 Pe mi e aplica écnicas de p og amación o ien ada a obje os.
 No equie e de inición de ipos de a iables aunque sus a iables se pueden e alua
ambién po el ipo que es én manejando en iempo de ejecución.
 Tiene manejo de excepciones.
 Pe mi e usa pa ones de diseño como el Modelo Vis a Con olado (MVC.
 Debido a su lexibilidad ha enido una g an acogida como lenguaje base pa a las
aplicaciones WEB de manejo de con enido, y es su uso p incipal.
 Puede se ejecu ado en la mayo ía de sis emas ope a i os, en e ellos Mic oso
Windows, equisi o indispensable pa a es e p oyec o.
7.2.2.3 - ASP .NET – Visual C#
ASP .NET es un amewo k pa a aplicaciones web, desa ollado y come cializado po
Mic oso . Sus usos más ecuen es son si ios web dinámicos, aplicaciones web y se icios web
XML. Es á cons uido sob e el Common Language Run ime, el cual es un en o no de ejecución
pa a códigos que se ejecu an sob e la pla a o ma Mic oso .NET y pe mi e a los
p og amado es esc ibi código ASP.NET usando cualquie lenguaje admi ido po el .NET
F amewo k.
En e sus ca ac e ís icas p incipales des acan: el modelo de p og amación Code-behind, el
con ol del es ado de la aplicación y de la sesión, y la con ucción de las llamadas Páginas o
40
Web Fo ms, en e o os. Además, Asp.Ne puede se u ilizado en aplicaciones clien e se ido ,
median e el lenguaje C#.
A pa e de las an e io es ca ac e ís icas, las ex ensiones más in e esan es de es e lenguaje
que pueden se ú iles pa a desa olla es e p oyec o donde se equie e una in e az g á ica
po en e, son:
 ASP.NET AJAX: an e io men e llamado A las, es un conjun o de ex ensiones pa a
ASP.NET desa ollado po Mic oso pa a implemen a la uncionalidad de Ajax.
 ASP.NET MVC F amewo k: ex ensión de páginas ASP.NET que u iliza la a qui ec u a
MVC.
Po o o lado, ASP.NET puede se u ilizado en aplicaciones clien e se ido , median e el
lenguaje C#, lenguaje de p og amación o ien ado a obje os desa ollado y es anda izado po
Mic oso como pa e de su pla a o ma .NET. Su sin axis básica de i a de C/C++ y u iliza el
modelo de obje os de la pla a o ma .NET.
Las ca ac e ís icas p incipales de es e lenguaje son:
 Po abilidad del código uen e.
 Sopo e pa a in e nacionalización.
 Adecuación pa a esc ibi aplicaciones de cualquie amaño: desde las más g andes y
so is icadas como sis emas ope a i os has a las más pequeñas unciones.
 Aplicaciones económicas en cuan o a memo ia y p ocesado.
 Adecuación pa a esc ibi aplicaciones de cualquie amaño.
 Inclusión de p incipios de ingenie ía de so wa e como e isión es ic a de los ipos de
da os y de lími es de ec o es, de ección de usos de a iables no inicializadas, y
ecolección de basu a au omá ica.
 Fácil mig ación del p og amado al nue o lenguaje, especialmen e pa a
p og amado es amilia izados con C, C++ y Ja a.
7.2.2.4 - Ja asc ip
Ja aSc ip es un lenguaje de p og amación in e p e ado. Todos los na egado es mode nos
in e p e an el código Ja aSc ip in eg ado en las páginas web, ya que pa a in e ac ua con una
página web, se p o ee al lenguaje Ja aSc ip de una implemen ación del Documen Objec
Model (DOM).
Ja aSc ip se diseñó con una sin axis simila al C, aunque adop a nomb es y con enciones
del lenguaje de p og amación Ja a. Sin emba go Ja a y Ja aSc ip no es án elacionados y
ienen semán icas y p opósi os di e en es.
Las p incipales ca ac e ís icas de Ja asc ip , que se ajus an al es ánda ECMASc ip , son:
 Impe a i o y es uc u ado: Ja aSc ip sopo a g an pa e de la es uc u a de
p og amación de C (po ejemplo, sen encias i , bucles o , sen encias swi ch, e c.).
 Dinámico:
41
o Tipado dinámico: Como en la mayo ía de lenguajes de sc ip ing, el ipo es á
asociado al alo , no a la a iable.
o Obje ual: Ja aSc ip es á o mado casi en su o alidad po obje os. Los obje os
en Ja aSc ip son a ays asocia i os. Las p opiedades y sus alo es pueden se
c eados, cambiados o eliminados en iempo de ejecución.
o E aluación en iempo de ejecución: Ja aSc ip incluye la unción e al que
pe mi e e alua exp esiones como exp esadas como cadenas en iempo de
ejecución.
 Funcional: Las unciones son obje os en sí mismos, y se puede anida una unción
den o de o a unción de inida. A di e encia de muchos lenguajes o ien ados a
obje os, no hay dis inción en e la de inición de unción y la de inición de mé odo.
 P o o ípico:
o P o o ipos: Ja aSc ip usa p o o ipos en ez de clases pa a el uso de he encia.
o Funciones como cons uc o es de obje os: Las unciones ambién se
compo an como cons uc o es.
 A ays y la de inición li e al de obje os: Al igual que muchos lenguajes de sc ip ,
a ays y obje os (a ays asocia i os en o os idiomas) pueden se c eados con una
sin axis ab e iada. De hecho, es os li e ales o man la base del o ma o de da os JSON.
 Exp esiones egula es: Ja aSc ip ambién sopo a exp esiones egula es de una
mane a simila a Pe l, que p opo cionan una sin axis concisa y pode osa pa a la
manipulación de ex o.
7.2.2.5 - HTML5
Lenguaje de ma cado u ilizado p incipalmen e pa a la elabo ación de páginas web.
Pe mi e esc ibi y desc ibi el o ma o y con enido que dicha página end á al se ende izada.
HTML5 es la quin a e sión del lenguaje básico de ma cado de oda página web, es deci ,
HTML. HTML5 especi ica dos a ian es de sin axis pa a HTML: un «clásico» HTML ( ex /h ml),
la a ian e conocida como HTML5 y una a ian e XHTML conocida como sin axis XHTML5 que
debe á se se ida como XML (XHTML).
HTML5 es ablece una se ie de nue os elemen os y a ibu os que e lejan el uso ípico de
los si ios web mode nos. Algunos de ellos son écnicamen e simila es a las e ique as <di > y
<span>, pe o ienen un signi icado semán ico, como po ejemplo <na > (bloque de na egación
del si io web) y < oo e >. O os elemen os p opo cionan nue as uncionalidades a a és de
una in e az es anda izada, como los elemen os <audio> y < ideo>.
La mejo a más signi ica i a pa a noso os es el elemen o <can as>, capaz de dibuja
elemen os 3D en los na egado es más impo an es (Mozilla, Ch ome, Ope a, Sa a i e IE).
7.2.2.6 - XML
XML es un lenguaje de ma cas u ilizado pa a almacena da os en o ma legible. De i a del
lenguaje SGML y pe mi e de ini la g amá ica de lenguajes especí icos (como HTML) pa a
48
8. Diseño
8.1 – In oducción
El diseño del so wa e se encuen a en el núcleo écnico de la ingenie ía del so wa e y
se aplica independien emen e del modelo de diseño del so wa e que se u ilice. Una ez que
se analizan y especi ican los equisi os del so wa e, el diseño es la p ime a de las es
ac i idades écnicas – diseño, gene ación de código y p uebas – que se equie en pa a
cons ui y e i ica el so wa e. Cada ac i idad ans o ma la in o mación de mane a que dé
luga , po úl imo, a un so wa e alidado.
En gene al, la ac i idad del diseño se e ie e al es ablecimien o de las es uc u as de
da os, la a qui ec u a gene al del so wa e, las ep esen aciones de la in e az y los
algo i mos. Po an o, el diseño debe con empla odos los equisi os explíci os ob enidos en
la ase de análisis, debe se una guía que puedan lee y en ende los que cons uyen, p ueban
y man ienen el so wa e, y debe p opo ciona una idea comple a, en es e caso, de la
aplicación.
8.2 – A qui ec u a Clien e-Se ido
La a qui ec u a clien e-se ido es un modelo pa a el desa ollo de sis emas de
in o mación, en el que las ansacciones se di iden en p ocesos independien es que coope an
en e sí pa a in e cambia in o mación, se icios o ecu sos. Se denomina clien e al p oceso
que inicia el diálogo o solici a los ecu sos y se ido al p oceso que esponde a las solici udes.
En es e modelo las aplicaciones se di iden de o ma que el se ido con iene la pa e
que debe se compa ida po a ios usua ios y en el clien e pe manece sólo lo pa icula de
cada usua io.
En la aplicación los clien es ealizan unciones como:
 Maneja la in e az de usua io.
 Gene a consul as e in o mes sob e la base de da os.
El se ido ealiza, en e o as, las siguien es unciones:
 Con ola accesos concu en es a las bases de da os compa idas.
 Enlaces de comunicaciones con o as edes de á ea local o ex ensa.

49
8.3 – Se icios Web
A con inuación se desc iben los casos del diseño de equisi os más écnicamen e pa a
es ablece los p ocedimien os y pliegos que deben cub i se pa a u iliza los se icios web de
los cuales el aplica i o se nu e de in o mación.
8.3.1 – Se icio Lema izado
La llamada a las unciones del se icio lema izado , una ez ealizada la conexión con él
mismo se debe hace median e las siguien es nomencla u as.
El mé odo Reconoce se in oca median e la llamada “Lema izado . econoce ()”,
pasándole como pa áme os: la palab a a busca , que se á de ipo s ing o is a; idioma,
ambién de ipo s ing o is a y inalmen e el campo mul iP e ijos que se á de ipo boolean o
buleano. Como ejemplos de es a llamada se de allan las llamadas con las palab as habla y
cohabla ía.
 Habla : Reconoce ("habla ", "es", alse);
 Cohabla ía: Reconoce ("cohabla ía", "es", alse);
El p ime campo se á la palab a deseada, mien as que los dos siguien es campos
siemp e end án los mismos alo es “es” pa a deno a el idioma que siemp e se á español y
“ alse” pa a deno a que nunca se ha á una llamada pa a una palab a mul ip e ijo.
Es a unción siemp e de ol e á un bloque de ipo a ay o ec o con la siguien e
es uc u a:
<A ayO AnyType>
<anyType xsi: ype="A ayO AnyType">
<anyType xsi: ype="xsd:s ing">co</anyType>
<anyType xsi: ype="xsd:in ">146265</anyType>
<anyType xsi: ype="xsd:in ">21</anyType>
<anyType xsi: ype="xsd:in ">0</anyType>
<anyType xsi: ype="xsd:s ing">lo</anyType>
</anyType>
</A ayO AnyType>
Aunque en es e bloque es á especi icado, como deben se a ados los ipos de
elemen os que gua da, hay que ene en cuen a que el sis ema de uel e un a ay en el que
odos sus elemen os son de ipo Objec u Obje o. Dicho es o se explican que ep esen a cada
campo.
 Campo 1: un s ing que ep esen a el p e ijo de la pala a, si no iene es a á acío.
 Campo 2: con iene un en e o con la cla e de la o ma canónica de la palab a.
 Campo 3: en e o que ep esen a el código de lexión de la palab a consul ada.
 Campo 4: i ele an e.
 Campo 5: s ing que ep esen a el p onomb e enclí ico de la palab a consul ada.
50
Cuando la palab a consul ada no iene p onomb e enclí ico es e campo es a á acío.
Pa a lo in ini i os el código de lexión es uno.
Una ez ecibida la espues a de la llamada al mé odo “Reconoce ” se iene que hace
la llamada a o o mé odo del se icio lema izado . El mé odo u ilizado es “Consul a”. Como la
conexión al se icio es á hecha desde el an e io mé odo aho a solo se á necesa io hace la
llamada la unción median e la siguien e nomencla u a, “Lema izado .consul a()”.
Po an o la llamada “Consul a("146265" , "es", "canonicas");” lle a como p ime o
pa áme o alo con e ido a ipo s ing del campo 2 de la llamada al mé odo “Reconoce ”, el
cual lle a el código de la de la o ma canónica de la palab a in oducida po el usua io. El
segundo campo de es a llamada ambién es de ipo s ing y ep esen a el código del idioma
siemp e se á español y se á “es”. Pa a e mina , el e ce pa áme o de es a llamada siemp e
se á el mismo, un s ing, con la palab a canónicas.
La espues a a la Consul a de canónicas iene los siguien es campos:
 1º: s ing - Fo ma canónica.
 2º: in - Código de ca ego ía g ama ical.
 3º: in - Código de la lexión de la o ma canónica.
 4º: in - F ecuencia de apa ición.
 5º: in - Código de la ca ego ía con géne o y núme o.
Al igual que en el mé odo an e io es e bloque iene de uel o con eniendo
únicamen e ipos a ay los cuales deben de se a ado como s ings o en e os dependiendo
del da o que ep esen en.
Con los da os ob enidos de la llamada a es e úl imo mé odo se puede hace la llamada
al se icio Familias pa a ob ene inalmen e la amilia de palab as elacionadas con la palab a
in oducida, eniendo como aíz la o ma canónica de dicha palab a.
8.3.2 – Se icio Familias
La llamada a las unciones del se icio Familias, se ealizan de o ma simila al se icio
an e io . En p ime luga se ealiza la conexión con el se icio median e la u l:
h p:// ip.dis.ulpgc.es/Se icioFamilias/Familias.asmx.
El mé odo Consul a se in oca median e la llamada “Familias.consul a()”, pasándole
como pa áme os: la palab a a busca , que se á de ipo s ing o is a; idioma, ambién de ipo
s ing o is a y inalmen e el campo nomb e de la consul a:
 1º: s ing - Cla e o código
 2º: s ing - Idioma
 3º: s ing - nomb e de la consul a
Po an o, al ealiza la llamada Consul a(" o ma canónica", "es", " amilias"), se
ob ienen como esul ado un a ay de ipo Objec con los siguien es campos, uno po palab a:
51
 1º: in - Ca ego ía de la o ma canónica del p ime pa áme o.
 2º: in - Código de la amilia a la que pe enece.
 3º: s ing - Fo ma canónica de i ada de es a amilia.
 4º: in - - Ca ego ía de la o ma canónica de i ada de es a amilia.
 5º: in - Código del su ijo.
 6º: s ing - Su ijo.
 7º: in - 1 si la unión del su ijo ha sido egula y ce o si ha sido i egula .
 8º: in - Código del p e ijo.
 9º: s ing - P e ijo.
 10º: in - 1 si la unión del p e ijo ha sido egula y ce o si ha sido i egula .
A pa i de la in o mación ob enida en del se icio Familias podemos pasa al
a amien o de la misma pa a almacena la en un a chi o de la o ma que necesi a án las
lib e ías u ilizadas pa a la ep esen ación isual de la in o mación. Dicho iche o iene que
almacena la siguien e in o mación:
Campo
Con enido
Pa a cada nodo
Colo
Ca ac e ís ica del elemen o.
Fo ma
Ca ac e ís ica del elemen o.
Posición del nodo
Ca ac e ís ica del elemen o.
Palab a
La palab a en sí que ep esen a
ese nodo.
Su ijo
Su ijo.
P e ijo
P e ijo.
pad e
Nodo del que p o iene.
Fo ma canónica
Tipo de palab a.
Hijos
De ine los hijos que iene un nodo.
8.3.3 – Diag ama de es ados
Todo lo is o en los apa ados an e io es se ecoge en el siguien e esquema de lujo de
es ados.
52
Figu a 6. Diag ama de es ados
8.4 – Aplicación mul ilenguaje
La aplicación mul ilenguaje se ealiza c eando a chi os de lenguajes en la ca pe a
“App_GlobalResou ces”, es os a chi os son ablas con la siguien e es uc u a:
Nomb e
Valo
Comen a io
Cla e que se co esponde
con el ID del elemen o de
la es uc u a.
S ing con el ex o en el
idioma seleccionado.
Comen a io explica i o
opcional.
53
8.5 – Pan alla comple a
La necesidad de cub i es e equisi o su ge, cuando el desa ollo es aba bas an e
a anzado y ocu e que algunas amilias de palabas son an g andes, incluyendo las elaciones
aíz hijos e hijos nie os que se hace bas an e incómodo pa a el usua io la consul a e
in e acción con el g a o y la in o mación que es e con iene. La Figu a 7. Pan alla no mal
mues a la necesidad de desa olla una pan alla comple a po la incomodidad de u iliza la
pan alla ac ual pa a algunas consul as.
Figu a 7. Pan alla no mal
En p incipio es e diseño se ha ealizado sus i uyendo el diseño de abla de il os
an e io po uno ep esen ado en línea y añadiendo al diseño inicial un bo ón de Pan alla
comple a, pa a cambia de is a cuando el usua io lo necesi e. La siguien e igu a mues a el
diseño de pan alla comple a donde desapa ecen de la is a la cabece a de la página y el pie.
Figu a 8. Pan alla comple a

54
9. Desa ollo
En es a sección se p ocede á a explica la ase de implemen ación ealizada pa a el
p oyec o. Se de alla án aspec os muy impo an es, po ejemplo, pun os ele an es de la
in e az, paque es ex e nos u ilizados, pa es más impo an es de los módulos desa ollados,
ecnologías u ilizadas, e c.
El código uen e al comple o se puede encon a en el CD adjun o a la memo ia. A
con inuación dedica emos algunos apa ados a los aspec os más ele an es de es a ase.
9.1 – Lib e ías
A con inuación se de alla án las lib e ías, ex e nas a ASP.Ne , u ilizadas y el abajo
ealizado sob e cada una de ellas pa a ob ene los esul ados eque idos.
9.1.1 – A bo .js
Como pun o de pa ida y p incipal obje i o de es e p oyec o es á el consegui que la
nue a aplicación p opo cione una in e az g á ica muy po en e, isualmen e amigable,
omen ando la in e ac uación del usua io con la in o mación y animada.
Es a lib e ía de AJAX p opo ciona algunos de es os a ibu os, con la posibilidad de
desa olla la aún más pa a llega a cub i los odos e incluso ob ene nue as cualidades en la
ep esen ación isual, pa a posibles u u os p oyec os con es a aplicación. “A bo .js” ue
descubie a cuando se ealizaban indagaciones sob e la ep esen ación g á ica de á boles o
g a os y a pa i de ecibi el benepláci o del u o se empezó a abaja en la misma pa a
cumpli obje i os.
El p incipal equisi o a ene en cuen a es que los g á icos de es a lib e ía deben se
dibujados en un elemen o Can as de HTML5, lo cual no esul a un p oblema po que la
es uc u a de ASP.Ne acep a elemen os de HTML5. Además la ins alación de es a lib e ía es
muy simple, únicamen e hay que añadi los a chi os siguien es:
 Jque y.min.js: Libe ia básica de Jque y pa a u iliza las unciones p incipales del
leguaje.
 A bo .js: Con iene las unciones y p ocedimien os pa a o ma un g a o.
 A bo - ween.js: Apo a a la lib e ía an e io colo es, mo imien o en iempo eal y
animación.
 Si e.js: lib e ía que dibuja en el can as el á bol, a pa i de un a chi o de
almacenamien o Json, y aplica las unciones de e en os pa a la in e ac uación con el
á bol median e el pun e o.
55
Las modi icaciones más impo an es han sido sob e “si e.js”, que como a chi o más
signi ica i o de es a lib e ía se á el que aglu ina las unciones que se deben modi ica , añadi y
bo a pa a ob ene los esul ados espe ados.
Las p ime as unciones añadidas han sido las que con olan la isualización del
con enido de cada una de las pes añas del elemen o AJAX “TabCon aine ” que sepa a en
pes añas cada uno de los g a os que gene an los se icios web a pa i de la consul a del
usua io.
O o pun o impo an e a des aca en es e a chi o es la modi icación de la unción que
asigna la u a del a chi o que usa la lib e ía pa a cons ui los g a os, siemp e de ipo Json,
pa a que u ilice el a chi o c eado y modi icado siemp e que se cambien las condiciones o
p e e encias de mues eo de los mismos. El código del mismo se mues a a con inuación:
a heUI = ( unc ion () {
a u l = "json/" + ile;
a heUI = null;
$.ajax({
'async': alse,
'global': alse,
'u l': u l,
'da aType': "json",
'success': unc ion (da a) {
heUI = da a;
}
});
e u n heUI;
})
Una unción que se ha modi icado pa a consegui un obje i o impo an e es la unción
“clicked” que o iginalmen e hacía la unción de pe mi i mo e y a as a los nodos del g a o,
además de enlaza los nodos que enían enlaces con o as páginas. El código modi icado ha
pe mi o segui mo iendo y a as ando los nodos además se ha añadido la unción de pode
ealiza doble click sob e un nodo cualquie a que no enga la posición aíz del g a o, y
au omá icamen e la aplicación mues a el subá bol esul an e de hace el nodo seleccionado
la aíz y pode e así has a sus nie os, si los hubie a. El código ejemplo se mues a a
con inuación:
// a iable global pa a doble click
a clicks = 0;
clicked: unc ion (e) {
clicks++;
i (clicks == 1){
se Timeou ( unc ion(){
a pos = $(can as).o se ();
_mouseP = a bo .Poin (e.pageX -
pos.le , e.pageY - pos. op)
nea es = d agged =
sys.nea es (_mouseP);
i (clicks == 1){
i (d agged && d agged.node !==
null) d agged.node. ixed = alse;
$(can as).unbind('mousemo e', handle .mo ed);
56
$(can as).bind('mousemo e',
handle .d agged)
$(window).bind('mouseup',
handle .d opped)
}
else{//Doble click
$(can as).unbind('mousemo e', handle .mo ed);
$(can as).unbind('mousemo e', handle .d agged)
$(window).unbind('mouseup',
handle .d opped)
a nomb eNodo =
d agged.node.da a.palab a;
console.log(nomb eNodo);
documen .ge Elemen ById('MainCon en _palab a'). alue = nomb eNodo;
documen .ge Elemen ById('MainCon en _bo on').click();
}
clicks = 0;
}, 300)
}
e u n alse;
}
O a unción modi icada, en es e a chi o “si e.js” ha sido “mo ed” mos a los nodos
nie os que pe manecen ocul os no malmen e al pasa el pun e o del a ón po encima de un
nodo hoja. El código es el siguien e:
mo ed: unc ion (e) {
a pos = $(can as).o se ();
_mouseP = a bo .Poin (e.pageX - pos.le ,
e.pageY - pos. op);
nea es = sys.nea es (_mouseP);
i (!nea es .node) e u n alse;
i (nea es .node.da a.shape != 'do ') {
selec ed = (nea es .dis ance < 50) ?
nea es : null;
} else i ($.inA ay(nea es .node.name,
allnodes) >= 0) {//c eamos nues o p opio a ay
i (nea es .node.name != _sec ion) {
_sec ion = nea es .node.name;
ha .swi chSec ion(_sec ion);
}
}
e u n alse;
}
La úl ima unción que ha sido modi icada de es a lib e ía es la unción “ ed aw”. Es a
unción edibuja en iempo eal el g a o pa a encuad a lo de o ma co ec a den o del
elemen o can as y que los elemen os del mismo no se sob epongan en e ellos o sob e salgan
57
del ma co del á ea de dibujo. Se ha modi icado pa a pode añadi e ique as a cada a is a del
g a o –P e ijos y/o Su ijos – como se mues a en la Figu a X. A is as del g a o.
Figu a 9. A is as del g a o.
El código de es a unción que posibili a añadi es as e ique as en el siguien e:
ed aw: unc ion () {
g x.clea ()
sys.eachEdge( unc ion (edge, p1, p2) {
i (edge.sou ce.da a.alpha *
edge. a ge .da a.alpha == 0) e u n;
g x.line(p1, p2, { s oke: "#b2b19d", wid h: 2,
alpha: edge. a ge .da a.alpha });
//Se esc ibe el label co espondien e a cada
edge encima de la línea
c x.s okeS yle = " gba(0,0,0, .333)";
c x.lineWid h = 1;
c x.beginPa h();
c x.mo eTo(p1.x, p1.y);
c x.lineTo(p2.x, p2.y);
c x.s oke();
c x. on = 'i alic 13px sans-se i ';
i (edge.da a.su !== "") {
c x. illS yle = "black";
c x. illTex (edge.da a.su , (p1.x + p2.x) /
2, (p1.y + p2.y) / 2);
}
i (edge.da a.p e !== "") {
c x. illS yle = "g een";
a pos = 0;
i (edge.da a.su !== "") {//Si no es nulo,
se coloca el p e ijo a iba del su ijo
pos = 2.22;
}
else {//Si no hay su ijo, se coloca en su
si io co ec o
pos = 2;
}
c x. illTex (edge.da a.p e, (p1.x + p2.x) /
2, ((p1.y + p2.y)) / pos);
}
});
sys.eachNode( unc ion (node, p ) {
64
<ajaxToolki :TabCon aine ID="TabCon aine 1" una ="se e "
Ac i eTabIndex="0" Au oPos Back=" alse"
Heigh ="370px" Wid h="1163px" s yle="ma gin- igh : 15px"
Sc ollBa s="Bo h" Visible=" alse">
<ajaxToolki :TabPanel una ="se e " Heade Tex ="TabPanel1"
ID="TabPanel1" OnClien Click="cambio1">
<Con en Templa e>
<can as heigh ="522" wid h="1048" id="si emap0"
class=""></can as>
</Con en Templa e>
</ajaxToolki :TabPanel>
<ajaxToolki :TabPanel ID="TabPanel2" una ="se e "
Heade Tex ="TabPanel2" Visible="False" OnClien Click="cambio2">
<Con en Templa e>
<can as heigh ="522" wid h="1048" id="si emap1"
class=""></can as>
</Con en Templa e>
</ajaxToolki :TabPanel>
<ajaxToolki :TabPanel ID="TabPanel3" una ="se e "
Heade Tex ="TabPanel3" Visible="False" OnClien Click="cambio3">
<Con en Templa e>
<can as heigh ="522" wid h="1048" id="si emap2"
class=""></can as>
</Con en Templa e>
</ajaxToolki :TabPanel>
<ajaxToolki :TabPanel ID="TabPanel4" una ="se e "
Heade Tex ="TabPanel4" Visible="False" OnClien Click="cambio4">
<Con en Templa e>
<can as heigh ="522" wid h="1048" id="si emap3"
class=""></can as>
</Con en Templa e>
</ajaxToolki :TabPanel>
<ajaxToolki :TabPanel ID="TabPanel5" una ="se e "
Heade Tex ="TabPanel5" Visible="False" OnClien Click="cambio5">
<Con en Templa e>
<can as heigh ="522" wid h="1048" id="si emap4"
class=""></can as>
</Con en Templa e>
</ajaxToolki :TabPanel>
</ajaxToolki :TabCon aine >
Tan o el panel como las pes añas es án ocul os po de ec o siendo solo mos adas a
pa i de que la consul a ealizada po el usua io las necesi e. Un ejemplo del modo de
uncionamien o del panel es la palab a ue que de uel e dos pes añas con la o ma canónica I
y o a con la o ma canónica Se , como se puede e en la igu a Figu a16. Con enedo po
pes aña.

65
Figu a 10. Con enedo po pes añas
9.2 – Conexión con los se icios Web
Pa a cub i es e aspec o se con ó con in o mación de allada adqui ida an o en las
euniones iniciales con el u o del p oyec o como con in o mes acili ados po el mismo.
En p ime luga hay que ealiza la conexión en el en o no de desa ollo Visual S udio
2010, dando que los se icios Web es án ya es ablecidos y uncionando con la aplicación
an e io .
Pa a ealiza la conexión con los se icios Lema izado y Familias, bas a con ag ega
una e e encia de se icio al p oyec o web y en opciones a anzadas selecciona Ag ega
e e encia de se icio. En el cuad o de dialogo que se ab e hay que ellena los campos
necesa ios: di ección URL y nomb e que end á el se icio en la aplicación. En el p opio cuad o
de dialogo se puede comp oba que la conexión se ha ealizado co ec amen e, po que en la
en ana web de la consola apa ecen la in o mación del se icio – mé odos implemen ados,
desc ipción gene al del se icio, o ma de conec a con él, e c. – La igu a X mues a que la
conexión es á co ec amen e ealizada, al habe ca gado la in o mación del mismo en la
en ana del na egado .
66
Figu a 11. Conexión Se icios Web
Una ez ag egados al p oyec o ambas e e encias al se icio web ya se puede hace
uso de los mismos en el código pa a ob ene la in o mación necesa ia del co pus de palab as,
así como las elaciones mo oléxicas de las mismas. Es a in o mación debe ecibi un
a amien o especial en algunos casos que se án explicados más adelan e. Aho a solo cabe
nomb a que la in o mación debe se almacenada linealmen e pa a ello se ha u ilizado la Clase
p opo cionada po Visual C#, Dic iona y<key, alue>. Es a clase p o ee al usua io de un
almacén en línea donde se almacenan alo es accesibles po cla e. Pa a más in o mación
sob e es a clase éase el apa ado 9.1.2 – Json.NET.
9.3 – Va iables de sesión
En la aplicación web que es amos desa ollando, hacemos uso de a iables de sesión
pa a almacena in o mación sob e cada uno de los usua ios que acceden a la aplicación y lee
dicha in o mación en dis in os momen os con los siguien es p opósi os:
 Realiza un con ol de usua ios ac i os.
 Almacena la in o mación de las búsquedas en el espacio asignado a cada usua io.
 Elimina la in o mación gene ada du an e el uso de la aplicación que deja un usua io
conc e o cuando cie a dicha aplicación.
El iche o global.asax con iene el código pa a implemen a las uncionalidades
desc i as an e io men e. En p ime luga , se decla a una lis a pa a lle a el con ol de las
67
sesiones ac i as iden i icándolas po medio de su ID y que se a a man ene a lo la go de oda
la ida de la aplicación:
p i a e s a ic Lis <S ing> _sessionIn o;
p i a e s a ic eadonly objec padlock = new objec ();
public s a ic Lis <s ing> Sessions
{
ge
{
lock (padlock)
{
i (_sessionIn o == null)
{
_sessionIn o = new Lis <s ing>();
}
e u n _sessionIn o;
}
}
}
Al inicia se la aplicación, au omá icamen e se lanza el p ocedimien o
Applica ion_S a , donde se inicializa la u a de eposi o io que con iene oda la
in o mación de odos los usua ios y el núme o de usua ios que se conec an a la aplicación:
oid Applica ion_S a (objec sende , E en A gs e)
{
// Código que se ejecu a al inicia se la aplicación
Applica ion["Usua iosConec ados"] = 0;
Applica ion["Ru aReposi o io"]=Se e .MapPa h("~")+@" json ";
}
Cada ez que un usua io accede a la aplicación web, se lanza el p ocedimien o
Session_S a , que inc emen a el núme o de usua ios ac i os y c ea una ca pe a p opia
pa a sólo dicho usua io en el eposi o io la cual con end á sus búsquedas. Además, se añade el
ID de la sesión de es e usua io a la lis a de sesiones ac i as pa a pode ges iona las sesiones
adecuadamen e.
oid Session_S a (objec sende , E en A gs e)
{
// Código que se ejecu a cuando se inicia una nue a sesión
Applica ion["Usua iosConec ados"]=(in )Applica ion["Usua io
sConec ados"] + 1;
Session["CodigoUsua io"] = Session.SessionID;
S ing CodigoUsua io = (s ing)(Session["CodigoUsua io"]);
S ing u l = Se e .MapPa h("~/json/" +
Session["CodigoUsua io"]);
Di ec o y.C ea eDi ec o y(u l);
Sessions.Add(Session.SessionID);
}
Cuando el usua io pe manece inac i o du an e un pe iodo de iempo o cie a la
aplicación, en onces se lanza el p ocedimien o Session_End que elimina su sesión de la lis a
de sesiones ac i as y elimina del eposi o io la ca pe a usada po dicho usua io y oda la
in o mación con enida en él:
68
oid Session_End(objec sende , E en A gs e)
{
S ing u l = Applica ion["Ru aReposi o io"].ToS ing();
Lis <S ing> ss = Sessions;
//Elimina el di ec o io usado po el usua io en su sesión.
S ing[] ca pe as = Di ec o y.Ge Di ec o ies(u l);
o each (S ing ca pe a in ca pe as)
{
S ing nomb eS =
ca pe a.Subs ing(ca pe a.Las IndexO (" ") + 1);
i (!Global.Sessions.Con ains(nomb eS))
{
Di ec o y.Dele e(ca pe a, ue);
}
}
Applica ion["Usua iosConec ados"]=(in )Applica ion["Usua io
sConec ados"] - 1;
}
Además, en el iche o Web.con ig se comp ueba que es é incluido la siguien e línea
de código:
<sessionS a e mode=”InP oc” imeou =”10”></sessionS a e>
Dónde:
 mode=”InP oc”, es el modo po de ec o de es ado de sesión. Especi ica que los alo es
del es ado de la sesión se almacenan en la memo ia del se ido Web local. És e es el
único modo que sopo a el e en o Session_End.
 imeou =”10”, especi ica el núme o de minu os que una sesión puede es a inac i a
an es de que se abandone. Po de ec o, el alo de es e a ibu o es de 20, indicando
20 minu os. Pe o se ha educido a 10 minu os.
9.4 – Pos VS Ge
Du an e el desa ollo de la aplicación, el p oblema que se encon ó ue que al
p esiona sob e el bo ón de ‘A ás’ del na egado el documen o de uel o había expi ado.
Es e p oblema no es á elacionado con las cabece as de con ol de caché, ya que el
mismo e o apa ece pa a páginas que incluyen es as cabece as. El p oblema eside en que al
p og ama en ASP.NET – C#, po de ec o, los e en os de cualquie a de los elemen os se en ían
al se ido ía HTTP POST. Es o signi ica que el se ido e es o como un en ío de o mula io, y
los na egado es ac uales ienen mecanismos de p e ención con a el een ío del mismo
o mula io múl iples eces, ya sea po que usua ios sin expe iencia puedan ealiza es a
ope ación po acciden e y sin ene conocimien o de ello.
La solución es en ia las consul as a a és del mé odo HTTP GET. Pa a ello,
in oducimos en la URL la palab a in oducida pa a busca su amilia. De es a o ma, cuando el
usua io p esiona sob e el bo ón Relaciones se lanza el p ocedimien o que con ola dicho
e en o y se cons uye la URL con la palab a in oducida como pa áme o de búsqueda y se
edi ige a la misma página. El código es el siguien e:
p o ec ed oid Bu on1_Click(objec sende , E en A gs e)
69
{
S ing an iguo = palab a.Tex ;
S ing pa ame os = @"?Sea chPa ame e s=" + an iguo;
S ing sea chU l = "De aul .aspx" + pa ame os;
Response.Redi ec (sea chU l);
}
Al edi igi a la misma página, hay que ene en conside ación que el se ido en iende
es a ope ación como se es á ca gando po p ime a ez la página aunque la URL sea la misma, y
no po que se haya e escado. Po an o, en el p ocedimien o Page_Load, lanzado po
de ec o al ca ga cualquie página, p ime o se comp ueba que la página se es á ca gando po
p ime a ez median e la comp obación de IsPos Back, a con inuación se comp ueba que en
la URL el pa áme o Sea chPa ame e s enga algún alo y si es el caso, se in oduce en el
inpu y se llama al p ocedimien o Relaciones pa a busca su amilia. El código es el siguien e:
p o ec ed oid Page_Load(objec sende , E en A gs e)
{
i (!IsPos Back)
{
i (!s ing.IsNullO Emp y(Reques .Que yS ing["Sea ch
Pa ame e s"]))
{
i
(!s ing.IsNullO Emp y(Reques .Que yS ing[" ull"]))
{
S ing ull =
Reques .Que yS ing[" ull"];
H mlGene icCon ol heade =
(H mlGene icCon ol)Mas e .FindCon ol("heade ");
H mlGene icCon ol
oo e Gene al =
(H mlGene icCon ol)Mas e .FindCon ol(" oo e Gene a
l");
i ( ull.Con ains("1")){
heade .Visible = alse;
oo e Gene al.Visible =
alse;
Session["Pan allaComple a"] = ue;
Bu on3.Visible = alse;
Bu on4.Visible = ue;
}
else
{
heade .Visible = ue;
oo e Gene al.Visible =
ue;
Session["Pan allaComple a"] = alse;
Bu on3.Visible = ue;
Bu on4.Visible = alse;
}
}
i
(!s ing.IsNullO Emp y(Reques .Que yS ing["Fil e s"
]))
{
S ing il =
Reques .Que yS ing["Fil e s"];
i ( il.Con ains("1"))
CheckBox1.Checked = alse;
i ( il.Con ains("2"))
CheckBox2.Checked = alse;

70
i ( il.Con ains("3"))
CheckBox3.Checked = alse;
i ( il.Con ains("4"))
CheckBox4.Checked = alse;
i ( il.Con ains("5"))
CheckBox5.Checked = alse;
i ( il.Con ains("6"))
CheckBox6.Checked = alse;
i ( il.Con ains("7"))
CheckBox7.Checked = alse;
i ( il.Con ains("8"))
CheckBox8.Checked = alse;
}
palab a.Tex =
Reques .Que yS ing["Sea chPa ame e s"];
i
(!s ing.IsNullO Emp y(Reques .Que yS ing[" elacion
es"]) &&
Reques .Que yS ing[" elaciones"].Con ains("1"))
{
Relaciones();
}
else i
(!s ing.IsNullO Emp y(Reques .Que yS ing[" elacion
es"]) &&
Reques .Que yS ing[" elaciones"].Con ains("2"))
{
Relaciones2();
}
else
{
TabCon aine 1.Visible =
ue;
Table1.Visible = ue;
S ing[] ich =
Session[" iche osAc uales"].ToS ing().Spli (',');
in numFich = ich.Leng h;
i (numFich == 0)
{
e o .Visible = ue;
TabCon aine 1.Visible =
alse;
Table1.Visible = alse;
}
i (numFich >= 1)
{
TabPanel1.Heade Tex =
Ob ene Nomb e( ich[0]);
TabPanel1.Visible =
ue;
}
i (numFich >= 2)
{
TabPanel2.Heade Tex =
Ob ene Nomb e( ich[1]);
TabPanel2.Visible =
ue;
}
i (numFich >= 3)
{
TabPanel3.Heade Tex =
Ob ene Nomb e( ich[2]);
TabPanel3.Visible =
ue;
}
i (numFich >= 4)
{
71
TabPanel4.Heade Tex =
Ob ene Nomb e( ich[3]);
TabPanel4.Visible =
ue;
}
i (numFich == 5)
{
TabPanel5.Heade Tex =
Ob ene Nomb e( ich[4]);
TabPanel5.Visible =
ue;
}
Clien Sc ip .Regis e S a upSc ip (Page.Ge Type(),
"in oca uncion", "inicializa('" +
Session[" iche osAc uales"] + "','"
+Session["CodigoUsua io"] + "');", ue);
}
}
}
}
9.5 – In e az
El obje i o en cuan o a la in e az ha sido el de ealiza un abajo de sencillez e
in uición pa a que el usua io no enga dudas en cuan o al uncionamien o del aplica i o. Po
an o, la po ada del si io solo mues a la in o mación de cabece a a modo de banne , el
con enido inicial –casilla pa a in oduci la palab a y bo ón de búsqueda– y la in o mación de
pie de página además de la posibilidad de cambio de idioma. La Figu a16. Po ada del si io,
se á la siguien e:
Figu a 12. Po ada del si io
Una ez el usua io ha in oducido una palab a y ealizado una búsqueda la in e az
mos a á además del con enido ya mencionado, una abla de casillas Checkbox con las
di e en es opciones de il ado que el usua io puede hace según ipo de amilia y según ipo
72
de ca ego ía g ama ical y un elemen o con enedo donde se dibuja án los di e en es g a os
sepa ados po pes añas, quedando la in e az como mues a la Figu a 17. In e az de consul a.
Figu a 13. In e az de consul a
9.5 – Idioma
O o equisi o que se ha enido en conside ación en el desa ollo de es e p oyec o ha
sido la posibilidad de desa olla un si io mul ilenguaje. Es e abajo se ha ealizado de la
siguien e o ma.
En la in e az donde se mos a án los ex os clasi icados po idiomas es án
e e enciados median e un sis ema de e ique as que sus i uye al ex o donde no malmen e
es a ía el campo del mismo en cada elemen o de la es uc u a g á ica Asp.Ne .
Ejemplo:
<asp:Label ID="Label2" una ="se e " Tex ="<%$Resou ces:LocalizedTex , Label2
%>" ></asp:Label>
En el campo Tex se encuen a una e ique a con la cla e Resou ces, que se e ie e a los
a chi os de ecu sos, nomb ando el a chi o eque ido después de los dos pun os y añade
después de la coma la cla e del ex o eque ido.
El con ol de idiomas se ha á desde la selección po de ec o que enga el na egado
del usua io y además se añadi án dos imágenes bo ón con las bande as española y b i ánica
pa a que cada usua io, pueda cambia el idioma de la aplicación a golpe de a ón.
Como la globalización de a chi os de ecu sos, se ha decla ado en la clase Mas e Page
se ha buscado una solución pa a implemen a la, ya que no se puede llama al mé odo
Ini ializedCul u e(). El o ma o escogido pa a dicha implemen ación ha sido es ablece la
selección de idioma en el a chi o Global.asax, donde se añadió el siguien e p ocedimien o:
//Código de p ueba pa a aplicación mul i-lenguaje
73
p o ec ed oid Applica ion_BeginReques (objec sende ,
E en A gs e)
{
H pCookie cookie = Reques .Cookies["Cul u eIn o"];
i (cookie != null && cookie.Value != null)
{
Th ead.Cu en Th ead.Cu en UICul u e = new
Sys em.Globaliza ion.Cul u eIn o(cookie.Value);
Th ead.Cu en Th ead.Cu en Cul u e = new
Sys em.Globaliza ion.Cul u eIn o(cookie.Value);
}else{
Th ead.Cu en Th ead.Cu en UICul u e = new
Sys em.Globaliza ion.Cul u eIn o("es-ES");
Th ead.Cu en Th ead.Cu en Cul u e = new
Sys em.Globaliza ion.Cul u eIn o("es-ES");
}
}
A con inuación en el iche o Si e.Mas e se incluye on, a pie de página, bo ones de
enlace pa a los idiomas disponibles – inglés y español – con o ma de bande as.
El código de es uc u a de los bo ones es el siguien e:
<asp:ImageBu on ID="ImageBu on1" una ="se e " ImageAlign="Bo om"
ImageU l="~/G aphics/bande a_ES.png" OnClick="ImageBu on1_Clicked" />
<asp:ImageBu on ID="ImageBu on2" una ="se e "
ImageU l="~/G aphics/bande a_EN.png" OnClick="ImageBu on2_Clicked" />
Finalmen e en el Si e.Mas e .cs se incluyó el código pa a los manejado es de e en os
de dichos bo ones:
public oid ImageBu on1_Clicked(objec sende , E en A gs e)
{
H pCookie cookie = new H pCookie("Cul u eIn o");
cookie.Value = "es-ES";
Response.Cookies.Add(cookie);
Th ead.Cu en Th ead.Cu en Cul u e = new Cul u eIn o("es-ES");
Th ead.Cu en Th ead.Cu en UICul u e = new Cul u eIn o("es-ES");
//Se e .T ans e (Reques .Pa h);
i (Session["Pa ame os"] != null)
{
S ing p = Session["Pa ame os"].ToS ing();
Session["Pa ame os"] = null;
Response.Redi ec (Reques .Pa h + p);
}
else
{
Response.Redi ec (Reques .Pa h);
}
}
public oid ImageBu on2_Clicked(objec sende , E en A gs e)
{
H pCookie cookie = new H pCookie("Cul u eIn o");
cookie.Value = "EN";
Response.Cookies.Add(cookie);
80
}
else
{
Response.Redi ec (Reques .Pa h);
}
}
public oid ImageBu on2_Clicked(objec sende , E en A gs e)
{
//Session["idioma"] = "en";
//Th ead.Cu en Th ead.Cu en UICul u e = new
Sys em.Globaliza ion.Cul u eIn o("EN");
H pCookie cookie = new H pCookie("Cul u eIn o");
cookie.Value = "EN";
Response.Cookies.Add(cookie);
//Se he cul u e and eload o immedia e e ec .
//Fu u e e ec s a e handled by Global.asax
Th ead.Cu en Th ead.Cu en Cul u e = new Cul u eIn o("EN");
Th ead.Cu en Th ead.Cu en UICul u e = new Cul u eIn o("EN");
//Se e .T ans e (Reques .Pa h);
i (Session["Pa ame os"] != null)
{
S ing p = Session["Pa ame os"].ToS ing();
Session["Pa ame os"] = null;
Response.Redi ec (Reques .Pa h + p);
}
else
{
Response.Redi ec (Reques .Pa h);
}
}
}
}
De aul .aspx
<%@ Page Ti le="Familias TIP" Language="C#" Mas e PageFile="~/Si e.mas e "
Au oE en Wi eup=" ue"
CodeBehind="De aul .aspx.cs" Inhe i s="FamiliasMo olexicas._De aul " %>
<%@ Mas e Type i ualpa h="~/Si e.Mas e " %>
<%@ Impo Namespace="Sys em.Th eading" %>
<%@ Impo Namespace="Sys em.Globaliza ion" %>
<sc ip una ="se e ">
p o ec ed o e ide oid Ini ializeCul u e()
{
S ing idioma = "";
i (Session["idioma"] != null) idioma = Session["idioma"].ToS ing();
i (Reques .U l.ToS ing().IndexO ("lang=EN") > 0 ||
idioma.Con ains("en"))
{
UICul u e = "en";
Cul u e = "en";
Th ead.Cu en Th ead.Cu en Cul u e =
Cul u eIn o.C ea eSpeci icCul u e("en");
Th ead.Cu en Th ead.Cu en UICul u e = new Cul u eIn o("en");
}

81
i (Reques .U l.ToS ing().IndexO ("lang=ES") > 0 ||
idioma.Con ains("es"))
{
UICul u e = "es";
Cul u e = "es";
Th ead.Cu en Th ead.Cu en Cul u e =
Cul u eIn o.C ea eSpeci icCul u e("es");
Th ead.Cu en Th ead.Cu en UICul u e = new Cul u eIn o("es");
}
base.Ini ializeCul u e();
}
</sc ip >
<asp:Con en ID="Heade Con en " una ="se e "
Con en PlaceHolde ID="HeadCon en ">
<link el="s yleshee " h e ="S yles/s yle.css" ype=" ex /css"/>
<!--Lib e ía añadida pa a u ilización de la unción doble click-->
<sc ip ype=" ex /ja asc ip " s c="h p://code.jque y.com/jque y-
1.9.1.js"></sc ip >
</asp:Con en >
<asp:Con en ID="BodyCon en " una ="se e " Con en PlaceHolde ID="MainCon en ">
<di s yle="wid h: 100%; heigh : au o; padding- op: 15px; padding-le : 15px;
backg ound-colo : # c;">
<asp:Label ID="Label2" una ="se e " Tex ="<%$Resou ces:LocalizedTex ,
Label2 %>" Fon -Size="Medium" S yle=" ex -align: le " Fon -Bold="T ue"
Fo eColo ="#666666"></asp:Label>
<asp:Tex Box ID="palab a" una ="se e " MaxLeng h="500" Wid h="50%" Fon -
Size="Medium" Au oComple eType="Disabled" Bo de S yle="Inse "
Bo de Wid h="2px"></asp:Tex Box>
<asp:Bu on ID="bo on" una ="se e " OnClick="Bu on1_Click"
Tex ="<%$Resou ces:LocalizedTex , bo on %>" Wid h="145px" />
<asp:Bu on ID="Bu on3" una ="se e " OnClick="Bu on3_Click"
Tex ="<%$Resou ces:LocalizedTex , Bu on3 %>" Wid h="145px"
Visible="False" />
<asp:Bu on ID="Bu on4" una ="se e " OnClick="Bu on4_Click"
Tex ="<%$Resou ces:LocalizedTex , Bu on4 %>" Wid h="145px" Visible="False" />
</di >
<di s yle="wid h: 100%; heigh : au o; padding-bo om: 5px; padding-le :
15px; backg ound-colo : # c; padding- op: 5px;" >
<asp:Label ID="e o " una ="se e " Visible=" alse"
Tex ="<%$Resou ces:LocalizedTex , e o %>"></asp:Label>
<asp:Label ID="a iso" una ="se e " Visible=" alse"
Tex ="<%$Resou ces:LocalizedTex , a iso %>"></asp:Label>
<asp:Label ID="a iso2" una ="se e " Visible=" alse"
Tex ="<%$Resou ces:LocalizedTex , a iso2 %>"></asp:Label>
<asp:Table ID="Table1" una ="se e " CellPadding="5"
G idLines="ho izon al"
Wid h="86em" isible=" alse">
<asp:TableRow>
<asp:TableCell ID=" ipo" Tex ="<%$Resou ces:LocalizedTex , ipo
%>" Fon -Bold="T ue"></asp:TableCell>
<asp:TableCell><asp:CheckBox ID="CheckBox1" una ="se e "
Tex ="<%$Resou ces:LocalizedTex , CheckBox1 %>" Checked="T ue" /></asp:TableCell>
<asp:TableCell><asp:CheckBox ID="CheckBox2" una ="se e "
Tex ="<%$Resou ces:LocalizedTex , CheckBox2 %>" Checked="T ue" /></asp:TableCell>
<asp:TableCell><asp:CheckBox ID="CheckBox3" una ="se e "
Tex ="<%$Resou ces:LocalizedTex , CheckBox3 %>" Checked="T ue" /></asp:TableCell>
82
<asp:TableCell><asp:CheckBox ID="CheckBox4" una ="se e "
Tex ="<%$Resou ces:LocalizedTex , CheckBox4 %>" Checked="T ue" /></asp:TableCell>
<asp:TableCell ID="g ama ical" Tex ="<%$Resou ces:LocalizedTex ,
g ama ical %>" Fon -Bold="T ue"></asp:TableCell>
<asp:TableCell><asp:CheckBox ID="CheckBox5" una ="se e "
Tex ="<%$Resou ces:LocalizedTex , CheckBox5 %>" Checked="T ue" /></asp:TableCell>
<asp:TableCell><asp:CheckBox ID="CheckBox6" una ="se e "
Tex ="<%$Resou ces:LocalizedTex , CheckBox6 %>" Checked="T ue" /></asp:TableCell>
<asp:TableCell><asp:CheckBox ID="CheckBox7" una ="se e "
Tex ="<%$Resou ces:LocalizedTex , CheckBox7 %>" Checked="T ue" /></asp:TableCell>
<asp:TableCell><asp:CheckBox ID="CheckBox8" una ="se e "
Tex ="<%$Resou ces:LocalizedTex , CheckBox8 %>" Checked="T ue" /></asp:TableCell>
<asp:TableCell Bo de S yle="None"><asp:Bu on ID="aplica "
una ="se e " Tex ="<%$Resou ces:LocalizedTex , aplica %>"
OnClick="Bu on2_Click"/></asp:TableCell></asp:TableRow>
</asp:Table>
</di >
<b />
<sc ip ype=" ex /ja asc ip " s c="Sc ip s/jque y-1.6.1.min.js"></sc ip >
<sc ip ype=" ex /ja asc ip " s c="Sc ip s/a bo .js"></sc ip >
<sc ip ype=" ex /ja asc ip " s c="Sc ip s/a bo - ween.js"></sc ip >
<sc ip ype=" ex /ja asc ip " s c="Sc ip s/a bo -g aphics.js"></sc ip >
<sc ip ype=" ex /ja asc ip " s c="Sc ip s/si e.js"></sc ip >
<ajaxToolki :Toolki Sc ip Manage ID="sm1" una ="se e "
EnableHis o y=" ue"
EnableSecu eHis o yS a e=" alse"></ajaxToolki :Toolki Sc ip Manage >
<ajaxToolki :TabCon aine ID="TabCon aine 1" una ="se e "
Ac i eTabIndex="0" Au oPos Back=" alse"
Heigh ="40em" Wid h="108em" s yle="ma gin- igh : 15px" Sc ollBa s="Bo h"
Visible=" alse">
<ajaxToolki :TabPanel una ="se e " Heade Tex ="TabPanel1"
ID="TabPanel1" OnClien Click="cambio1">
<Con en Templa e>
<can as heigh ="522" wid h="1048" id="si emap0"
class=""></can as>
</Con en Templa e>
</ajaxToolki :TabPanel>
<ajaxToolki :TabPanel ID="TabPanel2" una ="se e "
Heade Tex ="TabPanel2" Visible="False" OnClien Click="cambio2">
<Con en Templa e>
<can as heigh ="522" wid h="1048" id="si emap1"
class=""></can as>
</Con en Templa e>
</ajaxToolki :TabPanel>
<ajaxToolki :TabPanel ID="TabPanel3" una ="se e "
Heade Tex ="TabPanel3" Visible="False" OnClien Click="cambio3">
<Con en Templa e>
<can as heigh ="522" wid h="1048" id="si emap2"
class=""></can as>
</Con en Templa e>
</ajaxToolki :TabPanel>
<ajaxToolki :TabPanel ID="TabPanel4" una ="se e "
Heade Tex ="TabPanel4" Visible="False" OnClien Click="cambio4">
<Con en Templa e>
<can as heigh ="522" wid h="1048" id="si emap3"
class=""></can as>
</Con en Templa e>
</ajaxToolki :TabPanel>
83
<ajaxToolki :TabPanel ID="TabPanel5" una ="se e "
Heade Tex ="TabPanel5" Visible="False" OnClien Click="cambio5">
<Con en Templa e>
<can as heigh ="522" wid h="1048" id="si emap4"
class=""></can as>
</Con en Templa e>
</ajaxToolki :TabPanel>
</ajaxToolki :TabCon aine >
</asp:Con en >
De aul .aspx.cs
using Sys em;
using Sys em.Collec ions;
using Sys em.Collec ions.Gene ic;
using Sys em.Linq;
using Sys em.Xml;
using New onso ;
using Sys em.IO;
using Sys em.Web;
using Sys em.Web.UI;
using Sys em.Web.UI.WebCon ols;
using FamiliasMo olexicas.es.ulpgc.dis. ip;
using Sys em.Th eading;
using Sys em.Secu i y.Pe missions;
using Sys em.Web.UI.H mlCon ols;
using Sys em.Globaliza ion;
namespace FamiliasMo olexicas
{
public pa ial class _De aul : Sys em.Web.UI.Page
{
p o ec ed oid Page_Load(objec sende , E en A gs e)
{
i (!IsPos Back)
{
i
(!s ing.IsNullO Emp y(Reques .Que yS ing["Sea chPa ame e s"]))
{
i (!s ing.IsNullO Emp y(Reques .Que yS ing[" ull"]))
{
S ing ull = Reques .Que yS ing[" ull"];
H mlGene icCon ol heade =
(H mlGene icCon ol)Mas e .FindCon ol("heade ");
H mlGene icCon ol oo e Gene al =
(H mlGene icCon ol)Mas e .FindCon ol(" oo e Gene al");
i ( ull.Con ains("1")){
heade .Visible = alse;
oo e Gene al.Visible = alse;
Session["Pan allaComple a"] = ue;
Bu on3.Visible = alse;
Bu on4.Visible = ue;
}
else
{
heade .Visible = ue;
oo e Gene al.Visible = ue;
Session["Pan allaComple a"] = alse;
Bu on3.Visible = ue;
84
Bu on4.Visible = alse;
}
}
i (!s ing.IsNullO Emp y(Reques .Que yS ing["Fil e s"]))
{
S ing il = Reques .Que yS ing["Fil e s"];
i ( il.Con ains("1")) CheckBox1.Checked = alse;
i ( il.Con ains("2")) CheckBox2.Checked = alse;
i ( il.Con ains("3")) CheckBox3.Checked = alse;
i ( il.Con ains("4")) CheckBox4.Checked = alse;
i ( il.Con ains("5")) CheckBox5.Checked = alse;
i ( il.Con ains("6")) CheckBox6.Checked = alse;
i ( il.Con ains("7")) CheckBox7.Checked = alse;
i ( il.Con ains("8")) CheckBox8.Checked = alse;
}
palab a.Tex = Reques .Que yS ing["Sea chPa ame e s"];
i (!s ing.IsNullO Emp y(Reques .Que yS ing[" elaciones"])
&& Reques .Que yS ing[" elaciones"].Con ains("1"))
{
Relaciones();
}
else i
(!s ing.IsNullO Emp y(Reques .Que yS ing[" elaciones"]) &&
Reques .Que yS ing[" elaciones"].Con ains("2"))
{
Relaciones2();
}
else
{
TabCon aine 1.Visible = ue;
Table1.Visible = ue;
i (!s ing.IsNullO Emp y(Reques .Que yS ing[" ich"]) &&
Reques .Que yS ing[" ich"].Con ains("O"))
{
Session[" iche osAc uales"] =
Session[" iche osO iginales"];
}
i (!s ing.IsNullO Emp y(Reques .Que yS ing[" ich"]) &&
Reques .Que yS ing[" ich"].Con ains("A"))
{
Session[" iche osAc uales"] = Session[" iche osAux"];
}
S ing[] ich =
Session[" iche osAc uales"].ToS ing().Spli (',');
S ing l = Session[" iche osAc uales"].ToS ing();
in numFich = ich.Leng h;
i ( ich[0] == "")
{
a iso2.Visible = ue;
TabCon aine 1.Visible = alse;
Table1.Visible = alse;
}
i (numFich >= 1 && ich[0] != "")
{
TabPanel1.Heade Tex = Ob ene Nomb e( ich[0]);
TabPanel1.Visible = ue;
}
i (numFich >= 2)
{
TabPanel2.Heade Tex = Ob ene Nomb e( ich[1]);
TabPanel2.Visible = ue;
}
85
i (numFich >= 3)
{
TabPanel3.Heade Tex = Ob ene Nomb e( ich[2]);
TabPanel3.Visible = ue;
}
i (numFich >= 4)
{
TabPanel4.Heade Tex = Ob ene Nomb e( ich[3]);
TabPanel4.Visible = ue;
}
i (numFich == 5)
{
TabPanel5.Heade Tex = Ob ene Nomb e( ich[4]);
TabPanel5.Visible = ue;
}
Clien Sc ip .Regis e S a upSc ip (Page.Ge Type(),
"in oca uncion", "inicializa('" + Session[" iche osAc uales"] + "','" +
Session["CodigoUsua io"] + "');", ue);
}
}
}
}
//Ob ene el nomb e de la aíz pa a las pes añas en pan alla comple a
p o ec ed S ing Ob ene Nomb e(S ing ile)
{
S ing u l = Se e .MapPa h("~/json") + " " +
Session["CodigoUsua io"] + " " + ile;
S ing json = File.ReadAllTex (u l);
Dic iona y<S ing, Dic iona y<S ing, Objec >> a bol =
New onso .Json.JsonCon e .Dese ializeObjec <Dic iona y<S ing,
Dic iona y<S ing, Objec >>>(json);
o each (KeyValuePai <S ing, Dic iona y<S ing, Objec >> dic in
a bol)
{
i (dic.Key == "nodes")
{
Dic iona y<S ing, Objec > da os = dic.Value;
o each (KeyValuePai <S ing, Objec > dic2 in da os)
{
New onso .Json.Linq.JObjec nodo =
(New onso .Json.Linq.JObjec )dic2.Value;
S ing pad e = nodo.Ge Value("pad e").ToS ing();
in o ma = (in )nodo.Ge Value("codFo maCano");
i (pad e == "")//Nodo aíz
{
e u n nodo.Ge Value("palab a").ToS ing();
}
}
}
}
e u n "";
}
//his o ial de is as pa a con ola "A ás" en el na egado en el bo ón
elaciones.
p o ec ed oid Bu on1_Click(objec sende , E en A gs e)
{
S ing an iguo = palab a.Tex ;
S ing pa ame os = @"?Sea chPa ame e s=" + an iguo +
"& elaciones=1& ich=O";
i ((bool)Session["Pan allaComple a"] == ue)

86
{
pa ame os = pa ame os + "& ull=1";
}
else
{
pa ame os = pa ame os + "& ull=0";
}
S ing sea chU l = "De aul .aspx" + pa ame os;
Session["Pa ame os"] = pa ame os;
Response.Redi ec (sea chU l);
}
//his o ial de is as pa a con ola "A ás" en el bo ón aplica .
p o ec ed oid Bu on2_Click(objec sende , E en A gs e)
{
S ing an iguo = palab a.Tex ;
S ing pa ame os = @"?Sea chPa ame e s=" + an iguo +
"& elaciones=2& ich=A";
i ((bool)Session["Pan allaComple a"] == ue)
{
pa ame os = pa ame os + "& ull=1";
}
else
{
pa ame os = pa ame os + "& ull=0";
}
Session["Pa ame os"] = pa ame os + Fil os();
S ing sea chU l = "De aul .aspx" + pa ame os + Fil os();
Response.Redi ec (sea chU l);
}
//pan alla comple a
p o ec ed oid Bu on3_Click(objec sende , E en A gs e)
{
Session["Pan allaComple a"] = ue;
S ing an iguo = palab a.Tex ;
S ing pa ame os = @"?Sea chPa ame e s=" + an iguo +"& ull=1";
i (Session[" iche osAux"]!=null && Session[" iche osAux"].ToS ing()
== Session[" iche osAc uales"].ToS ing())
{
pa ame os = pa ame os + "& ich=A";
}
i (Session[" iche osAux"] != null &&
Session[" iche osAux"].ToS ing() == "")
{
pa ame os = pa ame os + "& ich=A";
}
i (Session[" iche osO iginales"].ToS ing() ==
Session[" iche osAc uales"].ToS ing())
{
pa ame os = pa ame os + "& ich=O";
}
S ing sea chU l = "De aul .aspx" + pa ame os + Fil os();
Session["Pa ame os"] = pa ame os + Fil os();
Response.Redi ec (sea chU l);
}
//pan alla no mal
p o ec ed oid Bu on4_Click(objec sende , E en A gs e)
{
Session["Pan allaComple a"] = alse;
87
S ing an iguo = palab a.Tex ;
S ing pa ame os = @"?Sea chPa ame e s=" + an iguo + "& ull=0";
i (Session[" iche osAux"] != null &&
Session[" iche osAux"].ToS ing() == Session[" iche osAc uales"].ToS ing())
{
pa ame os = pa ame os + "& ich=A";
}
i (Session[" iche osAux"] != null &&
Session[" iche osAux"].ToS ing() == "")
{
pa ame os = pa ame os + "& ich=A";
}
i (Session[" iche osO iginales"].ToS ing() ==
Session[" iche osAc uales"].ToS ing())
{
pa ame os = pa ame os + "& ich=O";
}
S ing sea chU l = "De aul .aspx" + pa ame os + Fil os();
Session["Pa ame os"] = pa ame os + Fil os();
Response.Redi ec (sea chU l);
}
// il os de u l
p o ec ed S ing Fil os()
{
S ing il os = "&Fil e s=";
i (!CheckBox1.Checked)
{
il os = il os + "1";
}
i (!CheckBox2.Checked)
{
il os = il os + "2";
}
i (!CheckBox3.Checked)
{
il os = il os + "3";
}
i (!CheckBox4.Checked)
{
il os = il os + "4";
}
i (!CheckBox5.Checked)
{
il os = il os + "5";
}
i (!CheckBox6.Checked)
{
il os = il os + "6";
}
i (!CheckBox7.Checked)
{
il os = il os + "7";
}
i (!CheckBox8.Checked)
{
il os = il os + "8";
}
e u n il os;
}
88
p o ec ed oid Relaciones()
{
S ing CodigoUsua io = (s ing)(Session["CodigoUsua io"]);
//Bu on3.Visible = ue;
TabCon aine 1.Visible = ue;
Table1.Visible = ue;
TabPanel2.Visible = alse;
TabPanel3.Visible = alse;
TabPanel4.Visible = alse;
TabPanel5.Visible = alse;
e o .Visible = alse;
a iso.Visible = alse;
a iso2.Visible = alse;
CheckBox1.Checked = ue;
CheckBox2.Checked = ue;
CheckBox3.Checked = ue;
CheckBox4.Checked = ue;
CheckBox5.Checked = ue;
CheckBox6.Checked = ue;
CheckBox7.Checked = ue;
CheckBox8.Checked = ue;
FamiliasMo olexicas.es.ulpgc.dis. ip.Lema izado x = new
Lema izado ();
Objec [] p = x.Reconoce (palab a.Tex , "es", alse);
in len = p.Leng h;
i (len == 0)
{
e o .Visible = ue;
TabCon aine 1.Visible = alse;
Table1.Visible = alse;
e u n;
}
in i = 1;
i (p.Leng h == 0) e u n;
else
{
//Es e lis ado es pa a comp oba que no se epi e el codigo de
o macanonica, po que Reconoce puede de ol e
// a ias iguales, que solo se di e encian en el código de
lexión.
Lis <in > o mascanonicas = new Lis <in >();
S ing iche os = "";
o each (Objec o mas in p)
{
Objec [] ec = (Objec []) o mas;
i ( o mascanonicas.Coun != 0 &&
o mascanonicas.Con ains((in ) ec[1])) { }
else
{
S ing nomb e = "" + ec[1] + ".json";
// iche os = iche os + nomb e + ",";
o mascanonicas.Add((in ) ec[1]);
S ing u l = Se e .MapPa h("~/json") + " " +
CodigoUsua io + " " + nomb e;
i (!File.Exis s("~/json/" + nomb e))
{
i ( o ma G a o( ec, nomb e, i))
{
iche os = iche os + nomb e + ",";
i (i == 2)
{
89
TabPanel2.Visible = ue;
}
i (i == 3)
{
TabPanel3.Visible = ue;
}
i (i == 4)
{
TabPanel4.Visible = ue;
}
i (i == 5)
{
TabPanel5.Visible = ue;
}
i++;
}
}
}
}
//Elimina el ca ac e inal que es una coma.
iche os = iche os.T imEnd(',');
Session[" iche osO iginales"] = iche os;
Session[" iche osAc uales"] = iche os;
Clien Sc ip .Regis e S a upSc ip (Page.Ge Type(),
"in oca uncion", "inicializa('" + iche os + "','" + CodigoUsua io + "');",
ue);
}
}
p o ec ed oid Relaciones2()
{
TabCon aine 1.Visible = ue;
//Bu on3.Visible = ue;
Table1.Visible = ue;
TabPanel2.Visible = alse;
TabPanel3.Visible = alse;
TabPanel4.Visible = alse;
TabPanel5.Visible = alse;
e o .Visible = alse;
a iso.Visible = alse;
a iso2.Visible = alse;
TabCon aine 1.Ac i eTabIndex = 0;
S ing sesion = Session["CodigoUsua io"].ToS ing();
S ing iche os = Session[" iche osO iginales"].ToS ing();
S ing iche osAux = "";
S ing[] nomb eFiche o = iche os.Spli (',');
in i = 1;
o each (S ing nomb e in nomb eFiche o)
{
i (i == 1)
{
TabPanel1.Visible = ue;
}
i (i == 2)
{
TabPanel2.Visible = ue;
}
i (i == 3)
{
TabPanel3.Visible = ue;
}
i (i == 4)
96
me ido = ue;
}
i (CheckBox3.Checked &&
nodo.Ge Value("codSu ").ToS ing() != "" && nodo.Ge Value("codP e").ToS ing() !=
"" && me ido == alse)
{
edgesDa a.Add(dic3.Key, new
Da a(nodo.Ge Value("codSu ").ToS ing(), nodo.Ge Value("codP e").ToS ing()));
me ido = ue;
}
i (CheckBox1.Checked &&
nodo.Ge Value("codSu ").ToS ing() != "" && nodo.Ge Value("codP e").ToS ing() ==
"" && nodo.Ge Value("codSu ").ToS ing().S a sWi h("-") && me ido == alse)
{
edgesDa a.Add(dic3.Key, new
Da a(nodo.Ge Value("codSu ").ToS ing(), nodo.Ge Value("codP e").ToS ing()));
me ido = ue;
}
i (CheckBox2.Checked &&
nodo.Ge Value("codP e").ToS ing() != "" && nodo.Ge Value("codSu ").ToS ing() ==
"" && me ido == alse)
{
edgesDa a.Add(dic3.Key, new
Da a(nodo.Ge Value("codSu ").ToS ing(), nodo.Ge Value("codP e").ToS ing()));
me ido = ue;
}
}
me ido = alse;
//Ve bo
i (CheckBox8.Checked && o ma >= 3000 &&
o ma <= 3199 && (nodos.Con ainsKey(nodo.Ge Value("pad e").ToS ing())))
{
//Bloque pa a comp oba si es an
checkeados su ijos, p e ijos, pa asin é icas u o os.
i (CheckBox4.Checked &&
!nodo.Ge Value("codSu ").ToS ing().S a sWi h("-") &&
nodo.Ge Value("codSu ").ToS ing() != "" && me ido == alse)
{
edgesDa a.Add(dic3.Key, new
Da a(su ijo, nodo.Ge Value("codP e").ToS ing()));
me ido = ue;
}
i (CheckBox3.Checked &&
nodo.Ge Value("codSu ").ToS ing() != "" && nodo.Ge Value("codP e").ToS ing() !=
"" && me ido == alse)
{
edgesDa a.Add(dic3.Key, new
Da a(nodo.Ge Value("codSu ").ToS ing(), nodo.Ge Value("codP e").ToS ing()));
me ido = ue;
}
i (CheckBox1.Checked &&
nodo.Ge Value("codSu ").ToS ing() != "" && nodo.Ge Value("codP e").ToS ing() ==
"" && nodo.Ge Value("codSu ").ToS ing().S a sWi h("-") && me ido == alse)
{
edgesDa a.Add(dic3.Key, new
Da a(nodo.Ge Value("codSu ").ToS ing(), nodo.Ge Value("codP e").ToS ing()));
me ido = ue;
}
i (CheckBox2.Checked &&
nodo.Ge Value("codP e").ToS ing() != "" && nodo.Ge Value("codSu ").ToS ing() ==
"" && me ido == alse)
{

97
edgesDa a.Add(dic3.Key, new
Da a(nodo.Ge Value("codSu ").ToS ing(), nodo.Ge Value("codP e").ToS ing()));
me ido = ue;
}
}
}
}
i (edgesDa a.Coun != 0)
{
edges.Add(dic2.Key, edgesDa a);
}
}
}
}
}
Dic iona y<S ing, Objec > a bol2 = new Dic iona y<S ing,
Objec >
{
{"nodes", nodos},
{"edges", edges}
};
S ing json2 =
New onso .Json.JsonCon e .Se ializeObjec (a bol2,
New onso .Json.Fo ma ing.Inden ed);//Lib e ía New onso .Json.
u l = u l.Subs ing(0, u l.Leng h - 5);
u l = u l + "-aux.json";
File.W i eAllTex (u l, json2);
}
//Elimina el ca ac e inal que es una coma.
iche osAux = iche osAux.T imEnd(',');
i ( iche os.Leng h != 0)
{
Session[" iche osAux"] = iche osAux;
Session[" iche osAc uales"] = iche osAux;
}
S ing CodigoUsua io = (S ing)Session["CodigoUsua io"];
Clien Sc ip .Regis e S a upSc ip (Page.Ge Type(), "in oca uncion",
"inicializa('" + iche osAux + "','" + CodigoUsua io + "');", ue);
}
//************************P ocedimien o o maG a o, que c ea el
a bol.************************//
p i a e Boolean o ma G a o(Objec [] ec, S ing nomb eFiche o, in
indice)
{
FamiliasMo olexicas.es.ulpgc.dis. ip.Lema izado x = new
Lema izado ();
S ing canonica = ec[1].ToS ing();
//S ing lexion = ec[2].ToS ing();
Objec [] p2 = x.Consul a(canonica, "es", "canonicas");
Objec [] ec2 = (Objec [])p2[0];
S ing o macanonica = ec2[0].ToS ing();
i (indice == 1)
{
TabPanel1.Heade Tex = o macanonica;
}
i (indice == 2)
{
TabPanel2.Heade Tex = o macanonica;
98
}
i (indice == 3)
{
TabPanel3.Heade Tex = o macanonica;
}
i (indice == 4)
{
TabPanel4.Heade Tex = o macanonica;
}
i (indice == 5)
{
TabPanel5.Heade Tex = o macanonica;
}
FamiliasMo olexicas.es.ulpgc.dis. ip1.Familias y = new
es.ulpgc.dis. ip1.Familias();
Objec [] amilia = y.Consul a( o macanonica, "es", " amilias");
i ( amilia.Leng h == 0)
{
a iso.Visible = ue;
TabCon aine 1.Visible = alse;
Table1.Visible = alse;
e u n alse;
}
//La aiz del á bol (que se co esponde con la o macanonica) iene
el id=0 SIEMPRE
Raiz p = new Raiz("#BFE7FE", "do ", 1, o macanonica, "", "", 0, "",
"#0000FF", 0);
//Lis a odos los nodos a pa i de la aíz, hijos y nie os.
Dic iona y<S ing, Objec > nodos = new Dic iona y<S ing, Objec >
{
{"0", p }
};
//Dic iona io pa a lis a los enlaces a los hijos
Dic iona y<S ing, Objec > edges = new Dic iona y<S ing, Objec >();
in i = 1, j = 100;
o each (Objec con ado in amilia)
{
Objec [] elemen os = (Objec [])con ado ;
nodos.Add("" + i, new Raiz("#660066", "do ", 1,
elemen os[2].ToS ing(), elemen os[5].ToS ing(), elemen os[8].ToS ing(),
(in )elemen os[3], "0", "#FFFFFF", (in )elemen os[4]));
//busca los hijos de los hijos
Objec [] nie os = y.Consul a(elemen os[2].ToS ing(), "es",
" amilias");
in len = nie os.Leng h;
i (len != 0)
{
//Dic iona y pa a lis a los enlaces a los nodos nie os.
Dic iona y<S ing, Objec > edgesDa ah = new
Dic iona y<S ing, Objec >();
o each (Objec con ado 2 in nie os)
{
Objec [] elemen os2 = (Objec [])con ado 2;
nodos.Add("" + j, new Raiz("#660066", "", 0,
elemen os2[2].ToS ing(), elemen os2[5].ToS ing(), elemen os2[8].ToS ing(),
(in )elemen os2[3], i.ToS ing(), "#FFFFFF", (in )elemen os2[4]));
//Comp ueba que es en ma cados los p e ijos y su ijos
pa a añadi los a los enlaces(edges).
S ing su ijo = "";
S ing p e ijo = "";
i (CheckBox2.Checked)
99
{
p e ijo = elemen os2[8].ToS ing();
}
i (CheckBox1.Checked &&
elemen os2[5].ToS ing().S a sWi h("-"))
{
su ijo = elemen os2[5].ToS ing();
}
i (CheckBox3.Checked)
{
p e ijo = elemen os2[8].ToS ing();
su ijo = elemen os2[5].ToS ing();
}
i (CheckBox4.Checked)
{
swi ch ((in )elemen os2[4])
{
case 1:
su ijo = "T ans.";
b eak;
case 7:
su ijo = "A e .";
b eak;
case 15:
su ijo = "Al .";
b eak;
case 24:
su ijo = "Apoc.";
b eak;
case 46:
su ijo = "Al .";
b eak;
case 134:
su ijo = "I eg.";
b eak;
case 158:
su ijo = "Me .";
b eak;
case 185:
su ijo = "Sup .";
b eak;
case 191:
su ijo = "Ve b.";
b eak;
}
}
Da a da a = new Da a(su ijo, p e ijo);
edgesDa ah.Add("" + j, da a);
j++;
}
edges.Add("" + i, edgesDa ah);
}
i++;
}
//Dic iona io pa a lis a las p opiedades que iene cada nodo.
Dic iona y<S ing, Objec > edgesDa a = new Dic iona y<S ing,
Objec >();
i = 1;
o each (Objec con ado in amilia)
{
Objec [] elemen os = (Objec [])con ado ;
100
//Comp ueba que es en ma cados los p e ijos y su ijos pa a
añadi los a los enlaces(edges).
S ing su ijo = "";
S ing p e ijo = "";
i (CheckBox2.Checked)
{
p e ijo = elemen os[8].ToS ing();
}
i (CheckBox1.Checked && elemen os[5].ToS ing().S a sWi h("-"))
{
su ijo = elemen os[5].ToS ing();
}
i (CheckBox3.Checked)
{
p e ijo = elemen os[8].ToS ing();
su ijo = elemen os[5].ToS ing();
}
i (CheckBox4.Checked)
{
//Case pa a cambia las e ique as de los enlaces po
palab as más co as que se isualicen mejo .
swi ch ((in )elemen os[4])
{
case 1:
su ijo = "T ans.";
b eak;
case 7:
su ijo = "A e .";
b eak;
case 15:
su ijo = "Al .";
b eak;
case 24:
su ijo = "Apoc.";
b eak;
case 46:
su ijo = "Al .";
b eak;
case 134:
su ijo = "I eg.";
b eak;
case 158:
su ijo = "Me .";
b eak;
case 185:
su ijo = "Sup .";
b eak;
case 191:
su ijo = "Ve b.";
b eak;
}
}
Da a da a = new Da a(su ijo, p e ijo);
edgesDa a.Add("" + i, da a);
i++;
}
//Elemen o aíz, que se in oduce en úl imo luga .
edges.Add("0", edgesDa a);
//Dic iona y que lis a el a bol con odas sus p opiedades (Raiz,
hijos y nie os) y las p opiedades de cada uno.
Dic iona y<S ing, Objec > a bol = new Dic iona y<S ing, Objec >
{
101
{"nodes", nodos},
{"edges", edges}
};
//T a amien o de la clase Dic iona y pa a con e i en a chi o json.
S ing json = New onso .Json.JsonCon e .Se ializeObjec (a bol,
New onso .Json.Fo ma ing.Inden ed);//Lib e ía New onso .Json.
S ing u l = Se e .MapPa h("~/json/" + Session["CodigoUsua io"]) +
" " + nomb eFiche o;
File.W i eAllTex (u l, json);
e u n ue;
}
//************************Clases que usa el p ocedimien o
o maG a o.************************//
public class Raiz
{
public S ing colo { ge ; se ; }
public S ing shape { ge ; se ; }
public S ing palab a { ge ; se ; }
public in alpha { ge ; se ; }
public S ing codSu { ge ; se ; }
public S ing codP e { ge ; se ; }
public S ing pad e { ge ; se ; }
public in codFo maCano { ge ; se ; }
public S ing colo le a { ge ; se ; }
public in codO os { ge ; se ; }
public Raiz() { }
public Raiz(S ing colo A, S ing shapeA, in alphaA, S ing
palab aA, S ing codSu A, S ing codP eA, in codFo maCanoA, S ing pad eA,
S ing colo le aA, in codO osA)
{
colo = colo A;
shape = shapeA;
alpha = alphaA;
palab a = palab aA;
codSu = codSu A;
codP e = codP eA;
codFo maCano = codFo maCanoA;
pad e = pad eA;
colo le a = colo le aA;
codO os = codO osA;
}
};
public class Da a
{
public S ing su { ge ; se ; }
public S ing p e { ge ; se ; }
public in leng h { ge ; se ; }
public Da a() { }
public Da a(S ing da aA, S ing p eA)
{
su = da aA;
p e = p eA;
leng h = 1;
}
};
}
}

102
Global.aspx.cs
using Sys em;
using Sys em.Collec ions.Gene ic;
using Sys em.Linq;
using Sys em.Web;
using Sys em.Web.Secu i y;
using Sys em.Web.SessionS a e;
using Sys em.IO;
using Sys em.Th eading;
namespace FamiliasMo olexicas
{
public class Global : Sys em.Web.H pApplica ion
{
p i a e s a ic Lis <S ing> _sessionIn o;
p i a e s a ic eadonly objec padlock = new objec ();
public s a ic Lis <s ing> Sessions
{
ge
{
lock (padlock)
{
i (_sessionIn o == null)
{
_sessionIn o = new Lis <s ing>();
}
e u n _sessionIn o;
}
}
}
//Código de p ueba pa a aplicación mul i-lenguaje
p o ec ed oid Applica ion_BeginReques (objec sende , E en A gs e)
{
H pCookie cookie = Reques .Cookies["Cul u eIn o"];
i (cookie != null && cookie.Value != null)
{
Th ead.Cu en Th ead.Cu en UICul u e = new
Sys em.Globaliza ion.Cul u eIn o(cookie.Value);
Th ead.Cu en Th ead.Cu en Cul u e = new
Sys em.Globaliza ion.Cul u eIn o(cookie.Value);
}else{
Th ead.Cu en Th ead.Cu en UICul u e = new
Sys em.Globaliza ion.Cul u eIn o("es-ES");
Th ead.Cu en Th ead.Cu en Cul u e = new
Sys em.Globaliza ion.Cul u eIn o("es-ES");
}
}
oid Applica ion_S a (objec sende , E en A gs e)
{
// Código que se ejecu a al inicia se la aplicación
Applica ion["Usua iosConec ados"] = 0;
Applica ion["Ru aReposi o io"] = Se e .MapPa h("~") + @" json ";
}
oid Applica ion_End(objec sende , E en A gs e)
{
// Código que se ejecu a cuando se cie a la aplicación
}
103
oid Applica ion_E o (objec sende , E en A gs e)
{
// Código que se ejecu a al p oduci se un e o no con olado
}
oid Session_S a (objec sende , E en A gs e)
{
// Código que se ejecu a cuando se inicia una nue a sesión
Applica ion["Usua iosConec ados"] =
(in )Applica ion["Usua iosConec ados"] + 1;
Session["CodigoUsua io"] = Session.SessionID;
S ing CodigoUsua io = (s ing)(Session["CodigoUsua io"]);
S ing u l = Se e .MapPa h("~/json/" + Session["CodigoUsua io"]);
Di ec o y.C ea eDi ec o y(u l);
Sessions.Add(Session.SessionID);
Session["Pan allaComple a"] = alse;
}
oid Session_End(objec sende , E en A gs e)
{
Sessions.Remo e(Session.SessionID);
S ing u l = Applica ion["Ru aReposi o io"].ToS ing();
Lis <S ing> ss = Sessions;
//Elimina el di ec o io u ilizado po el usua io en su sesion.
S ing[] ca pe as = Di ec o y.Ge Di ec o ies(u l);
o each (S ing ca pe a in ca pe as)
{
S ing nomb eS = ca pe a.Subs ing(ca pe a.Las IndexO (" ") +
1);
i (!Global.Sessions.Con ains(nomb eS))
{
Di ec o y.Dele e(ca pe a, ue);
}
}
Applica ion["Usua iosConec ados"] =
(in )Applica ion["Usua iosConec ados"] - 1;
}
}
}
Si e.js
//
// si e.js
//
// he a bo .js websi e
//
unc ion cambio1() {
edibuja(0);
}
unc ion cambio2() {
edibuja(1);
}
unc ion cambio3() {
edibuja(2);
}
104
unc ion cambio4() {
edibuja(3);
}
unc ion cambio5() {
edibuja(4);
}
//Va iables si emap y global pa a usa la en la uncion edibuja y c ea los
g a os en cada pes aña.
a u l;
a ids;
// a iable pa a doble click
a clicks = 0;
//Se llama desde Relaciones pa a ob ene las a iables que dicen que iche y
di ección hay que mi a .
unc ion inicializa( iche os, session) {
u l = session;
ids = iche os.spli (',');
edibuja(0);
}
//Añade la pes aña que se an isualiza a la di ección del a chi os y llama a
edibuja.
unc ion edibuja(x) {
a global = u l + "/" + ids[x];
a si e = "#si emap" + x
edibujaCan as(si e, global);
}
//Recibe el a chi o y la pes aña donde dibuja lo y u iliza las unciones de la
lib e ía pa a c ea el g a o.
unc ion edibujaCan as(si emap, ile){
a Rende e = unc ion (el ) {
console.log('el =' + si emap);
a dom = $(si emap); //el
a can as = dom.ge (0);
a c x = can as.ge Con ex ("2d");
a g x = a bo .G aphics(can as);
a sys = null;
a _ igne e = null;
a selec ed = null,
nea es = null,
_mouseP = null;
a ha = {
ini : unc ion (pSys em) {
sys = pSys em;
sys.sc een({ size: { wid h: dom.wid h(), heigh : dom.heigh () },
padding: [36, 60, 36, 60] });
$(window). esize( ha . esize);
ha . esize();
ha ._ini MouseHandling();
},
esize: unc ion(){
can as.wid h = $(window).wid h();
can as.heigh = .75* $(window).heigh ();
105
sys.sc een({size:{wid h:can as.wid h, heigh :can as.heigh }});
_ igne e = null;
ha . ed aw();
},
ed aw: unc ion () {
g x.clea ()
sys.eachEdge( unc ion (edge, p1, p2) {
i (edge.sou ce.da a.alpha * edge. a ge .da a.alpha == 0)
e u n;
g x.line(p1, p2, { s oke: "#b2b19d", wid h: 2, alpha:
edge. a ge .da a.alpha });
//Se esc ibe el label co espondien e a cada edge encima de
la línea
c x.s okeS yle = " gba(0,0,0, .333)";
c x.lineWid h = 1;
c x.beginPa h();
c x.mo eTo(p1.x, p1.y);
c x.lineTo(p2.x, p2.y);
c x.s oke();
c x. on = 'i alic 13px sans-se i ';
i (edge.da a.su !== "") {
c x. illS yle = "black";
c x. illTex (edge.da a.su , (p1.x + p2.x) / 2, (p1.y +
p2.y) / 2);
}
i (edge.da a.p e !== "") {
c x. illS yle = "g een";
a pos = 0;
i (edge.da a.su !== "") {//Si no es nulo, se coloca el
p e ijo a iba del su ijo
pos = 2.22;
}
else {//Si no hay su ijo, se coloca en su si io co ec o
pos = 2;
}
c x. illTex (edge.da a.p e, (p1.x + p2.x) / 2, ((p1.y +
p2.y)) / pos);
}
});
sys.eachNode( unc ion (node, p ) {
a w = Ma h.max(15, 15 + g x. ex Wid h(node.da a.palab a))
i (node.da a.alpha === 0) e u n;
i (node.da a.shape == 'do ') {
g x.o al(p .x - w / 2, p .y - w / 2, w, w, { ill:
node.da a.colo , alpha: node.da a.alpha });
g x. ex (node.da a.palab a, p .x, p .y + 7, { colo :
node.da a.colo le a, align: "cen e ", on : "Ve dana", size: 12 });
} else {
g x. ec (p .x - w / 2, p .y - 8, w, 20, 4, { ill:
node.da a.colo , alpha: node.da a.alpha });
g x. ex (node.da a.palab a, p .x, p .y + 9, { colo :
node.da a.colo le a, align: "cen e ", on : "Ve dana", size: 12 });
}
});
},
swi chMode: unc ion (e) {
i (e.mode == 'hidden') {
dom.s op( ue). adeTo(e.d , 0, unc ion () {
i (sys) sys.s op();
$( his).hide();
})
} else i (e.mode == ' isible') {
112
w} e u n[]},ge EdgesTo: unc ion( ){ =g.ge Node( );i (! ){ e u n[]} a
w=[];$.each(c.edges, unc ion(y,x){i (x. a ge == ){w.push(x)}}); e u n
w},eachEdge: unc ion( ){$.each(c.edges, unc ion(z,x){ a
y=c.nodes[x.sou ce._id]._p; a
w=c.nodes[x. a ge ._id]._p;i (y.x==null||w.x==null){ e u n}y=(u!==null)?g. oSc ee
n(y):y;w=(u!==null)?g. oSc een(w):w;i (y&&w){ .call(g,x,y,w)}})},p une: unc ion(w
){ a
={d opped:{nodes:[],edges:[]}};i (w===unde ined){$.each(c.nodes, unc ion(y,x){ .
d opped.nodes.push(x);g.p uneNode(x)})}else{g.eachNode( unc ion(y){ a
x=w.call(g,y,{ om:g.ge EdgesF om(y), o:g.ge EdgesTo(y)});i (x){ .d opped.nodes.p
ush(y);g.p uneNode(y)}})} e u n },g a : unc ion(w){ a
={added:{nodes:[],edges:[]}};i (w.nodes){$.each(w.nodes, unc ion(y,x){ a
z=g.ge Node(y);i (z){z.da a=x}else{ .added.nodes.push(g.addNode(y,x))}c.ke nel.s
a ()})}i (w.edges){$.each(w.edges, unc ion(z,x){ a
y=g.ge Node(z);i (!y){ .added.nodes.push(g.addNode(z,{}))}$.each(x, unc ion(D,A){
a C=g.ge Node(D);i (!C){ .added.nodes.push(g.addNode(D,{}))} a
B=g.ge Edges(z,D);i (B.leng h>0){B[0].da a=A}else{ .added.edges.push(g.addEdge(z,
D,A))}})})} e u n },me ge: unc ion(w){ a
={added:{nodes:[],edges:[]},d opped:{nodes:[],edges:[]}};$.each(c.edges, unc ion
(A,z){i ((w.edges[z.sou ce.name]===unde ined||w.edges[z.sou ce.name][z. a ge .nam
e]===unde ined)){g.p uneEdge(z); .d opped.edges.push(z)}}); a
y=g.p une( unc ion(A,z){i (w.nodes[A.name]===unde ined){ .d opped.nodes.push(A);
e u n ue}}); a
x=g.g a (w); .added.nodes= .added.nodes.conca (x.added.nodes); .added.edges= .ad
ded.edges.conca (x.added.edges); .d opped.nodes= .d opped.nodes.conca (y.d opped.
nodes); .d opped.edges= .d opped.edges.conca (y.d opped.edges); e u n
}, weenNode: unc ion(y, ,x){ a
w=g.ge Node(y);i (w){c. ween. o(w, ,x)}}, weenEdge: unc ion(w, ,z,y){i (y===unde
ined){g._ weenEdge(w, ,z)}else{ a
x=g.ge Edges(w, );$.each(x, unc ion(A,B){g._ weenEdge(B,z,y)})}},_ weenEdge: unc
ion(w, ,x){i (w&&w._id!==unde ined){c. ween. o(w, ,x)}},_upda eGeome y: unc ion(
y){i (y!=unde ined){ a =(y.epoch<k);a=y.ene gy; a
z=y.geome y;i (z!==unde ined){ o ( a x=0,w=z.leng h/3;x<w;x++){ a
A=z[3*x];i ( &&c.nodes[A]==unde ined){con inue}c.nodes[A]._p.x=z[3*x+1];c.nodes[A
]._p.y=z[3*x+2]}}}},sc een: unc ion( ){i ( ==unde ined){ e u n{size:(u)?objcopy(u
):unde ined,padding:i.conca (),s ep:m}}i ( .size!==unde ined){g.sc eenSize( .size
.wid h, .size.heigh )}i (!isNaN( .s ep)){g.sc eenS ep( .s ep)}i ( .padding!==unde
ined){g.sc eenPadding( .padding)}},sc eenSize: unc ion( ,w){u={wid h: ,heigh :w}
;g._upda eBounds()},sc eenPadding: unc ion(y,z, ,w){i ($.isA ay(y)){ bl=y}else{
bl=[y,z, ,w]} a A= bl[0]; a x= bl[1]; a
B= bl[2];i (x===unde ined){ bl=[A,A,A,A]}else{i (B==unde ined){ bl=[A,x,A,x]}}
i= bl},sc eenS ep: unc ion( ){m= }, oSc een: unc ion(x){i (!n||!u){ e u n} a
w=i||[0,0,0,0]; a =n.bo om igh .sub ac (n. ople ); a
z=w[3]+x.sub ac (n. ople ).di ide( .x).x*(u.wid h-(w[1]+w[3])); a
y=w[0]+x.sub ac (n. ople ).di ide( .y).y*(u.heigh -(w[0]+w[2])); e u n
a bo .Poin (z,y)}, omSc een: unc ion(z){i (!n||!u){ e u n} a y=i||[0,0,0,0]; a
x=n.bo om igh .sub ac (n. ople ); a w=(z.x-y[3])/(u.wid h-
(y[1]+y[3]))*x.x+n. ople .x; a =(z.y-y[0])/(u.heigh -
(y[0]+y[2]))*x.y+n. ople .y; e u n
a bo .Poin (w, )},_upda eBounds: unc ion(w){i (u===null){ e u n}i (w){o=w}else{o=
g.bounds()} a z=new Poin (o.bo om igh .x,o.bo om igh .y); a y=new
Poin (o. ople .x,o. ople .y); a B=z.sub ac (y); a =y.add(B.di ide(2)); a
x=4; a D=new
Poin (Ma h.max(B.x,x),Ma h.max(B.y,x));o. ople = .sub ac (D.di ide(2));o.bo om
igh = .add(D.di ide(2));i (!n){i ($.isEmp yObjec (c.nodes)){ e u n
alse}n=o; e u n ue} a
C=m;_newBounds={bo om igh :n.bo om igh .add(o.bo om igh .sub ac (n.bo om igh
).mul iply(C)), ople :n. ople .add(o. ople .sub ac (n. ople ).mul iply(C))}
; a A=new
Poin (n. ople .sub ac (_newBounds. ople ).magni ude(),n.bo om igh .sub ac (_
newBounds.bo om igh ).magni ude());i (A.x*u.wid h>1||A.y*u.heigh >1){n=_newBound
s; e u n ue}else{ e u n alse}},ene gy: unc ion(){ e u n

113
a},bounds: unc ion(){ a w=null; a
=null;$.each(c.nodes, unc ion(z,y){i (!w){w=new Poin (y._p); =new
Poin (y._p); e u n} a
x=y._p;i (x.x===null||x.y===null){ e u n}i (x.x>w.x){w.x=x.x}i (x.y>w.y){w.y=x.y}
i (x.x< .x){ .x=x.x}i (x.y< .y){ .y=x.y}});i (w&& ){ e u n{bo om igh :w, ople :
}}else{ e u n{ ople :new Poin (-1,-1),bo om igh :new
Poin (1,1)}}},nea es : unc ion(x){i (u!==null){x=g. omSc een(x)} a
w={node:null,poin :null,dis ance:null}; a =g;$.each(c.nodes, unc ion(B,y){ a
z=y._p;i (z.x===null||z.y===null){ e u n} a
A=z.sub ac (x).magni ude();i (w.dis ance===null||A<w.dis ance){w={node:y,poin :z
,dis ance:A};i (u!==null){w.sc eenPoin =g. oSc een(z)}}});i (w.node){i (u!==null)
{w.dis ance=g. oSc een(w.node.p).sub ac (g. oSc een(x)).magni ude()} e u n
w}else{ e u n
null}},_no i y: unc ion(){i (h===null){k++}else{clea Timeou (h)}h=se Timeou (g._s
ynch onize,20)},_synch onize: unc ion(){i (j.leng h>0){c.ke nel.g aphChanged(j);j
=[];h=null}},};c.ke nel=Ke nel(g);c. ween=c.ke nel. ween||null;Node.p o o ype.__d
e ineGe e __("p", unc ion(){ a w= his; a
={}; .__de ineGe e __("x", unc ion(){ e u n
w._p.x}); .__de ineSe e __("x", unc ion(x){c.ke nel.pa icleModi ied(w._id,{x:x}
)}); .__de ineGe e __("y", unc ion(){ e u n
w._p.y}); .__de ineSe e __("y", unc ion(x){c.ke nel.pa icleModi ied(w._id,{y:x}
)}); .__p o o__=Poin .p o o ype; e u n
});Node.p o o ype.__de ineSe e __("p", unc ion( ){ his._p.x= .x; his._p.y= .y;c
.ke nel.pa icleModi ied( his._id,{x: .x,y: .y})});Node.p o o ype.__de ineGe e _
_("mass", unc ion(){ e u n
his._mass});Node.p o o ype.__de ineSe e __("mass", unc ion( ){ his._mass= ;c.ke
nel.pa icleModi ied( his._id,{m: })});Node.p o o ype.__de ineSe e __(" empMass
", unc ion( ){c.ke nel.pa icleModi ied( his._id,{_m: })});Node.p o o ype.__de in
eGe e __(" ixed", unc ion(){ e u n
his._ ixed});Node.p o o ype.__de ineSe e __(" ixed", unc ion( ){ his._ ixed= ;c
.ke nel.pa icleModi ied( his._id,{ : ?1:0})}); e u n g};
/* ba nes-hu .js */ a Ba nesHu T ee= unc ion(){ a b=[]; a a=0; a
e=null; a d=0.5; a
c={ini : unc ion(g,h, ){d= ;a=0;e=c._newB anch();e.o igin=g;e.size=h.sub ac (g)}
,inse : unc ion(j){ a =e; a g=[j];while(g.leng h){ a h=g.shi (); a
m=h._m||h.m; a
p=c._whichQuad(h, );i ( [p]===unde ined){ [p]=h; .mass+=m;i ( .p){ .p= .p.add(h.p
.mul iply(m))}else{ .p=h.p.mul iply(m)}}else{i ("o igin" in
[p]){ .mass+=(m);i ( .p){ .p= .p.add(h.p.mul iply(m))}else{ .p=h.p.mul iply(m)}
= [p];g.unshi (h)}else{ a l= .size.di ide(2); a n=new
Poin ( .o igin);i (p[0]=="s"){n.y+=l.y}i (p[1]=="e"){n.x+=l.x} a
o= [p]; [p]=c._newB anch(); [p].o igin=n; [p].size=l; .mass=m; .p=h.p.mul iply(m)
; = [p];i (o.p.x===h.p.x&&o.p.y===h.p.y){ a k=l.x*0.08; a
i=l.y*0.08;o.p.x=Ma h.min(n.x+l.x,Ma h.max(n.x,o.p.x-
k/2+Ma h. andom()*k));o.p.y=Ma h.min(n.y+l.y,Ma h.max(n.y,o.p.y-
i/2+Ma h. andom()*i))}g.push(o);g.unshi (h)}}}},applyFo ces: unc ion(m,g){ a
=[e];while( .leng h){node= .shi ();i (node===unde ined){con inue}i (m===node){c
on inue}i (" " in node){ a k=m.p.sub ac (node.p); a
l=Ma h.max(1,k.magni ude()); a
i=((k.magni ude()>0)?k:Poin . andom(1)).no malize();m.applyFo ce(i.mul iply(g*(no
de._m||node.m)).di ide(l*l))}else{ a
j=m.p.sub ac (node.p.di ide(node.mass)).magni ude(); a
h=Ma h.sq (node.size.x*node.size.y);i (h/j>d){ .push(node.ne); .push(node.nw); .
push(node.se); .push(node.sw)}else{ a
k=m.p.sub ac (node.p.di ide(node.mass)); a l=Ma h.max(1,k.magni ude()); a
i=((k.magni ude()>0)?k:Poin . andom(1)).no malize();m.applyFo ce(i.mul iply(g*(no
de.mass)).di ide(l*l))}}}},_whichQuad: unc ion(i, ){i (i.p.exploded()){ e u n
null} a h=i.p.sub ac ( .o igin); a
g= .size.di ide(2);i (h.y<g.y){i (h.x<g.x){ e u n"nw"}else{ e u n"ne"}}else{i (h.
x<g.x){ e u n"sw"}else{ e u n"se"}}},_newB anch: unc ion(){i (b[a]){ a
=b[a]; .ne= .nw= .se= .sw=unde ined; .mass=0;dele e
114
.p}else{ ={o igin:null,size:null,nw:unde ined,ne:unde ined,sw:unde ined,se:unde
ined,mass:0};b[a]= }a++; e u n }}; e u n c};
/* physics.js */ a Physics= unc ion(a,m,n,e,h){ a =Ba nesHu T ee(); a
c={pa icles:{},sp ings:{}}; a l={pa icles:{}}; a o=[]; a k=[]; a d=0; a
b={sum:0,max:0,mean:0}; a g={ ople :new Poin (-1,-1),bo om igh :new
Poin (1,1)}; a j=1000; a
i={s i ness:(m!==unde ined)?m:1000, epulsion:(n!==unde ined)?n:600, ic ion:(e!=
=unde ined)?e:0.3,g a i y: alse,d :(a!==unde ined)?a:0.02, he a:0.4,ini : unc ion
(){ e u n
i},modi yPhysics: unc ion(p){$.each(["s i ness"," epulsion"," ic ion","g a i y"
,"d ","p ecision"], unc ion( ,s){i (p[s]!==unde ined){i (s=="p ecision"){i. he a=
1-p[s]; e u n}i[s]=p[s];i (s=="s i ness"){ a
q=p[s];$.each(c.sp ings, unc ion(u, ){ .k=q})}}})},addNode: unc ion(u){ a
=u.id; a q=u.m; a p=g.bo om igh .x-g. ople .x; a s=g.bo om igh .y-
g. ople .y; a =new
Poin ((u.x!=null)?u.x:g. ople .x+p*Ma h. andom(),(u.y!=null)?u.y:g. ople .y+s*M
a h. andom());c.pa icles[ ]=new
Pa icle( ,q);c.pa icles[ ].connec ions=0;c.pa icles[ ]. ixed=(u. ===1);l.pa i
cles[ ]=c.pa icles[ ];o.push(c.pa icles[ ])},d opNode: unc ion(s){ a
=s.id; a q=c.pa icles[ ]; a p=$.inA ay(q,o);i (p>-1){o.splice(p,1)}dele e
c.pa icles[ ];dele e l.pa icles[ ]},modi yNode: unc ion( ,p){i ( in
c.pa icles){ a q=c.pa icles[ ];i ("x" in p){q.p.x=p.x}i ("y" in
p){q.p.y=p.y}i ("m" in p){q.m=p.m}i (" " in p){q. ixed=(p. ===1)}i ("_m" in
p){i (q._m===unde ined){q._m=q.m}q.m=p._m}}},addSp ing: unc ion( ){ a s= .id; a
p= .l; a =c.pa icles[ . m]; a
q=c.pa icles[ . o];i ( !==unde ined&&q!==unde ined){c.sp ings[s]=new
Sp ing( ,q,p,i.s i ness);k.push(c.sp ings[s]); .connec ions++;q.connec ions++;de
le e l.pa icles[ . m];dele e l.pa icles[ . o]}},d opSp ing: unc ion(s){ a
=s.id; a q=c.sp ings[ ];q.poin 1.connec ions--;q.poin 2.connec ions--; a
p=$.inA ay(q,k);i (p>-1){k.splice(p,1)}dele e
c.sp ings[ ]},_upda e: unc ion(p){d++;$.each(p, unc ion(q, ){i ( . in
i){i[ . ]( )}}); e u n
d}, ick: unc ion(){i. endPa icles();i.eule In eg a o (i.d );i. ock()}, ock: unc
ion(){ a
p=[];$.each(c.pa icles, unc ion( ,q){p.push( );p.push(q.p.x);p.push(q.p.y)});i (
h){h({geome y:p,epoch:d,ene gy:b,bounds:g})}}, endPa icles: unc ion(){$.each(c.
pa icles, unc ion(q,p){i (p._m!==unde ined){i (Ma h.abs(p.m-
p._m)<1){p.m=p._m;dele e
p._m}else{p.m*=0.98}}p. .x=p. .y=0})},eule In eg a o : unc ion(p){i (i. epulsion>
0){i (i. he a>0){i.applyBa nesHu Repulsion()}else{i.applyB u eFo ceRepulsion()}}i
(i.s i ness>0){i.applySp ings()}i.applyCen e D i ();i (i.g a i y){i.applyCen e
G a i y()}i.upda eVeloci y(p);i.upda ePosi ion(p)},applyB u eFo ceRepulsion: unc
ion(){$.each(c.pa icles, unc ion(q,p){$.each(c.pa icles, unc ion(s, ){i (p!==
){ a u=p.p.sub ac ( .p); a =Ma h.max(1,u.magni ude()); a
=((u.magni ude()>0)?u:Poin . andom(1)).no malize();p.applyFo ce( .mul iply(i. ep
ulsion*( ._m|| .m)*0.5).di ide( * *0.5)); .applyFo ce( .mul iply(i. epulsion*(p._
m||p.m)*0.5).di ide( * *-
0.5))}})})},applyBa nesHu Repulsion: unc ion(){i (!g. ople ||!g.bo om igh ){ e
u n} a q=new Poin (g.bo om igh ); a p=new
Poin (g. ople ); .ini (p,q,i. he a);$.each(c.pa icles, unc ion(s, ){ .inse ( )
});$.each(c.pa icles, unc ion(s, ){ .applyFo ces( ,i. epulsion)})},applySp ings:
unc ion(){$.each(c.sp ings, unc ion( ,p){ a
s=p.poin 2.p.sub ac (p.poin 1.p); a q=p.leng h-s.magni ude(); a
=((s.magni ude()>0)?s:Poin . andom(1)).no malize();p.poin 1.applyFo ce( .mul ipl
y(p.k*q*-
0.5));p.poin 2.applyFo ce( .mul iply(p.k*q*0.5))})},applyCen e D i : unc ion(){
a q=0; a =new
Poin (0,0);$.each(c.pa icles, unc ion( ,s){ .add(s.p);q++});i (q==0){ e u n} a
p= .di ide(-
q);$.each(c.pa icles, unc ion( ,s){s.applyFo ce(p)})},applyCen e G a i y: unc io
n(){$.each(c.pa icles, unc ion( ,p){ a q=p.p.mul iply(-
1);p.applyFo ce(q.mul iply(i. epulsion/100))})},upda eVeloci y: unc ion(p){$.each
115
(c.pa icles, unc ion( ,q){i (q. ixed){q. =new Poin (0,0);q. =new
Poin (0,0); e u n} a s=q. .magni ude();q. =q. .add(q. .mul iply(p)).mul iply(1-
i. ic ion);q. .x=q. .y=0; a
=q. .magni ude();i ( >j){q. =q. .di ide( * )}})},upda ePosi ion: unc ion(q){ a
=0,p=0,u=0; a =null; a
s=null;$.each(c.pa icles, unc ion(w, ){ .p= .p.add( . .mul iply(q)); a
x= . .magni ude(); a z=x*x; +=z;p=Ma h.max(z,p);u++;i (! ){ =new
Poin ( .p.x, .p.y);s=new Poin ( .p.x, .p.y); e u n} a
y= .p;i (y.x===null||y.y===null){ e u n}i (y.x> .x){ .x=y.x}i (y.y> .y){ .y=y.y}i
(y.x<s.x){s.x=y.x}i (y.y<s.y){s.y=y.y}});b={sum: ,max:p,mean: /u,n:u};g={ ople
:s||new Poin (-1,-1),bo om igh : ||new
Poin (1,1)}},sys emEne gy: unc ion(p){ e u n b}}; e u n i.ini ()}; a
_nea Pa icle= unc ion(b,c){ a c=c||0; a a=b.x; a =b.y; a e=c*2; e u n new
Poin (a-c+Ma h. andom()*e, -c+Ma h. andom()*e)};
// i called as a wo ke h ead, se up a un loop o he Physics objec and
bail ou
i ( ypeo (window)=='unde ined') e u n ( unc ion(){
/* he me ic.js */ $={each: unc ion(d,e){i ($.isA ay(d)){ o ( a
c=0,b=d.leng h;c<b;c++){e(c,d[c])}}else{ o ( a a in
d){e(a,d[a])}}},map: unc ion(a,c){ a b=[];$.each(a, unc ion( ,e){ a
d=c(e);i (d!==unde ined){b.push(d)}}); e u n b},ex end: unc ion(c,b){i ( ypeo
b!="objec "){ e u n c} o ( a a in b){i (b.hasOwnP ope y(a)){c[a]=b[a]}} e u n
c},isA ay: unc ion(a){i (!a){ e u n
alse} e u n(a.cons uc o . oS ing().indexO ("A ay")!=-
1)},inA ay: unc ion(c,a){ o ( a d=0,b=a.leng h;d<b;d++){i (a[d]===c){ e u n
d}} e u n -1},isEmp yObjec : unc ion(a){i ( ypeo a!=="objec "){ e u n alse} a
b= ue;$.each(a, unc ion(c,d){b= alse}); e u n b},};
/* wo ke .js */ a PhysicsWo ke = unc ion(){ a b=20; a a=null; a
d=null; a c=null; a g=[]; a =new Da e(). alueO (); a
e={ini : unc ion(h){e. imeou (h. imeou );a=Physics(h.d ,h.s i ness,h. epulsion,h
. ic ion,e. ock); e u n
e}, imeou : unc ion(h){i (h!=b){b=h;i (d!==null){e.s op();e.go()}}},go: unc ion()
{i (d!==null){ e u n}c=null;d=se In e al(e. ick,b)},s op: unc ion(){i (d===null)
{ e u n}clea In e al(d);d=null}, ick: unc ion(){a. ick(); a
h=a.sys emEne gy();i ((h.mean+h.max)/2<0.05){i (c===null){c=new
Da e(). alueO ()}i (new Da e(). alueO ()-
c>1000){e.s op()}else{}}else{c=null}}, ock: unc ion(h){h. ype="geome y";pos Mess
age(h)},modi yNode: unc ion(i,h){a.modi yNode(i,h);e.go()},modi yPhysics: unc ion
(h){a.modi yPhysics(h)},upda e: unc ion(h){ a i=a._upda e(h)}}; e u n e}; a
physics=PhysicsWo ke ();onmessage= unc ion(a){i (!a.da a. ype){pos Message("¿ké n
èl?"); e u n}i (a.da a. ype=="physics"){ a
b=a.da a.physics;physics.ini (a.da a.physics); e u n}swi ch(a.da a. ype){case"mod
i y":physics.modi yNode(a.da a.id,a.da a.mods);b eak;case"changes":physics.upda e
(a.da a.changes);physics.go();b eak;case"s a ":physics.go();b eak;case"s op":phy
sics.s op();b eak;case"sys": a
b=a.da a.pa am||{};i (!isNaN(b. imeou )){physics. imeou (b. imeou )}physics.modi
yPhysics(b);physics.go();b eak}};
})()
a bo = ( ypeo (a bo )!=='unde ined') ? a bo : {}
$.ex end(a bo , {
// objec cons uc o s (don' use ‘new’, jus call hem)
Pa icleSys em:Pa icleSys em,
Poin : unc ion(x, y){ e u n new Poin (x, y) },
// immu able objec wi h use ul me hods
e c:{
ace: ace, // ƒ(msg) -> sa e console logging
di name:di name, // ƒ(pa h) -> leading pa o pa h
basename:basename, // ƒ(pa h) -> ailing pa o pa h
116
o dinalize:o dinalize, // ƒ(num) -> abb e in ege s (and add commas)
objcopy:objcopy, // ƒ(old) -> clone an objec
objcmp:objcmp, // ƒ(a, b, s ic _o de ing) -> / compa ison
objkeys:objkeys, // ƒ(obj) -> a ay o all keys in obj
objme ge:objme ge, // ƒ(ds , s c) -> like $.ex end bu non-
des uc i e
uniq:uniq, // ƒ(a ) -> a ay o unique i ems in a
a bo _pa h:a bo _pa h, // ƒ() -> guess he di ec o y o he lib code
}
})
})( his.jQue y)
A bo - ween.js
//
// a bo - ween.js
// smoo h ansi ions wi h a eal ime clock
//
// Copy igh (c) 2011 Samizda D a ing Co.
//
// Pe mission is he eby g an ed, ee o cha ge, o any pe son
// ob aining a copy o his so wa e and associa ed documen a ion
// iles ( he "So wa e"), o deal in he So wa e wi hou
// es ic ion, including wi hou limi a ion he igh s o use,
// copy, modi y, me ge, publish, dis ibu e, sublicense, and/o sell
// copies o he So wa e, and o pe mi pe sons o whom he
// So wa e is u nished o do so, subjec o he ollowing
// condi ions:
//
// The abo e copy igh no ice and his pe mission no ice shall be
// included in all copies o subs an ial po ions o he So wa e.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
//
// Easing Equa ions in easing.js:
// Copy igh © 2001 Robe Penne . All igh s ese ed.
//
// Open sou ce unde he BSD License. Redis ibu ion and use in sou ce
// and bina y o ms, wi h o wi hou modi ica ion, a e pe mi ed
// p o ided ha he ollowing condi ions a e me :
//
// Redis ibu ions o sou ce code mus e ain he abo e copy igh
// no ice, his lis o condi ions and he ollowing disclaime .
// Redis ibu ions in bina y o m mus ep oduce he abo e copy igh
// no ice, his lis o condi ions and he ollowing disclaime in he
// documen a ion and/o o he ma e ials p o ided wi h he dis ibu ion.
//
// Nei he he name o he au ho no he names o con ibu o s may be
// used o endo se o p omo e p oduc s de i ed om his so wa e
// wi hou speci ic p io w i en pe mission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
117
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
( unc ion($){
/* e c.js */ a
ace= unc ion(msg){i ( ypeo (window)=="unde ined"||!window.console){ e u n} a
len=a gumen s.leng h; a a gs=[]; o ( a
i=0;i<len;i++){a gs.push("a gumen s["+i+"]")}e al("console.log("+a gs.join(",")+"
)")}; a di name= unc ion(a){ a
b=a. eplace(/^ /?(.*?) /?$/,"$1").spli ("/");b.pop(); e u n"/"+b.join("/")}; a
basename= unc ion(b){ a c=b. eplace(/^ /?(.*?) /?$/,"$1").spli ("/"); a
a=c.pop();i (a==""){ e u n null}else{ e u n a}}; a
_o dinalize_ e=/( d)(?=( d d d)+(?! d))/g; a o dinalize= unc ion(a){ a
b=""+a;i (a<11000){b=(""+a). eplace(_o dinalize_ e,"$1,")}else{i (a<1000000){b=Ma
h. loo (a/1000)+"k"}else{i (a<1000000000){b=(""+Ma h. loo (a/1000)). eplace(_o d
inalize_ e,"$1,")+"m"}}} e u n b}; a nano= unc ion(a,b){ e u n
a. eplace(/ {([ w - .]*)}/g, unc ion( ,c){ a
d=c.spli ("."),e=b[d.shi ()];$.each(d, unc ion(){i (e.hasOwnP ope y( his)){e=e[
his]}else{e= }}); e u n e})}; a objcopy= unc ion(a){i (a===unde ined){ e u n
unde ined}i (a===null){ e u n null}i (a.pa en Node){ e u n a}swi ch( ypeo
a){case"s ing": e u n a.subs ing(0);b eak;case"numbe ": e u n
a+0;b eak;case"boolean": e u n a=== ue;b eak} a
b=($.isA ay(a))?[]:{};$.each(a, unc ion(d,c){b[d]=objcopy(c)}); e u n b}; a
objme ge= unc ion(d,b){d=d||{};b=b||{}; a c=objcopy(d); o ( a a in
b){c[a]=b[a]} e u n c}; a objcmp= unc ion(e,c,d){i (!e||!c){ e u n
e===c}i ( ypeo e!= ypeo c){ e u n alse}i ( ypeo e!="objec "){ e u n
e===c}else{i ($.isA ay(e)){i (!($.isA ay(c))){ e u n
alse}i (e.leng h!=c.leng h){ e u n alse}}else{ a h=[]; o ( a in
e){i (e.hasOwnP ope y( )){h.push( )}} a g=[]; o ( a in
c){i (c.hasOwnP ope y( )){g.push( )}}i (!d){h.so ();g.so ()}i (h.join(",")!==g
.join(",")){ e u n alse}} a i= ue;$.each(e, unc ion(a){ a
b=objcmp(e[a],c[a]);i=i&&b;i (!i){ e u n alse}}); e u n i}}; a
objkeys= unc ion(b){ a
a=[];$.each(b, unc ion(d,c){i (b.hasOwnP ope y(d)){a.push(d)}}); e u n a}; a
objcon ains= unc ion(c){i (!c|| ypeo c!="objec "){ e u n alse} o ( a
b=1,a=a gumen s.leng h;b<a;b++){i (c.hasOwnP ope y(a gumen s[b])){ e u n
ue}} e u n alse}; a uniq= unc ion(b){ a a=b.leng h; a d={}; o ( a
c=0;c<a;c++){d[b[c]]= ue} e u n objkeys(d)}; a a bo _pa h= unc ion(){ a
a=$("sc ip ").map( unc ion(b){ a
c=$( his).a ("s c");i (!c){ e u n}i (c.ma ch(/a bo [^ / .]*.js|de .js/)){ e u n
c.ma ch(/.* //)||"/"}});i (a.leng h>0){ e u n a[0]}else{ e u n null}};
/* colo s.js */ a Colo s=( unc ion(){ a =/#[0-9a- ]{6}/i; a
b=/#(..)(..)(..)/; a c= unc ion(h){ a
g=h. oS ing(16); e u n(g.leng h==2)?g:"0"+g}; a a= unc ion(g){ e u n
pa seIn (g,16)}; a d= unc ion(g){i (!g|| ypeo g!="objec "){ e u n alse} a
h=objkeys(g).so ().join("");i (h=="abg "){ e u n ue}}; a
e={CSS:{aliceblue:"# 0 8 ",an iquewhi e:"# aebd7",aqua:"#00 ",aquama ine:"#7
d4",azu e:"# 0 ",beige:"# 5 5dc",bisque:"# e4c4",black:"#000000",blanchedal
mond:"# ebcd",blue:"#0000 ",blue iole :"#8a2be2",b own:"#a52a2a",bu lywood:"#de
b887",cade blue:"#5 9ea0",cha euse:"#7 00",chocola e:"#d2691e",co al:"# 7 50
",co n lowe blue:"#6495ed",co nsilk:"# 8dc",c imson:"#dc143c",cyan:"#00 ",da
kblue:"#00008b",da kcyan:"#008b8b",da kgolden od:"#b8860b",da kg ay:"#a9a9a9",da
kg ey:"#a9a9a9",da kg een:"#006400",da kkhaki:"#bdb76b",da kmagen a:"#8b008b",da

118
koli eg een:"#556b2 ",da ko ange:"# 8c00",da ko chid:"#9932cc",da k ed:"#8b0000
",da ksalmon:"#e9967a",da kseag een:"#8 bc8 ",da ksla eblue:"#483d8b",da ksla eg
ay:"#2 4 4 ",da ksla eg ey:"#2 4 4 ",da k u quoise:"#00ced1",da k iole :"#9400d3"
,deeppink:"# 1493",deepskyblue:"#00b ",dimg ay:"#696969",dimg ey:"#696969",dod
ge blue:"#1e90 ", i eb ick:"#b22222", lo alwhi e:"# a 0", o es g een:"#228b22"
, uchsia:"# 00 ",gainsbo o:"#dcdcdc",ghos whi e:"# 8 8 ",gold:"# d700",golden
od:"#daa520",g ay:"#808080",g ey:"#808080",g een:"#008000",g eenyellow:"#ad 2 "
,honeydew:"# 0 0",ho pink:"# 69b4",indian ed:"#cd5c5c",indigo:"#4b0082",i o y:
"# 0",khaki:"# 0e68c",la ende :"#e6e6 a",la ende blush:"# 0 5",lawng een:"#
7c c00",lemonchi on:"# acd",ligh blue:"#add8e6",ligh co al:"# 08080",ligh cyan
:"#e0 ",ligh golden odyellow:"# a ad2",ligh g ay:"#d3d3d3",ligh g ey:"#d3d3d3"
,ligh g een:"#90ee90",ligh pink:"# b6c1",ligh salmon:"# a07a",ligh seag een:"#2
0b2aa",ligh skyblue:"#87ce a",ligh sla eg ay:"#778899",ligh sla eg ey:"#778899",l
igh s eelblue:"#b0c4de",ligh yellow:"# e0",lime:"#00 00",limeg een:"#32cd32",
linen:"# a 0e6",magen a:"# 00 ",ma oon:"#800000",mediumaquama ine:"#66cdaa",med
iumblue:"#0000cd",mediumo chid:"#ba55d3",mediumpu ple:"#9370d8",mediumseag een:"#
3cb371",mediumsla eblue:"#7b68ee",mediumsp ingg een:"#00 a9a",medium u quoise:"#4
8d1cc",medium iole ed:"#c71585",midnigh blue:"#191970",min c eam:"# 5 a",mis y
ose:"# e4e1",moccasin:"# e4b5",na ajowhi e:"# dead",na y:"#000080",oldlace:"#
d 5e6",oli e:"#808000",oli ed ab:"#6b8e23",o ange:"# a500",o ange ed:"# 4500",
o chid:"#da70d6",palegolden od:"#eee8aa",paleg een:"#98 b98",pale u quoise:"#a ee
ee",pale iole ed:"#d87093",papayawhip:"# e d5",peachpu :"# dab9",pe u:"#cd853
",pink:"# c0cb",plum:"#dda0dd",powde blue:"#b0e0e6",pu ple:"#800080", ed:"# 00
00", osyb own:"#bc8 8 ", oyalblue:"#4169e1",saddleb own:"#8b4513",salmon:"# a8072
",sandyb own:"# 4a460",seag een:"#2e8b57",seashell:"# 5ee",sienna:"#a0522d",sil
e :"#c0c0c0",skyblue:"#87ceeb",sla eblue:"#6a5acd",sla eg ay:"#708090",sla eg ey
:"#708090",snow:"# a a",sp ingg een:"#00 7 ",s eelblue:"#4682b4", an:"#d2b48c"
, eal:"#008080", his le:"#d8b d8", oma o:"# 6347", u quoise:"#40e0d0", iole :"#e
e82ee",whea :"# 5deb3",whi e:"# ",whi esmoke:"# 5 5 5",yellow:"# 00",yell
owg een:"#9acd32"},decode: unc ion(h){ a g=a gumen s.leng h; o ( a l=g-
1;l>=0;l--){i (a gumen s[l]===unde ined){g--}} a k=a gumen s;i (!h){ e u n
null}i (g==1&&d(h)){ e u n h} a j=null;i ( ypeo h=="s ing"){ a
o=1;i (g==2){o=k[1]} a n=e.CSS[h. oLowe Case()];i (n!==unde ined){h=n} a
m=h.ma ch( );i (m){ als=h.ma ch(b);i (! als||! als.leng h|| als.leng h!=4){ e u n
null}j={ :a( als[1]),g:a( als[2]),b:a( als[3]),a:o}}}else{i ( ypeo
h=="numbe "){i (g>=3){j={ :k[0],g:k[1],b:k[2],a:1};i (g>=4){j.a*=k[3]}}else{i (g>
=1){j={ :k[0],g:k[0],b:k[0],a:1};i (g==2){j.a*=k[1]}}}}} e u n
j}, alida e: unc ion(g){i (!g|| ypeo g!="s ing"){ e u n
alse}i (e.CSS[g. oLowe Case()]!==unde ined){ e u n ue}i (g.ma ch( )){ e u n
ue} e u n alse},mix: unc ion(h,g,k){ a j=e.decode(h); a
i=e.decode(g)},blend: unc ion(g,j){j=(j!==unde ined)?Ma h.max(0,Ma h.min(1,j)):1;
a h=e.decode(g);i (!h){ e u n null}i (j==1){ e u n g} a h=g;i ( ypeo
g=="s ing"){h=e.decode(g)} a i=objcopy(h);i.a*=j; e u n
nano(" gba({ },{g},{b},{a})",i)},encode: unc ion(g){i (!d(g)){g=e.decode(g);i (!d
(g)){ e u n null}}i (g.a==1){ e u n
nano("#{ }{g}{b}",{ :c(g. ),g:c(g.g),b:c(g.b)})}else{ e u n
nano(" gba({ },{g},{b},{a})",g)}}}; e u n e})();
/* easing.js */ a Easing=( unc ion(){ a a={linea : unc ion( ,e,h,g){ e u n
h*( /g)+e},quadin: unc ion( ,e,h,g){ e u n
h*( /=g)* +e},quadou : unc ion( ,e,h,g){ e u n -h*( /=g)*( -
2)+e},quadinou : unc ion( ,e,h,g){i (( /=g/2)<1){ e u n h/2* * +e} e u n -h/2*((-
- )*( -2)-1)+e},cubicin: unc ion( ,e,h,g){ e u n
h*( /=g)* * +e},cubicou : unc ion( ,e,h,g){ e u n h*(( = /g-
1)* * +1)+e},cubicinou : unc ion( ,e,h,g){i (( /=g/2)<1){ e u n
h/2* * * +e} e u n h/2*(( -=2)* * +2)+e},qua in: unc ion( ,e,h,g){ e u n
h*( /=g)* * * +e},qua ou : unc ion( ,e,h,g){ e u n -h*(( = /g-1)* * * -
1)+e},qua inou : unc ion( ,e,h,g){i (( /=g/2)<1){ e u n h/2* * * * +e} e u n -
h/2*(( -=2)* * * -2)+e},quin in: unc ion( ,e,h,g){ e u n
h*( /=g)* * * * +e},quin ou : unc ion( ,e,h,g){ e u n h*(( = /g-
1)* * * * +1)+e},quin inou : unc ion( ,e,h,g){i (( /=g/2)<1){ e u n
h/2* * * * * +e} e u n h/2*(( -=2)* * * * +2)+e},sinein: unc ion( ,e,h,g){ e u n
-h*Ma h.cos( /g*(Ma h.PI/2))+h+e},sineou : unc ion( ,e,h,g){ e u n
119
h*Ma h.sin( /g*(Ma h.PI/2))+e},sineinou : unc ion( ,e,h,g){ e u n -
h/2*(Ma h.cos(Ma h.PI* /g)-
1)+e},expoin: unc ion( ,e,h,g){ e u n( ==0)?e:h*Ma h.pow(2,10*( /g-
1))+e},expoou : unc ion( ,e,h,g){ e u n( ==g)?e+h:h*(-Ma h.pow(2,-
10* /g)+1)+e},expoinou : unc ion( ,e,h,g){i ( ==0){ e u n e}i ( ==g){ e u n
e+h}i (( /=g/2)<1){ e u n h/2*Ma h.pow(2,10*( -1))+e} e u n h/2*(-Ma h.pow(2,-
10*-- )+2)+e},ci cin: unc ion( ,e,h,g){ e u n -h*(Ma h.sq (1-( /=g)* )-
1)+e},ci cou : unc ion( ,e,h,g){ e u n h*Ma h.sq (1-( = /g-
1)* )+e},ci cinou : unc ion( ,e,h,g){i (( /=g/2)<1){ e u n -h/2*(Ma h.sq (1-
* )-1)+e} e u n h/2*(Ma h.sq (1-( -=2)* )+1)+e},elas icin: unc ion(g,e,k,j){ a
h=1.70158; a i=0; a =k;i (g==0){ e u n e}i ((g/=j)==1){ e u n
e+k}i (!i){i=j*0.3}i ( <Ma h.abs(k)){ =k; a h=i/4}else{ a
h=i/(2*Ma h.PI)*Ma h.asin(k/ )} e u n -( *Ma h.pow(2,10*(g-=1))*Ma h.sin((g*j-
h)*(2*Ma h.PI)/i))+e},elas icou : unc ion(g,e,k,j){ a h=1.70158; a i=0; a
=k;i (g==0){ e u n e}i ((g/=j)==1){ e u n
e+k}i (!i){i=j*0.3}i ( <Ma h.abs(k)){ =k; a h=i/4}else{ a
h=i/(2*Ma h.PI)*Ma h.asin(k/ )} e u n *Ma h.pow(2,-10*g)*Ma h.sin((g*j-
h)*(2*Ma h.PI)/i)+k+e},elas icinou : unc ion(g,e,k,j){ a h=1.70158; a i=0; a
=k;i (g==0){ e u n e}i ((g/=j/2)==2){ e u n
e+k}i (!i){i=j*(0.3*1.5)}i ( <Ma h.abs(k)){ =k; a h=i/4}else{ a
h=i/(2*Ma h.PI)*Ma h.asin(k/ )}i (g<1){ e u n -0.5*( *Ma h.pow(2,10*(g-
=1))*Ma h.sin((g*j-h)*(2*Ma h.PI)/i))+e} e u n *Ma h.pow(2,-10*(g-
=1))*Ma h.sin((g*j-
h)*(2*Ma h.PI)/i)*0.5+k+e},backin: unc ion( ,e,i,h,g){i (g==unde ined){g=1.70158}
e u n i*( /=h)* *((g+1)* -
g)+e},backou : unc ion( ,e,i,h,g){i (g==unde ined){g=1.70158} e u n i*(( = /h-
1)* *((g+1)* +g)+1)+e},backinou : unc ion( ,e,i,h,g){i (g==unde ined){g=1.70158}i
(( /=h/2)<1){ e u n i/2*( * *(((g*=(1.525))+1)* -g))+e} e u n i/2*(( -
=2)* *(((g*=(1.525))+1)* +g)+2)+e},bouncein: unc ion( ,e,h,g){ e u n h-
a.bounceOu (g- ,0,h,g)+e},bounceou : unc ion( ,e,h,g){i (( /=g)<(1/2.75)){ e u n
h*(7.5625* * )+e}else{i ( <(2/2.75)){ e u n h*(7.5625*( -
=(1.5/2.75))* +0.75)+e}else{i ( <(2.5/2.75)){ e u n h*(7.5625*( -
=(2.25/2.75))* +0.9375)+e}else{ e u n h*(7.5625*( -
=(2.625/2.75))* +0.984375)+e}}}},bounceinou : unc ion( ,e,h,g){i ( <g/2){ e u n
a.bounceIn( *2,0,h,g)*0.5+e} e u n a.bounceOu ( *2-g,0,h,g)*0.5+h*0.5+e}}; e u n
a})();
/* ween.js */ a Tween= unc ion(){ a a={}; a c= ue; a
b={ini : unc ion(){ e u n b},busy: unc ion(){ a e= alse; o ( a d in
a){e= ue;b eak} e u n e}, o: unc ion(g,e,p){ a =new Da e(). alueO (); a
d={}; a q={ om:{}, o:{},colo s:{},node:g, 0: , 1: +e*1000,du :e*1000}; a
o="linea "; o ( a j in p){i (j=="easing"){ a h=p[j]. oLowe Case();i (h in
Easing){o=h}con inue}else{i (j=="delay"){ a
m=(p[j]||0)*1000;q. 0+=m;q. 1+=m;con inue}}i (Colo s. alida e(p[j])){q.colo s[j]=
[Colo s.decode(g.da a[j]),Colo s.decode(p[j]),p[j]];d[j]= ue}else{q. om[j]=(g.d
a a[j]!=unde ined)?g.da a[j]:p[j];q. o[j]=p[j];d[j]= ue}}q.ease=Easing[o];i (a[g
._id]===unde ined){a[g._id]=[]}a[g._id].push(q);i (a.leng h>1){ o ( a
l=a.leng h-2;l>=0;l++){ a n=a[l]; o ( a j in n. o){i (j in d){dele e
n. o[j]}else{d[j]= ue}} o ( a j in n.colo s){i (j in d){dele e
n.colo s[j]}else{d[j]= ue}}i ($.isEmp yObjec (n.colo s)&&$.isEmp yObjec (n. o)){
a.splice(l,1)}}}c= alse},in e pola e: unc ion(e,h,i,g){g=(g||""). oLowe Case(); a
d=Easing.linea ;i (g in Easing){d=Easing[g]} a
=d(e,0,1,1);i (Colo s. alida e(h)&&Colo s. alida e(i)){ e u n
le pRGB( ,h,i)}else{i (!isNaN(h)){ e u n le pNumbe ( ,h,i)}else{i ( ypeo
h=="s ing"){ e u n( <0.5)?h:i}}}}, ick: unc ion(){ a = ue; o ( a d in
a){ = alse;b eak}i ( ){ e u n} a e=new
Da e(). alueO ();$.each(a, unc ion(i,h){ a g= alse;$.each(h, unc ion(p, ){ a
o= .ease((e- . 0),0,1, .du );o=Ma h.min(1,o); a = . om; a s= . o; a
j= .colo s; a l= .node.da a; a m=(o==1); o ( a n in s){swi ch( ypeo
s[n]){case"numbe ":l[n]=le pNumbe (o, [n],s[n]);i (n=="alpha"){l[n]=Ma h.max(0,Ma
h.min(1,l[n]))}b eak;case"s ing":i (m){l[n]=s[n]}b eak}} o ( a n in
j){i (m){l[n]=j[n][2]}else{ a
q=le pRGB(o,j[n][0],j[n][1]);l[n]=Colo s.encode(q)}}i (m){ .comple ed= ue;g= ue
120
}});i (g){a[i]=$.map(h, unc ion(j){i (!j.comple ed){ e u n
j}});i (a[i].leng h==0){dele e a[i]}}});c=$.isEmp yObjec (a); e u n c}}; e u n
b.ini ()}; a le pNumbe = unc ion(a,c,b){ e u n c+a*(b-c)}; a
le pRGB= unc ion(b,d,c){b=Ma h.max(Ma h.min(b,1),0); a
a={};$.each(" gba".spli (""), unc ion(e, ){a[ ]=Ma h. ound(d[ ]+b*(c[ ]-
d[ ]))}); e u n a};
a bo = ( ypeo (a bo )!=='unde ined') ? a bo : {}
$.ex end(a bo , {
// no eally use -se iceable; use he Pa icleSys em’s . ween* me hods
ins ead
Tween:Tween,
// immu able objec wi h use ul me hods
colo s:{
CSS:Colo s.CSS, // dic iona y: {colo name:# e 2e2,...}
alida e:Colo s. alida e, // ƒ(s ) -> /
decode:Colo s.decode, // ƒ(hexS ing_o _cssColo ) -> { ,g,b,a}
encode:Colo s.encode, // ƒ({ ,g,b,a}) -> hexO RgbaS ing
blend:Colo s.blend // ƒ(colo , opaci y) -> gbaS ing
}
})
})( his.jQue y)
A bo -g aphics.js
//
// a bo -g aphics.js
// can as uc ose
//
// Copy igh (c) 2011 Samizda D a ing Co.
//
// Pe mission is he eby g an ed, ee o cha ge, o any pe son
// ob aining a copy o his so wa e and associa ed documen a ion
// iles ( he "So wa e"), o deal in he So wa e wi hou
// es ic ion, including wi hou limi a ion he igh s o use,
// copy, modi y, me ge, publish, dis ibu e, sublicense, and/o sell
// copies o he So wa e, and o pe mi pe sons o whom he
// So wa e is u nished o do so, subjec o he ollowing
// condi ions:
//
// The abo e copy igh no ice and his pe mission no ice shall be
// included in all copies o subs an ial po ions o he So wa e.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
//
( unc ion($){
/* e c.js */ a
ace= unc ion(msg){i ( ypeo (window)=="unde ined"||!window.console){ e u n} a
len=a gumen s.leng h; a a gs=[]; o ( a
121
i=0;i<len;i++){a gs.push("a gumen s["+i+"]")}e al("console.log("+a gs.join(",")+"
)")}; a di name= unc ion(a){ a
b=a. eplace(/^ /?(.*?) /?$/,"$1").spli ("/");b.pop(); e u n"/"+b.join("/")}; a
basename= unc ion(b){ a c=b. eplace(/^ /?(.*?) /?$/,"$1").spli ("/"); a
a=c.pop();i (a==""){ e u n null}else{ e u n a}}; a
_o dinalize_ e=/( d)(?=( d d d)+(?! d))/g; a o dinalize= unc ion(a){ a
b=""+a;i (a<11000){b=(""+a). eplace(_o dinalize_ e,"$1,")}else{i (a<1000000){b=Ma
h. loo (a/1000)+"k"}else{i (a<1000000000){b=(""+Ma h. loo (a/1000)). eplace(_o d
inalize_ e,"$1,")+"m"}}} e u n b}; a nano= unc ion(a,b){ e u n
a. eplace(/ {([ w - .]*)}/g, unc ion( ,c){ a
d=c.spli ("."),e=b[d.shi ()];$.each(d, unc ion(){i (e.hasOwnP ope y( his)){e=e[
his]}else{e= }}); e u n e})}; a objcopy= unc ion(a){i (a===unde ined){ e u n
unde ined}i (a===null){ e u n null}i (a.pa en Node){ e u n a}swi ch( ypeo
a){case"s ing": e u n a.subs ing(0);b eak;case"numbe ": e u n
a+0;b eak;case"boolean": e u n a=== ue;b eak} a
b=($.isA ay(a))?[]:{};$.each(a, unc ion(d,c){b[d]=objcopy(c)}); e u n b}; a
objme ge= unc ion(d,b){d=d||{};b=b||{}; a c=objcopy(d); o ( a a in
b){c[a]=b[a]} e u n c}; a objcmp= unc ion(e,c,d){i (!e||!c){ e u n
e===c}i ( ypeo e!= ypeo c){ e u n alse}i ( ypeo e!="objec "){ e u n
e===c}else{i ($.isA ay(e)){i (!($.isA ay(c))){ e u n
alse}i (e.leng h!=c.leng h){ e u n alse}}else{ a h=[]; o ( a in
e){i (e.hasOwnP ope y( )){h.push( )}} a g=[]; o ( a in
c){i (c.hasOwnP ope y( )){g.push( )}}i (!d){h.so ();g.so ()}i (h.join(",")!==g
.join(",")){ e u n alse}} a i= ue;$.each(e, unc ion(a){ a
b=objcmp(e[a],c[a]);i=i&&b;i (!i){ e u n alse}}); e u n i}}; a
objkeys= unc ion(b){ a
a=[];$.each(b, unc ion(d,c){i (b.hasOwnP ope y(d)){a.push(d)}}); e u n a}; a
objcon ains= unc ion(c){i (!c|| ypeo c!="objec "){ e u n alse} o ( a
b=1,a=a gumen s.leng h;b<a;b++){i (c.hasOwnP ope y(a gumen s[b])){ e u n
ue}} e u n alse}; a uniq= unc ion(b){ a a=b.leng h; a d={}; o ( a
c=0;c<a;c++){d[b[c]]= ue} e u n objkeys(d)}; a a bo _pa h= unc ion(){ a
a=$("sc ip ").map( unc ion(b){ a
c=$( his).a ("s c");i (!c){ e u n}i (c.ma ch(/a bo [^ / .]*.js|de .js/)){ e u n
c.ma ch(/.* //)||"/"}});i (a.leng h>0){ e u n a[0]}else{ e u n null}};
/* colo s.js */ a Colo s=( unc ion(){ a =/#[0-9a- ]{6}/i; a
b=/#(..)(..)(..)/; a c= unc ion(h){ a
g=h. oS ing(16); e u n(g.leng h==2)?g:"0"+g}; a a= unc ion(g){ e u n
pa seIn (g,16)}; a d= unc ion(g){i (!g|| ypeo g!="objec "){ e u n alse} a
h=objkeys(g).so ().join("");i (h=="abg "){ e u n ue}}; a
e={CSS:{aliceblue:"# 0 8 ",an iquewhi e:"# aebd7",aqua:"#00 ",aquama ine:"#7
d4",azu e:"# 0 ",beige:"# 5 5dc",bisque:"# e4c4",black:"#000000",blanchedal
mond:"# ebcd",blue:"#0000 ",blue iole :"#8a2be2",b own:"#a52a2a",bu lywood:"#de
b887",cade blue:"#5 9ea0",cha euse:"#7 00",chocola e:"#d2691e",co al:"# 7 50
",co n lowe blue:"#6495ed",co nsilk:"# 8dc",c imson:"#dc143c",cyan:"#00 ",da
kblue:"#00008b",da kcyan:"#008b8b",da kgolden od:"#b8860b",da kg ay:"#a9a9a9",da
kg ey:"#a9a9a9",da kg een:"#006400",da kkhaki:"#bdb76b",da kmagen a:"#8b008b",da
koli eg een:"#556b2 ",da ko ange:"# 8c00",da ko chid:"#9932cc",da k ed:"#8b0000
",da ksalmon:"#e9967a",da kseag een:"#8 bc8 ",da ksla eblue:"#483d8b",da ksla eg
ay:"#2 4 4 ",da ksla eg ey:"#2 4 4 ",da k u quoise:"#00ced1",da k iole :"#9400d3"
,deeppink:"# 1493",deepskyblue:"#00b ",dimg ay:"#696969",dimg ey:"#696969",dod
ge blue:"#1e90 ", i eb ick:"#b22222", lo alwhi e:"# a 0", o es g een:"#228b22"
, uchsia:"# 00 ",gainsbo o:"#dcdcdc",ghos whi e:"# 8 8 ",gold:"# d700",golden
od:"#daa520",g ay:"#808080",g ey:"#808080",g een:"#008000",g eenyellow:"#ad 2 "
,honeydew:"# 0 0",ho pink:"# 69b4",indian ed:"#cd5c5c",indigo:"#4b0082",i o y:
"# 0",khaki:"# 0e68c",la ende :"#e6e6 a",la ende blush:"# 0 5",lawng een:"#
7c c00",lemonchi on:"# acd",ligh blue:"#add8e6",ligh co al:"# 08080",ligh cyan
:"#e0 ",ligh golden odyellow:"# a ad2",ligh g ay:"#d3d3d3",ligh g ey:"#d3d3d3"
,ligh g een:"#90ee90",ligh pink:"# b6c1",ligh salmon:"# a07a",ligh seag een:"#2
0b2aa",ligh skyblue:"#87ce a",ligh sla eg ay:"#778899",ligh sla eg ey:"#778899",l
igh s eelblue:"#b0c4de",ligh yellow:"# e0",lime:"#00 00",limeg een:"#32cd32",
linen:"# a 0e6",magen a:"# 00 ",ma oon:"#800000",mediumaquama ine:"#66cdaa",med
iumblue:"#0000cd",mediumo chid:"#ba55d3",mediumpu ple:"#9370d8",mediumseag een:"#