';
if ($this->u->info['team'] == 1) {
- $uz = mysql_fetch_array(mysql_query('SELECT `u`.`sex`,`u`.`id`,`u`.`login`,`u`.`align`,`u`.`clan`,`u`.`admin`,`u`.`city`,`u`.`room`,`u`.`online`,`u`.`level`,`u`.`battle`,`u`.`money`,`st`.* FROM `stats` AS `st` LEFT JOIN `users` AS `u` ON (`st`.`id` = `u`.`id`) WHERE `st`.`zv`="' . $zi['id'] . '" AND `st`.`team`="2" LIMIT 1'));
+ $uz = mysql_fetch_array(
+ mysql_query(
+ 'SELECT `u`.`sex`,`u`.`id`,`u`.`login`,`u`.`align`,`u`.`clan`,`u`.`admin`,`u`.`city`,`u`.`room`,`u`.`online`,`u`.`level`,`u`.`battle`,`u`.`money`,`st`.* FROM `stats` AS `st` LEFT JOIN `users` AS `u` ON (`st`.`id` = `u`.`id`) WHERE `st`.`zv`="' . $zi['id'] . '" AND `st`.`team`="2" LIMIT 1'
+ )
+ );
if (!isset($uz['id'])) {
//
echo '
';
@@ -1558,12 +1668,20 @@ class FightRequest
if ($uz['sex'] == 2) {
$sa = '';
}
- echo ' ' . $sa . ' ' . $ca . ' ' . $this->u->microLogin($uz['id'], 1) . ' ? ';
+ echo ' ' . $sa . ' ' . $ca . ' ' . $this->u->microLogin(
+ $uz['id'], 1
+ ) . ' ? ';
}
} else {
- $uz = mysql_fetch_array(mysql_query('SELECT `u`.`id`,`u`.`login`,`u`.`align`,`u`.`clan`,`u`.`admin`,`u`.`city`,`u`.`room`,`u`.`online`,`u`.`level`,`u`.`battle`,`u`.`money`,`st`.* FROM `stats` AS `st` LEFT JOIN `users` AS `u` ON (`st`.`id` = `u`.`id`) WHERE `st`.`zv`="' . $zi['id'] . '" AND `st`.`team`="1" LIMIT 1'));
+ $uz = mysql_fetch_array(
+ mysql_query(
+ 'SELECT `u`.`id`,`u`.`login`,`u`.`align`,`u`.`clan`,`u`.`admin`,`u`.`city`,`u`.`room`,`u`.`online`,`u`.`level`,`u`.`battle`,`u`.`money`,`st`.* FROM `stats` AS `st` LEFT JOIN `users` AS `u` ON (`st`.`id` = `u`.`id`) WHERE `st`.`zv`="' . $zi['id'] . '" AND `st`.`team`="1" LIMIT 1'
+ )
+ );
if (isset($uz['id'])) {
- echo ' ' . $this->u->microLogin($uz['id'], 1) . ' ';
+ echo ' ' . $this->u->microLogin(
+ $uz['id'], 1
+ ) . ' ';
}
}
echo '
';
@@ -1579,15 +1697,25 @@ class FightRequest
$ttur = [
0 => ' !',
1 => ' !',
- 2 => ' !'
+ 2 => ' !',
];
if (isset($_POST['trn1']) && $this->u->room['zvsee'] == 0) {
if ($this->u->info['inTurnirnew'] == 0) {
- $totr = mysql_fetch_array(mysql_query('SELECT * FROM `turnirs` WHERE `id` = "' . mysql_real_escape_string($_POST['trn1']) . '" AND `status` = "0" LIMIT 1'));
+ $totr = mysql_fetch_array(
+ mysql_query(
+ 'SELECT * FROM `turnirs` WHERE `id` = "' . mysql_real_escape_string(
+ $_POST['trn1']
+ ) . '" AND `status` = "0" LIMIT 1'
+ )
+ );
if (isset($totr['id'])) {
- mysql_query('UPDATE `users` SET `inTurnirnew` = "' . $totr['id'] . '" WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1');
- mysql_query('UPDATE `turnirs` SET `users_in` = `users_in` + 1 WHERE `id` = "' . $totr['id'] . '" LIMIT 1');
+ mysql_query(
+ 'UPDATE `users` SET `inTurnirnew` = "' . $totr['id'] . '" WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1'
+ );
+ mysql_query(
+ 'UPDATE `turnirs` SET `users_in` = `users_in` + 1 WHERE `id` = "' . $totr['id'] . '" LIMIT 1'
+ );
$this->u->info['inTurnirnew'] = $totr['id'];
$this->error = ' .';
} else {
@@ -1598,9 +1726,17 @@ class FightRequest
}
} elseif (isset($_GET['cancel13']) && $this->u->room['zvsee'] == 0) {
if ($this->u->info['inTurnirnew'] > 0) {
- $totr = mysql_fetch_array(mysql_query('SELECT * FROM `turnirs` WHERE `id` = "' . mysql_real_escape_string($this->u->info['inTurnirnew']) . '" AND `status` = "0" LIMIT 1'));
+ $totr = mysql_fetch_array(
+ mysql_query(
+ 'SELECT * FROM `turnirs` WHERE `id` = "' . mysql_real_escape_string(
+ $this->u->info['inTurnirnew']
+ ) . '" AND `status` = "0" LIMIT 1'
+ )
+ );
if (isset($totr['id'])) {
- mysql_query('UPDATE `users` SET `inTurnirnew` = "0" WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1');
+ mysql_query(
+ 'UPDATE `users` SET `inTurnirnew` = "0" WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1'
+ );
mysql_query('UPDATE `turnirs` SET `users_in` = `users_in` - 1 LIMIT 1');
$this->u->info['inTurnirnew'] = 0;
$this->error = ' .';
@@ -1616,16 +1752,26 @@ class FightRequest
$trse = '';
if ($this->u->info['inTurnirnew'] > 0) {
- $pl = mysql_fetch_array(mysql_query('SELECT * FROM `turnirs` WHERE `id` = "' . $this->u->info['inTurnirnew'] . '" LIMIT 1'));
+ $pl = mysql_fetch_array(
+ mysql_query(
+ 'SELECT * FROM `turnirs` WHERE `id` = "' . $this->u->info['inTurnirnew'] . '" LIMIT 1'
+ )
+ );
if (!isset($pl['id'])) {
- mysql_query('UPDATE `users` SET `inTurnirnew` = "0" WHERE `id` = "' . $pl['id'] . '" LIMIT 1');
+ mysql_query(
+ 'UPDATE `users` SET `inTurnirnew` = "0" WHERE `id` = "' . $pl['id'] . '" LIMIT 1'
+ );
echo '- ... .';
} else {
$dv = ' [' . $pl['users_in'] . ']: ';
- $spu = mysql_query('SELECT `u`.`id`,`u`.`align`,`u`.`login`,`u`.`clan`,`u`.`level`,`u`.`city`,`u`.`online`,`u`.`sex`,`u`.`cityreg`,`u`.`palpro`,`u`.`invis` FROM `users` AS `u` WHERE `u`.`inTurnirnew` = "' . $pl['id'] . '" LIMIT ' . $pl['users_in']);
+ $spu = mysql_query(
+ 'SELECT `u`.`id`,`u`.`align`,`u`.`login`,`u`.`clan`,`u`.`level`,`u`.`city`,`u`.`online`,`u`.`sex`,`u`.`cityreg`,`u`.`palpro`,`u`.`invis` FROM `users` AS `u` WHERE `u`.`inTurnirnew` = "' . $pl['id'] . '" LIMIT ' . $pl['users_in']
+ );
$i = 1;
while ($plu = mysql_fetch_array($spu)) {
- $dv .= '
';
+ return r;
+}
+
+function isImgInSlot(imgElt)
+{
+ var id = imgElt.id;
+ var yes = (id.indexOf(menuImageIdPrefix) !== 0);
+ return yes;
+}
+
+function getImgEltState(imgElt)
+{
+ return activeState;
+}
+
+function getImgEltSlot(imgElt)
+{
+ var id = imgElt.id;
+ if (id.indexOf(menuImageIdPrefix) === 0)
+ {
+ id = id.substr(menuImageIdPrefix.length, id.length - menuImageIdPrefix.length)
+ }
+ id = id.substr(activeState.id.toString().length);
+ return getSlotById(id);
+}
+
+function setMeter(state, meterSuffix, value)
+{
+ var baseId = format('{1}{0}', state.id, meterSuffix);
+ if (document.getElementById(baseId) == null)
+ {
+ return;
+ }
+ if (value == null)
+ {
+ value = 0;
+ }
+ var s = value.toString();
+ s = s + '/' + s;
+ var w = 240 - ((s.length + 2) * 7);
+ var displayMode = (value > 0) ? '' : 'none';
+ document.getElementById(baseId).style.display = displayMode;
+ document.getElementById(baseId + 'v').innerHTML = s;
+ document.getElementById(baseId + 'i').width = w;
+}
+
+function getPersNickString(state)
+{
+ if (state.name == '')
+ {
+ return '';
+ }
+ var clanimg = '';
+ if (state.clan != '')
+ {
+ clanimg = format('', state.clan, clanImgPath);
+ }
+ return format('{5}{0} [{2}]', htmlstring(state.name), state.name, state.natural.level, state.align, baseImgPath, clanimg, charInfoUrlFormat);
+}
+
+function showPetProps(e)
+{
+ var state = activeState;
+ if (state == null || state.pet == null)
+ {
+ return;
+ }
+ var pet = pets[state.pet.n];
+ var pl = pet.levels['L' + state.pet.level];
+ var html = '' + pet.caption2 + ' [' + pl.level + '] ';
+ html += ': ' + state.pet.name + ' ';
+ if ('skill' in pl)
+ {
+ html += ' ';
+ html += pl.skill.caption + ' [' + pl.skill.level + ']';
+ }
+ showPopup(html);
+ if (!is.ie && e.stopPropagation)
+ {
+ e.stopPropagation();
+ }
+ if (is.ie)
+ {
+ window.event.cancelBubble = true;
+ window.event.returnValue = false;
+ }
+ return false;
+}
+
+function showCharPopup()
+{
+ showPopup(localizer.charHint);
+}
+
+function getPersImageHtml(state)
+{
+ var oimg;
+ var i;
+ var hp = ('hitpoints' in state.results) ? state.results.hitpoints : 0;
+ hp = hp.toString();
+ hp = hp + '/' + hp;
+
+ var r = '';
+ r += '
';
+ r += format('
{2}
', state.id, 'nick', getPersNickString(state));
+ r += format('
', state.id, hpMeterSuffix);
+ r += format('{2} ', state.id, hpMeterSuffix, hp);
+ var w = 240 - ((hp.length + 2) * 7);
+ r += format('', hpMeterGreenImg, getItemPropLabel('hitpoints'), w, state.id, hpMeterSuffix);
+ r += format('', baseImgPath, getItemPropLabel('hitpoints'));
+ var mana = ('mana' in state.results) ? state.results.mana : 0;
+ var manaDisplayMode = (mana > 0) ? '' : 'none';
+ mana = mana.toString();
+ mana = mana + '/' + mana;
+ r += format('
', state.id, manaMeterSuffix, manaDisplayMode);
+ r += format('{2} ', state.id, manaMeterSuffix, mana);
+ w = 240 - ((mana.length + 2) * 7);
+ r += format('', manaMeterImg, getItemPropLabel('mana'), w, state.id, manaMeterSuffix);
+ r += format('', baseImgPath, getItemPropLabel('mana'));
+ r += '
';
+ // w100 - w109
+ for (i = 100; i < 105; i++)
+ {
+ r += getPersObjectImageHtml(state, getSlotById('w' + i));
+ }
+ // this slot is handled as book slot.
+ r += getPersObjectImageHtml(state, slot_wbook);
+// r += format('
', itemImgPath, 109);
+ r += '
';
+ for (i = 105; i < 110; i++)
+ {
+ r += getPersObjectImageHtml(state, getSlotById('w' + i));
+ }
+ // this slot is handled separately like as BK.
+ r += format('
', itemImgPath, 109);
+ r += '
';
+ // w9
+ r += getPersObjectImageHtml(state, slot_w9);
+ r += '
';
+ // w13
+ r += getPersObjectImageHtml(state, slot_w13);
+ r += '
';
+ // w3
+ r += getPersObjectImageHtml(state, slot_w3);
+ r += '
';
+ // w4
+ r += getPersObjectImageHtml(state, slot_w4);
+ r += '
';
+ // w5
+ r += getPersObjectImageHtml(state, slot_w5);
+ r += '
';
+ r += '
';
+ if (state.statElix != null)
+ {
+ var selix = knownElix[state.statElix.elixn];
+ r += '';
+ r += '';
+ r += '';
+ }
+ for (var damageelixn in state.damageElixes)
+ {
+ var damageelix = knownDamageElix[damageelixn];
+ r += '';
+ r += '';
+ r += '';
+ }
+ for (var defelixn in state.defElixes)
+ {
+ var defelix = knownDefElix[defelixn];
+ r += '';
+ r += '';
+ r += '';
+ }
+ if (state.spellHitpoints != 0)
+ {
+ var spellHitpointsId = 'spellHitpointsUp';
+ var spellHitpointsName = knownApplicableSpells.spellHitpointsUp.id;
+ var spellHitpointsCaption = knownApplicableSpells.spellHitpointsUp.caption;
+ if (state.spellHitpoints < 0)
+ {
+ var spellHitpointsId = 'spellHitpointsDown';
+ spellHitpointsName = knownApplicableSpells.spellHitpointsDown.id;
+ spellHitpointsCaption = knownApplicableSpells.spellHitpointsDown.caption;
+ }
+ r += '';
+ r += '';
+ r += '';
+ }
+ if (state.spellIntel > 0)
+ {
+ r += '';
+ r += '';
+ r += '';
+ }
+ if (state.spellBD > 0)
+ {
+ r += '';
+ r += '';
+ r += '';
+ }
+
+ if (state.pet != null)
+ {
+ var pet = pets[state.pet.n];
+ r += format(' ', charImgPath, pet.image.def, pet.image.sex);
+ }
+ r += '
';
+ r += getPersObjectImageHtml(state, slot_w14);
+ // w16 is skipped
+ r += format('
', itemImgPath);
+ r += getPersObjectImageHtml(state, slot_w15);
+ r += '
';
+ r += format('
', itemImgPath);
+ r += format('
', itemImgPath);
+ r += format('
', itemImgPath);
+ r += '
';
+ // w1
+ r += getPersObjectImageHtml(state, slot_w1);
+ r += '
';
+ // w2
+ r += getPersObjectImageHtml(state, slot_w2);
+ r += '
';
+ // w6
+ r += getPersObjectImageHtml(state, slot_w6);
+ // w7
+ r += getPersObjectImageHtml(state, slot_w7);
+ // w8
+ r += getPersObjectImageHtml(state, slot_w8);
+ r += '
';
+ // w11
+ r += getPersObjectImageHtml(state, slot_w11);
+ r += '
';
+ // w10
+ r += getPersObjectImageHtml(state, slot_w10);
+ r += '
';
+ // w19
+ r += getPersObjectImageHtml(state, slot_w19);
+ r += '
';
+ // w12
+ r += getPersObjectImageHtml(state, slot_w12);
+ r += '
';
+ r += '
';
+ // w18
+ r += getPersObjectImageHtml(state, slot_w18);
+ r += '
';
+ // wshirt (w0)
+ r += getPersObjectImageHtml(state, slot_w0);
+ r += '
';
+ // w17
+ r += getPersObjectImageHtml(state, slot_w17);
+ r += '
';
+ for (var ci = 0; ci < 3; ci++)
+ {
+ r += '
';
+ for (var i = 0; i < 7; i++)
+ {
+// if (ci==2 && i==7) {continue;}
+ var trickNumber = (ci * 7) + i;
+ r += getSingleTrickSlotHtml(state, trickNumber, state.trickSlots[trickNumber]);
+ }
+ r += '
';
+ }
+
+ r += '
';
+ return r;
+}
+
+function changePersName()
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ var name = window.prompt(' ', state.name);
+ if (name == null)
+ {
+ return;
+ }
+ state.name = name.toString();
+ hardUpdateDresserState(state);
+}
+
+function changePersAlignTo(align)
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ state.align = align;
+ hardUpdateDresserState(state);
+}
+
+function changePersAlign()
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ var menuHtml = '' + localizer.alignments + '';
+ menuHtml += '
';
+ menuHtml += '
';
+ var groupCount = 0;
+ for (var ai = 0; ai < aligns.length; ai++)
+ {
+ var a = aligns[ai];
+ if ('id' in a)
+ {
+ menuHtml += getRowMenuItemHtml(' ' + a.caption, 'changePersAlignTo(' + "'" + a.id + "'" + ')');
+ }
+ else
+ {
+ if (groupCount > 0)
+ {
+ menuHtml += '
';
+ }
+ }
+ if (chapterHtml)
+ {
+ html += chapterHtml;
+ }
+ return html;
+}
+
+function getDresserInfoPaneCombatSpellHtml(state, spellid)
+{
+ var r = state.combatSpells[spellid];
+ var o = getObjectById(spellid);
+ var html = '
';
+ if (isHeavyArmor(getObjectByStateSlot(state, slot_w4)))
+ {
+ html += format(localizer.badHeavyArmor,
+ getMenuItemHtml(localizer.here, format("onObjectDrop('{0}', 'w4')", state.id))
+ );
+ }
+ if (areNotMagicGloves(getObjectByStateSlot(state, slot_w11)))
+ {
+ html += format(localizer.badGloves,
+ getMenuItemHtml(localizer.here, format("onObjectDrop('{0}', 'w11')", state.id))
+ );
+ }
+ html += '
';
+ html += localizer.strikeGroup;
+ html += '
';
+ html += o.caption;
+ html += '
';
+ var chapterHtml = '';
+ for (var mf in r)
+ {
+ if (!item_props[mf].view)
+ {
+ continue;
+ }
+ var vt = r[mf];
+ var mvt = (vt.minv + vt.maxv);
+ for (var staten in dressStates)
+ {
+ var astate = dressStates[staten];
+ var avt = (spellid in astate.combatSpells) ? astate.combatSpells[spellid][mf] : null;
+ var mavt = (avt != null) ? (avt.minv + avt.maxv) : 0;
+ if (mvt < mavt)
+ {
+ mvt = mavt;
+ }
+ }
+ if (mvt != 0)
+ {
+ chapterHtml += '
', classn, onclick, tabText);
+ return html;
+}
+
+function getDresserInfoPaneTabsHtml(tabIndex)
+{
+ var state = activeState;
+ var html = '';
+ html += ' ';
+ html += '
';
+ html += getDresserInfoPaneTabHtml(localizer.infoPaneHeader, 'showInfoPane()', (tabIndex == 0));
+ html += getDresserInfoPaneTabHtml(localizer.damagePaneHeader, 'showDamagePane()', (tabIndex == 4));
+ html += getDresserInfoPaneTabHtml(localizer.componentsPaneHeader, 'showComponentsPane()', (tabIndex == 5));
+ html += getDresserInfoPaneTabHtml(localizer.listPaneHeader, 'showListPane()', (tabIndex == 1));
+ if (state != null && state.pet != null)
+ {
+ html += getDresserInfoPaneTabHtml(localizer.petPaneHeader, 'showPetPane()', (tabIndex == 2));
+ }
+ html += getDresserInfoPaneTabHtml(localizer.viewOptionsPaneHeader, 'showViewOptionsPane()', (tabIndex == 3));
+ html += '
';
+ return html;
+}
+
+function getDresserPetPaneHtml()
+{
+ var state = activeState;
+ if (state == null || state.pet == null)
+ {
+ return '';
+ }
+ var html = '';
+ var pet = pets[state.pet.n];
+ var pl = pet.levels['L' + state.pet.level];
+ html += '
';
+ html += getDresserInfoPaneTabsHtml(2);
+ html += '
';
+ html += '
';
+ html += '
';
+ html += ' ';
+ html += ': ' + pet.caption;
+ for (var name in pl)
+ {
+ if (name in item_props)
+ {
+ html += ' ' + getItemPropLabel(name) + ': ' + getItemPropFormattedValue(name, pl[name]);
+ }
+ }
+ if ('foods' in pet)
+ {
+ html += '';
+ html += ' ';
+ for (var foodn in pet.foods)
+ {
+ var food = pet.foods[foodn];
+ html += format('', itemImgPath, food.name, food.caption);
+ }
+ }
+
+ html += '
';
+ html += '
';
+ html += '
';
+ html += '
';
+ html += '';
+ html += '
';
+ return html;
+}
+
+function getCharmChooserHtml(sloti)
+{
+ var html = '';
+ var slot = getSlotByIndex(sloti);
+ var o = getObjectByStateSlot(activeState, slot);
+ html += '
';
+ html += format(localizer.charmHint, clanImgPath);
+ html += '
';
+ html += '
';
+ for (var i = 0; i < knownPredefinedCharms.length; i++)
+ {
+ var charm = knownPredefinedCharms[i];
+ if ('categories' in charm)
+ {
+ var found = false;
+ for (var ci = 0; ci < charm.categories.length; ci++)
+ {
+ if (charm.categories[ci] == o.category)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ {
+ continue;
+ }
+ }
+ var text = '';
+ var action = "doPredefinedCharm('" + sloti + "', '" + charm.v + "')";
+ html += getCellMenuItemHtml(text, action);
+ }
+ html += '
';
+ html += '
';
+ html += ' ';
+ html += ' ';
+ html += ' ';
+ html += ' ';
+ html += '';
+ html += ' ';
+ if (!('canCharm' in slot))
+ {
+ html += '
.
';
+ }
+ if ('artefact' in o)
+ {
+ if ('required' in o)
+ {
+ if ('level' in o.required)
+ {
+ if (o.required.level < 10)
+ { html += '
10- .
'; }
+ }
+ }
+ }
+ html += '';
+ html += ' ';
+ html += '
';
+ return html;
+}
+ ///////////////////////////////////////////////////////////////////////////////////
+function getASChooserHtml(sloti,numb)
+{
+ var html = '';
+ var slot = getSlotByIndex(sloti);
+ var o = getObjectByStateSlot(activeState, slot);
+ html += '
';
+ html += format(localizer.addstatsHint, clanImgPath);
+ html += '
';
+ html += '';
+ html += ' ';
+ html += '';
+ return html;
+}
+
+
+
+function item_ad_p(stat)
+ {
+ as = document.getElementById('alst');
+ var istat = document.getElementById('itemstat').value;
+ elem = document.getElementById(stat);
+ document.getElementById(stat).focus();
+ if ((parseInt(as.value) <= parseInt(istat)) && (parseInt(as.value) > 0))
+ {
+ elem.value ++;
+ as.value--;
+ }
+ document.getElementById(stat).blur();
+ }
+
+function item_ad_m(stat)
+ {
+ as = document.getElementById('alst');
+ elem = document.getElementById(stat);
+ var istat = document.getElementById('itemstat').value;
+ document.getElementById(stat).focus();
+
+ if ((as.value <=istat) && (as.value >= 0) )
+ {
+ if (elem.value >= 1)
+ {
+ elem.value --;
+ as.value ++;
+ }
+ }
+ document.getElementById(stat).blur();
+ }
+
+function getDresserViewOptionsPaneHtml()
+{
+ var html = '';
+ html += '
';
+ html += getDresserInfoPaneTabsHtml(3);
+ html += '
';
+ html += '
';
+ html += '
';
+ html += localizer.indicesPaneHeader;
+ for (var ci in common_props)
+ {
+ var prop = common_props[ci];
+ html += format(' ';
+ }
+ html += '';
+ for (var ipi in item_props)
+ {
+ var prop = item_props[ipi];
+ html += format(' ';
+ }
+ html += '
';
+ html += '
';
+ html += '
';
+ html += '
';
+ html += '';
+ html += '
';
+ return html;
+}
+
+function getDresserListPaneHtml(state)
+{
+ var html = '';
+ html += '
';
+ html += getDresserInfoPaneTabsHtml(1);
+ html += '
';
+ html += '
';
+ html += '
';
+ html += '' + localizer.naturalStats + ' ';
+ for (var i = 0; i < knownStats.length; i++)
+ {
+ html += getItemPropLabel(knownStats[i]);
+ html += ': ';
+ html += getItemPropFormattedValue(knownStats[i], state.natural[knownStats[i]]);
+ html += ' ';
+ }
+ html += '';
+
+ html += '' + localizer.resultStats + ' ';
+ for (var i = 0; i < knownStats.length; i++)
+ {
+ html += getItemPropLabel(knownStats[i]);
+ html += ': ';
+ html += getItemPropFormattedValue(knownStats[i], state.results[knownStats[i]]);
+ html += ' ';
+ }
+ html += '';
+
+ html += '' + localizer.wearedItems + ' ';
+ for (var i = 0; i < slots.length; i++)
+ {
+ var o = getObjectByStateSlot(state, slots[i]);
+ if (o == null)
+ {
+ continue;
+ }
+ html += '';
+ html += htmlstring(o.caption);
+ html += ' ';
+ html += ' ';
+ }
+ html += '';
+
+ html += '
';
+ html += '
';
+ html += '
';
+ html += '
';
+ html += '';
+ html += '
';
+ return html;
+}
+
+function showPetPane()
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ document.getElementById('infopane' + state.id).innerHTML = getDresserPetPaneHtml();
+}
+
+function showViewOptionsPane()
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ document.getElementById('infopane' + state.id).innerHTML = getDresserViewOptionsPaneHtml();
+}
+
+function showListPane()
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ document.getElementById('infopane' + state.id).innerHTML = getDresserListPaneHtml(state);
+}
+
+function showDamagePane()
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ document.getElementById('infopane' + state.id).innerHTML = getDresserDamagePaneHtml(state);
+}
+
+function showComponentsPane()
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ document.getElementById('infopane' + state.id).innerHTML = getDresserComponentsPaneHtml(state);
+}
+
+function showPetSkillProps()
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ var pet = pets[state.pet.n];
+ var pl = pet.levels['L' + state.pet.level];
+ showPopup(getObjectDescHtml(state, pl.skill));
+}
+
+function getDamageHtml(caption, damageData)
+{
+ var html = '';
+
+ var chapterHtml = '';
+ for (var mf in knownAdvWeaponModifiers)
+ {
+ if (!item_props[mf].view)
+ {
+ continue;
+ }
+ var vt = (mf in damageData) ? damageData[mf] : null;
+ var mvt = (vt != null) ? (vt.minv + vt.maxv) : 0;
+ if (mvt != 0)
+ {
+ chapterHtml += '
';
+ showMenu(menuHtml, false);
+ document.getElementById('dfcnick').focus();
+}
+
+function onCopyCab(stateid)
+{
+ var state = dressStates[stateid];
+ if (state == null)
+ {
+ return;
+ }
+ var serstate = getSerializableState(state);
+ applyDeserializedState(null, serstate);
+}
+
+function getDresserCommands(state)
+{
+ var html = '
';
+ //html += ''
+ html += getCell2MenuItemHtml(localizer.clearAllStats, format("onClearAllStats('{0}')", state.id));
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(localizer.fitStats, format("onFitStats('{0}')", state.id));
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(localizer.elixMenu, 'onElixMenu()');
+ if (!dressOptions.newCapEdition)
+ {
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(localizer.spellMenu, 'onSpellMenu()');
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(localizer.petMenu, 'onPetMenu()');
+ }
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(localizer.optionsMenu, "onOptionsMenu()");
+ html += '
';
+ html += getCell2MenuItemHtml(localizer.dropAll, 'onDropAll()');
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(localizer.saveSet, format("onSaveSet('{0}')", state.id));
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(localizer.loadSet, format("onLoadSet('{0}')", state.id));
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(localizer.dressCombatsSet, 'onDressAnyCombatsSet()');
+ html += getCell2MenuSeparatorHtml();
+ var s = localizer.dressFromCombats;
+ s = '' + s + '';
+ html += getCell2MenuItemHtml(s, format("onDressFromCombatsMenu('{0}')", state.id));
+ html += '
';
+ html += getCell2MenuItemHtml('' + localizer.friendLink + '', format("onFriendLink('{0}')", state.id));
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(localizer.copyCab, format("onCopyCab('{0}')", state.id));
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(localizer.waddMenu, 'onWAddMenu()');
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml('' + localizer.doClean + '', "doClean()");
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml('' + localizer.help + '', "showHelp()");
+ html += '
';
+ return html;
+}
+
+function getDresserNaturalEditorInfo(state, name)
+{
+ var html = '';
+ if (name in state.results)
+ {
+ var vt = state.results[name];
+ var vr = (name in state.required) ? state.required[name] : 0;
+ var vn = (name in state.natural) ? state.natural[name] : 0;
+ var vm = (name in state.modify) ? state.modify[name] : 0;
+ var vb = (name in state.battlemf) ? state.battlemf[name] : 0;
+ vt -= vb;
+ vm -= vb;
+ var mvt = vt;
+ for (var staten in dressStates)
+ {
+ var astate = dressStates[staten];
+ var avn = (name in astate.natural) ? astate.natural[name] : 0;
+ var avm = (name in astate.modify) ? astate.modify[name] : 0;
+ var avt = (name in astate.results) ? astate.results[name] : 0;
+ if (name in astate.battlemf)
+ {
+ avt -= astate.battlemf[name];
+ avm -= astate.battlemf[name];
+ }
+ if (mvt < avt)
+ {
+ mvt = avt;
+ }
+ }
+ html += getItemPropTNMRBHtml(name, vt, vn, vm, mvt, vr, true, vb);
+ }
+ return html;
+}
+
+function getLevelUpInfo(state)
+{
+ if (('L' + state.natural.level) in expd)
+ {
+ var ldata = expd['L' + state.natural.level];
+ if (!('ups' in ldata) || !(('U' + state.natural.levelup) in ldata.ups))
+ {
+ if ('count' in ldata)
+ {
+ state.natural.levelup = ldata.count - 1;
+ }
+ else
+ {
+ state.natural.levelup = 0;
+ }
+ }
+ if (!('ups' in ldata) || !('U0' in ldata.ups))
+ {
+ return null;
+ }
+ return ldata.ups['U' + state.natural.levelup];
+ }
+ return null;
+}
+
+function getEditHeaderInfo(state)
+{
+ var html = '';
+ var totalnskills = 0;
+ for (skilln in state.natural)
+ {
+ if (skilln.indexOf('skill') > 0)
+ {
+ totalnskills += state.natural[skilln];
+ }
+ }
+ if (state.pet != null)
+ {
+ if (state.pet.level > state.natural.level)
+ {
+ html += '
';
+ html += format(localizer.badPetLevel, state.natural.level, state.pet.level);
+ html += '
';
+ }
+ }
+ var availskills = state.natural.level + state.natural.pskil + 1;
+ if (availskills < totalnskills)
+ {
+ var pskilstr = '';
+ if (state.natural.pskil > 0)
+ {
+ pskilstr = format(localizer.badSkillRewardedCount);
+ }
+ html += '
';
+ html += format(localizer.badSkillCount, state.natural.level, pskilstr, availskills, totalnskills);
+ html += '
';
+ }
+ if (state.natural.pskil > 5)
+ {
+ html += '
';
+ html += format(localizer.badRewardedSkillCount, state.natural.pskil);
+ html += '
';
+ }
+ if (state.natural.pstat > 25)
+ {
+ html += '
';
+ html += format(localizer.badRewardedStatCount, state.natural.pstat);
+ html += '
';
+ }
+ var upd = getLevelUpInfo(state);
+ if (upd && upd.sstats && state.natural.totalstats)
+ {
+ html += '
';
+ var availstats = upd.sstats + state.natural.pstat;
+ var s = availstats.toString();
+ if (state.natural.totalstats != availstats)
+ {
+ s = s.bold();
+ }
+ var pstatstr = '';
+ if (state.natural.pstat > 0)
+ {
+ pstatstr = format(localizer.rewardedStatsCount, state.natural.pstat);
+ }
+
+ html += format(localizer.nativeStatsCount, state.natural.level, upd.id, pstatstr, s);
+ if (state.natural.totalstats != availstats)
+ {
+ s = state.natural.totalstats.toString();
+ if (state.natural.totalstats > availstats)
+ {
+ s = s.fontcolor('red');
+ }
+ html += format(localizer.neqStatsCount, s);
+ if (state.natural.totalstats < availstats)
+ {
+ html += format(localizer.gtStatsCount, (availstats - state.natural.totalstats));
+ }
+ else
+ {
+ html += format(localizer.ltStatsCount, (state.natural.totalstats - availstats));
+ }
+ }
+ else
+ {
+ html += localizer.eqStatsCount;
+ }
+ html += '
';
+ }
+ return html;
+}
+
+function getDresserNaturalEditors(state)
+{
+ var html = '
';
+ html += format('
{2}
', state.id, 'editheader', getEditHeaderInfo(state));
+ for (var i = 0; i < knownNaturalEditors.length; i++)
+ {
+ var name = knownNaturalEditors[i];
+ if (name == '-')
+ {
+ html += '
';
+ continue;
+ }
+ if (!item_props[name].view)
+ {
+ continue;
+ }
+ html += '
';
+ return r;
+}
+
+function getHeaderHtml(separator)
+{
+ var cattr = separator ? ' class="infoseparator"' : '';
+ var html = '
';
+ if (separator)
+ {
+ html += '';
+ }
+ else
+ {
+ html += ' ';
+ }
+ html += '
';
+ var stateCount = 0;
+ var i = 1;
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ var n = ' ' + localizer.upperCab + ' ' + i + ' ';
+ if (state.name != '')
+ {
+ n += ' ' + htmlstring(state.name);
+ }
+
+ html += '
' + n + '
';
+ stateCount++;
+ i++;
+ }
+ html += '
';
+ return html;
+}
+
+function getLeftCellHtml(s, odd, s2)
+{
+ var c = 'infoleftth';
+ var r = '
' + s;
+ }
+ else
+ {
+ r += '>' + s + '
' + s2;
+ }
+ r += '
';
+ return r;
+}
+
+function getSummaryInnerHtml()
+{
+ var html = '
';
+ html += '
' + localizer.summaryTableDesc + '
';
+ html += '
';
+ var stateCount = 0;
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ recalcDresserState(state);
+ stateCount++;
+ }
+ html += getHeaderHtml(false);
+ var firstChapter = true;
+ var chapterHtml = '';
+ var odd = false;
+ for (var mfi in knownCleanModifiers)
+ {
+ var mf = knownCleanModifiers[mfi];
+ if (mf == '-')
+ {
+ if (chapterHtml != '')
+ {
+ html += chapterHtml;
+ html += getHeaderHtml(true);
+ chapterHtml = '';
+ odd = false;
+ }
+ continue;
+ }
+ if (!item_props[mf].view)
+ {
+ continue;
+ }
+ var hasValues = false;
+ var maxValue = Number.MIN_VALUE;
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ hasValues |= (state.results[mf] != 0);
+ if (maxValue < state.results[mf])
+ {
+ maxValue = state.results[mf];
+ }
+ }
+ if (!hasValues)
+ {
+ continue;
+ }
+ chapterHtml += getLeftCellHtml(getItemPropLabel(mf), odd);
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ var v = state.results[mf];
+ v = getItemPropFormattedValue(mf, v, maxValue);
+ chapterHtml += getCellHtml(v, odd);
+ }
+ chapterHtml += '';
+ odd = !odd;
+ }
+ if (chapterHtml != '')
+ {
+ html += chapterHtml;
+ html += getHeaderHtml(true);
+ }
+
+ chapterHtml = '';
+ odd = false;
+ for (var mf in knownAdvWeaponModifiers)
+ {
+ if (!item_props[mf].view)
+ {
+ continue;
+ }
+ var hasValues = false;
+ var maxValue = Number.MIN_VALUE;
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ if (mf in state.w3props)
+ {
+ var vobj = state.w3props[mf];
+ if (vobj != null)
+ {
+ var vsum = vobj.minv + vobj.maxv;
+ hasValues = true;
+ if (maxValue < vsum)
+ {
+ maxValue = vsum;
+ }
+ }
+ }
+ if (mf in state.w10props)
+ {
+ var vobj = state.w10props[mf];
+ if (vobj != null)
+ {
+ var vsum = vobj.minv + vobj.maxv;
+ hasValues = true;
+ if (maxValue < vsum)
+ {
+ maxValue = vsum;
+ }
+ }
+ }
+ }
+ if (!hasValues)
+ {
+ continue;
+ }
+ chapterHtml += getLeftCellHtml(getItemPropLabel(mf), odd);
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ var vhtml = '';
+ var v = '-';
+ if (mf in state.w3props)
+ {
+ v = getItemPropAdvWeaponHtml(mf, state.w3props[mf], maxValue, true);
+ }
+ vhtml += v;
+ if (mf in state.w10props)
+ {
+ v = getItemPropAdvWeaponHtml(mf, state.w10props[mf], maxValue, true);
+ vhtml += '/' + v;
+ }
+ chapterHtml += getCellHtml(vhtml, odd);
+ }
+ chapterHtml += '';
+ odd = !odd;
+ }
+ if (chapterHtml != '')
+ {
+ html += chapterHtml;
+ html += getHeaderHtml(true);
+ chapterHtml = '';
+ odd = false;
+ }
+ for (var mfi in knownWeaponModifiers)
+ {
+ var mf = knownWeaponModifiers[mfi];
+ if (mf == '-')
+ {
+ if (chapterHtml != '')
+ {
+ html += chapterHtml;
+ html += getHeaderHtml(true);
+ chapterHtml = '';
+ odd = false;
+ }
+ continue;
+ }
+ if (!item_props[mf].view)
+ {
+ continue;
+ }
+ var hasValues = false;
+ var maxValue = Number.MIN_VALUE;
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ if (mf in state.w3props)
+ {
+ var v = state.w3props[mf];
+ if (mf in state.natural)
+ {
+ v += state.natural[mf];
+ }
+ hasValues |= (v != 0);
+ if (maxValue < v)
+ {
+ maxValue = v;
+ }
+ }
+ if (mf in state.w10props)
+ {
+ var v = state.w10props[mf];
+ if (mf in state.natural)
+ {
+ v += state.natural[mf];
+ }
+ hasValues |= (v != 0);
+ if (maxValue < v)
+ {
+ maxValue = v;
+ }
+ }
+ }
+ if (!hasValues)
+ {
+ continue;
+ }
+ chapterHtml += getLeftCellHtml(getItemPropLabel(mf), odd);
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ var vhtml = '';
+ var v = '-';
+ if (mf in state.w3props)
+ {
+ v = state.w3props[mf];
+ if (mf in state.natural)
+ {
+ v += state.natural[mf];
+ }
+ v = getItemPropFormattedValue(mf, v, maxValue);
+ }
+ vhtml += v;
+ if (mf in state.w10props)
+ {
+ v = state.w10props[mf];
+ if (mf in state.natural)
+ {
+ v += state.natural[mf];
+ }
+ v = getItemPropFormattedValue(mf, v, maxValue);
+ vhtml += '/' + v;
+ }
+ chapterHtml += getCellHtml(vhtml, odd);
+ }
+ chapterHtml += '';
+ odd = !odd;
+ }
+ if (chapterHtml != '')
+ {
+ html += chapterHtml;
+ html += getHeaderHtml(true);
+ }
+
+ chapterHtml = '';
+ odd = false;
+ for (var mf in knownArmorModifiers)
+ {
+ if (!item_props[mf].view)
+ {
+ continue;
+ }
+ var maxValue = Number.MIN_VALUE;
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ var v1 = state.results[mf + '1'];
+ var v2 = state.results[mf + '2'];
+ if (maxValue < (v1 + v2))
+ {
+ maxValue = v1 + v2;
+ }
+ }
+ chapterHtml += getLeftCellHtml(getItemPropLabel(mf), odd);
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ var vobj = { minv: state.results[mf + '1'], maxv: state.results[mf + '2'] };
+ chapterHtml += getCellHtml(getItemPropAdvWeaponHtml(mf, vobj, maxValue, true), odd);
+ }
+ chapterHtml += '';
+ odd = !odd;
+ }
+ if (chapterHtml != '')
+ {
+ html += chapterHtml;
+ html += getHeaderHtml(true);
+ }
+
+ chapterHtml = '';
+ odd = false;
+ for (var mf in knownZoneModifiers)
+ {
+ if (!item_props[mf].view)
+ {
+ continue;
+ }
+ var hasValues = false;
+ var maxValues = { head: 0, body: 0, waist: 0, leg: 0, avg: 0 };
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ if (mf in state.results)
+ {
+ var v = state.results[mf];
+ for (zone in maxValues)
+ {
+ if (maxValues[zone] < v[zone])
+ {
+ maxValues[zone] = v[zone];
+ hasValues = true;
+ }
+ }
+ }
+ }
+ if (!hasValues)
+ {
+ continue;
+ }
+ chapterHtml += '
' + getItemPropLabel(mf) + '
';
+ var firstZone = true;
+ for (var zone in maxValues)
+ {
+ if (firstZone)
+ {
+ firstZone = false;
+ }
+ else
+ {
+ chapterHtml += '
';
+ odd = !odd;
+ }
+ chapterHtml += '
' + localizer['zone' + zone] + '
';
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ var v = '-';
+ if (mf in state.results)
+ {
+ v = state.results[mf][zone];
+ var pcz = getMatvikZoneValue(parseFloat(v));
+// if (pcz > 80) pcz = 80; // no more than 80%
+ if (pcz > 100) pcz = 100; // no more than 100%
+ pcz = Math.floor(pcz * 100 + 0.5) / 100;
+ v = getItemPropFormattedValue(mf, v, maxValues[zone]) + ' (' + pcz + '%)';
+ }
+ chapterHtml += getCellHtml(v, odd);
+ }
+ }
+ chapterHtml += '
';
+ odd = !odd;
+ }
+ if (chapterHtml != '')
+ {
+ html += chapterHtml;
+ html += getHeaderHtml(true);
+ }
+ html += '
';
+
+ html += '
';
+ return html;
+}
+
+function showSummary()
+{
+ var summaryDiv = document.getElementById(summaryDivId);
+ summaryDiv.innerHTML = getSummaryInnerHtml();
+ summaryDiv.style.display = '';
+}
+
+function hideSummary()
+{
+ var summaryDiv = document.getElementById(summaryDivId);
+ summaryDiv.style.display = 'none';
+}
+
+function getExpTableHeaderHtml(separator)
+{
+ var cattr = separator ? ' class="infoseparator"' : '';
+ var html = '';
+ if (separator)
+ {
+ html += '
';
+ html += '';
+ html += '
';
+ }
+ else
+ {
+ html += '
' + item_props.level.lbl + '
';
+ html += '
' + item_props.levelup.lbl + '
';
+ html += '
|
';
+ html += '
' + localizer.expIncrement + '
';
+ html += '
|
';
+ html += '
' + localizer.expTotal + '
';
+ html += '
';
+ }
+ html += '
|
';
+ html += '
' + localizer.expStats + '
';
+ html += '
' + localizer.expSkills + '
';
+ html += '
' + localizer.expEndurance + '
';
+ html += '
' + localizer.expCredits + '
';
+ html += '
|
';
+ html += '
' + localizer.expStats + '
';
+ html += '
' + localizer.expExperience + '
';
+ html += '
' + localizer.expCredits + '
';
+ html += '
';
+ return html;
+}
+
+function getExpTableInnerHtml()
+{
+ var html = '
';
+ html += '
' + localizer.expTableDesc + '
';
+ html += '
';
+ html += getExpTableHeaderHtml(false);
+
+ for (var leveln in expd)
+ {
+ var level = expd[leveln];
+ var upc = 1;
+ if ('count' in level)
+ {
+ upc = level.count;
+ }
+ html += '
';
+
+ html += '
' + item_props.level.lbl + ': ';
+ html += level.id.toString().bold();
+ if ('baseExp' in level)
+ {
+ html += ' ' + localizer.expBaseExperience + ': ' + level.baseExp.toString().bold();
+ }
+ if ('body' in level)
+ {
+ html += ' ' + localizer.expBody + ': ' + level.body.toString().bold();
+ }
+ if ('description' in level)
+ {
+ html += ' ' + localizer.expDescription + ': ' + level.description.bold();
+ }
+ html += '
';
+ if ('ups' in level)
+ {
+ var firstUp = true;
+ var odd = false;
+ for (var upn in level.ups)
+ {
+ if (firstUp)
+ {
+ firstUp = false;
+ }
+ else
+ {
+ html += '
';
+ }
+ var up = level.ups[upn];
+ html += '
' + up.id + '
';
+ html += getCellHtml('|', odd)
+ html += getCellHtml(up.astats, odd)
+ html += getCellHtml(up.amastery || '', odd)
+ html += getCellHtml(up.aendurance || '', odd)
+ html += getCellHtml(up.acredits || '', odd)
+ html += getCellHtml('|', odd)
+ html += getCellHtml(up.sstats, odd)
+ html += getCellHtml(up.sexp, odd)
+ html += getCellHtml(up.scredits.toString(), odd)
+ odd = !odd;
+ }
+ }
+ if (!('count' in level))
+ {
+ html += '
';
+ html += '
' + localizer.expNoInformation + '
';
+ }
+ html += '
';
+ html += getExpTableHeaderHtml(true);
+ }
+
+ html += '
';
+ html += '
';
+ return html;
+}
+
+function showExpTable()
+{
+ var expTableDiv = document.getElementById(expTableDivId);
+ if (!expTableBuilt)
+ {
+ expTableDiv.innerHTML = ', ...';
+ }
+ expTableDiv.style.display = '';
+ if (!expTableBuilt)
+ {
+ expTableDiv.innerHTML = getExpTableInnerHtml();
+ expTableBuilt = true;
+ }
+}
+
+function hideExpTable()
+{
+ var expTableDiv = document.getElementById(expTableDivId);
+ expTableDiv.style.display = 'none';
+}
+
+function getCabsAsOptions()
+{
+ var html = '';
+ var i = 1;
+ for (var staten in dressStates)
+ {
+ var state = dressStates[staten];
+ html += '';
+ i++;
+ }
+ return html;
+}
+
+var dressHealerData = new Array(
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 ),
+ new Array ( 5, 5, 5, 5, 5, 5 )
+);
+
+function evaluateHealerPrice()
+{
+ var errorsFound = false;
+ var html = '';
+ var sourceState = dressStates[document.getElementById('sourcecab').value];
+ if (sourceState == null)
+ {
+ html += '
.
';
+ errorsFound = true;
+ }
+ var targetState = dressStates[document.getElementById('targetcab').value];
+ if (targetState == null)
+ {
+ html += '
.
';
+ errorsFound = true;
+ }
+ var freeSwapsCount = parseInt(document.getElementById('freeswaps').value);
+ if (isNaN(freeSwapsCount) || freeSwapsCount < 0)
+ {
+ html += '
.
';
+ errorsFound = true;
+ }
+ if (freeSwapsCount > 15)
+ {
+ html += '
15.
';
+ errorsFound = true;
+ }
+ if (sourceState == targetState)
+ {
+ html += '
';
+ errorsFound = true;
+ }
+ if (sval > tval)
+ {
+ if (freeStats != '')
+ {
+ freeStats += ', ';
+ }
+ freeStats += getItemPropLabel(mfname);
+ }
+ }
+ if (!errorsFound)
+ {
+ var history = '';
+ var price = 0;
+ for (var i = knownStats.length - 1; i >= 0; i--)
+ {
+ if (i >= dressHealerData[0].length)
+ {
+ continue;
+ }
+ var mfname = knownStats[i];
+ var sval = sourceState.natural[mfname];
+ var tval = targetState.natural[mfname];
+ var diff = tval - sval;
+ if (diff > 0)
+ {
+ for (j = 0; j < diff; j++)
+ {
+ if (freeSwapsCount > 0)
+ {
+ freeSwapsCount--;
+ history += ' [' + freeStats + '] ' + getItemPropLabel(mfname) + ' (' + getItemPropLabel(mfname) + ': ' + (sval + j).toString() + ', ' + (sval + j + 1).toString() + '). ';
+ }
+ else
+ {
+ var m = sval + j;
+ var m2 = m - 1;
+ if (m2 < 0) m2 = 0;
+ var stepPrice = dressHealerData[m2][i];
+ price += stepPrice;
+ history += ' [' + freeStats + '] ' + getItemPropLabel(mfname) + ' ' + stepPrice + '. (' + getItemPropLabel(mfname) + ': ' + m.toString() + ', ' + (m + 1).toString() + '). ';
+ }
+ }
+ }
+ }
+ html += '
: ' + price + '.
';
+ html += '';
+ html += history;
+ }
+ var healerInfoDiv = document.getElementById('evaluatedHealerInfo');
+ healerInfoDiv.innerHTML = html;
+}
+
+function getHealerInnerHtml()
+{
+ var html = '
';
+ html += '
.
';
+ html += '
1. : ';
+ html += '2. : ';
+ html += '3. : ';
+ html += '4. :
';
+ html += '';
+ html += '
';
+ return html;
+}
+
+function showHealer()
+{
+ var healerDiv = document.getElementById(healerDivId);
+ healerDiv.innerHTML = getHealerInnerHtml();
+ healerDiv.style.display = '';
+}
+
+function hideHealer()
+{
+ var healerDiv = document.getElementById(healerDivId);
+ healerDiv.style.display = 'none';
+}
+
+function getAttackCount(state)
+{
+ var r = 1;
+ var w3o = getObjectById(state.objects[slot_w3.index]);
+ var w10o = getObjectById(state.objects[slot_w10.index]);
+ if (w10o != null && w10o.slot != 'w3')
+ {
+ w10o = null;
+ }
+ if (w3o != null && w10o != null)
+ {
+ r = 2;
+ }
+ var wearedRings = [
+ state.objects[slot_w6.index],
+ state.objects[slot_w7.index],
+ state.objects[slot_w8.index]
+ ];
+ for (var ri = 0; ri < wearedRings.length; ri++)
+ {
+ if (wearedRings[ri] == 'aring5')
+ {
+ r += 1;
+ }
+ }
+ return r;
+}
+
+function adjustBlockCount(o, firstw, shieldy)
+{
+ if (o == null) return -1;
+ if (o.category == 'shields') return 1;
+ if (('properties' in o) && ('blockzones' in o.properties))
+ {
+ var bz = o.properties.blockzones.toString();
+ if (!firstw && (bz == '++'))
+ {
+ return 1;
+ }
+ if ((!firstw || shieldy) && (bz == '—'))
+ {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+function getBlockCount(state)
+{
+ var r = 2;
+ var w3o = getObjectById(state.objects[slot_w3.index]);
+ var w10o = getObjectById(state.objects[slot_w10.index]);
+ if (w3o == null)
+ {
+ return r;
+ }
+ if (w10o != null)
+ {
+ r += adjustBlockCount(w3o, true, (w10o.category=='shields'));
+ r += adjustBlockCount(w10o, false, (w10o.category=='shields'));
+ }
+ if (r < 1) r = 1;
+ if (r > 4) r = 4;
+
+ return r;
+}
+
+function getBlockZones(blockCount)
+{
+ var bzd = twoBlockZones;
+ if (blockCount >= 3)
+ {
+ bzd = threeBlockZones;
+ }
+ return bzd;
+}
+
+function updateTurnButton()
+{
+ var noStrike = false;
+ for (var i = 0; i < turnData.strikes.length; i++)
+ {
+ if (turnData.strikes[i] == null)
+ {
+ noStrike = true;
+ break;
+ }
+ }
+ var en = !noStrike && (turnData.blockZones != 0);
+ document.getElementById('doTurn').disabled = !en;
+}
+
+function strikeChosen(id)
+{
+ var el = document.getElementById(id);
+ var number = parseInt(el.name.substr(4));
+ var zn = parseInt(el.id.substr(el.name.length + 1));
+ var v = el.checked;
+ if (v)
+ {
+ turnData.strikes[number] = (zn-1);
+ }
+ else
+ {
+ if (turnData.strikes[number] == (zn-1))
+ {
+ turnData.strikes[number] = null;
+ }
+ }
+ updateTurnButton();
+}
+
+function blockChosen(id)
+{
+ var el = document.getElementById(id);
+ var number = parseInt(el.name.substr(4));
+ var zn = parseInt(el.id.substr(el.name.length + 1));
+ var v = el.checked;
+
+ if (v)
+ {
+ turnData.blockZones |= turnData.bzd[(zn-1)].zones;
+ }
+ else
+ {
+ turnData.blockZones &= ~turnData.bzd[(zn-1)].zones;
+ }
+
+ updateTurnButton();
+}
+
+function doBattleTurn()
+{
+ document.getElementById('battlechoose').innerHTML = ' ';
+ battleRequest();
+}
+
+function getBattleTurnParamsHash()
+{
+ var p = {};
+ for (var i = 0; i < battleTurnParams.length; i++)
+ {
+ p[battleTurnParams[i]] = true;
+ }
+ return p;
+}
+
+function getStateBattleTurnParamsOf(prefix, postfix, data, p)
+{
+ var r = '';
+ for (var mn in data)
+ {
+ if ((mn in p) && (data[mn] != 0))
+ {
+ r += '&' + prefix + mn + postfix + '=' + data[mn];
+ }
+ }
+ return r;
+}
+
+function getStateBattleTurnParams(postfix, state, p)
+{
+ var r = '';
+ r += getStateBattleTurnParamsOf('r.', postfix, state.results, p);
+ r += getStateBattleTurnParamsOf('w3.', postfix, state.w3props, p);
+ if (hasTwoWeapons(state))
+ {
+ r += getStateBattleTurnParamsOf('w0.', postfix, state.w10props, p);
+ }
+ return r;
+}
+
+function battleRequest()
+{
+ var p = getBattleTurnParamsHash();
+ br_cleanupScriptElement(battleScriptId);
+ var href = battleProviderUrl + '?rnd=' + Math.random();
+ if (hasTwoWeapons(bstate1))
+ {
+ href += '&h2w1=1';
+ }
+ if (hasTwoWeapons(bstate2))
+ {
+ href += '&h2w2=1';
+ }
+ for (var i = 0; i < turnData.strikes.length; i++)
+ {
+ href += '&s1_' + i + '=' + turnData.strikes[i];
+ }
+ href += '&bz1=' + turnData.blockZones;
+ href += getStateBattleTurnParams('.1', bstate1, p);
+ href += getStateBattleTurnParams('.2', bstate2, p);
+ if (isDeveloperMode()) informAboutProgress(href);
+ br_getScriptElement(battleScriptId, href);
+}
+
+function br_cleanupScriptElement(id)
+{
+ var span = document.getElementById(id);
+ if (span != null)
+ {
+ setTimeout(function()
+ {
+ // without setTimeout - crash in IE 5.0!
+ span.parentNode.removeChild(span);
+ },
+ 50
+ );
+ }
+}
+
+function br_getScriptElement(id, href)
+{
+ var span = document.body.appendChild(document.createElement('SPAN'));
+ span.style.display = 'none';
+ span.innerHTML = 'MSIE fix';
+ setTimeout(function()
+ {
+ var s = span.getElementsByTagName("script")[0];
+ s.language = "JavaScript";
+ if (s.setAttribute) s.setAttribute('src', href); else s.src = href;
+ },
+ 10
+ );
+ return span;
+}
+
+var bstate1;
+var bstate2;
+
+function handleBattleResponse(response)
+{
+ var line = response.line;
+ document.getElementById('xx_battlescreen').innerHTML = getBattleScreenHtml();
+ var logelt = document.getElementById('xx_battlelog');
+ line = '
' + line + '
';
+ if (logelt.insertAdjacentHTML)
+ {
+ logelt.insertAdjacentHTML('afterBegin', line);
+ }
+ else
+ {
+ logelt.innerHTML = line + logelt.innerHTML;
+ }
+}
+
+function getStrikeBlockSelector(attackCount, blockCount)
+{
+ var html = '';
+ var bzd = getBlockZones(blockCount);
+ turnData = { bzd: bzd, strikes: new Array(attackCount), blockZones: 0 };
+ html += '
';
+ for (azi = 0; azi < attackCount; azi++)
+ {
+ html += '
';
+ html += '';
+ var rn = 'atck' + azi;
+ for (var i = 0; i < localizer.attackZone.length; i++)
+ {
+ var id = rn + '_' + (i+1);
+ html += ' ';
+ html += '';
+ html += '';
+ }
+ }
+ html += '
';
+ html += '';
+ var rn = 'blck0';
+ for (var i = 0; i < bzd.length; i++)
+ {
+ var id = rn + '_' + (i+1);
+ html += ' ';
+ html += '';
+ html += '';
+ }
+ html += '
';
+ html += '';
+ return html;
+}
+
+function getBattleScreenHtml()
+{
+ var html = '';
+ html += '
';
+ html += '
' + getSimplePersImageHtml(bstate1, true) + '
';
+ html += '
';
+ html += getStrikeBlockSelector(bstate1.results.attackcount, bstate1.results.blockcount);
+ html += '
';
+ html += '
' + getSimplePersImageHtml(bstate2, false) + '
';
+ html += '
';
+
+ return html;
+}
+
+function clearBattleState(state)
+{
+ for (var mf in knownWeaponModifiersHash)
+ {
+ if (!(mf in state.natural))
+ {
+ continue;
+ }
+ if (mf in state.w3props)
+ {
+ state.w3props[mf] += state.natural[mf];
+ }
+ if (mf in state.w10props)
+ {
+ state.w10props[mf] += state.natural[mf];
+ }
+ delete state.results[mf];
+ }
+ state.inbattle.hitpoints = state.results.hitpoints;
+ state.inbattle.mana = state.results.mana;
+}
+
+function startBattle()
+{
+ var s1 = dressStates[document.getElementById('bcab1').value];
+ var s2 = dressStates[document.getElementById('bcab2').value];
+ bstate1 = cloneObject(s1);
+ bstate2 = cloneObject(s2);
+ clearBattleState(bstate1);
+ clearBattleState(bstate2);
+ var html = '';
+ html += getBattleScreenHtml();
+
+ html += '';
+ html += '
';
+
+ var battlesDiv = document.getElementById(battlesDivId);
+ battlesDiv.innerHTML = html;
+}
+
+function getBattlesInnerHtml()
+{
+ var html = '
';
+ html += '
.
';
+ html += '
. , .
';
+ html += '
1. : ';
+ html += '2. : ';
+ html += '3. :
';
+ html += '
';
+ return html;
+}
+
+function showBattles()
+{
+ var battlesDiv = document.getElementById(battlesDivId);
+ battlesDiv.innerHTML = getBattlesInnerHtml();
+ battlesDiv.style.display = '';
+}
+
+function hideBattles()
+{
+ var battlesDiv = document.getElementById(battlesDivId);
+ battlesDiv.style.display = 'none';
+}
+
+function getFake(oid)
+{
+ var o = getObjectById(oid);
+ var r = o.upgrade[getJSName(oid) + '_fake'];
+ if (!('caption' in r))
+ {
+ r.caption = o.caption;
+ }
+ r.category = o.category;
+ r.slot = o.slot;
+ r.width = o.width;
+ r.height = o.height;
+ return r;
+}
+
+function getCommonItemList()
+{
+ return common_props;
+}
+
+function getSelectItemListHtml(prefix, list)
+{
+ var html = '';
+ html += '';
+ return html;
+}
+
+function applyFakeParam(id)
+{
+ var value = parseFloat(document.getElementById('fakeParamValue').value);
+ if (isNaN(value))
+ {
+ alert(' .');
+ return;
+ }
+ var o = getObjectById(id);
+ if ('upgradecache' in o)
+ {
+ delete o.upgradecache;
+ }
+ var fake = getFake(id);
+ if (!('common' in fake))
+ {
+ fake.common = {};
+ }
+ if (value != 0)
+ {
+ fake.common[document.getElementById('cmnitemListChooser').value] = value;
+ }
+ else
+ {
+ delete fake.common[document.getElementById('cmnitemListChooser').value];
+ }
+
+ document.getElementById('buildings').innerHTML = getFakeItemEditor(id);
+}
+
+function addFakeParam(id)
+{
+ var html = '';
+ html += getSelectItemListHtml('cmn', getCommonItemList());
+ html += ' ';
+ html += ' ';
+ document.getElementById('param_newline').innerHTML = html;
+}
+
+function getBoolItemList(boolvar)
+{
+ var r = {};
+ for (var mf in item_props)
+ {
+ var data = item_props[mf];
+ if ((boolvar in data) && data[boolvar])
+ {
+ r[mf] = data;
+ }
+ }
+ return r;
+}
+
+function getRequiredItemList()
+{
+ return getBoolItemList('required');
+}
+
+function applyFakeReq(id)
+{
+ var value = document.getElementById('fakeReqValue').value;
+ if (isNaN(value))
+ {
+ alert(' .');
+ return;
+ }
+ var o = getObjectById(id);
+ if ('upgradecache' in o)
+ {
+ delete o.upgradecache;
+ }
+ var fake = getFake(id);
+ if (!('required' in fake))
+ {
+ fake.required = {};
+ }
+ if (value > 0)
+ {
+ fake.required[document.getElementById('reqitemListChooser').value] = value;
+ }
+ else
+ {
+ delete fake.required[document.getElementById('reqitemListChooser').value];
+ }
+ document.getElementById('buildings').innerHTML = getFakeItemEditor(id);
+}
+
+function addFakeReq(id)
+{
+ var html = '';
+ html += getSelectItemListHtml('req', getRequiredItemList());
+ html += ' ';
+ html += ' ';
+ document.getElementById('req_newline').innerHTML = html;
+}
+
+function getCleanModifyItemList()
+{
+ return getBoolItemList('inmfg');
+}
+
+function applyFakeCleanMf(id)
+{
+ var value = document.getElementById('fakeMfValue').value;
+ if (isNaN(value))
+ {
+ alert(' .');
+ return;
+ }
+ var o = getObjectById(id);
+ if ('upgradecache' in o)
+ {
+ delete o.upgradecache;
+ }
+ var fake = getFake(id);
+ if (!('modify' in fake))
+ {
+ fake.modify = {};
+ }
+ if (value != 0)
+ {
+ fake.modify[document.getElementById('cmfitemListChooser').value] = value;
+ }
+ else
+ {
+ delete fake.modify[document.getElementById('cmfitemListChooser').value];
+ }
+ document.getElementById('buildings').innerHTML = getFakeItemEditor(id);
+}
+
+function addFakeCleanMf(id)
+{
+ var html = '';
+ html += getSelectItemListHtml('cmf', getCleanModifyItemList());
+ html += ' ';
+ html += ' ';
+ document.getElementById('mf_newline').innerHTML = html;
+}
+
+function getCleanPropertiesItemList()
+{
+ return getBoolItemList('inprpg');
+}
+
+function applyFakeCleanPrp(id)
+{
+ var value = document.getElementById('fakePrpValue').value;
+ if (isNaN(value))
+ {
+ alert(' .');
+ return;
+ }
+ var o = getObjectById(id);
+ if ('upgradecache' in o)
+ {
+ delete o.upgradecache;
+ }
+ var fake = getFake(id);
+ if (!('properties' in fake))
+ {
+ fake.properties = {};
+ }
+ if (value != 0)
+ {
+ fake.properties[document.getElementById('prpitemListChooser').value] = value;
+ }
+ else
+ {
+ delete fake.properties[document.getElementById('prpitemListChooser').value];
+ }
+ document.getElementById('buildings').innerHTML = getFakeItemEditor(id);
+}
+
+function addFakeCleanPrp(id)
+{
+ var html = '';
+ html += getSelectItemListHtml('prp', getCleanPropertiesItemList());
+ html += ' ';
+ html += ' ';
+ document.getElementById('prp_newline').innerHTML = html;
+}
+
+function renameFake(id)
+{
+ var o = getObjectById(id);
+ var fake = getFake(id);
+ var caption = o.caption;
+ if ('caption' in fake)
+ {
+ caption = fake.caption;
+ }
+ caption = window.prompt(' ', caption);
+ if (caption != null)
+ {
+ if (caption == o.caption)
+ {
+ if ('caption' in fake)
+ {
+ delete fake.caption;
+ }
+ }
+ else
+ {
+ fake.caption = caption;
+ }
+ }
+ if ('upgradecache' in o)
+ {
+ delete o.upgradecache;
+ }
+ document.getElementById('buildings').innerHTML = getFakeItemEditor(id);
+}
+
+function getFakeItemEditor(id)
+{
+ var html = '';
+ var fake = getFake(id);
+
+ html += categories[fake.category].caption.bold() + '';
+
+ html += format('', itemImgPath, id, fake.width, fake.height);
+ html += '' + getUpgradeCaption(getObjectById(id), fake) + ' ';
+ html += ' ';
+ if ('common' in fake)
+ {
+ for (var mf in fake.common)
+ {
+ html += getHtmlOfProp(null, fake.common, common_props[mf], mf);
+ }
+ }
+ html += '';
+ html += localizer.itemRequiredGroup.bold() + ' ';
+ if ('required' in fake)
+ {
+ for (var mf in fake.required)
+ {
+ html += getHtmlOfProp(null, fake.required, item_props[mf], mf);
+ }
+ }
+ html += '';
+ html += localizer.itemModifyGroup.bold() + ' ';
+ if ('modify' in fake)
+ {
+ for (var mf in fake.modify)
+ {
+ if (mf in knownArmorModifiers)
+ {
+ continue;
+ }
+ html += getHtmlOfSignedProp(fake.modify, item_props[mf], mf, null, null, null);
+ }
+ for (var armorn in knownArmorModifiers)
+ {
+ html += getHtmlOfArmorProp(fake.modify, armorn, getItemPropLabel(armorn));
+ }
+ }
+ html += '';
+ html += localizer.itemPropertiesGroup.bold() + ' ';
+ if ('properties' in fake)
+ {
+ for (var mf in fake.properties)
+ {
+ html += getHtmlOfSignedProp(fake.properties, item_props[mf], mf, null, null, null);
+ }
+ }
+ html += '';
+
+ return html;
+}
+
+function createFake(id, fake)
+{
+ var c = categories[fake.category];
+ var slot = getSlotById(c.slot);
+ var oidx = getJSName(id);
+ if (!(oidx in dressItems))
+ {
+ dressItems[oidx] = {id: id, fakebase: true, caption: fake.caption, category: c.id, slot: c.slot, width: slot.width, height: slot.height};
+ c.items.push(dressItems[oidx]);
+ }
+ var o = getObjectById(id);
+ if (!('upgrade' in o))
+ {
+ o.upgrade = {};
+ }
+ o.upgrade[oidx + '_fake'] = fake;
+}
+
+function builderEditItem(isNewItem)
+{
+ var ci = document.getElementById('builderCategoryChooser').value;
+ var c = categories[ci];
+ var slot = getSlotById(c.slot);
+ var id = '';
+ if (isNewItem)
+ {
+ id = document.getElementById('builderItemComposeName').value;
+ var slashIndex = id.lastIndexOf('/');
+ if (slashIndex >= 0)
+ {
+ id = id.substr(slashIndex + 1);
+ }
+ var gifIndex = id.lastIndexOf('.gif');
+ if (gifIndex >= 0)
+ {
+ id = id.substr(0, gifIndex);
+ }
+ if (getObjectById(id) != null)
+ {
+ alert(' !');
+ return;
+ }
+ }
+ else
+ {
+ id = document.getElementById('builderItemChooser').value;
+ }
+ if (id == '')
+ {
+ alert(' ');
+ return;
+ }
+ var oidx = getJSName(id);
+ if (!(oidx in dressItems))
+ {
+ dressItems[oidx] = {id: id, fakebase: true, caption: ' ', category: c.id, slot: c.slot, width: slot.width, height: slot.height};
+ c.items.push(dressItems[oidx]);
+ for (var ci in categories)
+ {
+ var oc = categories[ci];
+ if (('basecat' in oc) && (oc.basecat == c) && (oc.items != c.items))
+ {
+ oc.items.push(dressItems[oidx]);
+ }
+ }
+ }
+ if (!(oidx in dressExData.fakes))
+ {
+ var o = getObjectById(id);
+ if (!('upgrade' in o))
+ {
+ o.upgrade = {};
+ }
+ o.upgrade[oidx + '_fake'] = {id: id + '_fake', fake: Math.random()};
+ if (!isNewItem)
+ {
+ o.upgrade[oidx + '_fake'] = combineObjects(o, o.upgrade[oidx + '_fake']);
+ }
+ dressExData.fakes[oidx] = id;
+ }
+ document.getElementById('buildings').innerHTML = getFakeItemEditor(id);
+}
+
+function rebuildItems()
+{
+ var ci = document.getElementById('builderCategoryChooser').value;
+ if (ci == null || ci == '')
+ {
+ document.getElementById('builderItemChooserDiv').innerHTML = '';
+ return;
+ }
+ var html = '';
+ html += '';
+ html += ' ';
+ document.getElementById('builderItemChooserDiv').innerHTML = html;
+}
+
+function builderChooseItem()
+{
+ var html = '';
+ html += ' ';
+ html += '';
+ html += '
';
+
+ document.getElementById('buildings').innerHTML = html;
+ rebuildItems();
+}
+
+function builderComposeItem()
+{
+ var html = '';
+ html += ' ';
+ html += '';
+ html += ' ';
+ html += ' ';
+
+ document.getElementById('buildings').innerHTML = html;
+}
+
+function dropItemFromCategoryItems(c, o)
+{
+ for (var i = 0; i < c.items.length; i++)
+ {
+ if (c.items[i] == o)
+ {
+ delete c.items[i];
+ break;
+ }
+ }
+}
+
+function builderDropItem()
+{
+ var id = document.getElementById('builderItemChooser').value;
+ var o = getObjectById(id);
+ delete o.upgrade[id + '_fake'];
+ var hasUpgrades = false;
+ for (var ui in o.upgrade)
+ {
+ hasUpgrades = true;
+ break;
+ }
+ if (!hasUpgrades)
+ {
+ delete o.upgrade;
+ }
+ delete dressExData.fakes[getJSName(id)];
+ if ('fakebase' in o)
+ {
+ var c = categories[o.category];
+ dropItemFromCategoryItems(c, o);
+ for (var ci in categories)
+ {
+ var oc = categories[ci];
+ if (('basecat' in oc) && (oc.basecat == c) && (oc.items != c.items))
+ {
+ dropItemFromCategoryItems(oc, o);
+ }
+ }
+ delete dressItems[getJSName(id)];
+ }
+ showBuilder();
+}
+
+function builderForgotItem()
+{
+ var html = '';
+ html += ' ';
+ html += '';
+ html += ' ';
+
+ document.getElementById('buildings').innerHTML = html;
+}
+
+function getBuilderCommands()
+{
+ var html = '
';
+ html += getCell2MenuItemHtml(' ', 'builderChooseItem()');
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(' ', 'builderComposeItem()');
+ html += getCell2MenuSeparatorHtml();
+ html += getCell2MenuItemHtml(' ', 'builderForgotItem()');
+ html += '
';
+ return html;
+}
+
+function getBuilderInnerHtml()
+{
+ var html = '';
+
+ html += getBuilderCommands();
+ html += '
';
+ html += '
, .
';
+ html += '
.
';
+ html += '
, -.
';
+ html += '
';
+
+ return html;
+}
+
+function showBuilder()
+{
+ var builderDiv = document.getElementById(builderDivId);
+ builderDiv.innerHTML = getBuilderInnerHtml();
+ builderDiv.style.display = '';
+}
+
+function hideBuilder()
+{
+ var builderDiv = document.getElementById(builderDivId);
+ builderDiv.style.display = 'none';
+}
+
+function recalcDresserWeaponState(state, wslot)
+{
+ var r = {};
+ var objid;
+ var o;
+ for (var mfname in knownWeaponModifiersHash)
+ {
+ var mfvalue = 0;
+ for (var sloti = 0; sloti < slots.length; sloti++)
+ {
+ var slot = slots[sloti];
+ o = getObjectByStateSlot(state, slot);
+ if (o == null)
+ {
+ continue;
+ }
+ if (('modify' in o) && (mfname in o.modify))
+ {
+ mfvalue += parseInt(o.modify[mfname]);
+ }
+ }
+ for (var seti = 0; seti < state.appliedSets.length; seti++)
+ {
+ var set = state.appliedSets[seti];
+ if (('modify' in set) && (mfname in set.modify))
+ {
+ mfvalue += parseInt(set.modify[mfname]);
+ }
+ }
+ for (var strgi = 0; strgi < state.appliedStrengthenings.length; strgi++)
+ {
+ var strg = state.appliedStrengthenings[strgi];
+ if (('modify' in strg) && (mfname in strg.modify))
+ {
+ mfvalue += parseInt(strg.modify[mfname]);
+ }
+ }
+ o = getObjectByStateSlot(state, wslot);
+ if (o != null)
+ {
+ if (('properties' in o) && (mfname in o.properties))
+ {
+ mfvalue += parseInt(o.properties[mfname]);
+ }
+ }
+ if (o == null && wslot.id != 'w3')
+ {
+ continue;
+ }
+ r[mfname] = mfvalue;
+ }
+ for (var powerupn in state.spellPowerUps)
+ {
+ if (powerupn in knownECRPowerUps)
+ {
+ var epowerup = knownECRPowerUps[powerupn];
+ if (epowerup.modify in knownWeaponModifiersHash)
+ {
+ r[epowerup.modify] += epowerup.v;
+ }
+ }
+ }
+ return r;
+}
+
+function calculateBaseWeaponIndices(state, wslot, o)
+{
+ var strength = 0;
+ var mindamage = 0;
+ var maxdamage = 0;
+ var postmindamage = 0;
+ var postmaxdamage = 0;
+ var powermf = 0;
+ var magicpowermf = 0;
+ var skill = getWeaponSkillValue(state, wslot);
+ var attacks = getAttackFreq(o);
+
+ for (var sloti = 0; sloti < slots.length; sloti++)
+ {
+ var slot = slots[sloti];
+ if (slot == wslot) continue;
+ var so = getObjectByStateSlot(state, slot);
+ if (so == null)
+ {
+ continue;
+ }
+ if ('modify' in so)
+ {
+ if ('mindamage' in so.modify)
+ {
+ postmindamage += parseInt(so.modify.mindamage);
+ }
+ if ('maxdamage' in so.modify)
+ {
+ postmaxdamage += parseInt(so.modify.maxdamage);
+ }
+ }
+ }
+ for (var i = 0; i < state.appliedStrengthenings.length; i++)
+ {
+ var strengthening = state.appliedStrengthenings[i];
+ if ('modify' in strengthening)
+ {
+ if ('mindamage' in strengthening.modify)
+ {
+ postmindamage += parseInt(strengthening.modify.mindamage);
+ }
+ if ('maxdamage' in strengthening.modify)
+ {
+ postmaxdamage += parseInt(strengthening.modify.maxdamage);
+ }
+ }
+ }
+
+ if (o != null)
+ {
+ if ('modify' in o)
+ {
+ if ('mindamage' in o.modify)
+ {
+ mindamage += parseInt(o.modify.mindamage);
+ }
+ if ('maxdamage' in o.modify)
+ {
+ maxdamage += parseInt(o.modify.maxdamage);
+ }
+ }
+ if ('properties' in o)
+ {
+ if ('mindamage' in o.properties)
+ {
+ mindamage += parseInt(o.properties.mindamage);
+ }
+ if ('maxdamage' in o.properties)
+ {
+ maxdamage += parseInt(o.properties.maxdamage);
+ }
+ }
+ }
+
+// mindamage += state.natural.level;
+// maxdamage += state.natural.level;
+
+ if (o != null)
+ {
+ if (isTwohandledWeapon(o))
+ {
+ skill *= 1.2;
+ }
+
+ var statBonuses = categories[o.category].statBonuses;
+ if (statBonuses != null)
+ {
+ for (var statName in statBonuses)
+ {
+ if (statName in state.results)
+ {
+ var bonus = (state.results[statName] * statBonuses[statName]) / 100.0;
+ strength += bonus;
+ }
+ }
+ }
+ }
+ else
+ {
+ // test no weapons
+ if (wslot.id == 'w3' && getObjectByStateSlot(state, slot_w10) == null)
+ {
+ mindamage += 2;
+ maxdamage += 4;
+ if ('strength' in state.results)
+ {
+ strength += state.results.strength;
+ }
+ if (strength <= 100)
+ {
+ strength *= 2;
+ }
+ else
+ {
+ strength += 100;
+ }
+ }
+ }
+ if (hasTwohandledWeapon(state))
+ {
+ strength *= 1.1;
+ }
+ var cpower = 0;
+ if ('criticalpower' in state[wslot.id + 'props'])
+ {
+ cpower = state[wslot.id + 'props'].criticalpower;
+ if ('criticalpower' in state.natural)
+ {
+ cpower += state.natural.criticalpower;
+ }
+ }
+ else if ('criticalpower' in state.results)
+ {
+ cpower = state.results.criticalpower;
+ }
+
+ for (var delixn in state.damageElixes)
+ {
+ var delix = knownDamageElix[delixn];
+ if (!('modify' in delix)) continue;
+ if ('power' in delix.modify)
+ {
+ powermf += delix.modify.power;
+ }
+ if ('magicpower' in delix.modify)
+ {
+ magicpowermf += delix.modify.magicpower;
+ }
+ if ('damage1' in delix.modify)
+ {
+ postmindamage += delix.modify.damage1;
+ }
+ if ('damage2' in delix.modify)
+ {
+ postmaxdamage += delix.modify.damage2;
+ }
+ }
+
+ return {strength: strength, skill: skill, mindamage: mindamage, maxdamage: maxdamage, cpower: cpower, attacks: attacks, powermf: powermf, magicpowermf: magicpowermf, postmindamage: postmindamage, postmaxdamage: postmaxdamage};
+}
+
+function getPowerMfValue(state, wslot, powermfn)
+{
+ var powerMfValue = 0;
+ if (powermfn in state[wslot.id + 'props'])
+ {
+ powerMfValue = state[wslot.id + 'props'][powermfn];
+ if (powermfn in state.natural)
+ {
+ powerMfValue += state.natural[powermfn];
+ }
+ }
+ else if (powermfn in state.results)
+ {
+ powerMfValue = state.results[powermfn];
+ }
+ return powerMfValue;
+}
+
+function calculateAttackDamage(state, wslot, o, baseIndices, attackn)
+{
+ var attack = baseIndices.attacks[attackn];
+
+ var k1 = 1 + (baseIndices.strength / 300.0);
+ var k2 = 1 + (baseIndices.skill * 0.075);
+ var k4 = 0.97;
+ var k2e = 1;
+
+ var mindamage = baseIndices.mindamage + (baseIndices.strength / 5);
+ var maxdamage = baseIndices.maxdamage + (baseIndices.strength / 5);
+
+ if (mindamage < 0 || mindamage > maxdamage)
+ {
+ mindamage = 0;
+ }
+
+ var powermfn = attackn + 'power';
+ var powerMfValue = baseIndices.powermf;
+ if (attack.elemental)
+ {
+ powermfn = attackn + 'magicpower';
+ var estrength = 0;
+ for (var powerupn in state.spellPowerUps)
+ {
+ if (!(powerupn in knownPowerUps))
+ {
+ continue;
+ }
+ var powerup = knownPowerUps[powerupn];
+ if (powerup.damageup && ('element' in powerup))
+ {
+ if (attackn != powerup.element)
+ {
+ continue;
+ }
+ estrength = baseIndices.strength * 0.01 * state.spellPowerUps[powerupn];
+ }
+ }
+ var eskill = getWeaponSkillValueOf(state, o, (attackn + 'magicskill'));
+ k2e += (estrength / 300.0) + (eskill * 0.050);
+// k2 = 1 + ((k2 - 1) / 2);
+ powerMfValue += getPowerMfValue(state, wslot, 'magicpower');
+ powerMfValue += baseIndices.magicpowermf;
+ }
+// else
+// {
+ powerMfValue += getPowerMfValue(state, wslot, 'power');
+// }
+
+ powerMfValue += getPowerMfValue(state, wslot, powermfn);
+
+ mindamage *= k1 * k2;
+ maxdamage *= k1 * k2;
+
+ var k3 = 1 + (powerMfValue / 100.0);
+
+ var damage1 = mindamage * k2e * k3 * k4;
+ var damage2 = maxdamage * k2e * k3 * k4;
+
+ mindamage += baseIndices.postmindamage;
+ maxdamage += baseIndices.postmaxdamage;
+
+ damage1 += baseIndices.postmindamage;
+ damage2 += baseIndices.postmaxdamage;
+
+ var cdamage1 = (damage1 + damage1) * (1 + (baseIndices.cpower / 100.0));
+ var cdamage2 = (damage2 + damage2) * (1 + (baseIndices.cpower / 100.0));
+
+ return {
+ id: attackn,
+ attack: attack,
+ damage: {minv:mindamage, maxv:maxdamage},
+ mfdamage: {minv:damage1, maxv:damage2},
+ mfcdamage: {minv:cdamage1, maxv:cdamage2},
+ postdamage: {minv:baseIndices.postmindamage, maxv:baseIndices.postmaxdamage},
+ _power_v: powerMfValue
+ };
+}
+
+function addToDamage(averages, concrete, percentage)
+{
+ averages.minv += concrete.minv * percentage / 100.0;
+ averages.maxv += concrete.maxv * percentage / 100.0;
+}
+
+function floorDamage(damage)
+{
+ damage.minv = Math.floor(damage.minv + 0.5);
+ damage.maxv = Math.floor(damage.maxv + 0.5);
+}
+
+function floorDamages(damages)
+{
+ floorDamage(damages.damage);
+ floorDamage(damages.mfdamage);
+ floorDamage(damages.mfcdamage);
+}
+
+function recalcDresserWeaponAdvState(state, wslot)
+{
+ var o = getObjectByStateSlot(state, wslot);
+ var baseIndices = calculateBaseWeaponIndices(state, wslot, o);
+
+ if ('spell_powerup10' in state.spellPowerUps)
+ {
+ baseIndices.strength *= 1 + (0.01 * state.spellPowerUps.spell_powerup10);
+ }
+ baseIndices.mindamage += (baseIndices.strength / 3);
+ baseIndices.maxdamage += (baseIndices.strength / 3);
+
+ // calculate averages in parallel
+ var finalData = {};
+ var averages = {damage: {minv:0, maxv:0}, mfdamage: {minv:0, maxv:0}, mfcdamage: {minv:0, maxv:0}};
+ for (var attackn in baseIndices.attacks)
+ {
+ var fd = calculateAttackDamage(state, wslot, o, baseIndices, attackn);
+ addToDamage(averages.damage, fd.damage, fd.attack.real);
+ addToDamage(averages.mfdamage, fd.mfdamage, fd.attack.real);
+ addToDamage(averages.mfcdamage, fd.mfcdamage, fd.attack.real);
+ floorDamages(fd);
+ finalData[attackn] = fd;
+ }
+ floorDamages(averages);
+ state[wslot.id + 'props'].damage = averages.damage;
+ state[wslot.id + 'props'].mfdamage = averages.mfdamage;
+ state[wslot.id + 'props'].mfcdamage = averages.mfcdamage;
+ state[wslot.id + 'props'].damages = finalData;
+}
+
+
+function recalcDresserCombatSpellsState(state)
+{
+ var spellsFound = {};
+ for (var spellBase in combatSpells)
+ {
+ var spello = combatSpells[spellBase];
+ for (var sloti = 0; sloti < slots.length; sloti++)
+ {
+ var slot = slots[sloti];
+ var o = getObjectByStateSlot(state, slot);
+ if (o == null)
+ {
+ continue;
+ }
+ if (o.id.substr(0, spello.id.length) == spello.id && ('required' in o) && ('mana' in o.required))
+ {
+ var b = o.id.substr(spello.id.length);
+ spellsFound[getJSName(o.id)] = {spell: o, evd: spello, b: parseInt(b)};
+ }
+ }
+ }
+ state.combatSpells = {};
+ for (var sid in spellsFound)
+ {
+ var spell = spellsFound[sid];
+ var skillname = spell.evd.magic + 'magicskill';
+ var maxdamage = spell.b;
+ var skill = state.results[skillname];
+
+ maxdamage += state.natural.level;
+
+ var mf1 = 1 + (skill * 0.072);
+ var mf2 = 1;
+ mf2 += state.results[spell.evd.magic + 'magicpower'] * 0.01;
+ if (spell.evd.elemental)
+ {
+ mf2 += state.results['magicpower'] * 0.01;
+ }
+ maxdamage *= mf1;
+ maxdamage *= mf2;
+ maxdamage *= 0.97;
+ if (maxdamage > (spell.b * 10))
+ {
+ maxdamage = spell.b * 10;
+ }
+ var mindamage = (spell.evd.minzero ? 0.0 : (maxdamage * 0.9))
+ maxdamage *= 1.02;
+ var mincdamage = mindamage * spell.evd.critMultiplier;
+ var maxcdamage = maxdamage * spell.evd.critMultiplier;
+ state.combatSpells[spell.spell.id] = { magic_damage: {minv: Math.floor(mindamage), maxv: Math.floor(maxdamage)}, magic_cdamage: {minv: Math.floor(mincdamage), maxv: Math.floor(maxcdamage)} };
+ }
+}
+
+function calcResults(state)
+{
+ for (var mfname in item_props)
+ {
+ if (mfname in knownZoneModifiers)
+ {
+ continue;
+ }
+ var vm = state.modify[mfname];
+ var vn = state.natural[mfname];
+ state.results[mfname] = (vm + vn);
+ }
+}
+
+function calcArmors(state)
+{
+ var avgarmor1 = 0;
+ var avgarmor2 = 0;
+ for (var mfname in knownArmorModifiers)
+ {
+ if (mfname == 'avgarmor')
+ {
+ continue;
+ }
+ var mina = 0;
+ var maxa = 0;
+ for (var sloti = 0; sloti < slots.length; sloti++)
+ {
+ var slot = slots[sloti];
+ var o = getObjectByStateSlot(state, slot);
+ if (o == null || !('modify' in o))
+ {
+ continue;
+ }
+ if ((mfname + '1') in o.modify)
+ {
+ mina += parseInt(o.modify[mfname + '1']);
+ maxa += parseInt(o.modify[mfname + '2']);
+ }
+ else if (mfname in o.modify)
+ {
+ mina += parseInt(o.modify[mfname]);
+ maxa += parseInt(o.modify[mfname]);
+ }
+ }
+ avgarmor1 += mina;
+ avgarmor2 += maxa;
+ state.results[mfname + '1'] = mina;
+ state.results[mfname + '2'] = maxa;
+ }
+ state.results.avgarmor1 = avgarmor1 / 4.0;
+ state.results.avgarmor2 = avgarmor2 / 4.0;
+
+}
+
+function applyDefElix(state, makeUp, v)
+{
+ switch (makeUp)
+ {
+ case 'edefence':
+ state.results.thrustdefence.all += v;
+ state.results.sabredefence.all += v;
+ state.results.crushdefence.all += v;
+ state.results.cutdefence.all += v;
+ break;
+ case 'emagicdefence':
+ state.modify.firemagicdefence += v;
+ state.modify.airmagicdefence += v;
+ state.modify.watermagicdefence += v;
+ state.modify.earthmagicdefence += v;
+ break;
+ default:
+ if (makeUp in knownZoneModifiers)
+ {
+ state.results[makeUp].all += v;
+ }
+ else
+ {
+ state.modify[makeUp] += v;
+ }
+ break;
+ }
+}
+
+function precalcZoneModifiers(state)
+{
+ for (var mfname in knownZoneModifiers)
+ {
+ state.results[mfname] = {all: 0, head: 0, body: 0, waist: 0, leg: 0, avg: 0, pants: 0};
+ }
+ state.results.defence.all = state.natural.endurance * 1.5;
+}
+
+function calcZoneModifiers(state)
+{
+ for (var i = 0; i < slots.length; i++)
+ {
+ var slot = slots[i];
+ var o = getObjectByStateSlot(state, slot);
+ if (o == null)
+ {
+ continue;
+ }
+ if ('modify' in o)
+ {
+ for (var mfname in o.modify)
+ {
+ if (mfname in knownZoneModifiers)
+ {
+ state.results[mfname].all += parseInt(o.modify[mfname]);
+ }
+ }
+ }
+ if ('properties' in o)
+ {
+ for (var mfname in o.properties)
+ {
+ if (mfname in knownZoneModifiers)
+ {
+ state.results[mfname][slot.zone] += parseInt(o.properties[mfname]);
+ }
+ }
+ }
+ }
+ for (var i = 0; i < state.appliedSets.length; i++)
+ {
+ var set = state.appliedSets[i];
+ if ('modify' in set)
+ {
+ for (var mfname in set.modify)
+ {
+ if (mfname in knownZoneModifiers)
+ {
+ state.results[mfname].all += parseInt(set.modify[mfname]);
+ }
+ }
+ }
+ }
+ for (var i = 0; i < state.appliedStrengthenings.length; i++)
+ {
+ var strengthening = state.appliedStrengthenings[i];
+ if ('modify' in strengthening)
+ {
+ for (var mfname in strengthening.modify)
+ {
+ if (mfname in knownZoneModifiers)
+ {
+ state.results[mfname].all += parseInt(strengthening.modify[mfname]);
+ }
+ }
+ }
+ }
+ for (var delixn in state.defElixes)
+ {
+ var delix = knownDefElix[delixn];
+ if (!(delix.makeUp in knownZoneModifiers) && !(delix.makeUp == 'edefence'))
+ {
+ continue;
+ }
+ var v = state.defElixes[delixn];
+ applyDefElix(state, delix.makeUp, v);
+ if ('makeUp2' in delix)
+ {
+ var v2 = getDefElixSecondValue(delix, v);
+ applyDefElix(state, delix.makeUp2, v2);
+ }
+ }
+ if ('spell_protect10' in state.spellPowerUps)
+ {
+ state.results.defence.all += state.spellPowerUps.spell_protect10;
+ }
+ for (var mfname in knownZoneModifiers)
+ {
+ if (mfname == 'defence')
+ {
+ continue;
+ }
+ var zones = state.results[mfname];
+ zones.all += state.results.defence.all;
+ zones.head += state.results.defence.head;
+ zones.body += state.results.defence.body;
+ zones.waist += state.results.defence.waist;
+ zones.leg += state.results.defence.leg;
+ zones.pants += state.results.defence.pants;
+ }
+ for (var mfname in knownZoneModifiers)
+ {
+ var zones = state.results[mfname];
+ zones.head += zones.all;
+ zones.body += zones.all;
+ zones.waist += zones.all;
+ zones.leg += zones.all;
+ zones.waist += zones.pants;
+ zones.leg += zones.pants;
+ zones.avg = (zones.head + zones.body + zones.waist + zones.leg) / 4;
+ }
+ state.results.defence = {all: 0, head: 0, body: 0, waist: 0, leg: 0, avg: 0};
+}
+
+function recalcSpellPowerUpState(state)
+{
+ for (var powerUp in knownPowerUps)
+ {
+ knownPowerUps[powerUp].found = false;
+ for (var sloti = 0; sloti < slots.length; sloti++)
+ {
+ var slot = slots[sloti];
+ var o = getObjectByStateSlot(state, slot);
+ knownPowerUps[powerUp].found |= (o != null && o.id == powerUp);
+ }
+ if (!knownPowerUps[powerUp].found)
+ {
+ continue;
+ }
+ var v = (2.2 * state.results[knownPowerUps[powerUp].skill] + 0.1 * state.natural.wisdom);
+ if (!knownPowerUps[powerUp].damageup)
+ {
+ v *= 2;
+ v /= 3;
+ }
+ var vself = v;
+ if (vself > 33)
+ {
+ vself = 33;
+ }
+ vself = Math.floor(vself * 100.0 + 0.5) / 100.0;
+ state.modify[powerUp + '_self'] = vself;
+ var vother = vself * 0.75;
+ vother = Math.floor(vother * 100.0 + 0.5) / 100.0;
+ state.modify[powerUp + '_other'] = vother;
+ }
+}
+
+function recalcDresserCombatTricksState(state)
+{
+ state.combatTricks = {};
+ for (var i = 0; i < state.trickSlots.length; i++)
+ {
+ var trickn = state.trickSlots[i];
+ if (trickn == null)
+ {
+ continue;
+ }
+ state.combatTricks[trickn] = {};
+ }
+ for (var trickn in state.combatTricks)
+ {
+ var trick = tricks[trickn];
+ var skillv = 0;
+ var power = state.results.magicpower;
+ var manaconsumption = state.results.manaconsumption;
+ var element = '';
+ if (typeof (trick) == 'object' && ('required' in trick))
+ {
+ for (mfn in trick.required)
+ {
+ if (mfn.indexOf('magicskill') > 0)
+ {
+ skillv = state.results[mfn];
+ element = mfn.substr(0, mfn.indexOf('magicskill'));
+ power += state.results[element + 'magicpower'];
+ break;
+ }
+ }
+ }
+ if (element != '')
+ {
+ for (var powerupn in state.spellPowerUps)
+ {
+ var v = state.spellPowerUps[powerupn];
+ var kpu = knownPowerUps[powerupn];
+ if ((kpu == null) || !kpu.damageup || !('element' in kpu) || (kpu.element != element))
+ {
+ continue;
+ }
+ power += (v * 2.0 / 3.0);
+ break;
+ }
+ }
+ manaconsumption += (skillv * 0.72);
+
+ var r = state.combatTricks[trickn];
+ r.name = trick.name;
+ r.caption = trick.caption;
+ if ('consumes' in trick)
+ {
+ if ('mana' in trick.consumes)
+ {
+ var mana = trick.consumes.mana;
+ r.mana = Math.floor(mana * (1.0 - (manaconsumption / 100.0)) + 0.5);
+ }
+ if ('spiritlevel' in trick.consumes)
+ {
+ r.spiritlevel = trick.consumes.spiritlevel;
+ }
+ }
+ if ('attack' in trick)
+ {
+ if ('damage' in trick.attack)
+ {
+ r.mfdamage = Math.floor(trick.attack.damage * (1.0 + (power / 100.0)) + 0.5);
+ }
+ if ('mindamage' in trick.attack)
+ {
+ r.mindamage = Math.floor(trick.attack.mindamage * (1.0 + (power / 100.0)) + 0.5);
+ r.maxdamage = Math.floor(trick.attack.maxdamage * (1.0 + (power / 100.0)) + 0.5);
+ }
+ if ('nextdamage' in trick.attack)
+ {
+ r.nextdamage = Math.floor(trick.attack.nextdamage * (1.0 + (power / 100.0)) + 0.5);
+ r.nextturns = trick.attack.nextturns;
+ }
+ }
+ if ('healing' in trick)
+ {
+ if ('hitpoints' in trick.healing)
+ {
+ r.hitpoints = Math.floor(trick.healing.hitpoints * (1.0 + (power / 100.0)) + 0.5);
+ }
+ if ('minhitpoints' in trick.healing)
+ {
+ r.minhitpoints = Math.floor(trick.healing.minhitpoints * (1.0 + (power / 100.0)) + 0.5);
+ r.maxhitpoints = Math.floor(trick.healing.maxhitpoints * (1.0 + (power / 100.0)) + 0.5);
+ }
+ if ('nexthitpoints' in trick.healing)
+ {
+ r.nexthitpoints = Math.floor(trick.healing.nexthitpoints * (1.0 + (power / 100.0)) + 0.5);
+ r.nextturns = trick.healing.nextturns;
+ }
+ }
+ }
+}
+
+function applyCommonSkillsTo(chapter)
+{
+ if ('weaponskill' in chapter)
+ {
+ for (var i = 0; i < knownWeaponSkills.length; i++)
+ {
+ var skilln = knownWeaponSkills[i];
+ if (skilln == 'staffskill')
+ {
+ continue;
+ }
+ if (!(skilln in chapter))
+ {
+ chapter[skilln] = 0;
+ }
+ chapter[skilln] += chapter.weaponskill;
+ }
+ chapter.weaponskill = 0;
+ }
+ if ('magicskill' in chapter)
+ {
+ for (var i = 0; i < naturalElements.length; i++)
+ {
+ var skilln = naturalElements[i] + 'magicskill';
+ if (!(skilln in chapter))
+ {
+ chapter[skilln] = 0;
+ }
+ chapter[skilln] += chapter.magicskill;
+ }
+ chapter.magicskill = 0;
+ }
+ if ('magicpower' in chapter)
+ {
+ for (var i = 0; i < allElements.length; i++)
+ {
+ var powern = allElements[i] + 'magicpower';
+ if (!(powern in chapter))
+ {
+ chapter[powern] = 0;
+ }
+ chapter[powern] += chapter.magicpower;
+ }
+ chapter.magicpower = 0;
+ }
+}
+
+function applyCommonSkills(state)
+{
+// applyCommonSkillsTo(state.natural);
+ applyCommonSkillsTo(state.modify);
+ applyCommonSkillsTo(state.results);
+}
+
+function recalcDresserState(state)
+{
+ var objid;
+ var o;
+ var propi;
+ var sloti;
+ var slot;
+ var set;
+ state.required = {};
+ state.modify = {};
+ state.results = {};
+ state.battlemf = {};
+ state.w3props = {};
+ state.w10props = {};
+ state.appliedSets = [];
+ state.appliedStrengthenings = [];
+ for (var mfname in item_props)
+ {
+ if (mfname in knownZoneModifiers)
+ {
+ continue;
+ }
+ if (!(mfname in state.natural))
+ {
+ state.natural[mfname] = 0;
+ }
+ if (!(mfname in state.modify))
+ {
+ state.modify[mfname] = 0;
+ }
+ }
+ state.natural.hitpoints = (state.natural.endurance * 6);
+ state.natural.knapsack = 40*(state.natural.level + 1) + state.natural.endurance;
+ state.natural.magicdefence = (state.natural.endurance * 1.5);
+ state.natural.defence = (state.natural.endurance * 1.5);
+ state.natural.mana = (state.natural.wisdom * 10);
+ state.natural.spiritlevel = 0;
+
+ var ls = state.natural.level;
+
+ if (ls > 6)
+ {
+ if (ls > 10)
+ {
+ ls = 10;
+ }
+ state.natural.spiritlevel += (ls - 6) * 10;
+ }
+ state.natural.counterstroke = dressOptions.newCapEdition ? 20 : 10;
+ state.natural.piercearmor = dressOptions.newCapEdition ? 20 : 5;
+ state.natural.attackcount = 1;
+ state.modify.attackcount = getAttackCount(state) - 1;
+ state.natural.blockcount = 2;
+ state.modify.blockcount = getBlockCount(state) - 2;
+ for (var i = 0; i < naturalElements.length; i++)
+ {
+ state.natural[naturalElements[i] + 'magicdefence'] = 0;
+ }
+ for (var i = 0; i < allElements.length; i++)
+ {
+ state.natural[allElements[i] + 'magicpower'] = state.natural.intellect * 0.5;
+ }
+
+ if ('spirituality' in state.natural)
+ {
+ state.natural.spiritlevel += state.natural.spirituality;
+ }
+ state.modify.knapsack = 0;
+ if (state.statElix != null)
+ {
+ var mf = knownElix[state.statElix.elixn].makeUp;
+ state.modify[mf] = state.statElix.v;
+ if ('makeUp2' in knownElix[state.statElix.elixn])
+ {
+ var mf2 = knownElix[state.statElix.elixn].makeUp2;
+ state.modify[mf2] = knownElix[state.statElix.elixn].values2[0];
+ }
+ }
+ if (state.spellIntel != 0)
+ {
+ state.modify.intellect = state.spellIntel + (('intellect' in state.modify) ? state.modify.intellect : 0);
+ }
+ if (state.spellBD != 0)
+ {
+ state.modify.strength = state.spellBD + (('strength' in state.modify) ? state.modify.strength : 0);
+ state.modify.dexterity = state.spellBD + (('dexterity' in state.modify) ? state.modify.dexterity : 0);
+ state.modify.intuition = state.spellBD + (('intuition' in state.modify) ? state.modify.intuition : 0);
+ state.modify.intellect = state.spellBD + (('intellect' in state.modify) ? state.modify.intellect : 0);
+ state.modify.hitpoints = state.spellBD*6 +(('hitpoints' in state.modify) ? state.modify.hitpoints : 0);
+ }
+ if (state.spellHitpoints != 0)
+ {
+ state.modify.hitpoints = (state.natural.endurance * state.spellHitpoints) + (('hitpoints' in state.modify) ? state.modify.hitpoints : 0);
+ }
+ var w3o = getObjectByStateSlot(state, slot_w3);
+ var w10o = getObjectByStateSlot(state, slot_w10);
+ //dressStrengthenings.neutralPower.modify.mindamage = state.natural.level;
+ //dressStrengthenings.neutralPower.modify.maxdamage = state.natural.level;
+ for (var setn in dressSets)
+ {
+ set = dressSets[setn];
+ var countFound = getCountForSet(state, set.id);
+ if (!('details' in set) || (countFound == 0))
+ {
+ continue;
+ }
+ for (var scn in set.details)
+ {
+ var sc = set.details[scn];
+ if ('required' in sc)
+ {
+ if ('itemscount' in sc.required)
+ {
+ if (!('caption' in sc))
+ {
+ sc.caption = set.caption + ' (' + sc.required.itemscount + ')';
+ }
+ if (sc.required.itemscount == countFound)
+ {
+ state.appliedSets.push(sc);
+ }
+ }
+ else if (('minitemscount' in sc.required) && ('maxitemscount' in sc.required))
+ {
+ if (!('caption' in sc))
+ {
+ sc.caption = set.caption + ' (' + sc.required.minitemscount + ' - ' + sc.required.maxitemscount + ')';
+ }
+ if ((countFound >= sc.required.minitemscount) && (countFound <= sc.required.maxitemscount))
+ {
+ state.appliedSets.push(sc);
+ }
+ }
+ }
+ }
+ }
+
+ for (sloti = 0; sloti < slots.length; sloti++)
+ {
+ slot = slots[sloti];
+ o = getObjectByStateSlot(state, slot);
+ if (o == null)
+ {
+ continue;
+ }
+
+ if ('required' in o)
+ {
+ for (var mfname in o.required)
+ {
+ if (mfname in knownZoneModifiers)
+ {
+ continue;
+ }
+ var v = parseInt(o.required[mfname]);
+ if (!(mfname in state.required) || (state.required[mfname] < v))
+ {
+ state.required[mfname] = v;
+ }
+ }
+ }
+
+ if ('modify' in o)
+ {
+ for (var mfname in o.modify)
+ {
+ if (mfname in knownZoneModifiers)
+ {
+ continue;
+ }
+ state.modify[mfname] += parseInt(o.modify[mfname]);
+ }
+ }
+ }
+ for (var tricki = 0; tricki < state.trickSlots.length; tricki++)
+ {
+ var trickn = state.trickSlots[tricki];
+ if (trickn == null)
+ {
+ continue;
+ }
+ o = tricks[getJSName(trickn)];
+ if (o == null)
+ {
+ continue;
+ }
+ if ('required' in o)
+ {
+ for (var mfname in o.required)
+ {
+ if (mfname in knownZoneModifiers)
+ {
+ continue;
+ }
+ var v = parseInt(o.required[mfname]);
+ if (!(mfname in state.required) || (state.required[mfname] < v))
+ {
+ state.required[mfname] = v;
+ }
+ }
+ }
+ }
+ for (var seti = 0; seti < state.appliedSets.length; seti++)
+ {
+ set = state.appliedSets[seti];
+ if ('required' in set)
+ {
+ for (var mfname in set.required)
+ {
+ if (mfname in knownZoneModifiers)
+ {
+ continue;
+ }
+ var v = parseInt(set.required[mfname]);
+ if (!(mfname in state.required) || (state.required[mfname] < v))
+ {
+ state.required[mfname] = v;
+ }
+ }
+ }
+
+ if ('modify' in set)
+ {
+ for (var mfname in set.modify)
+ {
+ if (mfname in knownZoneModifiers)
+ {
+ continue;
+ }
+ state.modify[mfname] += parseInt(set.modify[mfname]);
+ }
+ }
+ }
+ if (state.pet != null)
+ {
+ var pet = pets[state.pet.n];
+ var pl = pet.levels['L' + state.pet.level];
+ if ('skill' in pl)
+ {
+ if ('modify' in pl.skill)
+ {
+ for (var mfname in pl.skill.modify)
+ {
+ state.battlemf[mfname] = pl.skill.modify[mfname];
+ state.modify[mfname] += pl.skill.modify[mfname];
+ }
+ }
+ }
+ }
+ // preliminary results.
+ for (var powerupn in state.spellPowerUps)
+ {
+ if (powerupn in knownPowerUps)
+ {
+ var powerup = knownPowerUps[powerupn];
+ if (!powerup.damageup)
+ {
+ state.modify[powerup.element + 'magicdefence'] += state.spellPowerUps[powerupn];
+ }
+ else
+ {
+ state.modify[powerup.element + 'magicpower'] += state.spellPowerUps[powerupn];
+ }
+ }
+ if (powerupn in knownECRPowerUps)
+ {
+ var epowerup = knownECRPowerUps[powerupn];
+ if (!(epowerup.modify in knownZoneModifiers))
+ {
+ if (!(epowerup.modify in knownWeaponModifiersHash))
+ {
+ state.modify[epowerup.modify] += epowerup.v;
+ }
+ }
+ }
+ }
+ calcResults(state);
+ state.natural.criticalhit = state.natural.anticriticalhit = (state.results.intuition * 5);
+ state.natural.jumpaway = state.natural.antijumpaway = (state.results.dexterity * 5);
+ for (var delixn in state.damageElixes)
+ {
+ var delix = knownDamageElix[delixn];
+ if (!('modify' in delix)) continue;
+ if ('hitpoints' in delix.modify)
+ {
+ state.modify.hitpoints += delix.modify.hitpoints;
+ }
+ }
+ for (var strgn in dressStrengthenings)
+ {
+ var strg = dressStrengthenings[strgn];
+ if (dressOptions.newCapEdition)
+ {
+ if (strg.domain == 'ru') continue;
+ }
+ else
+ {
+ if (strg.domain == 'com') continue;
+ }
+ var strgOk = true;
+ if ('required' in strg)
+ {
+ for (var mfname in strg.required)
+ {
+ var rvmin = parseInt(strg.required[mfname]);
+ var rvmax = rvmin + 24;
+ if (strgn == 'spirituality50')
+ {
+ rvmax = 99;
+ }
+ if (dressOptions.newCapEdition)
+ {
+ rvmax = 10000;
+ }
+ if (!(mfname in state.results) || (state.results[mfname] < rvmin) || ((rvmin < 125) && (state.results[mfname] > rvmax)))
+ {
+ strgOk = false;
+ break;
+ }
+ }
+ if (strgOk)
+ {
+ if ('zodiacs' in strg)
+ {
+ strgOk = false;
+ var zv = parseInt(state.sign);
+ if (!isNaN(zv) && (zv >= 1) && (zv <= 12))
+ {
+ for (var zn in strg.zodiacs)
+ {
+ var z = strg.zodiacs[zn];
+ if (zv == parseInt(z.value))
+ {
+ strgOk = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (strgOk)
+ {
+ state.appliedStrengthenings.push(strg);
+ }
+ }
+ for (propi = 0; propi < knownCleanModifiers.length; propi++)
+ {
+ var mfname = knownCleanModifiers[propi];
+ if (mfname == '-')
+ {
+ continue;
+ }
+ var mfvalue = (mfname in state.modify) ? state.modify[mfname] : 0;
+ for (var strgi = 0; strgi < state.appliedStrengthenings.length; strgi++)
+ {
+ var strg = state.appliedStrengthenings[strgi];
+ if (('modify' in strg) && (mfname in strg.modify))
+ {
+ mfvalue += parseInt(strg.modify[mfname]);
+ }
+ }
+ state.modify[mfname] = mfvalue;
+ }
+ if ((w10o != null) && w10o.slot == slot_w10.id)
+ {
+ if (('properties' in w10o) && ('shieldblock' in w10o.properties))
+ {
+ state.modify.shieldblock += w10o.properties.shieldblock;
+ }
+ }
+ // final results
+ /*if ('strength' in state.modify)
+ {
+ state.modify.knapsack = (state.modify.strength * 4);
+ }
+ if ('strength' in state.battlemf)
+ {
+ state.modify.knapsack -= (state.battlemf.strength * 4);
+ }*/
+ state.natural.consumed_reward = (10000 * state.natural.pskil);
+ state.natural.consumed_reward += (2000 * state.natural.pstat) + (50 * (state.natural.pstat * (state.natural.pstat - 1)));
+ state.modify.consumed_reward = 0;
+ state.natural.totalstats = 0;
+ state.modify.totalstats = 0;
+ for (propi = 0; propi < knownStats.length; propi++)
+ {
+ var stname = knownStats[propi];
+ state.natural.totalstats += state.natural[stname];
+ state.modify.totalstats += state.modify[stname];
+ }
+ state.modify.totalprice = 0;
+ state.modify.totaleprice = 0;
+ state.modify.totalweight = 0;
+ for (sloti = 0; sloti < slots.length; sloti++)
+ {
+ slot = slots[sloti];
+ o = getObjectByStateSlot(state, slot);
+ if (o == null || !('common' in o))
+ {
+ continue;
+ }
+ if ('price' in o.common)
+ {
+ state.modify.totalprice += o.common.price;
+ }
+ if ('eprice' in o.common)
+ {
+ state.modify.totaleprice += o.common.eprice;
+ }
+ if ('weight' in o.common)
+ {
+ state.modify.totalweight += o.common.weight;
+ }
+ else
+ {
+ state.modify.totalweight += 1;
+ }
+ }
+ state.modify.totalprice = Math.floor(state.modify.totalprice * 100.0 + 0.5) / 100.0;
+ state.modify.totaleprice = Math.floor(state.modify.totaleprice * 100.0 + 0.5) / 100.0;
+ state.modify.totalweight = Math.floor(state.modify.totalweight * 100.0 + 0.5) / 100.0;
+ var bothSkill = getWeaponSkillValue(state, slot_w3) + getWeaponSkillValue(state, slot_w10);
+ //state.natural.parry = (bothSkill * 0.5);
+ calcArmors(state);
+ precalcZoneModifiers(state);
+ for (var powerupn in state.spellPowerUps)
+ {
+ if (powerupn in knownECRPowerUps)
+ {
+ var epowerup = knownECRPowerUps[powerupn];
+ if (epowerup.modify in knownZoneModifiers)
+ {
+ state.results[epowerup.modify].head += epowerup.v;
+ state.results[epowerup.modify].body += epowerup.v;
+ state.results[epowerup.modify].waist += epowerup.v;
+ state.results[epowerup.modify].leg += epowerup.v;
+ state.results[epowerup.modify].avg += epowerup.v;
+ }
+ }
+ }
+ calcZoneModifiers(state);
+ recalcSpellPowerUpState(state);
+ for (var delixn in state.defElixes)
+ {
+ var delix = knownDefElix[delixn];
+ var v = state.defElixes[delixn];
+ applyDefElix(state, delix.makeUp, v);
+ if ('makeUp2' in delix)
+ {
+ var v2 = getDefElixSecondValue(delix, v);
+ applyDefElix(state, delix.makeUp2, v2);
+ }
+ }
+ // updating magic skills from natural intellect
+ for (var i = 0; i < allElements.length; i++)
+ {
+ var mfvalue= ((allElements[i]+'magicpower') in state.modify) ? state.modify[allElements[i] + 'magicpower'] : 0;
+ if ('intellect' in state.modify)
+ {
+ mfvalue += state.modify.intellect*0.5;
+ }
+ state.modify[allElements[i]+'magicpower'] = mfvalue;
+ }
+
+ calcResults(state);
+ applyCommonSkills(state);
+ recalcDresserCombatSpellsState(state);
+ recalcDresserCombatTricksState(state);
+ calcResults(state);
+ state.w3props = recalcDresserWeaponState(state, slot_w3);
+ recalcDresserWeaponAdvState(state, slot_w3);
+ if (w10o != null && w10o.slot == slot_w3.id)
+ {
+ state.w10props = recalcDresserWeaponState(state, slot_w10);
+ recalcDresserWeaponAdvState(state, slot_w10);
+ }
+}
+
+function showInfoPane(state)
+{
+ if (state == null)
+ {
+ state = activeState;
+ }
+ if (state == null)
+ {
+ return;
+ }
+ document.getElementById('infopane' + state.id).innerHTML = getDresserInfoPaneHtml(state);
+}
+
+// call when changes only in other cabs
+function fastUpdateDresserState(state)
+{
+ if (state == null)
+ {
+ return;
+ }
+ recalcDresserState(state);
+ showInfoPane(state);
+ updateDresserNaturalEditors(state);
+ showDressHint();
+}
+
+function updateDresserState(state)
+{
+ if (state == null)
+ {
+ state = activeState;
+ }
+ if (state == null)
+ {
+ return;
+ }
+ fastUpdateDresserState(state);
+ setMeter(state, hpMeterSuffix, state.results.hitpoints);
+ setMeter(state, manaMeterSuffix, ('mana' in state.results) ? state.results.mana : 0);
+ var nickelt = document.getElementById('nick' + state.id);
+ if (nickelt)
+ {
+ nickelt.innerHTML = getPersNickString(state);
+ }
+}
+
+function hardUpdateDresserState(state)
+{
+ recalcDresserState(state);
+ document.getElementById('cab_' + state.id).innerHTML = getDresserInnerHtml(state);
+}
+
+var updateDresserStateWantedTimer = null;
+
+function updateDresserStateWanted()
+{
+ if (updateDresserStateWantedTimer != null)
+ {
+ clearTimeout(updateDresserStateWantedTimer);
+ updateDresserStateWantedTimer = null;
+ }
+ updateDresserStateWantedTimer = setTimeout("updateDresserState()", 300);
+}
+
+
+function preloadImages()
+{
+ informAboutProgress(localizer.startPreloadImages);
+ var img = new Image(18, 16);
+ if (!('artefact' in imagesToBeLoaded))
+ {
+ img.src = baseImgPath + 'artefact.gif';
+ imagesToBeLoaded['artefact'] = img;
+ }
+ for (var catid in categories)
+ {
+ for (var j = 0; j < categories[catid].items.length; j++)
+ {
+ var item = categories[catid].items[j];
+ var jsName = getJSName(item.id);
+ if (!(jsName in imagesToBeLoaded))
+ {
+ img = new Image(item.width, item.height);
+ img.src = itemImgPath + item.id + '.gif';
+ imagesToBeLoaded[jsName] = img;
+ }
+ }
+ }
+ informAboutProgress(localizer.completePreloadImages);
+}
+
+var preloadImagesWantedTimer = null;
+
+function preloadImagesWanted(state)
+{
+ if (preloadImagesWantedTimer != null)
+ {
+ clearTimeout(preloadImagesWantedTimer);
+ preloadImagesWantedTimer = null;
+ }
+ preloadImagesWantedTimer = setTimeout('preloadImages()', preloadImagesDelay);
+}
+
+function getSlotById(slotid)
+{
+ for (var i = 0; i < slots.length; i++)
+ {
+ if (slots[i].id == slotid)
+ {
+ return slots[i];
+ }
+ }
+ return null;
+}
+
+function getSlotByIndex(sloti)
+{
+ for (var i = 0; i < slots.length; i++)
+ {
+ if (slots[i].index == sloti)
+ {
+ return slots[i];
+ }
+ }
+ return null;
+}
+
+function getObjectIdOfSlot(state, slotid)
+{
+ return state.objects[getSlotById(slotid).index];
+}
+
+function hasTwohandledWeapon(state)
+{
+ var w3o = getObjectByStateSlot(state, slot_w3);
+ return isTwohandledWeapon(w3o);
+}
+
+function DropAllScrolls(state)
+{
+for (var isScrollSlot = 100; isScrollSlot <= 109; isScrollSlot++)
+ {
+ setObjectForSlot(dressStates[state], 'w'+isScrollSlot, null);
+ }
+
+}
+
+function setObjectForSlot(state, slotid, objid)
+{
+ var slot = getSlotById(slotid);
+ if (state == null || slot == null)
+ {
+ return;
+ }
+ var oimg = (objid == null) ? slotid : objid;
+ var o = getObjectById(objid);
+ var realItemImgPath = getRealImagePath(objid, slot);
+ // drop incompatible items.
+ if (slotid == 'w10' && objid != null && hasTwohandledWeapon(state))
+ {
+ onObjectDrop(state.id, 'w3');
+ }
+ if (slotid == 'w3' && objid != null && isTwohandledWeapon(o))
+ {
+ onObjectDrop(state.id, 'w10');
+ }
+ // dresser is fully rebuilt and transition applied later.
+ var imgElt = document.getElementById(state.id.toString() + slot.id);
+ var needRebuild = (imgElt == null);
+ if (slotid == 'w4')
+ {
+ // unfit armor if fitted before.
+ state.fitArmor = false;
+ }
+ state.fitSlots[slot.index] = null;
+ state.upgradeSlots[slot.index] = null;
+ state.charmSlots[slot.index] = null;
+ state.addSlots[slot.index] = null;
+ state.runeSlots[slot.index] = null;
+ if (slotid == 'w3')
+ {
+ state.w3sharp = 0;
+ }
+ if (slotid == 'w10')
+ {
+ state.w10sharp = 0;
+ }
+ state.objCache[slot.index] = null;
+ if (needRebuild)
+ {
+ document.getElementById('cab_' + state.id).innerHTML = getDresserInnerHtml(state);
+ }
+ state.objects[slot.index] = objid;
+ if ((o != null) && ('fakebase' in o))
+ {
+ state.upgradeSlots[slot.index] = objid + '_fake';
+ }
+ updateDresserSlot(state, slot);
+}
+
+function getFittedArmor(armorObject)
+{
+ var fittedArmor = cloneObject(armorObject);
+ if (!('modify' in fittedArmor))
+ {
+ fittedArmor.modify = { hitpoints: 0 };
+ }
+ else if (!('hitpoints' in fittedArmor.modify))
+ {
+ fittedArmor.modify.hitpoints = 0;
+ }
+ var armorLevel = (('required' in fittedArmor) && ('level' in fittedArmor.required)) ? parseInt(fittedArmor.required.level) : 0;
+ fittedArmor.modify.hitpoints += ((armorLevel + 1) * 6);
+ fittedArmor.armorWasFit = true;
+ fittedArmor.destiny = ' ';
+ return fittedArmor;
+}
+
+function getFittedObject(objectToFit, setIdToFit)
+{
+ var fittedObject = cloneObject(objectToFit);
+ if (!('setlink' in fittedObject))
+ {
+ fittedObject.setlink = { name: setIdToFit };
+ }
+ else
+ {
+ fittedObject.setlink.name = setIdToFit;
+ }
+ fittedObject.wasFit = true;
+ if ('common' in fittedObject)
+ {
+ var upgradePrice = 0;
+ if ('eprice' in fittedObject.common)
+ {
+ upgradePrice = Math.floor(fittedObject.common.eprice * 20 + 0.5) / 100.0;
+ }
+ else if ('price' in fittedObject.common)
+ {
+ upgradePrice = Math.floor(fittedObject.common.price * 4 + 0.5) / 100.0;
+ }
+ if (upgradePrice > 0)
+ {
+ if ('eprice' in fittedObject.common)
+ {
+ fittedObject.common.eprice += upgradePrice;
+ }
+ else
+ {
+ fittedObject.common.eprice = upgradePrice;
+ }
+ }
+ }
+ return fittedObject;
+}
+
+function getCharmedObject(objectToCharm, modify)
+{
+ var charmedObject = cloneObject(objectToCharm);
+ charmedObject.wasCharmed = true;
+ charmedObject.charms = modify;
+ if (!('modify' in charmedObject))
+ {
+ charmedObject.modify = {};
+ }
+ for (var mf in modify)
+ {
+ if (mf in charmedObject.modify)
+ {
+ charmedObject.modify[mf] = parseInt(charmedObject.modify[mf]) + modify[mf];
+ }
+ else
+ {
+ charmedObject.modify[mf] = modify[mf];
+ }
+ }
+ return charmedObject;
+}
+
+function getAddObject(objectToCharm, modify)
+{
+ var charmedObject = cloneObject(objectToCharm);
+ charmedObject.wasAdded = true;
+ charmedObject.charms = modify;
+ if (!('modify' in charmedObject))
+ {
+ charmedObject.modify = {};
+ }
+ for (var mf in modify)
+ {
+ if (mf in charmedObject.modify)
+ {
+ charmedObject.modify[mf] = parseInt(charmedObject.modify[mf]) + modify[mf];
+ }
+ else
+ {
+ charmedObject.modify[mf] = modify[mf];
+ }
+ }
+ return charmedObject;
+}
+
+function getCharmedObject2(objectToCharm, charm)
+{
+ var modify = {};
+ var ss = charm.split('#');
+ for (var i = 0; i < ss.length; i += 2)
+ {
+ var v = parseInt(ss[i + 1]);
+ if (!isNaN(v))
+ {
+ modify[ss[i]] = v;
+ }
+ }
+ return getCharmedObject(objectToCharm, modify);
+}
+
+function getAddObject2(objectToCharm, charm)
+{
+ var modify = {};
+ var ss = charm.split('#');
+ for (var i = 0; i < ss.length; i += 2)
+ {
+ var v = parseInt(ss[i + 1]);
+ if (!isNaN(v))
+ {
+ modify[ss[i]] = v;
+ }
+ }
+ return getAddObject(objectToCharm, modify);
+}
+
+function getRunedObject(objectToRune, runeStr)
+{
+var appliedRune = '';
+var appliedRuneOpt = '';
+
+var ss = runeStr.split('#');
+var v = parseInt(ss[1]);
+if (!isNaN(v))
+ {
+ if (v < 1) { v = '0'; }
+ appliedRune=ss[0];
+ appliedRuneOpt=v;
+ }
+
+var runedObject = cloneObject(objectToRune);
+if (!appliedRune) { return runedObject; }
+var o=getObjectById(appliedRune);
+if (!('opts' in o.modify)) { return runedObject; }
+if (o.modify.opts[appliedRuneOpt] == null) { return runedObject; }
+
+runedObject.wasRuned = true;
+runedObject.rune = appliedRune;
+runedObject.runeOpt = appliedRuneOpt;
+
+if (!('modify' in runedObject))
+ {
+ runedObject.modify = {};
+ }
+
+var modify = o.modify.opts[appliedRuneOpt];
+
+for (var mf in modify)
+ {
+ if (mf in runedObject.modify)
+ {
+ runedObject.modify[mf] = parseInt(runedObject.modify[mf]) + modify[mf];
+ }
+ else
+ {
+ runedObject.modify[mf] = modify[mf];
+ }
+ }
+return runedObject;
+}
+
+
+function dropZeroInSection(o, sn)
+{
+ if (!(sn in o)) return o;
+ for (var n in o[sn])
+ {
+ if (!isNaN(o[sn][n]) && o[sn][n] == 0) delete o[sn][n];
+ }
+ return o;
+}
+
+
+
+function getUpgradeObject(objectToUpgrade, upgradeIdToUpgrade)
+{
+ if (!('upgradecache' in objectToUpgrade))
+ {
+ objectToUpgrade.upgradecache = {};
+ }
+ if (!(upgradeIdToUpgrade in objectToUpgrade.upgradecache))
+ {
+ var upgradeObject = {};
+ var upgrade = objectToUpgrade.upgrade[upgradeIdToUpgrade];
+ if ('fake' in upgrade)
+ {
+ upgrade.category = objectToUpgrade.category;
+ upgrade.slot = objectToUpgrade.slot;
+ upgrade.width = objectToUpgrade.width;
+ upgrade.height = objectToUpgrade.height;
+ upgradeObject = cloneObject(upgrade);
+ }
+ else
+ {
+ upgradeObject = cloneObject(objectToUpgrade);
+ upgradeObject = combineObjects(upgradeObject, upgrade);
+ upgradeObject = dropZeroInSection(upgradeObject, 'modify');
+ upgradeObject = dropZeroInSection(upgradeObject, 'properties');
+ upgradeObject = dropZeroInSection(upgradeObject, 'required');
+ }
+ upgradeObject.caption = getUpgradeCaption(objectToUpgrade, upgrade);
+ if ('price' in upgrade)
+ {
+ if (!('common' in upgradeObject))
+ {
+ upgradeObject.common = { eprice: 0 };
+ }
+ var oprice = ('eprice' in objectToUpgrade.common) ? objectToUpgrade.common.eprice : 0;
+ if ('level' in upgrade)
+ {
+ for (var oun in objectToUpgrade.upgrade)
+ {
+ var ou = objectToUpgrade.upgrade[oun];
+ var al = ('level' in ou) ? ou.level : 0;
+ if ((al < upgrade.level) && ('price' in ou))
+ {
+ oprice += ou.price;
+ }
+ }
+ }
+ oprice += upgrade.price;
+ upgradeObject.common.eprice = oprice;
+ }
+ upgradeObject.wasUpgrade = true;
+ objectToUpgrade.upgradecache[upgradeIdToUpgrade] = upgradeObject;
+ }
+ return objectToUpgrade.upgradecache[upgradeIdToUpgrade];
+}
+
+var sharpStatValues = {
+ strength: 0,
+ dexterity: 0,
+ intuition: 0,
+ endurance: 0,
+ intellect: 0,
+ wisdom: 0
+ };
+var sharpStatsPriority = {
+ strength: 10,
+ dexterity: 8,
+ intuition: 6,
+ endurance: 4,
+ intellect: 2,
+ wisdom: 1
+ };
+var sharpStats = [];
+
+function compareSharpStats(x, y)
+{
+ var r = sharpStatValues[x] - sharpStatValues[y];
+ if (r == 0)
+ {
+ r = sharpStatsPriority[x] - sharpStatsPriority[y];
+ }
+ return r;
+}
+
+function getSharpenWeapon(weaponObject, sharp)
+{
+ if (sharp == 0 || weaponObject == null)
+ {
+ return weaponObject;
+ }
+
+ if (parseInt(sharp) == 11 || parseInt(sharp) == 8 || parseInt(sharp) == 6 || parseInt(sharp) == 9) { sharp=100+parseInt(sharp); }
+ var oldmode=1;
+ if (sharp > 100) { sharp-=100; oldmode = 0; }
+ var sharpenWeapon = cloneObject(weaponObject);
+
+ // drop sharpening for non-lv10 arts
+ //if (('artefact' in sharpenWeapon) && (oldmode != 1))
+ // {
+ // if ('required' in sharpenWeapon)
+ // {
+ // if ('level' in sharpenWeapon.required)
+ // {
+ // if (sharpenWeapon.required.level < 10 ) { return weaponObject; }
+ // }
+ // }
+ // }
+
+ var swcat = categories[sharpenWeapon.category];
+ var skillname = null;
+ if ('required' in sharpenWeapon)
+ {
+ for (var i = 0; i < knownWeaponSkills.length; i++)
+ {
+ if (knownWeaponSkills[i] in sharpenWeapon.required)
+ {
+ skillname = knownWeaponSkills[i];
+ break;
+ }
+ }
+ }
+ if (skillname == null && ('skillname' in swcat))
+ {
+ skillname = swcat.skillname;
+ }
+ var increaseReq = (skillname != null);
+ if (increaseReq && ('required' in weaponObject))
+ {
+ if ('multiplier' in weaponObject.required)
+ {
+ increaseReq = (weaponObject.required.multiplier != 0);
+ }
+ }
+
+ if (oldmode != 1) { increaseReq = false; }
+ if (increaseReq)
+ {
+ if (!('required' in sharpenWeapon))
+ {
+ sharpenWeapon.required = { strength: sharp, dexterity: sharp };
+ }
+ else
+ {
+ sharpStatValues = {
+ strength: ('strength' in sharpenWeapon.required) ? sharpenWeapon.required.strength : 0,
+ dexterity: ('dexterity' in sharpenWeapon.required) ? sharpenWeapon.required.dexterity : 0,
+ intuition: ('intuition' in sharpenWeapon.required) ? sharpenWeapon.required.intuition : 0,
+ endurance: ('endurance' in sharpenWeapon.required) ? sharpenWeapon.required.endurance : 0,
+ intellect: ('intellect' in sharpenWeapon.required) ? sharpenWeapon.required.intellect : 0,
+ wisdom: ('wisdom' in sharpenWeapon.required) ? sharpenWeapon.required.wisdom : 0
+ };
+ sharpStats = new Array('strength', 'dexterity', 'intuition', 'endurance', 'intellect', 'wisdom');
+ sharpStats.sort(compareSharpStats);
+ sharpStats.reverse();
+ sharpenWeapon.required[sharpStats[0]] = sharpStatValues[sharpStats[0]] + sharp;
+ sharpenWeapon.required[sharpStats[1]] = sharpStatValues[sharpStats[1]] + sharp;
+ }
+ if (skillname != 'staffskill')
+ {
+ var skillv = (skillname in sharpenWeapon.required) ? sharpenWeapon.required[skillname] : 0;
+ skillv += sharp;
+ sharpenWeapon.required[skillname] = skillv;
+ }
+ }
+ if (!('common' in sharpenWeapon))
+ {
+ sharpenWeapon.common = { price: 0 };
+ }
+ else
+ {
+ if (!('price' in sharpenWeapon.common))
+ {
+ sharpenWeapon.common.price = 0;
+ }
+ }
+
+ if (oldmode != 1)
+ {
+ if (!('required' in sharpenWeapon))
+ {
+ sharpenWeapon.required = { level: 0 };
+ }
+ else
+ {
+ if (!('level' in sharpenWeapon.required))
+ {
+ sharpenWeapon.required.level=0;
+ }
+ }
+ if (sharpenWeapon.required.level < minSharpLevels[sharp]) { sharpenWeapon.required.level = minSharpLevels[sharp]; }
+ }
+
+ if (oldmode==1)
+ {
+ if (sharp < 7)
+ {
+ sharpenWeapon.common.price += 10 * Math.pow(2, sharp);
+ }
+ else
+ {
+ sharpenWeapon.common.price += (1000 * (sharp - 6));
+ }
+ }
+ else
+ {
+ if ('properties' in sharpenWeapon)
+ {
+ if ('twohandled' in sharpenWeapon.properties)
+ { sharpenWeapon.common.price += dblSharpPrices[sharp]; }
+ else { sharpenWeapon.common.price += regSharpPrices[sharp]; }
+ }
+ else { sharpenWeapon.common.price += regSharpPrices[sharp]; }
+ }
+
+ var generalSharp=1;
+ if ('category' in sharpenWeapon)
+ {
+ if (sharpenWeapon.category == 'staffs') { generalSharp=0; }
+ }
+
+ if (generalSharp==1)
+ {
+ if (!('properties' in sharpenWeapon))
+ {
+ sharpenWeapon.properties = { mindamage: 0, maxdamage: 0 };
+ }
+ else
+ {
+ if (!('mindamage' in sharpenWeapon.properties))
+ {
+ sharpenWeapon.properties.mindamage = 0;
+ }
+ if (!('maxdamage' in sharpenWeapon.properties))
+ {
+ sharpenWeapon.properties.maxdamage = sharpenWeapon.properties.mindamage;
+ }
+ }
+ if ('properties' in sharpenWeapon)
+ {
+ if (('twohandled' in sharpenWeapon.properties) && (oldmode != 1))
+ {
+ sharpenWeapon.properties.mindamage += 2*sharp;
+ sharpenWeapon.properties.maxdamage += 2*sharp;
+ }
+ else
+ {
+ sharpenWeapon.properties.mindamage += sharp;
+ sharpenWeapon.properties.maxdamage += sharp;
+ }
+ }
+ }
+ else
+ {
+ if (!('modify' in sharpenWeapon))
+ {
+ sharpenWeapon.modify = { magicpower: 0 };
+ }
+ else
+ {
+ if (!('magicpower' in sharpenWeapon.modify))
+ {
+ sharpenWeapon.modify.magicpower = 0;
+ }
+ }
+ if (oldmode != 1) { sharpenWeapon.modify.magicpower += sharp*2; }
+ else { sharpenWeapon.modify.magicpower += sharp; }
+ }
+
+ if (oldmode==1) { sharpenWeapon.caption += ' +' + sharp + '[old]'; }
+ else { sharpenWeapon.caption += ' +' + sharp; }
+
+ if ((sharp > 5 && oldmode == 1) || (oldmode != 1))
+ {
+ sharpenWeapon.destiny = ' , ';
+ }
+ return sharpenWeapon;
+}
+
+function onObjectDrop(stateId, slotid)
+{
+ setObjectForSlot(dressStates[stateId], slotid, null);
+}
+
+function onDropAll()
+{
+ var state = activeState;
+ applyCleanItemsToState(state);
+ hardUpdateDresserState(state);
+}
+
+function onClearAllStats(stateId)
+{
+ var state = dressStates[stateId];
+ clearAllStats(state);
+ updateDresserState(state);
+}
+
+function updateDresserSlot(state, slot)
+{
+ state.objCache[slot.index] = null;
+ var o = getObjectById(state.objects[slot.index]);
+ var oimg = (o == null) ? slot.id : o.id;
+ var realItemImgPath = getRealImagePath(o != null ? o.id : null, slot);
+ var imgElt = document.getElementById(state.id.toString() + slot.id);
+ if (imgElt != null)
+ {
+ if (dressOptions.useTransitionEffects)
+ {
+ imgElt.filters['revealtrans'].apply();
+ }
+ imgElt.name = 'x' + oimg;
+ imgElt.src = format('{0}{1}.gif', realItemImgPath, oimg);
+ o = getObjectByStateSlot(state, slot);
+ var newFilter = getRealFilter(getObjectFilter(state, slot, o));
+ if (is.ie && newFilter != imgElt.style.filter)
+ {
+ imgElt.style.filter = newFilter;
+ }
+ if (dressOptions.useTransitionEffects)
+ {
+ imgElt.filters['revealtrans'].play();
+ }
+ }
+ updateDresserStateWanted();
+}
+
+function onFitArmor(stateId, fit)
+{
+ var state = dressStates[stateId];
+ state.fitArmor = fit;
+ updateDresserSlot(state, slot_w4);
+}
+
+function onUnfitObject(stateId, slotId)
+{
+ var state = dressStates[stateId];
+ var slot = getSlotById(slotId);
+ state.fitSlots[slot.index] = null;
+ updateDresserSlot(state, slot);
+}
+
+function onFitObject(stateId, slotId, setId)
+{
+ var state = dressStates[stateId];
+ var slot = getSlotById(slotId);
+ if (state == null || slot == null)
+ {
+ return;
+ }
+ if (setId != null)
+ {
+ state.fitSlots[slot.index] = setId;
+ updateDresserSlot(state, slot);
+ }
+ else
+ {
+ var menuHtml ='
';
+ var o = getObjectByStateSlot(state, slot);
+ if (('wasFit' in o) && o.wasFit)
+ {
+ menuHtml += getRowMenuItemHtml(localizer.unfitObject, format("onUnfitObject('{0}', '{1}')", state.id, slot.id));
+ }
+ if ('setlinks' in o)
+ {
+ for (var seti = 1; seti < o.setlinks.length; seti++) // skip first
+ {
+ var set = dressSets[o.setlinks[seti]];
+ var sethtml = set.caption;
+ menuHtml += getRowMenuItemHtml(sethtml, format("onFitObject('{0}', '{1}', '{2}')", state.id, slot.id, set.id));
+ }
+ }
+ else
+ {
+ for (var setn in dressSets)
+ {
+ var set = dressSets[setn];
+ if (('noadjust' in set) && set.noadjust)
+ {
+ continue;
+ }
+ if (('virtual' in set) && set.virtual)
+ {
+ continue;
+ }
+ if (getSetItemsForSlot(set, slot).length > 0)
+ {
+ var sethtml = set.caption;
+ menuHtml += getRowMenuItemHtml(sethtml, format("onFitObject('{0}', '{1}', '{2}')", state.id, slot.id, set.id));
+ }
+ }
+ }
+ menuHtml += getRowMenuSeparatorHtml();
+ menuHtml += getRowMenuItemHtml(localizer.closeMenu, 'hideMenu()');
+ menuHtml += '
';
+ showMenu(menuHtml);
+ }
+}
+
+function getUpgradeCaption(o, upgrade)
+{
+ var caption = o.caption;
+ if ('caption' in upgrade)
+ {
+ caption = upgrade.caption;
+ }
+ if (('old' in upgrade) && upgrade.old)
+ {
+ caption = caption + ' [old]';
+ }
+ if ('level' in upgrade)
+ {
+ caption = caption + ' [' + upgrade.level + ']';
+ }
+ if ('fake' in upgrade)
+ {
+ caption = caption + ' []';
+ }
+ return caption;
+}
+
+function onUpgradeObject(stateId, slotId, upgradeId)
+{
+ var state = dressStates[stateId];
+ var slot = getSlotById(slotId);
+ if (state == null || slot == null)
+ {
+ return;
+ }
+ if (upgradeId != '')
+ {
+ state.upgradeSlots[slot.index] = upgradeId;
+ updateDresserSlot(state, slot);
+ }
+ else
+ {
+ var menuHtml ='
';
+ showMenu(menuHtml);
+}
+
+function onChooseTrick(trickNumber)
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ var menuHtml = format('{0}', localizer.tricks);
+ menuHtml += '
';
+ for (var i = 0; i < trickCategories.length; i++)
+ {
+ var ftricks = getFilteredTricks(state, i);
+ if (ftricks.length == 0) continue;
+ var onclick = format("hideMenu(); onChooseTrick_InCat({0}, {1}); return false", trickNumber, i);
+ menuHtml += getRowMenuItemHtml(
+ trickCategories[i].caption,
+ onclick
+ );
+ }
+ if (state.trickSlots[trickNumber] != null)
+ {
+ menuHtml += getRowMenuSeparatorHtml();
+ var onclick = format("hideMenu(); onWearTrick({0})", trickNumber);
+ menuHtml += getRowMenuItemHtml(localizer.dropTrick, onclick);
+ }
+ var AnyTricksOn=0;
+ for (var i=0; i';
+ cursorY -= 60;
+ showMenu(menuHtml);
+}
+
+function onWearTrick(trickNumber, name)
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ state.trickSlots[trickNumber] = name;
+ updateSingleTrickSlotHtml(trickNumber);
+}
+
+function onWearTrickAll()
+{
+ var state = activeState;
+ if (state == null)
+ {
+ return;
+ }
+ for (var i=0; i',
+ realItemImgPath,
+ oimg,
+ slot.width,
+ slot.height,
+ style
+ );
+ r += '';
+ return r;
+}
+
+function onUseTrick(trickNumber)
+{
+ // does nothing yet.
+}
+
+function getSimplePersImageHtml(state, showTricks)
+{
+ var oimg;
+ var i;
+ var hp = ('hitpoints' in state.inbattle) ? state.inbattle.hitpoints : 0;
+ var mhp = ('hitpoints' in state.results) ? state.results.hitpoints : 0;
+ hp = hp.toString();
+ hp = hp + '/' + mhp;
+
+ var r = '';
+ r += '
';
+ r += format('
{2}
', state.id, 'nick', getPersNickString(state));
+ r += format('
', state.id, hpMeterSuffix);
+ r += format('{2} ', state.id, hpMeterSuffix, hp);
+ var w = 240 - ((hp.length + 2) * 7);
+ r += format('', hpMeterGreenImg, getItemPropLabel('hitpoints'), w, state.id, hpMeterSuffix);
+ r += format('', baseImgPath, getItemPropLabel('hitpoints'));
+ var mana = ('mana' in state.inbattle) ? state.inbattle.mana : 0;
+ var mmana = ('mana' in state.results) ? state.results.mana : 0;
+ mana = mana.toString();
+ mana = mana + '/' + mmana;
+ var manaDisplayMode = (mmana > 0) ? '' : 'none';
+ r += format('
', state.id, manaMeterSuffix, manaDisplayMode);
+ r += format('{2} ', state.id, manaMeterSuffix, mana);
+ w = 240 - ((mana.length + 2) * 7);
+ r += format('', manaMeterImg, getItemPropLabel('mana'), w, state.id, manaMeterSuffix);
+ r += format('', baseImgPath, getItemPropLabel('mana'));
+ r += '
';
+ if (showTricks)
+ {
+ r += '
';
+ // w100 - w109
+ for (i = 100; i < 105; i++)
+ {
+ r += getSimplePersObjectImageHtml(state, getSlotById('w' + i));
+ }
+ // this slot is handled as book slot.
+ r += getSimplePersObjectImageHtml(state, slot_wbook);
+ // r += format('
', itemImgPath, 109);
+ r += '
';
+ for (i = 105; i < 110; i++)
+ {
+ r += getSimplePersObjectImageHtml(state, getSlotById('w' + i));
+ }
+ // this slot is handled separately like as BK.
+ r += format('
', itemImgPath, 109);
+ r += '
';
+ }
+ r += '
';
+ // w9
+ r += getSimplePersObjectImageHtml(state, slot_w9);
+ r += '
';
+ // w13
+ r += getSimplePersObjectImageHtml(state, slot_w13);
+ r += '
';
+ // w3
+ r += getSimplePersObjectImageHtml(state, slot_w3);
+ r += '
';
+ // w4
+ r += getSimplePersObjectImageHtml(state, slot_w4);
+ r += '
';
+ // w5
+ r += getSimplePersObjectImageHtml(state, slot_w5);
+ r += '
';
+ r += '
';
+ if (state.pet != null)
+ {
+ var pet = pets[state.pet.n];
+ r += format('', charImgPath, pet.image.def, pet.image.sex);
+ }
+ r += '
';
+ r += getSimplePersObjectImageHtml(state, slot_w14);
+ // w16 is skipped
+ r += format('
', itemImgPath);
+ r += getSimplePersObjectImageHtml(state, slot_w15);
+ r += '
';
+ r += format('
', itemImgPath);
+ r += format('
', itemImgPath);
+ r += format('
', itemImgPath);
+ r += '
';
+
+ // w1
+ r += getSimplePersObjectImageHtml(state, slot_w1);
+ r += '
';
+ // w2
+ r += getSimplePersObjectImageHtml(state, slot_w2);
+ r += '
';
+ // w6
+ r += getSimplePersObjectImageHtml(state, slot_w6);
+ // w7
+ r += getSimplePersObjectImageHtml(state, slot_w7);
+ // w8
+ r += getSimplePersObjectImageHtml(state, slot_w8);
+ r += '
';
+ // w11
+ r += getSimplePersObjectImageHtml(state, slot_w11);
+ r += '
';
+ // w10
+ r += getSimplePersObjectImageHtml(state, slot_w10);
+ r += '
';
+ // w19
+ r += getSimplePersObjectImageHtml(state, slot_w19);
+ r += '
';
+ // w12
+ r += getSimplePersObjectImageHtml(state, slot_w12);
+ r += '
';
+ r += '
';
+ // w18
+ r += getSimplePersObjectImageHtml(state, slot_w18);
+ r += '
';
+ // wshirt (w0)
+ r += getSimplePersObjectImageHtml(state, slot_w0);
+ r += '
';
+ // w17
+ r += getSimplePersObjectImageHtml(state, slot_w17);
+ r += '
';
+ if (showTricks)
+ {
+ r += '
';
+ for (var ci = 0; ci < 2; ci++)
+ {
+ r += '
';
+ for (var i = 0; i < 7; i++)
+ {
+ //if (ci==2 && i==6) {continue;}
+ var trickNumber = (ci * 7) + i;
+ var onclick = 'hideMenu(); onUseTrick(' + trickNumber + '); return false';
+ r += getTrickImageHtml(state, state.trickSlots[trickNumber], onclick, 50);
+ }
+ r += '
';
+ }
+ r += '
';
+ }
+ r += '
';
+ return r;
+}
+
+function getEmbeddedDresserFrameHtml()
+{
+ return '';
+}
+
+function getAutoCombatsDresserFrameHtml()
+{
+ return '';
+}
+
+function getOfflineDresserFrameHtml()
+{
+ return '';
+}
+
+function initializeDresserForBenderOmsk()
+{
+ dressOptions.benderOmskMode = true;
+ hereItemImgPath = '';
+ charImgPath = 'http://img.combats.com/i/chars/';
+ brandImgPath = 'brand/';
+ brand2ImgPath = 'misc/';
+ infospaceImgPath = 'images/infospace/';
+ dressImgPath = 'dress/';
+ blankImgPath = 'blank.gif';
+ zodiacImgPath = 'dress/z/';
+ saveSetOnServerUrl = absoluteDressRoomUrl + '?action=save&saveset=1&offline=1&texttosave={0}';
+}
+
diff --git a/dresss/dubina1.gif b/dresss/dubina1.gif
new file mode 100644
index 00000000..c6d4a112
Binary files /dev/null and b/dresss/dubina1.gif differ
diff --git a/dresss/dubina2.gif b/dresss/dubina2.gif
new file mode 100644
index 00000000..01074b0c
Binary files /dev/null and b/dresss/dubina2.gif differ
diff --git a/dresss/dubina2t.gif b/dresss/dubina2t.gif
new file mode 100644
index 00000000..01074b0c
Binary files /dev/null and b/dresss/dubina2t.gif differ
diff --git a/dresss/dubina3.gif b/dresss/dubina3.gif
new file mode 100644
index 00000000..87c2a72c
Binary files /dev/null and b/dresss/dubina3.gif differ
diff --git a/dresss/earrings200.gif b/dresss/earrings200.gif
new file mode 100644
index 00000000..cb421cda
Binary files /dev/null and b/dresss/earrings200.gif differ
diff --git a/dresss/earrings201.gif b/dresss/earrings201.gif
new file mode 100644
index 00000000..097e1f5f
Binary files /dev/null and b/dresss/earrings201.gif differ
diff --git a/dresss/earrings202.gif b/dresss/earrings202.gif
new file mode 100644
index 00000000..7432ef65
Binary files /dev/null and b/dresss/earrings202.gif differ
diff --git a/dresss/earrings203.gif b/dresss/earrings203.gif
new file mode 100644
index 00000000..3350d624
Binary files /dev/null and b/dresss/earrings203.gif differ
diff --git a/dresss/earrings204.gif b/dresss/earrings204.gif
new file mode 100644
index 00000000..ca71d544
Binary files /dev/null and b/dresss/earrings204.gif differ
diff --git a/dresss/earrings205.gif b/dresss/earrings205.gif
new file mode 100644
index 00000000..8e154960
Binary files /dev/null and b/dresss/earrings205.gif differ
diff --git a/dresss/earrings206.gif b/dresss/earrings206.gif
new file mode 100644
index 00000000..89ed42f8
Binary files /dev/null and b/dresss/earrings206.gif differ
diff --git a/dresss/earrings207.gif b/dresss/earrings207.gif
new file mode 100644
index 00000000..886723c3
Binary files /dev/null and b/dresss/earrings207.gif differ
diff --git a/dresss/earrings209.gif b/dresss/earrings209.gif
new file mode 100644
index 00000000..15188c13
Binary files /dev/null and b/dresss/earrings209.gif differ
diff --git a/dresss/earrings210.gif b/dresss/earrings210.gif
new file mode 100644
index 00000000..e2997d4b
Binary files /dev/null and b/dresss/earrings210.gif differ
diff --git a/dresss/earrings211.gif b/dresss/earrings211.gif
new file mode 100644
index 00000000..ad3511d4
Binary files /dev/null and b/dresss/earrings211.gif differ
diff --git a/dresss/earrings_illusion1.gif b/dresss/earrings_illusion1.gif
new file mode 100644
index 00000000..64de2284
Binary files /dev/null and b/dresss/earrings_illusion1.gif differ
diff --git a/dresss/earrings_illusion2.gif b/dresss/earrings_illusion2.gif
new file mode 100644
index 00000000..b25504d4
Binary files /dev/null and b/dresss/earrings_illusion2.gif differ
diff --git a/dresss/ekr8bot.png b/dresss/ekr8bot.png
new file mode 100644
index 00000000..86ab61cc
Binary files /dev/null and b/dresss/ekr8bot.png differ
diff --git a/dresss/el1.gif b/dresss/el1.gif
new file mode 100644
index 00000000..608673c2
Binary files /dev/null and b/dresss/el1.gif differ
diff --git a/dresss/el2.gif b/dresss/el2.gif
new file mode 100644
index 00000000..476200f1
Binary files /dev/null and b/dresss/el2.gif differ
diff --git a/dresss/el3.gif b/dresss/el3.gif
new file mode 100644
index 00000000..7e8520fe
Binary files /dev/null and b/dresss/el3.gif differ
diff --git a/dresss/element.gif b/dresss/element.gif
new file mode 100644
index 00000000..f65d82a8
Binary files /dev/null and b/dresss/element.gif differ
diff --git a/dresss/element_1.gif b/dresss/element_1.gif
new file mode 100644
index 00000000..c74a2fbb
Binary files /dev/null and b/dresss/element_1.gif differ
diff --git a/dresss/element_2.gif b/dresss/element_2.gif
new file mode 100644
index 00000000..d8014182
Binary files /dev/null and b/dresss/element_2.gif differ
diff --git a/dresss/element_3.gif b/dresss/element_3.gif
new file mode 100644
index 00000000..6d5e4a25
Binary files /dev/null and b/dresss/element_3.gif differ
diff --git a/dresss/element_4.gif b/dresss/element_4.gif
new file mode 100644
index 00000000..674d4505
Binary files /dev/null and b/dresss/element_4.gif differ
diff --git a/dresss/elementalcrit.gif b/dresss/elementalcrit.gif
new file mode 100644
index 00000000..d5427d88
Binary files /dev/null and b/dresss/elementalcrit.gif differ
diff --git a/dresss/elka_w1.gif b/dresss/elka_w1.gif
new file mode 100644
index 00000000..78618289
Binary files /dev/null and b/dresss/elka_w1.gif differ
diff --git a/dresss/elka_w10.gif b/dresss/elka_w10.gif
new file mode 100644
index 00000000..93579414
Binary files /dev/null and b/dresss/elka_w10.gif differ
diff --git a/dresss/elka_w11.gif b/dresss/elka_w11.gif
new file mode 100644
index 00000000..1daddca4
Binary files /dev/null and b/dresss/elka_w11.gif differ
diff --git a/dresss/elka_w12.gif b/dresss/elka_w12.gif
new file mode 100644
index 00000000..e594238b
Binary files /dev/null and b/dresss/elka_w12.gif differ
diff --git a/dresss/elka_w13.gif b/dresss/elka_w13.gif
new file mode 100644
index 00000000..17f18017
Binary files /dev/null and b/dresss/elka_w13.gif differ
diff --git a/dresss/elka_w14.gif b/dresss/elka_w14.gif
new file mode 100644
index 00000000..79393a68
Binary files /dev/null and b/dresss/elka_w14.gif differ
diff --git a/dresss/elka_w15.gif b/dresss/elka_w15.gif
new file mode 100644
index 00000000..4fce5455
Binary files /dev/null and b/dresss/elka_w15.gif differ
diff --git a/dresss/elka_w16.gif b/dresss/elka_w16.gif
new file mode 100644
index 00000000..50577528
Binary files /dev/null and b/dresss/elka_w16.gif differ
diff --git a/dresss/elka_w17.gif b/dresss/elka_w17.gif
new file mode 100644
index 00000000..46ca844c
Binary files /dev/null and b/dresss/elka_w17.gif differ
diff --git a/dresss/elka_w18.gif b/dresss/elka_w18.gif
new file mode 100644
index 00000000..c21be2ec
Binary files /dev/null and b/dresss/elka_w18.gif differ
diff --git a/dresss/elka_w19.gif b/dresss/elka_w19.gif
new file mode 100644
index 00000000..f668189d
Binary files /dev/null and b/dresss/elka_w19.gif differ
diff --git a/dresss/elka_w2.gif b/dresss/elka_w2.gif
new file mode 100644
index 00000000..d47fa508
Binary files /dev/null and b/dresss/elka_w2.gif differ
diff --git a/dresss/elka_w20.gif b/dresss/elka_w20.gif
new file mode 100644
index 00000000..63796b04
Binary files /dev/null and b/dresss/elka_w20.gif differ
diff --git a/dresss/elka_w21.gif b/dresss/elka_w21.gif
new file mode 100644
index 00000000..224dae71
Binary files /dev/null and b/dresss/elka_w21.gif differ
diff --git a/dresss/elka_w22.gif b/dresss/elka_w22.gif
new file mode 100644
index 00000000..58a76506
Binary files /dev/null and b/dresss/elka_w22.gif differ
diff --git a/dresss/elka_w23.gif b/dresss/elka_w23.gif
new file mode 100644
index 00000000..7015894a
Binary files /dev/null and b/dresss/elka_w23.gif differ
diff --git a/dresss/elka_w24.gif b/dresss/elka_w24.gif
new file mode 100644
index 00000000..923dfffc
Binary files /dev/null and b/dresss/elka_w24.gif differ
diff --git a/dresss/elka_w25.gif b/dresss/elka_w25.gif
new file mode 100644
index 00000000..baabec81
Binary files /dev/null and b/dresss/elka_w25.gif differ
diff --git a/dresss/elka_w26.gif b/dresss/elka_w26.gif
new file mode 100644
index 00000000..71905a9e
Binary files /dev/null and b/dresss/elka_w26.gif differ
diff --git a/dresss/elka_w27.gif b/dresss/elka_w27.gif
new file mode 100644
index 00000000..65ab920b
Binary files /dev/null and b/dresss/elka_w27.gif differ
diff --git a/dresss/elka_w28.gif b/dresss/elka_w28.gif
new file mode 100644
index 00000000..d59d223a
Binary files /dev/null and b/dresss/elka_w28.gif differ
diff --git a/dresss/elka_w29.gif b/dresss/elka_w29.gif
new file mode 100644
index 00000000..df2ef821
Binary files /dev/null and b/dresss/elka_w29.gif differ
diff --git a/dresss/elka_w3.gif b/dresss/elka_w3.gif
new file mode 100644
index 00000000..c52966fa
Binary files /dev/null and b/dresss/elka_w3.gif differ
diff --git a/dresss/elka_w4.gif b/dresss/elka_w4.gif
new file mode 100644
index 00000000..92bccf75
Binary files /dev/null and b/dresss/elka_w4.gif differ
diff --git a/dresss/elka_w5.gif b/dresss/elka_w5.gif
new file mode 100644
index 00000000..4042e900
Binary files /dev/null and b/dresss/elka_w5.gif differ
diff --git a/dresss/elka_w6.gif b/dresss/elka_w6.gif
new file mode 100644
index 00000000..16270938
Binary files /dev/null and b/dresss/elka_w6.gif differ
diff --git a/dresss/elka_w7.gif b/dresss/elka_w7.gif
new file mode 100644
index 00000000..09ad1298
Binary files /dev/null and b/dresss/elka_w7.gif differ
diff --git a/dresss/elka_w8.gif b/dresss/elka_w8.gif
new file mode 100644
index 00000000..5fee157d
Binary files /dev/null and b/dresss/elka_w8.gif differ
diff --git a/dresss/elka_w9.gif b/dresss/elka_w9.gif
new file mode 100644
index 00000000..9ecba4bc
Binary files /dev/null and b/dresss/elka_w9.gif differ
diff --git a/dresss/enhp_11_moder_3.gif b/dresss/enhp_11_moder_3.gif
new file mode 100644
index 00000000..17596ddc
Binary files /dev/null and b/dresss/enhp_11_moder_3.gif differ
diff --git a/dresss/enhp_11_moder_3_1.gif b/dresss/enhp_11_moder_3_1.gif
new file mode 100644
index 00000000..17596ddc
Binary files /dev/null and b/dresss/enhp_11_moder_3_1.gif differ
diff --git a/dresss/enhp_12_4.gif b/dresss/enhp_12_4.gif
new file mode 100644
index 00000000..1caa4d45
Binary files /dev/null and b/dresss/enhp_12_4.gif differ
diff --git a/dresss/enhp_13_pm_revard.gif b/dresss/enhp_13_pm_revard.gif
new file mode 100644
index 00000000..ab917a05
Binary files /dev/null and b/dresss/enhp_13_pm_revard.gif differ
diff --git a/dresss/enhp_19_1.gif b/dresss/enhp_19_1.gif
new file mode 100644
index 00000000..14dd6ed2
Binary files /dev/null and b/dresss/enhp_19_1.gif differ
diff --git a/dresss/enhp_19_2.gif b/dresss/enhp_19_2.gif
new file mode 100644
index 00000000..724920f0
Binary files /dev/null and b/dresss/enhp_19_2.gif differ
diff --git a/dresss/enhp_19_3.gif b/dresss/enhp_19_3.gif
new file mode 100644
index 00000000..376f7480
Binary files /dev/null and b/dresss/enhp_19_3.gif differ
diff --git a/dresss/enhp_19_4.gif b/dresss/enhp_19_4.gif
new file mode 100644
index 00000000..154b2cf3
Binary files /dev/null and b/dresss/enhp_19_4.gif differ
diff --git a/dresss/enhp_2_4.gif b/dresss/enhp_2_4.gif
new file mode 100644
index 00000000..acb69d67
Binary files /dev/null and b/dresss/enhp_2_4.gif differ
diff --git a/dresss/enhp_2_maxHP10.gif b/dresss/enhp_2_maxHP10.gif
new file mode 100644
index 00000000..046e8c5c
Binary files /dev/null and b/dresss/enhp_2_maxHP10.gif differ
diff --git a/dresss/enhp_2_tournir1chka_7_1.gif b/dresss/enhp_2_tournir1chka_7_1.gif
new file mode 100644
index 00000000..a6853d0a
Binary files /dev/null and b/dresss/enhp_2_tournir1chka_7_1.gif differ
diff --git a/dresss/enhp_2_tournir1chka_7_2.gif b/dresss/enhp_2_tournir1chka_7_2.gif
new file mode 100644
index 00000000..64436894
Binary files /dev/null and b/dresss/enhp_2_tournir1chka_7_2.gif differ
diff --git a/dresss/enhp_2_tournir1chka_7_3.gif b/dresss/enhp_2_tournir1chka_7_3.gif
new file mode 100644
index 00000000..046e8c5c
Binary files /dev/null and b/dresss/enhp_2_tournir1chka_7_3.gif differ
diff --git a/dresss/enhp_3_cointel3.gif b/dresss/enhp_3_cointel3.gif
new file mode 100644
index 00000000..47cfad22
Binary files /dev/null and b/dresss/enhp_3_cointel3.gif differ
diff --git a/dresss/enhp_3_copower2.gif b/dresss/enhp_3_copower2.gif
new file mode 100644
index 00000000..b5521b75
Binary files /dev/null and b/dresss/enhp_3_copower2.gif differ
diff --git a/dresss/enhp_3_decay_1.gif b/dresss/enhp_3_decay_1.gif
new file mode 100644
index 00000000..b38c2d7c
Binary files /dev/null and b/dresss/enhp_3_decay_1.gif differ
diff --git a/dresss/enhp_3_lightning_1.gif b/dresss/enhp_3_lightning_1.gif
new file mode 100644
index 00000000..20867ed4
Binary files /dev/null and b/dresss/enhp_3_lightning_1.gif differ
diff --git a/dresss/enhp_3_manabuff1.gif b/dresss/enhp_3_manabuff1.gif
new file mode 100644
index 00000000..0640b1f5
Binary files /dev/null and b/dresss/enhp_3_manabuff1.gif differ
diff --git a/dresss/enhp_3_manabuff2.gif b/dresss/enhp_3_manabuff2.gif
new file mode 100644
index 00000000..5492f0af
Binary files /dev/null and b/dresss/enhp_3_manabuff2.gif differ
diff --git a/dresss/enhp_3_manabuff3.gif b/dresss/enhp_3_manabuff3.gif
new file mode 100644
index 00000000..9bd59e67
Binary files /dev/null and b/dresss/enhp_3_manabuff3.gif differ
diff --git a/dresss/enhp_3_moder_4.gif b/dresss/enhp_3_moder_4.gif
new file mode 100644
index 00000000..d02998f1
Binary files /dev/null and b/dresss/enhp_3_moder_4.gif differ
diff --git a/dresss/enhp_3_moder_5.gif b/dresss/enhp_3_moder_5.gif
new file mode 100644
index 00000000..d70e88d9
Binary files /dev/null and b/dresss/enhp_3_moder_5.gif differ
diff --git a/dresss/enhp_3_moder_6.gif b/dresss/enhp_3_moder_6.gif
new file mode 100644
index 00000000..2b27b354
Binary files /dev/null and b/dresss/enhp_3_moder_6.gif differ
diff --git a/dresss/enhp_3_moder_6_1.gif b/dresss/enhp_3_moder_6_1.gif
new file mode 100644
index 00000000..2b27b354
Binary files /dev/null and b/dresss/enhp_3_moder_6_1.gif differ
diff --git a/dresss/enhp_4_4.gif b/dresss/enhp_4_4.gif
new file mode 100644
index 00000000..9f385a93
Binary files /dev/null and b/dresss/enhp_4_4.gif differ
diff --git a/dresss/enhp_4_moder_2.gif b/dresss/enhp_4_moder_2.gif
new file mode 100644
index 00000000..ac4216e4
Binary files /dev/null and b/dresss/enhp_4_moder_2.gif differ
diff --git a/dresss/enhp_4_moder_2_1.gif b/dresss/enhp_4_moder_2_1.gif
new file mode 100644
index 00000000..ac4216e4
Binary files /dev/null and b/dresss/enhp_4_moder_2_1.gif differ
diff --git a/dresss/enhp_4_solidarity_1.gif b/dresss/enhp_4_solidarity_1.gif
new file mode 100644
index 00000000..4f224df2
Binary files /dev/null and b/dresss/enhp_4_solidarity_1.gif differ
diff --git a/dresss/enhp_4_solidarity_2.gif b/dresss/enhp_4_solidarity_2.gif
new file mode 100644
index 00000000..60bc108f
Binary files /dev/null and b/dresss/enhp_4_solidarity_2.gif differ
diff --git a/dresss/enhp_5_dampen_all_1.gif b/dresss/enhp_5_dampen_all_1.gif
new file mode 100644
index 00000000..24833263
Binary files /dev/null and b/dresss/enhp_5_dampen_all_1.gif differ
diff --git a/dresss/enhp_5_defend_all_1.gif b/dresss/enhp_5_defend_all_1.gif
new file mode 100644
index 00000000..947ed9f9
Binary files /dev/null and b/dresss/enhp_5_defend_all_1.gif differ
diff --git a/dresss/enhp_6_bloodlinem1.gif b/dresss/enhp_6_bloodlinem1.gif
new file mode 100644
index 00000000..f4a26772
Binary files /dev/null and b/dresss/enhp_6_bloodlinem1.gif differ
diff --git a/dresss/enhp_6_bloodlinem2.gif b/dresss/enhp_6_bloodlinem2.gif
new file mode 100644
index 00000000..c20814b2
Binary files /dev/null and b/dresss/enhp_6_bloodlinem2.gif differ
diff --git a/dresss/enhp_6_bloodlinew1.gif b/dresss/enhp_6_bloodlinew1.gif
new file mode 100644
index 00000000..0f99752d
Binary files /dev/null and b/dresss/enhp_6_bloodlinew1.gif differ
diff --git a/dresss/enhp_6_bloodlinew2.gif b/dresss/enhp_6_bloodlinew2.gif
new file mode 100644
index 00000000..14345887
Binary files /dev/null and b/dresss/enhp_6_bloodlinew2.gif differ
diff --git a/dresss/enhp_9_5.gif b/dresss/enhp_9_5.gif
new file mode 100644
index 00000000..be10b563
Binary files /dev/null and b/dresss/enhp_9_5.gif differ
diff --git a/dresss/enhp_9_moder_1.gif b/dresss/enhp_9_moder_1.gif
new file mode 100644
index 00000000..33f02484
Binary files /dev/null and b/dresss/enhp_9_moder_1.gif differ
diff --git a/dresss/enhp_9_moder_1_1.gif b/dresss/enhp_9_moder_1_1.gif
new file mode 100644
index 00000000..33f02484
Binary files /dev/null and b/dresss/enhp_9_moder_1_1.gif differ
diff --git a/dresss/exorcism25.gif b/dresss/exorcism25.gif
new file mode 100644
index 00000000..bd5905ba
Binary files /dev/null and b/dresss/exorcism25.gif differ
diff --git a/dresss/expd.js b/dresss/expd.js
new file mode 100644
index 00000000..30274e46
--- /dev/null
+++ b/dresss/expd.js
@@ -0,0 +1,310 @@
+// autogenerated by DarkClan.Encicl.ACToJS 1.199.29.0
+var expd = {
+ L0: {id: 0, count: 4, body: '', baseExp: 5, ups: {
+ U0: {id: 0, sexp: 0, aendurance: 0, amastery: 1, sstats: 15, astats: 3, scredits: 0, acredits: 0
+ },
+ U1: {id: 1, sexp: 20, aendurance: 0, amastery: 0, sstats: 16, astats: 1, scredits: 0, acredits: 0
+ },
+ U2: {id: 2, sexp: 45, aendurance: 0, amastery: 0, sstats: 17, astats: 1, scredits: 0, acredits: 0
+ },
+ U3: {id: 3, sexp: 75, aendurance: 0, amastery: 0, sstats: 18, astats: 1, scredits: 0, acredits: 0
+ }}
+
+ },
+ L1: {id: 1, count: 5, body: '', baseExp: 10, description: ' , ', ups: {
+ U0: {id: 0, sexp: 110, aendurance: 1, amastery: 1, sstats: 22, astats: 3, scredits: 0, acredits: 0
+ },
+ U1: {id: 1, sexp: 160, aendurance: 0, amastery: 0, sstats: 23, astats: 1, scredits: 0, acredits: 0
+ },
+ U2: {id: 2, sexp: 215, aendurance: 0, amastery: 0, sstats: 24, astats: 1, scredits: 0, acredits: 0
+ },
+ U3: {id: 3, sexp: 280, aendurance: 0, amastery: 0, sstats: 25, astats: 1, scredits: 0, acredits: 0
+ },
+ U4: {id: 4, sexp: 350, aendurance: 0, amastery: 0, sstats: 26, astats: 1, scredits: 0, acredits: 0
+ }}
+
+ },
+ L2: {id: 2, count: 6, body: '', baseExp: 20, description: ' ', ups: {
+ U0: {id: 0, sexp: 410, aendurance: 1, amastery: 1, sstats: 30, astats: 3, scredits: 0, acredits: 0
+ },
+ U1: {id: 1, sexp: 530, aendurance: 0, amastery: 0, sstats: 31, astats: 1, scredits: 0, acredits: 0
+ },
+ U2: {id: 2, sexp: 670, aendurance: 0, amastery: 0, sstats: 32, astats: 1, scredits: 0, acredits: 0
+ },
+ U3: {id: 3, sexp: 830, aendurance: 0, amastery: 0, sstats: 33, astats: 1, scredits: 0, acredits: 0
+ },
+ U4: {id: 4, sexp: 950, aendurance: 0, amastery: 0, sstats: 34, astats: 1, scredits: 0, acredits: 0
+ },
+ U5: {id: 5, sexp: 1100, aendurance: 0, amastery: 0, sstats: 35, astats: 1, scredits: 0, acredits: 0
+ }}
+
+ },
+ L3: {id: 3, count: 6, body: '', baseExp: 30, description: ' ', ups: {
+ U0: {id: 0, sexp: 1300, aendurance: 1, amastery: 1, sstats: 39, astats: 3, scredits: 0, acredits: 0
+ },
+ U1: {id: 1, sexp: 1450, aendurance: 0, amastery: 0, sstats: 40, astats: 1, scredits: 0, acredits: 0
+ },
+ U2: {id: 2, sexp: 1650, aendurance: 0, amastery: 0, sstats: 41, astats: 1, scredits: 0, acredits: 0
+ },
+ U3: {id: 3, sexp: 1850, aendurance: 0, amastery: 0, sstats: 42, astats: 1, scredits: 0, acredits: 0
+ },
+ U4: {id: 4, sexp: 2050, aendurance: 0, amastery: 0, sstats: 43, astats: 1, scredits: 0, acredits: 0
+ },
+ U5: {id: 5, sexp: 2200, aendurance: 0, amastery: 0, sstats: 44, astats: 1, scredits: 0, acredits: 0
+ }}
+
+ },
+ L4: {id: 4, count: 6, body: '', baseExp: 60, description: ' ( ), , / ', ups: {
+ U0: {id: 0, sexp: 2500, aendurance: 1, amastery: 1, sstats: 50, astats: 5, scredits: 0, acredits: 0
+ },
+ U1: {id: 1, sexp: 2900, aendurance: 0, amastery: 0, sstats: 51, astats: 1, scredits: 0, acredits: 0
+ },
+ U2: {id: 2, sexp: 3350, aendurance: 0, amastery: 0, sstats: 52, astats: 1, scredits: 0, acredits: 0
+ },
+ U3: {id: 3, sexp: 3800, aendurance: 0, amastery: 0, sstats: 53, astats: 1, scredits: 0, acredits: 0
+ },
+ U4: {id: 4, sexp: 4200, aendurance: 0, amastery: 0, sstats: 54, astats: 1, scredits: 0, acredits: 0
+ },
+ U5: {id: 5, sexp: 4600, aendurance: 0, amastery: 0, sstats: 55, astats: 1, scredits: 0, acredits: 0
+ }}
+
+ },
+ L5: {id: 5, count: 8, body: '', baseExp: 120, ups: {
+ U0: {id: 0, sexp: 5000, aendurance: 1, amastery: 1, sstats: 59, astats: 3, scredits: 0, acredits: 0
+ },
+ U1: {id: 1, sexp: 6000, aendurance: 0, amastery: 0, sstats: 60, astats: 1, scredits: 0, acredits: 0
+ },
+ U2: {id: 2, sexp: 7000, aendurance: 0, amastery: 0, sstats: 61, astats: 1, scredits: 0, acredits: 0
+ },
+ U3: {id: 3, sexp: 8000, aendurance: 0, amastery: 0, sstats: 62, astats: 1, scredits: 0, acredits: 0
+ },
+ U4: {id: 4, sexp: 9000, aendurance: 0, amastery: 0, sstats: 63, astats: 1, scredits: 0, acredits: 0
+ },
+ U5: {id: 5, sexp: 10000, aendurance: 0, amastery: 0, sstats: 64, astats: 1, scredits: 0, acredits: 0
+ },
+ U6: {id: 6, sexp: 11000, aendurance: 0, amastery: 0, sstats: 65, astats: 1, scredits: 0, acredits: 0
+ },
+ U7: {id: 7, sexp: 12000, aendurance: 0, amastery: 0, sstats: 66, astats: 1, scredits: 0, acredits: 0
+ }}
+
+ },
+ L6: {id: 6, count: 8, body: '', baseExp: 180, description: ' . [6] .', ups: {
+ U0: {id: 0, sexp: 12500, aendurance: 1, amastery: 1, sstats: 70, astats: 3, scredits: 0, acredits: 0
+ },
+ U1: {id: 1, sexp: 14000, aendurance: 0, amastery: 0, sstats: 71, astats: 1, scredits: 0, acredits: 0
+ },
+ U2: {id: 2, sexp: 15500, aendurance: 0, amastery: 0, sstats: 72, astats: 1, scredits: 0, acredits: 0
+ },
+ U3: {id: 3, sexp: 17000, aendurance: 0, amastery: 0, sstats: 73, astats: 1, scredits: 0, acredits: 0
+ },
+ U4: {id: 4, sexp: 19000, aendurance: 0, amastery: 0, sstats: 74, astats: 1, scredits: 0, acredits: 0
+ },
+ U5: {id: 5, sexp: 21000, aendurance: 0, amastery: 0, sstats: 75, astats: 1, scredits: 0, acredits: 0
+ },
+ U6: {id: 6, sexp: 23000, aendurance: 0, amastery: 0, sstats: 76, astats: 1, scredits: 0, acredits: 0
+ },
+ U7: {id: 7, sexp: 27000, aendurance: 0, amastery: 0, sstats: 77, astats: 1, scredits: 0, acredits: 0
+ }}
+
+ },
+ L7: {id: 7, count: 10, body: '', baseExp: 540, description: ' ( ), - ', ups: {
+ U0: {id: 0, sexp: 30000, aendurance: 1, amastery: 1, sstats: 83, astats: 5, scredits: 0, acredits: 0
+ },
+ U1: {id: 1, sexp: 60000, aendurance: 0, amastery: 0, sstats: 84, astats: 1, scredits: 0, acredits: 0
+ },
+ U2: {id: 2, sexp: 75000, aendurance: 0, amastery: 0, sstats: 85, astats: 1, scredits: 0, acredits: 0
+ },
+ U3: {id: 3, sexp: 150000, aendurance: 0, amastery: 0, sstats: 86, astats: 1, scredits: 0, acredits: 0
+ },
+ U4: {id: 4, sexp: 175000, aendurance: 0, amastery: 0, sstats: 87, astats: 1, scredits: 0, acredits: 0
+ },
+ U5: {id: 5, sexp: 200000, aendurance: 0, amastery: 0, sstats: 88, astats: 1, scredits: 0, acredits: 0
+ },
+ U6: {id: 6, sexp: 225000, aendurance: 0, amastery: 0, sstats: 89, astats: 1, scredits: 0, acredits: 0
+ },
+ U7: {id: 7, sexp: 250000, aendurance: 0, amastery: 0, sstats: 90, astats: 1, scredits: 0, acredits: 0
+ },
+ U8: {id: 8, sexp: 260000, aendurance: 0, amastery: 0, sstats: 91, astats: 1, scredits: 0, acredits: 0
+ },
+ U9: {id: 9, sexp: 280000, aendurance: 0, amastery: 0, sstats: 92, astats: 1, scredits: 0, acredits: 0
+ }}
+
+ },
+ L8: {id: 8, count: 18, body: '', baseExp: 1800, description: ' ', ups: {
+ U0: {id: 0, sexp: 300000, aendurance: 1, amastery: 1, sstats: 98, astats: 5, scredits: 500, acredits: 500
+ },
+ U1: {id: 1, sexp: 400000, aendurance: 0, amastery: 0, sstats: 98, astats: 0, scredits: 600, acredits: 100
+ },
+ U2: {id: 2, sexp: 500000, aendurance: 0, amastery: 0, sstats: 98, astats: 0, scredits: 700, acredits: 100
+ },
+ U3: {id: 3, sexp: 600000, aendurance: 0, amastery: 0, sstats: 98, astats: 0, scredits: 800, acredits: 100
+ },
+ U4: {id: 4, sexp: 700000, aendurance: 0, amastery: 0, sstats: 98, astats: 0, scredits: 900, acredits: 100
+ },
+ U5: {id: 5, sexp: 800000, aendurance: 0, amastery: 0, sstats: 98, astats: 0, scredits: 1000, acredits: 100
+ },
+ U6: {id: 6, sexp: 900000, aendurance: 0, amastery: 0, sstats: 98, astats: 0, scredits: 1100, acredits: 100
+ },
+ U7: {id: 7, sexp: 1000000, aendurance: 0, amastery: 0, sstats: 98, astats: 0, scredits: 1200, acredits: 100
+ },
+ U8: {id: 8, sexp: 1200000, aendurance: 0, amastery: 0, sstats: 98, astats: 0, scredits: 1300, acredits: 100
+ },
+ U9: {id: 9, sexp: 1500000, aendurance: 0, amastery: 0, sstats: 99, astats: 1, scredits: 1800, acredits: 500
+ },
+ U10: {id: 10, sexp: 1750000, aendurance: 0, amastery: 0, sstats: 100, astats: 1, scredits: 2000, acredits: 200
+ },
+ U11: {id: 11, sexp: 2000000, aendurance: 0, amastery: 0, sstats: 101, astats: 1, scredits: 2300, acredits: 300
+ },
+ U12: {id: 12, sexp: 2175000, aendurance: 0, amastery: 0, sstats: 102, astats: 1, scredits: 2400, acredits: 100
+ },
+ U13: {id: 13, sexp: 2300000, aendurance: 0, amastery: 0, sstats: 103, astats: 1, scredits: 2500, acredits: 100
+ },
+ U14: {id: 14, sexp: 2400000, aendurance: 0, amastery: 0, sstats: 104, astats: 1, scredits: 2501, acredits: 1
+ },
+ U15: {id: 15, sexp: 2500000, aendurance: 0, amastery: 0, sstats: 105, astats: 1, scredits: 2701, acredits: 200
+ },
+ U16: {id: 16, sexp: 2600000, aendurance: 0, amastery: 0, sstats: 106, astats: 1, scredits: 2801, acredits: 100
+ },
+ U17: {id: 17, sexp: 2800000, aendurance: 0, amastery: 0, sstats: 107, astats: 1, scredits: 3001, acredits: 200
+ }}
+
+ },
+ L9: {id: 9, count: 10, body: '', baseExp: 2800, ups: {
+ U0: {id: 0, sexp: 3000000, aendurance: 2, amastery: 1, sstats: 116, astats: 7, scredits: 4401, acredits: 1400
+ },
+ U1: {id: 1, sexp: 6000000, aendurance: 0, amastery: 0, sstats: 117, astats: 1, scredits: 4901, acredits: 500
+ },
+ U2: {id: 2, sexp: 6500000, aendurance: 0, amastery: 0, sstats: 118, astats: 1, scredits: 5101, acredits: 200
+ },
+ U3: {id: 3, sexp: 7500000, aendurance: 0, amastery: 0, sstats: 119, astats: 1, scredits: 5102, acredits: 1
+ },
+ U4: {id: 4, sexp: 8500000, aendurance: 0, amastery: 0, sstats: 120, astats: 1, scredits: 5352, acredits: 250
+ },
+ U5: {id: 5, sexp: 9000000, aendurance: 0, amastery: 0, sstats: 121, astats: 1, scredits: 5752, acredits: 400
+ },
+ U6: {id: 6, sexp: 9250000, aendurance: 0, amastery: 0, sstats: 122, astats: 1, scredits: 5802, acredits: 50
+ },
+ U7: {id: 7, sexp: 9500000, aendurance: 0, amastery: 0, sstats: 123, astats: 1, scredits: 6202, acredits: 400
+ },
+ U8: {id: 8, sexp: 9750000, aendurance: 0, amastery: 0, sstats: 124, astats: 1, scredits: 6552, acredits: 350
+ },
+ U9: {id: 9, sexp: 9900000, aendurance: 0, amastery: 0, sstats: 125, astats: 1, scredits: 7052, acredits: 500
+ }}
+
+ },
+ L10: {id: 10, count: 24, body: '', baseExp: 8400, description: ' , ', ups: {
+ U0: {id: 0, sexp: 10000000, aendurance: 3, amastery: 1, sstats: 137, astats: 9, scredits: 9452, acredits: 2400
+ },
+ U1: {id: 1, sexp: 13000000, aendurance: 0, amastery: 0, sstats: 139, astats: 2, scredits: 9652, acredits: 200
+ },
+ U2: {id: 2, sexp: 14000000, aendurance: 0, amastery: 0, sstats: 141, astats: 2, scredits: 9852, acredits: 200
+ },
+ U3: {id: 3, sexp: 15000000, aendurance: 0, amastery: 0, sstats: 143, astats: 2, scredits: 10052, acredits: 200
+ },
+ U4: {id: 4, sexp: 16000000, aendurance: 0, amastery: 0, sstats: 145, astats: 2, scredits: 10252, acredits: 200
+ },
+ U5: {id: 5, sexp: 17000000, aendurance: 0, amastery: 0, sstats: 147, astats: 2, scredits: 10452, acredits: 200
+ },
+ U6: {id: 6, sexp: 17500000, aendurance: 0, amastery: 0, sstats: 149, astats: 2, scredits: 10652, acredits: 200
+ },
+ U7: {id: 7, sexp: 18000000, aendurance: 0, amastery: 0, sstats: 151, astats: 2, scredits: 10852, acredits: 200
+ },
+ U8: {id: 8, sexp: 19000000, aendurance: 0, amastery: 0, sstats: 153, astats: 2, scredits: 11052, acredits: 200
+ },
+ U9: {id: 9, sexp: 19500000, aendurance: 0, amastery: 0, sstats: 155, astats: 2, scredits: 11252, acredits: 200
+ },
+ U10: {id: 10, sexp: 20000000, aendurance: 0, amastery: 0, sstats: 157, astats: 2, scredits: 11452, acredits: 200
+ },
+ U11: {id: 11, sexp: 30000000, aendurance: 0, amastery: 0, sstats: 160, astats: 2, scredits: 11452, acredits: 0
+ },
+ U12: {id: 12, sexp: 32000000, aendurance: 0, amastery: 0, sstats: 162, astats: 2, scredits: 11452, acredits: 0
+ },
+ U13: {id: 13, sexp: 34000000, aendurance: 0, amastery: 0, sstats: 164, astats: 2, scredits: 11452, acredits: 0
+ },
+ U14: {id: 14, sexp: 35000000, aendurance: 0, amastery: 0, sstats: 167, astats: 2, scredits: 11452, acredits: 0
+ },
+ U15: {id: 15, sexp: 36000000, aendurance: 0, amastery: 0, sstats: 169, astats: 2, scredits: 11452, acredits: 0
+ },
+ U16: {id: 16, sexp: 38000000, aendurance: 0, amastery: 0, sstats: 171, astats: 2, scredits: 11452, acredits: 0
+ },
+ U17: {id: 17, sexp: 40000000, aendurance: 0, amastery: 0, sstats: 174, astats: 2, scredits: 11452, acredits: 0
+ },
+ U18: {id: 18, sexp: 42000000, aendurance: 0, amastery: 0, sstats: 176, astats: 2, scredits: 11452, acredits: 0
+ },
+ U19: {id: 19, sexp: 44000000, aendurance: 0, amastery: 0, sstats: 178, astats: 2, scredits: 11452, acredits: 0
+ },
+ U20: {id: 20, sexp: 45000000, aendurance: 0, amastery: 0, sstats: 181, astats: 2, scredits: 11452, acredits: 0
+ },
+ U21: {id: 21, sexp: 46000000, aendurance: 0, amastery: 0, sstats: 183, astats: 2, scredits: 11452, acredits: 0
+ },
+ U22: {id: 22, sexp: 48000000, aendurance: 0, amastery: 0, sstats: 185, astats: 2, scredits: 11452, acredits: 0
+ },
+ U23: {id: 23, sexp: 50000000, aendurance: 0, amastery: 0, sstats: 188, astats: 2, scredits: 11452, acredits: 0
+ }}
+
+ },
+ L11: {id: 11, count: 11, body: '', baseExp: 12000, ups: {
+ U0: {id: 0, sexp: 52000000, aendurance: 5, amastery: 1, sstats: 203, astats: 10, scredits: 11452, acredits: 0
+ },
+ U1: {id: 1, sexp: 55000000, aendurance: 1, amastery: 0, sstats: 206, astats: 1, scredits: 11452, acredits: 0
+ },
+ U2: {id: 2, sexp: 60000000, aendurance: 1, amastery: 0, sstats: 209, astats: 1, scredits: 11452, acredits: 0
+ },
+ U3: {id: 3, sexp: 65000000, aendurance: 1, amastery: 0, sstats: 212, astats: 1, scredits: 11452, acredits: 0
+ },
+ U4: {id: 4, sexp: 70000000, aendurance: 1, amastery: 0, sstats: 215, astats: 1, scredits: 11452, acredits: 0
+ },
+ U5: {id: 5, sexp: 75000000, aendurance: 1, amastery: 0, sstats: 218, astats: 1, scredits: 11452, acredits: 0
+ },
+ U6: {id: 6, sexp: 80000000, aendurance: 1, amastery: 0, sstats: 221, astats: 1, scredits: 11452, acredits: 0
+ },
+ U7: {id: 7, sexp: 85000000, aendurance: 1, amastery: 0, sstats: 224, astats: 1, scredits: 11452, acredits: 0
+ },
+ U8: {id: 8, sexp: 90000000, aendurance: 1, amastery: 0, sstats: 227, astats: 1, scredits: 11452, acredits: 0
+ },
+ U9: {id: 9, sexp: 95000000, aendurance: 1, amastery: 0, sstats: 230, astats: 1, scredits: 11452, acredits: 0
+ },
+ U10: {id: 10, sexp: 100000000, aendurance: 0, amastery: 1, sstats: 245, astats: 15, scredits: 11452, acredits: 0
+ }}
+
+ },
+ L12: {id: 12, baseExp: 3600, ups: {
+}
+
+ },
+ L13: {id: 13, baseExp: 6000, ups: {
+}
+
+ },
+ L14: {id: 14, baseExp: 7500, ups: {
+}
+
+ },
+ L15: {id: 15, baseExp: 9000, ups: {
+}
+
+ },
+ L16: {id: 16, baseExp: 12000, ups: {
+}
+
+ },
+ L17: {id: 17, baseExp: 15000, ups: {
+}
+
+ },
+ L18: {id: 18, baseExp: 18000, ups: {
+}
+
+ },
+ L19: {id: 19, baseExp: 24000, ups: {
+}
+
+ },
+ L20: {id: 20, baseExp: 36000, ups: {
+}
+
+ },
+ L21: {id: 21, baseExp: 50000, ups: {
+}
+
+ }};
diff --git a/dresss/f_bluebell.gif b/dresss/f_bluebell.gif
new file mode 100644
index 00000000..f518ae4e
Binary files /dev/null and b/dresss/f_bluebell.gif differ
diff --git a/dresss/f_chrysanthemum.gif b/dresss/f_chrysanthemum.gif
new file mode 100644
index 00000000..4bdff895
Binary files /dev/null and b/dresss/f_chrysanthemum.gif differ
diff --git a/dresss/f_cosmos.gif b/dresss/f_cosmos.gif
new file mode 100644
index 00000000..719be4f0
Binary files /dev/null and b/dresss/f_cosmos.gif differ
diff --git a/dresss/f_forget-me-not.gif b/dresss/f_forget-me-not.gif
new file mode 100644
index 00000000..e9546eac
Binary files /dev/null and b/dresss/f_forget-me-not.gif differ
diff --git a/dresss/f_forget-me-not21_kjkjklk.gif b/dresss/f_forget-me-not21_kjkjklk.gif
new file mode 100644
index 00000000..36b5d943
Binary files /dev/null and b/dresss/f_forget-me-not21_kjkjklk.gif differ
diff --git a/dresss/f_glad.gif b/dresss/f_glad.gif
new file mode 100644
index 00000000..fb6c8b4b
Binary files /dev/null and b/dresss/f_glad.gif differ
diff --git a/dresss/f_hydrangea.gif b/dresss/f_hydrangea.gif
new file mode 100644
index 00000000..14dbf316
Binary files /dev/null and b/dresss/f_hydrangea.gif differ
diff --git a/dresss/f_kantubaki.gif b/dresss/f_kantubaki.gif
new file mode 100644
index 00000000..62ac928c
Binary files /dev/null and b/dresss/f_kantubaki.gif differ
diff --git a/dresss/f_landish.gif b/dresss/f_landish.gif
new file mode 100644
index 00000000..bf5a69ca
Binary files /dev/null and b/dresss/f_landish.gif differ
diff --git a/dresss/f_lillyp.gif b/dresss/f_lillyp.gif
new file mode 100644
index 00000000..1bc13346
Binary files /dev/null and b/dresss/f_lillyp.gif differ
diff --git a/dresss/f_lotus.gif b/dresss/f_lotus.gif
new file mode 100644
index 00000000..2fa45b56
Binary files /dev/null and b/dresss/f_lotus.gif differ
diff --git a/dresss/f_magnolia.gif b/dresss/f_magnolia.gif
new file mode 100644
index 00000000..5c078d7e
Binary files /dev/null and b/dresss/f_magnolia.gif differ
diff --git a/dresss/f_narcissus.gif b/dresss/f_narcissus.gif
new file mode 100644
index 00000000..6973983e
Binary files /dev/null and b/dresss/f_narcissus.gif differ
diff --git a/dresss/f_pion.gif b/dresss/f_pion.gif
new file mode 100644
index 00000000..240c3340
Binary files /dev/null and b/dresss/f_pion.gif differ
diff --git a/dresss/f_rom.gif b/dresss/f_rom.gif
new file mode 100644
index 00000000..03fb5fce
Binary files /dev/null and b/dresss/f_rom.gif differ
diff --git a/dresss/f_rose.gif b/dresss/f_rose.gif
new file mode 100644
index 00000000..60b08d30
Binary files /dev/null and b/dresss/f_rose.gif differ
diff --git a/dresss/f_sunflower.gif b/dresss/f_sunflower.gif
new file mode 100644
index 00000000..c7170a50
Binary files /dev/null and b/dresss/f_sunflower.gif differ
diff --git a/dresss/f_tulip.gif b/dresss/f_tulip.gif
new file mode 100644
index 00000000..dd12739b
Binary files /dev/null and b/dresss/f_tulip.gif differ
diff --git a/dresss/f_yrose.gif b/dresss/f_yrose.gif
new file mode 100644
index 00000000..cf09f192
Binary files /dev/null and b/dresss/f_yrose.gif differ
diff --git a/dresss/fikus.gif b/dresss/fikus.gif
new file mode 100644
index 00000000..0ad46a6d
Binary files /dev/null and b/dresss/fikus.gif differ
diff --git a/dresss/food_8m1.gif b/dresss/food_8m1.gif
new file mode 100644
index 00000000..8740bdc0
Binary files /dev/null and b/dresss/food_8m1.gif differ
diff --git a/dresss/food_8m1e.gif b/dresss/food_8m1e.gif
new file mode 100644
index 00000000..611f5cb7
Binary files /dev/null and b/dresss/food_8m1e.gif differ
diff --git a/dresss/food_8m2.gif b/dresss/food_8m2.gif
new file mode 100644
index 00000000..a154bdcf
Binary files /dev/null and b/dresss/food_8m2.gif differ
diff --git a/dresss/food_l10_e.gif b/dresss/food_l10_e.gif
new file mode 100644
index 00000000..dbeddb30
Binary files /dev/null and b/dresss/food_l10_e.gif differ
diff --git a/dresss/food_l11_e.gif b/dresss/food_l11_e.gif
new file mode 100644
index 00000000..bbd99bee
Binary files /dev/null and b/dresss/food_l11_e.gif differ
diff --git a/dresss/food_l41.gif b/dresss/food_l41.gif
new file mode 100644
index 00000000..ae110433
Binary files /dev/null and b/dresss/food_l41.gif differ
diff --git a/dresss/food_l5_eng.gif b/dresss/food_l5_eng.gif
new file mode 100644
index 00000000..88a4583d
Binary files /dev/null and b/dresss/food_l5_eng.gif differ
diff --git a/dresss/food_l61.gif b/dresss/food_l61.gif
new file mode 100644
index 00000000..ee83d8c8
Binary files /dev/null and b/dresss/food_l61.gif differ
diff --git a/dresss/food_l71.gif b/dresss/food_l71.gif
new file mode 100644
index 00000000..e898a3d0
Binary files /dev/null and b/dresss/food_l71.gif differ
diff --git a/dresss/food_l8.gif b/dresss/food_l8.gif
new file mode 100644
index 00000000..05baa4e9
Binary files /dev/null and b/dresss/food_l8.gif differ
diff --git a/dresss/fp_b21sdff.gif b/dresss/fp_b21sdff.gif
new file mode 100644
index 00000000..763e6f2c
Binary files /dev/null and b/dresss/fp_b21sdff.gif differ
diff --git a/dresss/fp_b3sdfsd.gif b/dresss/fp_b3sdfsd.gif
new file mode 100644
index 00000000..1e9521c5
Binary files /dev/null and b/dresss/fp_b3sdfsd.gif differ
diff --git a/dresss/fp_b5sds2.gif b/dresss/fp_b5sds2.gif
new file mode 100644
index 00000000..18886812
Binary files /dev/null and b/dresss/fp_b5sds2.gif differ
diff --git a/dresss/fp_b7dsfw.gif b/dresss/fp_b7dsfw.gif
new file mode 100644
index 00000000..79e6cc13
Binary files /dev/null and b/dresss/fp_b7dsfw.gif differ
diff --git a/dresss/fp_b9s3ga.gif b/dresss/fp_b9s3ga.gif
new file mode 100644
index 00000000..ba9082d8
Binary files /dev/null and b/dresss/fp_b9s3ga.gif differ
diff --git a/dresss/fp_black.gif b/dresss/fp_black.gif
new file mode 100644
index 00000000..cd2fd757
Binary files /dev/null and b/dresss/fp_black.gif differ
diff --git a/dresss/fp_chrysanthemum21g4tg.gif b/dresss/fp_chrysanthemum21g4tg.gif
new file mode 100644
index 00000000..b794f038
Binary files /dev/null and b/dresss/fp_chrysanthemum21g4tg.gif differ
diff --git a/dresss/fp_chrysanthemum3fsh.gif b/dresss/fp_chrysanthemum3fsh.gif
new file mode 100644
index 00000000..33559d91
Binary files /dev/null and b/dresss/fp_chrysanthemum3fsh.gif differ
diff --git a/dresss/fp_chrysanthemum5sddsgf.gif b/dresss/fp_chrysanthemum5sddsgf.gif
new file mode 100644
index 00000000..4f4f6256
Binary files /dev/null and b/dresss/fp_chrysanthemum5sddsgf.gif differ
diff --git a/dresss/fp_chrysanthemum7f34.gif b/dresss/fp_chrysanthemum7f34.gif
new file mode 100644
index 00000000..f5dd7179
Binary files /dev/null and b/dresss/fp_chrysanthemum7f34.gif differ
diff --git a/dresss/fp_chrysanthemum9g45t.gif b/dresss/fp_chrysanthemum9g45t.gif
new file mode 100644
index 00000000..086b5506
Binary files /dev/null and b/dresss/fp_chrysanthemum9g45t.gif differ
diff --git a/dresss/fp_cosmos21sdf3j.gif b/dresss/fp_cosmos21sdf3j.gif
new file mode 100644
index 00000000..3173e831
Binary files /dev/null and b/dresss/fp_cosmos21sdf3j.gif differ
diff --git a/dresss/fp_cosmos3sfsafs.gif b/dresss/fp_cosmos3sfsafs.gif
new file mode 100644
index 00000000..54e520a5
Binary files /dev/null and b/dresss/fp_cosmos3sfsafs.gif differ
diff --git a/dresss/fp_cosmos5sdfw3.gif b/dresss/fp_cosmos5sdfw3.gif
new file mode 100644
index 00000000..0a8c12ba
Binary files /dev/null and b/dresss/fp_cosmos5sdfw3.gif differ
diff --git a/dresss/fp_cosmos7sdfsd.gif b/dresss/fp_cosmos7sdfsd.gif
new file mode 100644
index 00000000..db738ece
Binary files /dev/null and b/dresss/fp_cosmos7sdfsd.gif differ
diff --git a/dresss/fp_cosmos9vjwsu.gif b/dresss/fp_cosmos9vjwsu.gif
new file mode 100644
index 00000000..cbe00182
Binary files /dev/null and b/dresss/fp_cosmos9vjwsu.gif differ
diff --git a/dresss/fp_fire3.gif b/dresss/fp_fire3.gif
new file mode 100644
index 00000000..ac85162f
Binary files /dev/null and b/dresss/fp_fire3.gif differ
diff --git a/dresss/fp_fire7.gif b/dresss/fp_fire7.gif
new file mode 100644
index 00000000..85e766ac
Binary files /dev/null and b/dresss/fp_fire7.gif differ
diff --git a/dresss/fp_glad7.gif b/dresss/fp_glad7.gif
new file mode 100644
index 00000000..f912ac48
Binary files /dev/null and b/dresss/fp_glad7.gif differ
diff --git a/dresss/fp_hanana21dfsd.gif b/dresss/fp_hanana21dfsd.gif
new file mode 100644
index 00000000..174b5eb2
Binary files /dev/null and b/dresss/fp_hanana21dfsd.gif differ
diff --git a/dresss/fp_ice3.gif b/dresss/fp_ice3.gif
new file mode 100644
index 00000000..2198256e
Binary files /dev/null and b/dresss/fp_ice3.gif differ
diff --git a/dresss/fp_ice7.gif b/dresss/fp_ice7.gif
new file mode 100644
index 00000000..a4278c4a
Binary files /dev/null and b/dresss/fp_ice7.gif differ
diff --git a/dresss/fp_kantubaki1mmbey0.gif b/dresss/fp_kantubaki1mmbey0.gif
new file mode 100644
index 00000000..62ac928c
Binary files /dev/null and b/dresss/fp_kantubaki1mmbey0.gif differ
diff --git a/dresss/fp_kantubaki21mcmk4.gif b/dresss/fp_kantubaki21mcmk4.gif
new file mode 100644
index 00000000..37973dc2
Binary files /dev/null and b/dresss/fp_kantubaki21mcmk4.gif differ
diff --git a/dresss/fp_kantubaki3ki3.gif b/dresss/fp_kantubaki3ki3.gif
new file mode 100644
index 00000000..eeb2b392
Binary files /dev/null and b/dresss/fp_kantubaki3ki3.gif differ
diff --git a/dresss/fp_kantubaki5mxkde72.gif b/dresss/fp_kantubaki5mxkde72.gif
new file mode 100644
index 00000000..a6fc572e
Binary files /dev/null and b/dresss/fp_kantubaki5mxkde72.gif differ
diff --git a/dresss/fp_kantubaki7pp837.gif b/dresss/fp_kantubaki7pp837.gif
new file mode 100644
index 00000000..3570712f
Binary files /dev/null and b/dresss/fp_kantubaki7pp837.gif differ
diff --git a/dresss/fp_kantubaki9mjdfh.gif b/dresss/fp_kantubaki9mjdfh.gif
new file mode 100644
index 00000000..f1ef1b4d
Binary files /dev/null and b/dresss/fp_kantubaki9mjdfh.gif differ
diff --git a/dresss/fp_kikyou1fsdg.gif b/dresss/fp_kikyou1fsdg.gif
new file mode 100644
index 00000000..4227edc0
Binary files /dev/null and b/dresss/fp_kikyou1fsdg.gif differ
diff --git a/dresss/fp_kikyou21bdljr.gif b/dresss/fp_kikyou21bdljr.gif
new file mode 100644
index 00000000..64b50710
Binary files /dev/null and b/dresss/fp_kikyou21bdljr.gif differ
diff --git a/dresss/fp_kikyou3ver4t.gif b/dresss/fp_kikyou3ver4t.gif
new file mode 100644
index 00000000..8ee7ab7d
Binary files /dev/null and b/dresss/fp_kikyou3ver4t.gif differ
diff --git a/dresss/fp_kikyou5vert.gif b/dresss/fp_kikyou5vert.gif
new file mode 100644
index 00000000..4e399166
Binary files /dev/null and b/dresss/fp_kikyou5vert.gif differ
diff --git a/dresss/fp_kikyou7bvert34.gif b/dresss/fp_kikyou7bvert34.gif
new file mode 100644
index 00000000..8da2dfd0
Binary files /dev/null and b/dresss/fp_kikyou7bvert34.gif differ
diff --git a/dresss/fp_kikyou9vfset.gif b/dresss/fp_kikyou9vfset.gif
new file mode 100644
index 00000000..597d72b0
Binary files /dev/null and b/dresss/fp_kikyou9vfset.gif differ
diff --git a/dresss/fp_landish1mcgl2.gif b/dresss/fp_landish1mcgl2.gif
new file mode 100644
index 00000000..bf5a69ca
Binary files /dev/null and b/dresss/fp_landish1mcgl2.gif differ
diff --git a/dresss/fp_landish21d348j.gif b/dresss/fp_landish21d348j.gif
new file mode 100644
index 00000000..708a7c97
Binary files /dev/null and b/dresss/fp_landish21d348j.gif differ
diff --git a/dresss/fp_landish3sdfsdf.gif b/dresss/fp_landish3sdfsdf.gif
new file mode 100644
index 00000000..dea8e9c8
Binary files /dev/null and b/dresss/fp_landish3sdfsdf.gif differ
diff --git a/dresss/fp_landish5asdf8.gif b/dresss/fp_landish5asdf8.gif
new file mode 100644
index 00000000..e5fddd77
Binary files /dev/null and b/dresss/fp_landish5asdf8.gif differ
diff --git a/dresss/fp_landish7dv9.gif b/dresss/fp_landish7dv9.gif
new file mode 100644
index 00000000..27ee8da3
Binary files /dev/null and b/dresss/fp_landish7dv9.gif differ
diff --git a/dresss/fp_landish9sd5qx.gif b/dresss/fp_landish9sd5qx.gif
new file mode 100644
index 00000000..9340efe6
Binary files /dev/null and b/dresss/fp_landish9sd5qx.gif differ
diff --git a/dresss/fp_lillyp1cnvf83.gif b/dresss/fp_lillyp1cnvf83.gif
new file mode 100644
index 00000000..1bc13346
Binary files /dev/null and b/dresss/fp_lillyp1cnvf83.gif differ
diff --git a/dresss/fp_lillyp21mxx92.gif b/dresss/fp_lillyp21mxx92.gif
new file mode 100644
index 00000000..5aa84913
Binary files /dev/null and b/dresss/fp_lillyp21mxx92.gif differ
diff --git a/dresss/fp_lillyp3xxa2d.gif b/dresss/fp_lillyp3xxa2d.gif
new file mode 100644
index 00000000..b51e39f1
Binary files /dev/null and b/dresss/fp_lillyp3xxa2d.gif differ
diff --git a/dresss/fp_lillyp5pfme96.gif b/dresss/fp_lillyp5pfme96.gif
new file mode 100644
index 00000000..5e3192c4
Binary files /dev/null and b/dresss/fp_lillyp5pfme96.gif differ
diff --git a/dresss/fp_lillyp7lgfdd.gif b/dresss/fp_lillyp7lgfdd.gif
new file mode 100644
index 00000000..c9012258
Binary files /dev/null and b/dresss/fp_lillyp7lgfdd.gif differ
diff --git a/dresss/fp_lillyp9dfo933.gif b/dresss/fp_lillyp9dfo933.gif
new file mode 100644
index 00000000..be5a8d92
Binary files /dev/null and b/dresss/fp_lillyp9dfo933.gif differ
diff --git a/dresss/fp_lotus_1fksdfkd.gif b/dresss/fp_lotus_1fksdfkd.gif
new file mode 100644
index 00000000..2fa45b56
Binary files /dev/null and b/dresss/fp_lotus_1fksdfkd.gif differ
diff --git a/dresss/fp_lotus_21svs.gif b/dresss/fp_lotus_21svs.gif
new file mode 100644
index 00000000..f26e849e
Binary files /dev/null and b/dresss/fp_lotus_21svs.gif differ
diff --git a/dresss/fp_lotus_3sdcfse.gif b/dresss/fp_lotus_3sdcfse.gif
new file mode 100644
index 00000000..06fea2d5
Binary files /dev/null and b/dresss/fp_lotus_3sdcfse.gif differ
diff --git a/dresss/fp_lotus_5sdsd.gif b/dresss/fp_lotus_5sdsd.gif
new file mode 100644
index 00000000..9f0a57cb
Binary files /dev/null and b/dresss/fp_lotus_5sdsd.gif differ
diff --git a/dresss/fp_lotus_7vsw.gif b/dresss/fp_lotus_7vsw.gif
new file mode 100644
index 00000000..ff05699d
Binary files /dev/null and b/dresss/fp_lotus_7vsw.gif differ
diff --git a/dresss/fp_lotus_9verg.gif b/dresss/fp_lotus_9verg.gif
new file mode 100644
index 00000000..e59a816b
Binary files /dev/null and b/dresss/fp_lotus_9verg.gif differ
diff --git a/dresss/fp_magnolia1vfe.gif b/dresss/fp_magnolia1vfe.gif
new file mode 100644
index 00000000..ca172bb6
Binary files /dev/null and b/dresss/fp_magnolia1vfe.gif differ
diff --git a/dresss/fp_magnolia21gew3.gif b/dresss/fp_magnolia21gew3.gif
new file mode 100644
index 00000000..ec589f2a
Binary files /dev/null and b/dresss/fp_magnolia21gew3.gif differ
diff --git a/dresss/fp_magnolia3dg3f.gif b/dresss/fp_magnolia3dg3f.gif
new file mode 100644
index 00000000..3eeeef50
Binary files /dev/null and b/dresss/fp_magnolia3dg3f.gif differ
diff --git a/dresss/fp_magnolia5lojosd.gif b/dresss/fp_magnolia5lojosd.gif
new file mode 100644
index 00000000..1da3336b
Binary files /dev/null and b/dresss/fp_magnolia5lojosd.gif differ
diff --git a/dresss/fp_magnolia7cvs9.gif b/dresss/fp_magnolia7cvs9.gif
new file mode 100644
index 00000000..d3825dc4
Binary files /dev/null and b/dresss/fp_magnolia7cvs9.gif differ
diff --git a/dresss/fp_magnolia9v34t.gif b/dresss/fp_magnolia9v34t.gif
new file mode 100644
index 00000000..d72734fd
Binary files /dev/null and b/dresss/fp_magnolia9v34t.gif differ
diff --git a/dresss/fp_mimoza.gif b/dresss/fp_mimoza.gif
new file mode 100644
index 00000000..1ba6ce05
Binary files /dev/null and b/dresss/fp_mimoza.gif differ
diff --git a/dresss/fp_narcissus1dge3.gif b/dresss/fp_narcissus1dge3.gif
new file mode 100644
index 00000000..588771bd
Binary files /dev/null and b/dresss/fp_narcissus1dge3.gif differ
diff --git a/dresss/fp_narcissus21gf4t.gif b/dresss/fp_narcissus21gf4t.gif
new file mode 100644
index 00000000..defc3a73
Binary files /dev/null and b/dresss/fp_narcissus21gf4t.gif differ
diff --git a/dresss/fp_narcissus3bv4sds.gif b/dresss/fp_narcissus3bv4sds.gif
new file mode 100644
index 00000000..f320df6a
Binary files /dev/null and b/dresss/fp_narcissus3bv4sds.gif differ
diff --git a/dresss/fp_narcissus5vergwe.gif b/dresss/fp_narcissus5vergwe.gif
new file mode 100644
index 00000000..63cf7dd7
Binary files /dev/null and b/dresss/fp_narcissus5vergwe.gif differ
diff --git a/dresss/fp_narcissus7vsdegw.gif b/dresss/fp_narcissus7vsdegw.gif
new file mode 100644
index 00000000..2ef46d86
Binary files /dev/null and b/dresss/fp_narcissus7vsdegw.gif differ
diff --git a/dresss/fp_narcissus9vergt.gif b/dresss/fp_narcissus9vergt.gif
new file mode 100644
index 00000000..7c6b7941
Binary files /dev/null and b/dresss/fp_narcissus9vergt.gif differ
diff --git a/dresss/fp_pion7.gif b/dresss/fp_pion7.gif
new file mode 100644
index 00000000..0402e418
Binary files /dev/null and b/dresss/fp_pion7.gif differ
diff --git a/dresss/fp_rom7.gif b/dresss/fp_rom7.gif
new file mode 100644
index 00000000..fd63904a
Binary files /dev/null and b/dresss/fp_rom7.gif differ
diff --git a/dresss/fp_rose_1ejdi3.gif b/dresss/fp_rose_1ejdi3.gif
new file mode 100644
index 00000000..788a8d27
Binary files /dev/null and b/dresss/fp_rose_1ejdi3.gif differ
diff --git a/dresss/fp_rose_21dfioehjf.gif b/dresss/fp_rose_21dfioehjf.gif
new file mode 100644
index 00000000..cf7ad0fc
Binary files /dev/null and b/dresss/fp_rose_21dfioehjf.gif differ
diff --git a/dresss/fp_rose_25zzz.gif b/dresss/fp_rose_25zzz.gif
new file mode 100644
index 00000000..ddffa264
Binary files /dev/null and b/dresss/fp_rose_25zzz.gif differ
diff --git a/dresss/fp_rose_5eudmje.gif b/dresss/fp_rose_5eudmje.gif
new file mode 100644
index 00000000..b577f59a
Binary files /dev/null and b/dresss/fp_rose_5eudmje.gif differ
diff --git a/dresss/fp_sunflover21dei.gif b/dresss/fp_sunflover21dei.gif
new file mode 100644
index 00000000..1d8b7ec6
Binary files /dev/null and b/dresss/fp_sunflover21dei.gif differ
diff --git a/dresss/fp_tulip1dsfg.gif b/dresss/fp_tulip1dsfg.gif
new file mode 100644
index 00000000..735b4abf
Binary files /dev/null and b/dresss/fp_tulip1dsfg.gif differ
diff --git a/dresss/fp_tulip21fgkj.gif b/dresss/fp_tulip21fgkj.gif
new file mode 100644
index 00000000..0acdbcc3
Binary files /dev/null and b/dresss/fp_tulip21fgkj.gif differ
diff --git a/dresss/fp_tulip3vwet.gif b/dresss/fp_tulip3vwet.gif
new file mode 100644
index 00000000..fc2eb718
Binary files /dev/null and b/dresss/fp_tulip3vwet.gif differ
diff --git a/dresss/fp_tulip5cvwe.gif b/dresss/fp_tulip5cvwe.gif
new file mode 100644
index 00000000..e3266f49
Binary files /dev/null and b/dresss/fp_tulip5cvwe.gif differ
diff --git a/dresss/fp_tulip7cwefw.gif b/dresss/fp_tulip7cwefw.gif
new file mode 100644
index 00000000..a2ec6be9
Binary files /dev/null and b/dresss/fp_tulip7cwefw.gif differ
diff --git a/dresss/fp_tulip9cwef.gif b/dresss/fp_tulip9cwef.gif
new file mode 100644
index 00000000..b9cc5c57
Binary files /dev/null and b/dresss/fp_tulip9cwef.gif differ
diff --git a/dresss/fp_verba1.gif b/dresss/fp_verba1.gif
new file mode 100644
index 00000000..1cef87f3
Binary files /dev/null and b/dresss/fp_verba1.gif differ
diff --git a/dresss/fp_verba11.gif b/dresss/fp_verba11.gif
new file mode 100644
index 00000000..2206e323
Binary files /dev/null and b/dresss/fp_verba11.gif differ
diff --git a/dresss/fp_wrose21mkdefj.gif b/dresss/fp_wrose21mkdefj.gif
new file mode 100644
index 00000000..9c8f669a
Binary files /dev/null and b/dresss/fp_wrose21mkdefj.gif differ
diff --git a/dresss/fp_wrose9vsergt.gif b/dresss/fp_wrose9vsergt.gif
new file mode 100644
index 00000000..48d89918
Binary files /dev/null and b/dresss/fp_wrose9vsergt.gif differ
diff --git a/dresss/fp_yrose21dfsew.gif b/dresss/fp_yrose21dfsew.gif
new file mode 100644
index 00000000..db127424
Binary files /dev/null and b/dresss/fp_yrose21dfsew.gif differ
diff --git a/dresss/fp_yrose3dfe.gif b/dresss/fp_yrose3dfe.gif
new file mode 100644
index 00000000..ff7f5ba8
Binary files /dev/null and b/dresss/fp_yrose3dfe.gif differ
diff --git a/dresss/fp_yrose5dfs.gif b/dresss/fp_yrose5dfs.gif
new file mode 100644
index 00000000..c3c68573
Binary files /dev/null and b/dresss/fp_yrose5dfs.gif differ
diff --git a/dresss/fp_yrose7sd3.gif b/dresss/fp_yrose7sd3.gif
new file mode 100644
index 00000000..89ac0d5c
Binary files /dev/null and b/dresss/fp_yrose7sd3.gif differ
diff --git a/dresss/fp_yrose9dfw3.gif b/dresss/fp_yrose9dfw3.gif
new file mode 100644
index 00000000..1b45cac6
Binary files /dev/null and b/dresss/fp_yrose9dfw3.gif differ
diff --git a/dresss/freedom.gif b/dresss/freedom.gif
new file mode 100644
index 00000000..dafcc2d4
Binary files /dev/null and b/dresss/freedom.gif differ
diff --git a/dresss/friendly_blood.gif b/dresss/friendly_blood.gif
new file mode 100644
index 00000000..99f086c7
Binary files /dev/null and b/dresss/friendly_blood.gif differ
diff --git a/dresss/fsleep.gif b/dresss/fsleep.gif
new file mode 100644
index 00000000..a0cbd840
Binary files /dev/null and b/dresss/fsleep.gif differ
diff --git a/dresss/gilet1.gif b/dresss/gilet1.gif
new file mode 100644
index 00000000..8a7e9564
Binary files /dev/null and b/dresss/gilet1.gif differ
diff --git a/dresss/gilet200.gif b/dresss/gilet200.gif
new file mode 100644
index 00000000..fc64b149
Binary files /dev/null and b/dresss/gilet200.gif differ
diff --git a/dresss/gilet201.gif b/dresss/gilet201.gif
new file mode 100644
index 00000000..b0a516c7
Binary files /dev/null and b/dresss/gilet201.gif differ
diff --git a/dresss/gilet202.gif b/dresss/gilet202.gif
new file mode 100644
index 00000000..bc500eb3
Binary files /dev/null and b/dresss/gilet202.gif differ
diff --git a/dresss/gloves1.gif b/dresss/gloves1.gif
new file mode 100644
index 00000000..89511666
Binary files /dev/null and b/dresss/gloves1.gif differ
diff --git a/dresss/gloves2.gif b/dresss/gloves2.gif
new file mode 100644
index 00000000..b0a2433e
Binary files /dev/null and b/dresss/gloves2.gif differ
diff --git a/dresss/gloves200.gif b/dresss/gloves200.gif
new file mode 100644
index 00000000..20d70699
Binary files /dev/null and b/dresss/gloves200.gif differ
diff --git a/dresss/gloves201.gif b/dresss/gloves201.gif
new file mode 100644
index 00000000..a42d398a
Binary files /dev/null and b/dresss/gloves201.gif differ
diff --git a/dresss/gloves202.gif b/dresss/gloves202.gif
new file mode 100644
index 00000000..7589a6be
Binary files /dev/null and b/dresss/gloves202.gif differ
diff --git a/dresss/gloves203.gif b/dresss/gloves203.gif
new file mode 100644
index 00000000..13f82f8e
Binary files /dev/null and b/dresss/gloves203.gif differ
diff --git a/dresss/gloves204.gif b/dresss/gloves204.gif
new file mode 100644
index 00000000..acbaa6cd
Binary files /dev/null and b/dresss/gloves204.gif differ
diff --git a/dresss/gloves205.gif b/dresss/gloves205.gif
new file mode 100644
index 00000000..43bb2d79
Binary files /dev/null and b/dresss/gloves205.gif differ
diff --git a/dresss/gloves206.gif b/dresss/gloves206.gif
new file mode 100644
index 00000000..1a6c621c
Binary files /dev/null and b/dresss/gloves206.gif differ
diff --git a/dresss/gloves207.gif b/dresss/gloves207.gif
new file mode 100644
index 00000000..24f8b48f
Binary files /dev/null and b/dresss/gloves207.gif differ
diff --git a/dresss/gloves208.gif b/dresss/gloves208.gif
new file mode 100644
index 00000000..84a25aea
Binary files /dev/null and b/dresss/gloves208.gif differ
diff --git a/dresss/gloves209.gif b/dresss/gloves209.gif
new file mode 100644
index 00000000..c818449b
Binary files /dev/null and b/dresss/gloves209.gif differ
diff --git a/dresss/gloves210.gif b/dresss/gloves210.gif
new file mode 100644
index 00000000..529237b7
Binary files /dev/null and b/dresss/gloves210.gif differ
diff --git a/dresss/gloves211.gif b/dresss/gloves211.gif
new file mode 100644
index 00000000..55b361a2
Binary files /dev/null and b/dresss/gloves211.gif differ
diff --git a/dresss/gloves212.gif b/dresss/gloves212.gif
new file mode 100644
index 00000000..8c63b4de
Binary files /dev/null and b/dresss/gloves212.gif differ
diff --git a/dresss/gloves3.gif b/dresss/gloves3.gif
new file mode 100644
index 00000000..bcff2a38
Binary files /dev/null and b/dresss/gloves3.gif differ
diff --git a/dresss/gloves90.gif b/dresss/gloves90.gif
new file mode 100644
index 00000000..acbde50b
Binary files /dev/null and b/dresss/gloves90.gif differ
diff --git a/dresss/gnel1.gif b/dresss/gnel1.gif
new file mode 100644
index 00000000..462548ea
Binary files /dev/null and b/dresss/gnel1.gif differ
diff --git a/dresss/gnel2.gif b/dresss/gnel2.gif
new file mode 100644
index 00000000..3723c79d
Binary files /dev/null and b/dresss/gnel2.gif differ
diff --git a/dresss/gnel3.gif b/dresss/gnel3.gif
new file mode 100644
index 00000000..cafb67a8
Binary files /dev/null and b/dresss/gnel3.gif differ
diff --git a/dresss/grshield1.gif b/dresss/grshield1.gif
new file mode 100644
index 00000000..1063cd94
Binary files /dev/null and b/dresss/grshield1.gif differ
diff --git a/dresss/grshield2.gif b/dresss/grshield2.gif
new file mode 100644
index 00000000..3881dfc8
Binary files /dev/null and b/dresss/grshield2.gif differ
diff --git a/dresss/hammer1.gif b/dresss/hammer1.gif
new file mode 100644
index 00000000..e4080e9d
Binary files /dev/null and b/dresss/hammer1.gif differ
diff --git a/dresss/hammer200.gif b/dresss/hammer200.gif
new file mode 100644
index 00000000..5848f2e1
Binary files /dev/null and b/dresss/hammer200.gif differ
diff --git a/dresss/hammer201.gif b/dresss/hammer201.gif
new file mode 100644
index 00000000..d46893d0
Binary files /dev/null and b/dresss/hammer201.gif differ
diff --git a/dresss/hammer202.gif b/dresss/hammer202.gif
new file mode 100644
index 00000000..ca80cfa5
Binary files /dev/null and b/dresss/hammer202.gif differ
diff --git a/dresss/hammer203.gif b/dresss/hammer203.gif
new file mode 100644
index 00000000..6860e78c
Binary files /dev/null and b/dresss/hammer203.gif differ
diff --git a/dresss/hammer204.gif b/dresss/hammer204.gif
new file mode 100644
index 00000000..a3ccf7d6
Binary files /dev/null and b/dresss/hammer204.gif differ
diff --git a/dresss/hammer205.gif b/dresss/hammer205.gif
new file mode 100644
index 00000000..e0e1e1ec
Binary files /dev/null and b/dresss/hammer205.gif differ
diff --git a/dresss/hammer206.gif b/dresss/hammer206.gif
new file mode 100644
index 00000000..24431173
Binary files /dev/null and b/dresss/hammer206.gif differ
diff --git a/dresss/hammer3.gif b/dresss/hammer3.gif
new file mode 100644
index 00000000..5b8c53c9
Binary files /dev/null and b/dresss/hammer3.gif differ
diff --git a/dresss/hammer4.gif b/dresss/hammer4.gif
new file mode 100644
index 00000000..3e6f1205
Binary files /dev/null and b/dresss/hammer4.gif differ
diff --git a/dresss/hammer5.gif b/dresss/hammer5.gif
new file mode 100644
index 00000000..688f0930
Binary files /dev/null and b/dresss/hammer5.gif differ
diff --git a/dresss/hammer50.gif b/dresss/hammer50.gif
new file mode 100644
index 00000000..2ab3d8d0
Binary files /dev/null and b/dresss/hammer50.gif differ
diff --git a/dresss/hammer51.gif b/dresss/hammer51.gif
new file mode 100644
index 00000000..9571a245
Binary files /dev/null and b/dresss/hammer51.gif differ
diff --git a/dresss/hammer52.gif b/dresss/hammer52.gif
new file mode 100644
index 00000000..01466ba4
Binary files /dev/null and b/dresss/hammer52.gif differ
diff --git a/dresss/hammer53.gif b/dresss/hammer53.gif
new file mode 100644
index 00000000..a8639c5f
Binary files /dev/null and b/dresss/hammer53.gif differ
diff --git a/dresss/hammer54.gif b/dresss/hammer54.gif
new file mode 100644
index 00000000..68dffad2
Binary files /dev/null and b/dresss/hammer54.gif differ
diff --git a/dresss/hammer56.gif b/dresss/hammer56.gif
new file mode 100644
index 00000000..65089c3f
Binary files /dev/null and b/dresss/hammer56.gif differ
diff --git a/dresss/hammer58.gif b/dresss/hammer58.gif
new file mode 100644
index 00000000..e7c0a675
Binary files /dev/null and b/dresss/hammer58.gif differ
diff --git a/dresss/hammer59.gif b/dresss/hammer59.gif
new file mode 100644
index 00000000..33a40cd5
Binary files /dev/null and b/dresss/hammer59.gif differ
diff --git a/dresss/hammer60.gif b/dresss/hammer60.gif
new file mode 100644
index 00000000..a25786ec
Binary files /dev/null and b/dresss/hammer60.gif differ
diff --git a/dresss/hammer61.gif b/dresss/hammer61.gif
new file mode 100644
index 00000000..7664a351
Binary files /dev/null and b/dresss/hammer61.gif differ
diff --git a/dresss/hammer62.gif b/dresss/hammer62.gif
new file mode 100644
index 00000000..522e5a6a
Binary files /dev/null and b/dresss/hammer62.gif differ
diff --git a/dresss/hammer63.gif b/dresss/hammer63.gif
new file mode 100644
index 00000000..ed103df8
Binary files /dev/null and b/dresss/hammer63.gif differ
diff --git a/dresss/hammer65.gif b/dresss/hammer65.gif
new file mode 100644
index 00000000..f4314006
Binary files /dev/null and b/dresss/hammer65.gif differ
diff --git a/dresss/hammer66.gif b/dresss/hammer66.gif
new file mode 100644
index 00000000..c16cac23
Binary files /dev/null and b/dresss/hammer66.gif differ
diff --git a/dresss/hammer67.gif b/dresss/hammer67.gif
new file mode 100644
index 00000000..b0953f64
Binary files /dev/null and b/dresss/hammer67.gif differ
diff --git a/dresss/hammer68.gif b/dresss/hammer68.gif
new file mode 100644
index 00000000..701e199b
Binary files /dev/null and b/dresss/hammer68.gif differ
diff --git a/dresss/hammer69.gif b/dresss/hammer69.gif
new file mode 100644
index 00000000..00d6ee6a
Binary files /dev/null and b/dresss/hammer69.gif differ
diff --git a/dresss/hammer70.gif b/dresss/hammer70.gif
new file mode 100644
index 00000000..e8d14eba
Binary files /dev/null and b/dresss/hammer70.gif differ
diff --git a/dresss/hammer71.gif b/dresss/hammer71.gif
new file mode 100644
index 00000000..e5f3acee
Binary files /dev/null and b/dresss/hammer71.gif differ
diff --git a/dresss/hammer72_du2.gif b/dresss/hammer72_du2.gif
new file mode 100644
index 00000000..82397a36
Binary files /dev/null and b/dresss/hammer72_du2.gif differ
diff --git a/dresss/hammer74.gif b/dresss/hammer74.gif
new file mode 100644
index 00000000..99f5e1fd
Binary files /dev/null and b/dresss/hammer74.gif differ
diff --git a/dresss/hammer75.gif b/dresss/hammer75.gif
new file mode 100644
index 00000000..be56e6f6
Binary files /dev/null and b/dresss/hammer75.gif differ
diff --git a/dresss/hammer76.gif b/dresss/hammer76.gif
new file mode 100644
index 00000000..43f464a1
Binary files /dev/null and b/dresss/hammer76.gif differ
diff --git a/dresss/hamq.gif b/dresss/hamq.gif
new file mode 100644
index 00000000..7f857eb0
Binary files /dev/null and b/dresss/hamq.gif differ
diff --git a/dresss/haos.gif b/dresss/haos.gif
new file mode 100644
index 00000000..70944a5c
Binary files /dev/null and b/dresss/haos.gif differ
diff --git a/dresss/healvortex.gif b/dresss/healvortex.gif
new file mode 100644
index 00000000..8bb81682
Binary files /dev/null and b/dresss/healvortex.gif differ
diff --git a/dresss/helmet1.gif b/dresss/helmet1.gif
new file mode 100644
index 00000000..1bcfd440
Binary files /dev/null and b/dresss/helmet1.gif differ
diff --git a/dresss/helmet10.gif b/dresss/helmet10.gif
new file mode 100644
index 00000000..4168e7fb
Binary files /dev/null and b/dresss/helmet10.gif differ
diff --git a/dresss/helmet11.gif b/dresss/helmet11.gif
new file mode 100644
index 00000000..0908fe55
Binary files /dev/null and b/dresss/helmet11.gif differ
diff --git a/dresss/helmet14.gif b/dresss/helmet14.gif
new file mode 100644
index 00000000..18f71c15
Binary files /dev/null and b/dresss/helmet14.gif differ
diff --git a/dresss/helmet2.gif b/dresss/helmet2.gif
new file mode 100644
index 00000000..86b74b06
Binary files /dev/null and b/dresss/helmet2.gif differ
diff --git a/dresss/helmet200.gif b/dresss/helmet200.gif
new file mode 100644
index 00000000..f91ea16a
Binary files /dev/null and b/dresss/helmet200.gif differ
diff --git a/dresss/helmet2008_1.gif b/dresss/helmet2008_1.gif
new file mode 100644
index 00000000..a20f29ed
Binary files /dev/null and b/dresss/helmet2008_1.gif differ
diff --git a/dresss/helmet201.gif b/dresss/helmet201.gif
new file mode 100644
index 00000000..6b802ae7
Binary files /dev/null and b/dresss/helmet201.gif differ
diff --git a/dresss/helmet202.gif b/dresss/helmet202.gif
new file mode 100644
index 00000000..e2da831e
Binary files /dev/null and b/dresss/helmet202.gif differ
diff --git a/dresss/helmet203.gif b/dresss/helmet203.gif
new file mode 100644
index 00000000..b142f08b
Binary files /dev/null and b/dresss/helmet203.gif differ
diff --git a/dresss/helmet204.gif b/dresss/helmet204.gif
new file mode 100644
index 00000000..c206ac78
Binary files /dev/null and b/dresss/helmet204.gif differ
diff --git a/dresss/helmet205.gif b/dresss/helmet205.gif
new file mode 100644
index 00000000..70f10348
Binary files /dev/null and b/dresss/helmet205.gif differ
diff --git a/dresss/helmet206.gif b/dresss/helmet206.gif
new file mode 100644
index 00000000..879911c7
Binary files /dev/null and b/dresss/helmet206.gif differ
diff --git a/dresss/helmet207.gif b/dresss/helmet207.gif
new file mode 100644
index 00000000..15322e5b
Binary files /dev/null and b/dresss/helmet207.gif differ
diff --git a/dresss/helmet208.gif b/dresss/helmet208.gif
new file mode 100644
index 00000000..66a6fe49
Binary files /dev/null and b/dresss/helmet208.gif differ
diff --git a/dresss/helmet209.gif b/dresss/helmet209.gif
new file mode 100644
index 00000000..248417a9
Binary files /dev/null and b/dresss/helmet209.gif differ
diff --git a/dresss/helmet21.gif b/dresss/helmet21.gif
new file mode 100644
index 00000000..2449dbec
Binary files /dev/null and b/dresss/helmet21.gif differ
diff --git a/dresss/helmet210.gif b/dresss/helmet210.gif
new file mode 100644
index 00000000..531ec755
Binary files /dev/null and b/dresss/helmet210.gif differ
diff --git a/dresss/helmet211.gif b/dresss/helmet211.gif
new file mode 100644
index 00000000..1efd0f3a
Binary files /dev/null and b/dresss/helmet211.gif differ
diff --git a/dresss/helmet212.gif b/dresss/helmet212.gif
new file mode 100644
index 00000000..7722e618
Binary files /dev/null and b/dresss/helmet212.gif differ
diff --git a/dresss/helmet22.gif b/dresss/helmet22.gif
new file mode 100644
index 00000000..86c67cd7
Binary files /dev/null and b/dresss/helmet22.gif differ
diff --git a/dresss/helmet23.gif b/dresss/helmet23.gif
new file mode 100644
index 00000000..8a3f4af4
Binary files /dev/null and b/dresss/helmet23.gif differ
diff --git a/dresss/helmet24.gif b/dresss/helmet24.gif
new file mode 100644
index 00000000..421ce644
Binary files /dev/null and b/dresss/helmet24.gif differ
diff --git a/dresss/helmet25.gif b/dresss/helmet25.gif
new file mode 100644
index 00000000..5af3413c
Binary files /dev/null and b/dresss/helmet25.gif differ
diff --git a/dresss/helmet26.gif b/dresss/helmet26.gif
new file mode 100644
index 00000000..ef4010c4
Binary files /dev/null and b/dresss/helmet26.gif differ
diff --git a/dresss/helmet27.gif b/dresss/helmet27.gif
new file mode 100644
index 00000000..d27222e4
Binary files /dev/null and b/dresss/helmet27.gif differ
diff --git a/dresss/helmet28.gif b/dresss/helmet28.gif
new file mode 100644
index 00000000..b4bc79f5
Binary files /dev/null and b/dresss/helmet28.gif differ
diff --git a/dresss/helmet29.gif b/dresss/helmet29.gif
new file mode 100644
index 00000000..18540536
Binary files /dev/null and b/dresss/helmet29.gif differ
diff --git a/dresss/helmet3.gif b/dresss/helmet3.gif
new file mode 100644
index 00000000..e371a50e
Binary files /dev/null and b/dresss/helmet3.gif differ
diff --git a/dresss/helmet30.gif b/dresss/helmet30.gif
new file mode 100644
index 00000000..18875007
Binary files /dev/null and b/dresss/helmet30.gif differ
diff --git a/dresss/helmet31.gif b/dresss/helmet31.gif
new file mode 100644
index 00000000..120485d7
Binary files /dev/null and b/dresss/helmet31.gif differ
diff --git a/dresss/helmet32.gif b/dresss/helmet32.gif
new file mode 100644
index 00000000..0ea2c7e1
Binary files /dev/null and b/dresss/helmet32.gif differ
diff --git a/dresss/helmet33.gif b/dresss/helmet33.gif
new file mode 100644
index 00000000..1e155e17
Binary files /dev/null and b/dresss/helmet33.gif differ
diff --git a/dresss/helmet34.gif b/dresss/helmet34.gif
new file mode 100644
index 00000000..69b9e7d2
Binary files /dev/null and b/dresss/helmet34.gif differ
diff --git a/dresss/helmet35.gif b/dresss/helmet35.gif
new file mode 100644
index 00000000..6e404875
Binary files /dev/null and b/dresss/helmet35.gif differ
diff --git a/dresss/helmet36.gif b/dresss/helmet36.gif
new file mode 100644
index 00000000..a9c60e2b
Binary files /dev/null and b/dresss/helmet36.gif differ
diff --git a/dresss/helmet37.gif b/dresss/helmet37.gif
new file mode 100644
index 00000000..c6c8bedc
Binary files /dev/null and b/dresss/helmet37.gif differ
diff --git a/dresss/helmet38.gif b/dresss/helmet38.gif
new file mode 100644
index 00000000..ca21e4c3
Binary files /dev/null and b/dresss/helmet38.gif differ
diff --git a/dresss/helmet39.gif b/dresss/helmet39.gif
new file mode 100644
index 00000000..66b5fdd7
Binary files /dev/null and b/dresss/helmet39.gif differ
diff --git a/dresss/helmet4.gif b/dresss/helmet4.gif
new file mode 100644
index 00000000..26fd8566
Binary files /dev/null and b/dresss/helmet4.gif differ
diff --git a/dresss/helmet40.gif b/dresss/helmet40.gif
new file mode 100644
index 00000000..9d48d6a9
Binary files /dev/null and b/dresss/helmet40.gif differ
diff --git a/dresss/helmet42.gif b/dresss/helmet42.gif
new file mode 100644
index 00000000..fc7cf9aa
Binary files /dev/null and b/dresss/helmet42.gif differ
diff --git a/dresss/helmet43.gif b/dresss/helmet43.gif
new file mode 100644
index 00000000..b788da07
Binary files /dev/null and b/dresss/helmet43.gif differ
diff --git a/dresss/helmet44.gif b/dresss/helmet44.gif
new file mode 100644
index 00000000..ef503c1a
Binary files /dev/null and b/dresss/helmet44.gif differ
diff --git a/dresss/helmet45.gif b/dresss/helmet45.gif
new file mode 100644
index 00000000..a43538a8
Binary files /dev/null and b/dresss/helmet45.gif differ
diff --git a/dresss/helmet46.gif b/dresss/helmet46.gif
new file mode 100644
index 00000000..17c37fc2
Binary files /dev/null and b/dresss/helmet46.gif differ
diff --git a/dresss/helmet47.gif b/dresss/helmet47.gif
new file mode 100644
index 00000000..3bf1cd5d
Binary files /dev/null and b/dresss/helmet47.gif differ
diff --git a/dresss/helmet48.gif b/dresss/helmet48.gif
new file mode 100644
index 00000000..a6f30da8
Binary files /dev/null and b/dresss/helmet48.gif differ
diff --git a/dresss/helmet49.gif b/dresss/helmet49.gif
new file mode 100644
index 00000000..d4642bd4
Binary files /dev/null and b/dresss/helmet49.gif differ
diff --git a/dresss/helmet5.gif b/dresss/helmet5.gif
new file mode 100644
index 00000000..7e53eb09
Binary files /dev/null and b/dresss/helmet5.gif differ
diff --git a/dresss/helmet50.gif b/dresss/helmet50.gif
new file mode 100644
index 00000000..e6f3caad
Binary files /dev/null and b/dresss/helmet50.gif differ
diff --git a/dresss/helmet51.gif b/dresss/helmet51.gif
new file mode 100644
index 00000000..be0d6d37
Binary files /dev/null and b/dresss/helmet51.gif differ
diff --git a/dresss/helmet52.gif b/dresss/helmet52.gif
new file mode 100644
index 00000000..5e0b39b4
Binary files /dev/null and b/dresss/helmet52.gif differ
diff --git a/dresss/helmet53.gif b/dresss/helmet53.gif
new file mode 100644
index 00000000..c989d3c4
Binary files /dev/null and b/dresss/helmet53.gif differ
diff --git a/dresss/helmet54.gif b/dresss/helmet54.gif
new file mode 100644
index 00000000..736ac12c
Binary files /dev/null and b/dresss/helmet54.gif differ
diff --git a/dresss/helmet56.gif b/dresss/helmet56.gif
new file mode 100644
index 00000000..c64b4430
Binary files /dev/null and b/dresss/helmet56.gif differ
diff --git a/dresss/helmet57.gif b/dresss/helmet57.gif
new file mode 100644
index 00000000..a2ca5be3
Binary files /dev/null and b/dresss/helmet57.gif differ
diff --git a/dresss/helmet58.gif b/dresss/helmet58.gif
new file mode 100644
index 00000000..498ee0f6
Binary files /dev/null and b/dresss/helmet58.gif differ
diff --git a/dresss/helmet59.gif b/dresss/helmet59.gif
new file mode 100644
index 00000000..e2e7655e
Binary files /dev/null and b/dresss/helmet59.gif differ
diff --git a/dresss/helmet6.gif b/dresss/helmet6.gif
new file mode 100644
index 00000000..bb969f2f
Binary files /dev/null and b/dresss/helmet6.gif differ
diff --git a/dresss/helmet60.gif b/dresss/helmet60.gif
new file mode 100644
index 00000000..e46757f4
Binary files /dev/null and b/dresss/helmet60.gif differ
diff --git a/dresss/helmet61.gif b/dresss/helmet61.gif
new file mode 100644
index 00000000..9abf143c
Binary files /dev/null and b/dresss/helmet61.gif differ
diff --git a/dresss/helmet62.gif b/dresss/helmet62.gif
new file mode 100644
index 00000000..d5a93c3a
Binary files /dev/null and b/dresss/helmet62.gif differ
diff --git a/dresss/helmet63.gif b/dresss/helmet63.gif
new file mode 100644
index 00000000..f3240001
Binary files /dev/null and b/dresss/helmet63.gif differ
diff --git a/dresss/helmet64.gif b/dresss/helmet64.gif
new file mode 100644
index 00000000..0f1de9af
Binary files /dev/null and b/dresss/helmet64.gif differ
diff --git a/dresss/helmet65.gif b/dresss/helmet65.gif
new file mode 100644
index 00000000..f367a944
Binary files /dev/null and b/dresss/helmet65.gif differ
diff --git a/dresss/helmet66.gif b/dresss/helmet66.gif
new file mode 100644
index 00000000..809a5c85
Binary files /dev/null and b/dresss/helmet66.gif differ
diff --git a/dresss/helmet67.gif b/dresss/helmet67.gif
new file mode 100644
index 00000000..44e3a20c
Binary files /dev/null and b/dresss/helmet67.gif differ
diff --git a/dresss/helmet68.gif b/dresss/helmet68.gif
new file mode 100644
index 00000000..e8e4008c
Binary files /dev/null and b/dresss/helmet68.gif differ
diff --git a/dresss/helmet69.gif b/dresss/helmet69.gif
new file mode 100644
index 00000000..49cdbd0b
Binary files /dev/null and b/dresss/helmet69.gif differ
diff --git a/dresss/helmet7.gif b/dresss/helmet7.gif
new file mode 100644
index 00000000..befbcdc1
Binary files /dev/null and b/dresss/helmet7.gif differ
diff --git a/dresss/helmet70.gif b/dresss/helmet70.gif
new file mode 100644
index 00000000..65b387c5
Binary files /dev/null and b/dresss/helmet70.gif differ
diff --git a/dresss/helmet71.gif b/dresss/helmet71.gif
new file mode 100644
index 00000000..9848f345
Binary files /dev/null and b/dresss/helmet71.gif differ
diff --git a/dresss/helmet72.gif b/dresss/helmet72.gif
new file mode 100644
index 00000000..3f4b62bc
Binary files /dev/null and b/dresss/helmet72.gif differ
diff --git a/dresss/helmet73.gif b/dresss/helmet73.gif
new file mode 100644
index 00000000..7913ee76
Binary files /dev/null and b/dresss/helmet73.gif differ
diff --git a/dresss/helmet74.gif b/dresss/helmet74.gif
new file mode 100644
index 00000000..74b02e48
Binary files /dev/null and b/dresss/helmet74.gif differ
diff --git a/dresss/helmet75.gif b/dresss/helmet75.gif
new file mode 100644
index 00000000..baba7683
Binary files /dev/null and b/dresss/helmet75.gif differ
diff --git a/dresss/helmet76.gif b/dresss/helmet76.gif
new file mode 100644
index 00000000..4b019c79
Binary files /dev/null and b/dresss/helmet76.gif differ
diff --git a/dresss/helmet77.gif b/dresss/helmet77.gif
new file mode 100644
index 00000000..f1851f4b
Binary files /dev/null and b/dresss/helmet77.gif differ
diff --git a/dresss/helmet78.gif b/dresss/helmet78.gif
new file mode 100644
index 00000000..ef5a842c
Binary files /dev/null and b/dresss/helmet78.gif differ
diff --git a/dresss/helmet79.gif b/dresss/helmet79.gif
new file mode 100644
index 00000000..9a43162c
Binary files /dev/null and b/dresss/helmet79.gif differ
diff --git a/dresss/helmet79_1.gif b/dresss/helmet79_1.gif
new file mode 100644
index 00000000..9a43162c
Binary files /dev/null and b/dresss/helmet79_1.gif differ
diff --git a/dresss/helmet8.gif b/dresss/helmet8.gif
new file mode 100644
index 00000000..893ad541
Binary files /dev/null and b/dresss/helmet8.gif differ
diff --git a/dresss/helmet80.gif b/dresss/helmet80.gif
new file mode 100644
index 00000000..1433d82d
Binary files /dev/null and b/dresss/helmet80.gif differ
diff --git a/dresss/helmet80_1.gif b/dresss/helmet80_1.gif
new file mode 100644
index 00000000..1433d82d
Binary files /dev/null and b/dresss/helmet80_1.gif differ
diff --git a/dresss/helmet81.gif b/dresss/helmet81.gif
new file mode 100644
index 00000000..3c5ce61f
Binary files /dev/null and b/dresss/helmet81.gif differ
diff --git a/dresss/helmet81_1.gif b/dresss/helmet81_1.gif
new file mode 100644
index 00000000..3c5ce61f
Binary files /dev/null and b/dresss/helmet81_1.gif differ
diff --git a/dresss/helmet82_du2.gif b/dresss/helmet82_du2.gif
new file mode 100644
index 00000000..af623edc
Binary files /dev/null and b/dresss/helmet82_du2.gif differ
diff --git a/dresss/helmet82_du2_1.gif b/dresss/helmet82_du2_1.gif
new file mode 100644
index 00000000..af623edc
Binary files /dev/null and b/dresss/helmet82_du2_1.gif differ
diff --git a/dresss/helmet83.gif b/dresss/helmet83.gif
new file mode 100644
index 00000000..2562f639
Binary files /dev/null and b/dresss/helmet83.gif differ
diff --git a/dresss/helmet83_1.gif b/dresss/helmet83_1.gif
new file mode 100644
index 00000000..2562f639
Binary files /dev/null and b/dresss/helmet83_1.gif differ
diff --git a/dresss/helmet84.gif b/dresss/helmet84.gif
new file mode 100644
index 00000000..5ba97027
Binary files /dev/null and b/dresss/helmet84.gif differ
diff --git a/dresss/helmet84_1.gif b/dresss/helmet84_1.gif
new file mode 100644
index 00000000..5ba97027
Binary files /dev/null and b/dresss/helmet84_1.gif differ
diff --git a/dresss/helmet85.gif b/dresss/helmet85.gif
new file mode 100644
index 00000000..27b3d01e
Binary files /dev/null and b/dresss/helmet85.gif differ
diff --git a/dresss/helmet85_1.gif b/dresss/helmet85_1.gif
new file mode 100644
index 00000000..27b3d01e
Binary files /dev/null and b/dresss/helmet85_1.gif differ
diff --git a/dresss/helmet9.gif b/dresss/helmet9.gif
new file mode 100644
index 00000000..788e46db
Binary files /dev/null and b/dresss/helmet9.gif differ
diff --git a/dresss/helmet90.gif b/dresss/helmet90.gif
new file mode 100644
index 00000000..86eec296
Binary files /dev/null and b/dresss/helmet90.gif differ
diff --git a/dresss/helmet91.gif b/dresss/helmet91.gif
new file mode 100644
index 00000000..0fb8e195
Binary files /dev/null and b/dresss/helmet91.gif differ
diff --git a/dresss/helmet92.gif b/dresss/helmet92.gif
new file mode 100644
index 00000000..8fe39835
Binary files /dev/null and b/dresss/helmet92.gif differ
diff --git a/dresss/helmet_illusion1.gif b/dresss/helmet_illusion1.gif
new file mode 100644
index 00000000..eeb153b7
Binary files /dev/null and b/dresss/helmet_illusion1.gif differ
diff --git a/dresss/helmet_illusion2.gif b/dresss/helmet_illusion2.gif
new file mode 100644
index 00000000..43c28813
Binary files /dev/null and b/dresss/helmet_illusion2.gif differ
diff --git a/dresss/helmetq.gif b/dresss/helmetq.gif
new file mode 100644
index 00000000..b6dde84c
Binary files /dev/null and b/dresss/helmetq.gif differ
diff --git a/dresss/helmq.gif b/dresss/helmq.gif
new file mode 100644
index 00000000..b6dde84c
Binary files /dev/null and b/dresss/helmq.gif differ
diff --git a/dresss/herz.gif b/dresss/herz.gif
new file mode 100644
index 00000000..237dd8f6
Binary files /dev/null and b/dresss/herz.gif differ
diff --git a/dresss/hidden.gif b/dresss/hidden.gif
new file mode 100644
index 00000000..3821f44e
Binary files /dev/null and b/dresss/hidden.gif differ
diff --git a/dresss/hit.gif b/dresss/hit.gif
new file mode 100644
index 00000000..6a724f94
Binary files /dev/null and b/dresss/hit.gif differ
diff --git a/dresss/hit_empower.gif b/dresss/hit_empower.gif
new file mode 100644
index 00000000..2b8b0f98
Binary files /dev/null and b/dresss/hit_empower.gif differ
diff --git a/dresss/hit_luck.gif b/dresss/hit_luck.gif
new file mode 100644
index 00000000..b73e1715
Binary files /dev/null and b/dresss/hit_luck.gif differ
diff --git a/dresss/hit_natisk.gif b/dresss/hit_natisk.gif
new file mode 100644
index 00000000..93e545a9
Binary files /dev/null and b/dresss/hit_natisk.gif differ
diff --git a/dresss/hit_overhit.gif b/dresss/hit_overhit.gif
new file mode 100644
index 00000000..94b2e661
Binary files /dev/null and b/dresss/hit_overhit.gif differ
diff --git a/dresss/hit_resolve.gif b/dresss/hit_resolve.gif
new file mode 100644
index 00000000..68ab2150
Binary files /dev/null and b/dresss/hit_resolve.gif differ
diff --git a/dresss/hit_restrike.gif b/dresss/hit_restrike.gif
new file mode 100644
index 00000000..1f5e02bb
Binary files /dev/null and b/dresss/hit_restrike.gif differ
diff --git a/dresss/hit_shock.gif b/dresss/hit_shock.gif
new file mode 100644
index 00000000..258ad05a
Binary files /dev/null and b/dresss/hit_shock.gif differ
diff --git a/dresss/hit_strong.gif b/dresss/hit_strong.gif
new file mode 100644
index 00000000..96a568fc
Binary files /dev/null and b/dresss/hit_strong.gif differ
diff --git a/dresss/hit_target_sword.gif b/dresss/hit_target_sword.gif
new file mode 100644
index 00000000..3d1ea0ce
Binary files /dev/null and b/dresss/hit_target_sword.gif differ
diff --git a/dresss/hit_willpower.gif b/dresss/hit_willpower.gif
new file mode 100644
index 00000000..0a5c0b4b
Binary files /dev/null and b/dresss/hit_willpower.gif differ
diff --git a/dresss/hp.gif b/dresss/hp.gif
new file mode 100644
index 00000000..9b949a05
Binary files /dev/null and b/dresss/hp.gif differ
diff --git a/dresss/hp_circleshield.gif b/dresss/hp_circleshield.gif
new file mode 100644
index 00000000..ffee808e
Binary files /dev/null and b/dresss/hp_circleshield.gif differ
diff --git a/dresss/hp_cleance.gif b/dresss/hp_cleance.gif
new file mode 100644
index 00000000..0516669e
Binary files /dev/null and b/dresss/hp_cleance.gif differ
diff --git a/dresss/hp_defence.gif b/dresss/hp_defence.gif
new file mode 100644
index 00000000..0aae5786
Binary files /dev/null and b/dresss/hp_defence.gif differ
diff --git a/dresss/hp_enrage.gif b/dresss/hp_enrage.gif
new file mode 100644
index 00000000..00d615df
Binary files /dev/null and b/dresss/hp_enrage.gif differ
diff --git a/dresss/hp_laststrike.gif b/dresss/hp_laststrike.gif
new file mode 100644
index 00000000..d057c82b
Binary files /dev/null and b/dresss/hp_laststrike.gif differ
diff --git a/dresss/hp_natisk.gif b/dresss/hp_natisk.gif
new file mode 100644
index 00000000..c8036ab7
Binary files /dev/null and b/dresss/hp_natisk.gif differ
diff --git a/dresss/hp_regen.gif b/dresss/hp_regen.gif
new file mode 100644
index 00000000..95bb6ae2
Binary files /dev/null and b/dresss/hp_regen.gif differ
diff --git a/dresss/hp_trade.gif b/dresss/hp_trade.gif
new file mode 100644
index 00000000..873e4af6
Binary files /dev/null and b/dresss/hp_trade.gif differ
diff --git a/dresss/hp_travma.gif b/dresss/hp_travma.gif
new file mode 100644
index 00000000..71a0bff3
Binary files /dev/null and b/dresss/hp_travma.gif differ
diff --git a/dresss/htm2chm_explorer.htm b/dresss/htm2chm_explorer.htm
new file mode 100644
index 00000000..f4712217
--- /dev/null
+++ b/dresss/htm2chm_explorer.htm
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/dresss/hypoam.gif b/dresss/hypoam.gif
new file mode 100644
index 00000000..cca3d0b1
Binary files /dev/null and b/dresss/hypoam.gif differ
diff --git a/dresss/hypoarmor.gif b/dresss/hypoarmor.gif
new file mode 100644
index 00000000..935ba69e
Binary files /dev/null and b/dresss/hypoarmor.gif differ
diff --git a/dresss/hypobelt.gif b/dresss/hypobelt.gif
new file mode 100644
index 00000000..581e8f0d
Binary files /dev/null and b/dresss/hypobelt.gif differ
diff --git a/dresss/hypohelmet.gif b/dresss/hypohelmet.gif
new file mode 100644
index 00000000..06db1aa3
Binary files /dev/null and b/dresss/hypohelmet.gif differ
diff --git a/dresss/hypokol.gif b/dresss/hypokol.gif
new file mode 100644
index 00000000..c81ce63f
Binary files /dev/null and b/dresss/hypokol.gif differ
diff --git a/dresss/hyponarnar.gif b/dresss/hyponarnar.gif
new file mode 100644
index 00000000..d8f14ffc
Binary files /dev/null and b/dresss/hyponarnar.gif differ
diff --git a/dresss/hypoperch.gif b/dresss/hypoperch.gif
new file mode 100644
index 00000000..036b1484
Binary files /dev/null and b/dresss/hypoperch.gif differ
diff --git a/dresss/hypopon.gif b/dresss/hypopon.gif
new file mode 100644
index 00000000..eec7c246
Binary files /dev/null and b/dresss/hypopon.gif differ
diff --git a/dresss/hyposer.gif b/dresss/hyposer.gif
new file mode 100644
index 00000000..22450caa
Binary files /dev/null and b/dresss/hyposer.gif differ
diff --git a/dresss/illusion.gif b/dresss/illusion.gif
new file mode 100644
index 00000000..da941054
Binary files /dev/null and b/dresss/illusion.gif differ
diff --git a/dresss/images.html b/dresss/images.html
new file mode 100644
index 00000000..02024f8e
--- /dev/null
+++ b/dresss/images.html
@@ -0,0 +1,2306 @@
+Autogenerated images index
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dresss/images/DarkClan.gif b/dresss/images/DarkClan.gif
new file mode 100644
index 00000000..91940650
Binary files /dev/null and b/dresss/images/DarkClan.gif differ
diff --git a/dresss/images/armored4.gif b/dresss/images/armored4.gif
new file mode 100644
index 00000000..f17d7440
Binary files /dev/null and b/dresss/images/armored4.gif differ
diff --git a/dresss/images/blank.gif b/dresss/images/blank.gif
new file mode 100644
index 00000000..75b945d2
Binary files /dev/null and b/dresss/images/blank.gif differ
diff --git a/dresss/images/bottle4.gif b/dresss/images/bottle4.gif
new file mode 100644
index 00000000..50f7f46b
Binary files /dev/null and b/dresss/images/bottle4.gif differ
diff --git a/dresss/images/cat4.gif b/dresss/images/cat4.gif
new file mode 100644
index 00000000..c1f08b64
Binary files /dev/null and b/dresss/images/cat4.gif differ
diff --git a/dresss/images/dressroomlogo5.gif b/dresss/images/dressroomlogo5.gif
new file mode 100644
index 00000000..2aa66ace
Binary files /dev/null and b/dresss/images/dressroomlogo5.gif differ
diff --git a/dresss/images/email.gif b/dresss/images/email.gif
new file mode 100644
index 00000000..d30b11dd
Binary files /dev/null and b/dresss/images/email.gif differ
diff --git a/dresss/images/hands4.gif b/dresss/images/hands4.gif
new file mode 100644
index 00000000..f2b5d1e2
Binary files /dev/null and b/dresss/images/hands4.gif differ
diff --git a/dresss/images/icq.gif b/dresss/images/icq.gif
new file mode 100644
index 00000000..122b51b2
Binary files /dev/null and b/dresss/images/icq.gif differ
diff --git a/dresss/images/images.html b/dresss/images/images.html
new file mode 100644
index 00000000..6d2313fe
--- /dev/null
+++ b/dresss/images/images.html
@@ -0,0 +1,12 @@
+Autogenerated images index
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dresss/images/infospace/close.gif b/dresss/images/infospace/close.gif
new file mode 100644
index 00000000..93d184c5
Binary files /dev/null and b/dresss/images/infospace/close.gif differ
diff --git a/dresss/images/infospace/info.gif b/dresss/images/infospace/info.gif
new file mode 100644
index 00000000..fc6aa51d
Binary files /dev/null and b/dresss/images/infospace/info.gif differ
diff --git a/dresss/images/nude4.gif b/dresss/images/nude4.gif
new file mode 100644
index 00000000..470968fb
Binary files /dev/null and b/dresss/images/nude4.gif differ
diff --git a/dresss/inf.gif b/dresss/inf.gif
new file mode 100644
index 00000000..c14a2111
Binary files /dev/null and b/dresss/inf.gif differ
diff --git a/dresss/inf0.gif b/dresss/inf0.gif
new file mode 100644
index 00000000..fa49405d
Binary files /dev/null and b/dresss/inf0.gif differ
diff --git a/dresss/inf1.gif b/dresss/inf1.gif
new file mode 100644
index 00000000..fa49405d
Binary files /dev/null and b/dresss/inf1.gif differ
diff --git a/dresss/inv_protection.gif b/dresss/inv_protection.gif
new file mode 100644
index 00000000..b5c0868c
Binary files /dev/null and b/dresss/inv_protection.gif differ
diff --git a/dresss/invoke_1s_random.gif b/dresss/invoke_1s_random.gif
new file mode 100644
index 00000000..215b2e7e
Binary files /dev/null and b/dresss/invoke_1s_random.gif differ
diff --git a/dresss/invoke_create_bloodstone.gif b/dresss/invoke_create_bloodstone.gif
new file mode 100644
index 00000000..67d242ce
Binary files /dev/null and b/dresss/invoke_create_bloodstone.gif differ
diff --git a/dresss/invoke_create_lesserbloodstone.gif b/dresss/invoke_create_lesserbloodstone.gif
new file mode 100644
index 00000000..745862a1
Binary files /dev/null and b/dresss/invoke_create_lesserbloodstone.gif differ
diff --git a/dresss/invoke_kar1_heal10.gif b/dresss/invoke_kar1_heal10.gif
new file mode 100644
index 00000000..e523550b
Binary files /dev/null and b/dresss/invoke_kar1_heal10.gif differ
diff --git a/dresss/invoke_kar2_mana10.gif b/dresss/invoke_kar2_mana10.gif
new file mode 100644
index 00000000..827a8aed
Binary files /dev/null and b/dresss/invoke_kar2_mana10.gif differ
diff --git a/dresss/invoke_kar3_basil.gif b/dresss/invoke_kar3_basil.gif
new file mode 100644
index 00000000..b138bf44
Binary files /dev/null and b/dresss/invoke_kar3_basil.gif differ
diff --git a/dresss/invoke_kar3_dust.gif b/dresss/invoke_kar3_dust.gif
new file mode 100644
index 00000000..ded1e8cb
Binary files /dev/null and b/dresss/invoke_kar3_dust.gif differ
diff --git a/dresss/invoke_kar3_lifew.gif b/dresss/invoke_kar3_lifew.gif
new file mode 100644
index 00000000..95780b90
Binary files /dev/null and b/dresss/invoke_kar3_lifew.gif differ
diff --git a/dresss/invoke_kar3_mush.gif b/dresss/invoke_kar3_mush.gif
new file mode 100644
index 00000000..a1608826
Binary files /dev/null and b/dresss/invoke_kar3_mush.gif differ
diff --git a/dresss/invoke_kar3_potpg.gif b/dresss/invoke_kar3_potpg.gif
new file mode 100644
index 00000000..7df71b42
Binary files /dev/null and b/dresss/invoke_kar3_potpg.gif differ
diff --git a/dresss/invoke_plain_1s_all5.gif b/dresss/invoke_plain_1s_all5.gif
new file mode 100644
index 00000000..443c2703
Binary files /dev/null and b/dresss/invoke_plain_1s_all5.gif differ
diff --git a/dresss/invoke_plain_1s_dex10.gif b/dresss/invoke_plain_1s_dex10.gif
new file mode 100644
index 00000000..a3c5f6e8
Binary files /dev/null and b/dresss/invoke_plain_1s_dex10.gif differ
diff --git a/dresss/invoke_plain_1s_inst10.gif b/dresss/invoke_plain_1s_inst10.gif
new file mode 100644
index 00000000..0025168d
Binary files /dev/null and b/dresss/invoke_plain_1s_inst10.gif differ
diff --git a/dresss/invoke_plain_1s_intel10.gif b/dresss/invoke_plain_1s_intel10.gif
new file mode 100644
index 00000000..2344120b
Binary files /dev/null and b/dresss/invoke_plain_1s_intel10.gif differ
diff --git a/dresss/invoke_plain_1s_spirit10.gif b/dresss/invoke_plain_1s_spirit10.gif
new file mode 100644
index 00000000..70e972cf
Binary files /dev/null and b/dresss/invoke_plain_1s_spirit10.gif differ
diff --git a/dresss/invoke_plain_1s_str10.gif b/dresss/invoke_plain_1s_str10.gif
new file mode 100644
index 00000000..9664e7d7
Binary files /dev/null and b/dresss/invoke_plain_1s_str10.gif differ
diff --git a/dresss/invoke_snowball_start.gif b/dresss/invoke_snowball_start.gif
new file mode 100644
index 00000000..aa63f5ab
Binary files /dev/null and b/dresss/invoke_snowball_start.gif differ
diff --git a/dresss/invoke_spell_godintel100.gif b/dresss/invoke_spell_godintel100.gif
new file mode 100644
index 00000000..ba05cc41
Binary files /dev/null and b/dresss/invoke_spell_godintel100.gif differ
diff --git a/dresss/invoke_spell_godmana100.gif b/dresss/invoke_spell_godmana100.gif
new file mode 100644
index 00000000..ac0c6675
Binary files /dev/null and b/dresss/invoke_spell_godmana100.gif differ
diff --git a/dresss/invoke_tactics5.gif b/dresss/invoke_tactics5.gif
new file mode 100644
index 00000000..cd074a66
Binary files /dev/null and b/dresss/invoke_tactics5.gif differ
diff --git a/dresss/jail.gif b/dresss/jail.gif
new file mode 100644
index 00000000..9f02296b
Binary files /dev/null and b/dresss/jail.gif differ
diff --git a/dresss/joke_battlelog.gif b/dresss/joke_battlelog.gif
new file mode 100644
index 00000000..9886359d
Binary files /dev/null and b/dresss/joke_battlelog.gif differ
diff --git a/dresss/joke_block.gif b/dresss/joke_block.gif
new file mode 100644
index 00000000..a84b9d28
Binary files /dev/null and b/dresss/joke_block.gif differ
diff --git a/dresss/joke_items.gif b/dresss/joke_items.gif
new file mode 100644
index 00000000..607a2309
Binary files /dev/null and b/dresss/joke_items.gif differ
diff --git a/dresss/joke_name.gif b/dresss/joke_name.gif
new file mode 100644
index 00000000..a38426e4
Binary files /dev/null and b/dresss/joke_name.gif differ
diff --git a/dresss/joke_stat.gif b/dresss/joke_stat.gif
new file mode 100644
index 00000000..4a74c7cf
Binary files /dev/null and b/dresss/joke_stat.gif differ
diff --git a/dresss/joke_system.gif b/dresss/joke_system.gif
new file mode 100644
index 00000000..309f8f23
Binary files /dev/null and b/dresss/joke_system.gif differ
diff --git a/dresss/jshttp.js b/dresss/jshttp.js
new file mode 100644
index 00000000..070ede03
--- /dev/null
+++ b/dresss/jshttp.js
@@ -0,0 +1,249 @@
+// JScript File
+
+
+
+var dcInfoSpaceScriptId = 'dcInfoSpaceS';
+var dcInfoSpaceOutputId = 'dcInfoSpaceOutput';
+var dcInfoSpaceDataSource = 'http://www.darkclan.ru/cgi/getisdata.pl';
+var dcInfoSpaceNoCache = true;
+
+var cityhash = {
+ Capital: 'Capital city',
+ Angels: ' Angels city',
+ Demons: 'Demons city',
+ Devils: ' Devils city',
+ Sun: 'Suncity',
+ Sand: 'Sandcity',
+ Emeralds: 'Emeralds city',
+ Moon: 'Moon city',
+ East: 'East city',
+ capital: 'Capital city',
+ emeralds: 'Emeralds city'
+ };
+
+var stateshop = "";
+var privateshop = "";
+
+var moz = (document.getElementById && !document.all);
+
+var cursorX = 0;
+var cursorY = 0;
+
+var infoSpaceRequest = new Object();
+
+function dcInfoSpace(id, ctx)
+{
+ infoSpaceRequest = {
+ id: id,
+ ctx: ctx,
+ response: null,
+ activeTab: 0
+ };
+ cleanupScriptElement(dcInfoSpaceScriptId);
+ var href = dcInfoSpaceDataSource + '?rnd=' + Math.random() + '&i=' + escape(id) + '&ctx=' + escape(ctx);
+ getScriptElement(dcInfoSpaceScriptId, href);
+
+ return false;
+}
+
+function cleanupScriptElement(id)
+{
+ var span = document.getElementById(id);
+ if (span != null)
+ {
+ setTimeout(function()
+ {
+ // without setTimeout - crash in IE 5.0!
+ span.parentNode.removeChild(span);
+ },
+ 50
+ );
+ }
+}
+
+function getScriptElement(id, href)
+{
+ var span = document.body.appendChild(document.createElement('SPAN'));
+ span.style.display = 'none';
+ span.innerHTML = 'MSIE fix';
+ setTimeout(function()
+ {
+ var s = span.getElementsByTagName("script")[0];
+ s.language = "JavaScript";
+ if (s.setAttribute) s.setAttribute('src', href); else s.src = href;
+ },
+ 10
+ );
+ return span;
+}
+
+function handleResponse(response)
+{
+ var imgHtml = '';
+ var html = '';
+ html += imgHtml + '' + response.caption + ' ';
+ html += '
';
+ html += '
';
+ html += '
';
+ html += '
';
+ html += '
';
+ for (var shopi = 0; shopi < response.shops.length; shopi++)
+ {
+ var shop = response.shops[shopi];
+ html += '
' + cityhash[shop.where] + '
';
+ html += (shop.which == 'state') ? stateshop : privateshop;
+ html += '
Законы в Бойцовском Клубе абсолютны, не подвергаются обсуждению и должны безусловно выполняться. За их выполнением следит администрация и модераторы, которые являются носителями закона. Администрация и модерация могут принять решение о наличии того или иного состава преступления.
+
+
ЗАПРЕЩАЕТСЯ:
+ - Регистрация нескольких персонажей одним человеком.
+ - Денежно-вещевая прокачка (ДВП). Подробнее...
+ - Регистрация через реферальную систему подставных персонажей, только с целью получения игровых ценностей.
+ - Прокачка на других игроках за вознаграждение или взаимная прокачка, заведомого проигрыша/выигрыша боя,договорные бои.
+ - Передача паролей от игрового персонажа третьим лицам.
+ - Общение на языке, отличном от русского или английского.
+ - Использование оскорблений и ненормативной лексики (в том числе завуалированного мата), унижение чести и достоинства, выраженное в неприличной форме: в любых возможных выражениях в игре.
+ - Обман игроков ( в любом виде ).
+ - Обман модератора/администрации в любом виде.
+ - Умышленный ввод в заблуждение администрации/модерации, отказ в предоставлении необходимой информации.
+ - Попытка или прямой подкуп модерации/администрации.
+ - Использование ошибок программного обеспечения сервера или багоюзерство
+ - Использование стороннего программного обеспечения с целью получения игрового преимущества (использование ботов, кликеров).
+ - Распространение ссылок на сайты, содержание которых вызывает сбои в работе компьютера, а равно на сайты, содержание которых направлено на незаконное получение паролей, а так же ссылки на сайты конкурентных проектов.
+ - Антиреклама проекта,в виде постоянно нытья в чате,на форуме или где либо еще.
+ - Покупки/продажи (равно как и попытки это сделать) персонажа/кредитов/екр/игровых услуг/игровых вещей за реальные денежные средства или другое вознаграждение.
+ - Пропаганда наркотиков и реклама ресурсов, содержащих данную рекламу.
+ - Косвенная или прямая реклама порно-сайтов.
+ - Пропаганда расизма, националистические высказывания. Дискуссии на политические темы.
+ - Дискриминация любого рода (по расовой, религиозной, половой принадлежности).
+ - Угрозы насилием и/или физической расправой в реале.
+ - Попрошайничество в любом виде.
+ - Передача главенства клана и последующий выход из него ( разрешается в случае,если тот игрок,которому был передан клан с этим согласен ).
+ - Раскрывать в общем чате баги и/или недоработки игрового процесса.
+ - Общение от лица администрации,администратор один и его ник в игре << Администратор >>.
+ - Обсуждать наказания администрации по отношению к нарушителю или игроку в общем чате.
+
+ Возможные наказания за деяния, описанные выше:
+ 1. Заклятие молчания.
+ 2. Обезличивание.
+ 3. Присваивание склонности Хаос.
+ 4. Тюремное заключение.
+ 5. Блокировка персонажа с последующей блокировкой его айпи адреса.
+
+ Наказания могут применяться в комплексе и не сразу, а в последствии на более старших уровнях.
+
+ Незнание законов не освобождает от ответственности.
+ Свод законов может быть дополнен и изменен в любое время по решении Администрации проекта
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ new-combats.com - 2018 (c)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/encicl/law2.html b/encicl/law2.html
new file mode 100644
index 00000000..9be614bf
--- /dev/null
+++ b/encicl/law2.html
@@ -0,0 +1,271 @@
+
+
+
+
+
+Бойцовский Клуб - Пользовательское Соглашение
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Настоящее пользовательское соглашение (далее «соглашение»), регулирует отношения между администрацией интерактивной онлайн игры «Бойцовский Клуб v2.1» (далее «Игра»), размещенной на интернет-сайтах в сети Интернет (www.new-combats.com и их поддоменах), а также на относящиеся к указанной игре сопутствующие игровые ресурсы (в совокупности Игра и игровые ресурсы далее «Проект») и пользователем Проекта (далее «Игрок»).
+
+
В случае, если вам в соответствии с законами вашего государства запрещено получать игровые услуги онлайн или существуют иные законодательные ограничения, включая ограничения по возрасту допуска к таким услугам, вы не вправе использовать Игру или отдельные услуги в Игре, и обязуетесь немедленно прекратить использование Игры или таких услуг в Игре.
+
+
Любые общедоступные или дополнительные (платные) сервисы или услуги в Игре предоставляются исключительно Администрацией игры. Получение игровых услуг или сервисов от иных третьих лиц может повлечь отказ в предоставлении услуг Игры или Проекта для Игрока полностью или частично на усмотрение Администрации игры.
+
+
В случае намерения Игрока использовать в Игре дополнительные сервисы Игры или Проекта, Игрок обязуется следовать всем инструкциям, прилагаемым к Игре или Проекту по порядку и способам оплаты, в том числе по правилам ввода номера коротких текстовых сообщений (SMS), если таковые предоставляются, включая, но не ограничиваясь, порядком ввода строчных или заглавных букв, пробелов, языка ввода. Администрация игры не несет ответственности за правильность выполнения Игроком условий проведения оплаты дополнительных сервисов Игры или Проекта, как за находящиеся вне контроля Администрации. Получение Игроком дополнительных сервисов Игры или Проекта возможно при условии оплаты Игроком таких сервисов, при этом Администрация вправе до получения подтверждения об оплате дополнительных сервисов такие сервисы не предоставлять, предоставлять в ограниченном объеме или ограничивать Игроку получение как дополнительных, так и основных сервисов Игры или Проекта. Любые денежные средства, вложенные в игру, не возвращаются ни при каких условиях, ни полностью, ни частично.
+Администрация вправе закрывать и/или ограничивать функциональность Игры или Проекта в любое время без какого-либо предварительного уведомления Игроков.
+
+ За нарушения Соглашения или Правил Игры или Проекта Игроку может быть незамедлительно, без какого-либо предварительного уведомления, отказано в услугах по предоставлению сервиса Игры или Проекта или такие услуги или доступ к Игре или Проекту могут быть ограничены полностью или частично.
+Получение дополнительных (платных) сервисов Игры или Проекта не освобождает Игроков или посетителей Проекта от соблюдения и применения в отношении них Администрацией игры настоящего Соглашения или Правил Игры или Проекта, включая, но не ограничиваясь, возможность отказа Администрацией игры в услугах по предоставлению сервиса Игры или Проекта или такие услуги или доступ к Игре или Проекту могут быть ограничены полностью или частично. Администрация не обязана предъявлять доказательства, подтверждающие обоснованность применения санкций, предусмотренных настоящим Пользовательским соглашением и/или Правил Игры или Проекта, при нарушении Пользователями условий, а также его отдельных Приложений.
+
+
+В отдельных случаях Администрация вправе передать данные об Игроке, нарушающем Соглашение или действующее законодательство, в правоохранительные органы.
+
+ Администрация управляет Игрой и игровыми процессами исключительно по своему усмотрению. Для сбора статистических данных и идентификации посетителей Проекта Администрация игры может отслеживать и сохранять информацию об IP-адресах доступа Игрока к Проекту, использовать файлы технической информации (cookies), размещаемые на локальном терминале Игрока или посетителя Проекта.
+
+
Любая информация Игрока персонального характера, если таковая была предоставлена Администрации каким-либо образом при взаимодействии Сторон по соглашению, хранится у Администрации исключительно для целей исполнения соглашение и ни при каких обстоятельствах не передается третьим лицам не иначе как для целей исполнения соглашения или в соответствии с требованиями законодательства.
+Игрок или посетитель Проекта согласны с тем, что Администрация, может и вправе запросить, собирать и хранить, с учетом положений ФЗ «О защите персональных данных» персональную информацию Игрока или посетителя Проекта, включая информацию о фамилии, имени, отчестве, поле, возрасте или адресах электронной почты или иных средств электронной коммуникации, а также, в случае использования Игроком или Посетителем Проекта дополнительных (платных) услуг – данные о платежных реквизитах Игрока или Посетителя Проекта.
+Правила игры являются неотъемлемой частью Соглашения, соблюдение Правил игры и указаний представителей Администрации Игры, не противоречащих настоящему Соглашению или Правилам игры обязательно для Игрока.
+
+
Использование сервисов Игры производится Игроком исключительно самостоятельно и по принципу «как-есть», то есть Администрация не отвечает перед Игроком ни при каких обстоятельствах за любой прямой и/или косвенный ущерб, которые может быть (возникнуть) у Игрока в связи с получением сервиса игры или невозможностью такой сервис получить.
+
+
Игрок настоящим уведомлен, что Игра может предусматривать различные звуковые и/или видео эффекты, которые, при определенных обстоятельствах, могут вызывать у лиц, склонных к эпилептическим или иным расстройствам нервного характера, обострение указанных состояний, и Игрок гарантирует, что указанными расстройствами он не страдает, или же обязуется Игру не использовать.
+
Игрок настоящим уведомлен, что регулярное длительное (непрерывное) нахождение у персонального компьютера может вызывать различные осложнения физического состояния, в том числе ослабление зрения, сколиоз, различные формы неврозов и прочие негативные воздействия на организм. Игрок гарантирует, что он будет использовать Игру исключительно на протяжении разумного времени, с перерывами на отдых или иные мероприятия по профилактике физического состояния, если таковые Игроку рекомендованы или предписаны.
+
Администрация Игры не дает никаких явных или подразумеваемых гарантий того, что в процессе разработки Игры были учтены все недочеты и выявлены все программные ошибки, и, основываясь в том числе на вышеизложенном, Администрация прилагает все разумные усилия для того, чтобы указанные ошибки были выявлены и в разумные сроки исправлены. При этом Игрок, нашедший такой недочет или ошибку, но не сообщивший о ее наличии Администрации, и использовавший ее для получение не предусмотренных условиями соглашения возможностей Игры или публично обнародовавший факт ее существования или характер проявления, лишается прав, предусмотренных Соглашением, непосредственно в момент такого неправомерного использования или обнародования.
+
Недействительность одного или нескольких положений соглашения, признанная в установленном порядке вступившим в силу решением суда, не влечет для сторон недействительность соглашения в целом. В случае признания одного или нескольких положений договора в установленном порядке недействительными, Стороны обязуются исполнять взятые на себя по соглашению обязательства максимально близким к подразумеваемым Сторонами при заключении и/или согласованном изменении соглашения способом.
+
При изменении законодательства, регулирующего установленные соглашением отношения между Сторонами, Стороны обязуются исполнять взятые на себя по соглашению обязательства максимально близким к подразумеваемым Сторонами при заключении и/или согласованном изменении соглашения способом, включая, но не ограничиваясь объемом переданных прав, порядком и способами получения дополнительных сервисов Игры, условиями поддержки Игры или прекращения действия соглашения.
+
Все используемые или упоминаемые в Игре товарные знаки и иные средства индивидуализации товаров или услуг принадлежат их законным правообладателям. Все иные права, явно не указанные как принадлежащие третьим лицам, принадлежат Администрации или законным правообладателям таких прав.
+
Все авторские, смежные и иные права на Игру, включая игровых персонажей, игровые предметы и аксессуары, игровые расчетные средства, и Проект в целом, принадлежат Администрации, если иное в явном виде не указано. Несанкционированное в явном виде Администрацией Игры использование Игры или элементов Игры полностью или частично запрещается.
+
Все права собственности и права на интеллектуальную собственность в отношении Игры, включая, но не ограничиваясь, любыми графическими изображениями, фотографиями, анимацией, видеозаписями, звукозаписями, музыкой, текстом, сопровождающие Игру материалы и любые ее части или копии принадлежат Администрации или соответствующим правообладателям.
+
Все споры сторон по настоящему соглашению подлежат разрешению путем переписки и переговоров.
+
Настоящее Соглашение может быть изменено Администрацией без какого-либо предварительного уведомления. Игрок обязуется проверять Соглашение на предмет изменений не менее чем один раз в семь дней. В случае, если такой проверки не будет в указанные сроки или после ознакомления с Соглашением (новой редакцией Соглашения) Игрок продолжает пользоваться Проектом, считается, что игрок ознакомлен и согласен с Соглашением (новой редакцией Соглашения).
+
+ Администрация Игры вправе рассылать Игрокам электронные сообщения информационного или технического характера, связанные с Игрой или Проектом.
+ Все взаимодействие в рамках соглашения ведется на русском языке.
+
+ НАЧАЛО ИГРЫ ОЗНАЧАЕТ БЕЗУСЛОВНОЕ СОГЛАСИЕ И ПОДТВЕРЖДЕНИЕ ГАРАНТИЙ СО СТОРОНЫ ИГРОКА В ОТНОШЕНИИ ПОЛОЖЕНИЙ НАСТОЯЩЕГО СОГЛАШЕНИЯ.
+
+
+ По вопросам, связанным с исполнением Соглашения, просьба обращаться admin@new-combats.com
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/encicl/law3.html b/encicl/law3.html
new file mode 100644
index 00000000..9747b60d
--- /dev/null
+++ b/encicl/law3.html
@@ -0,0 +1,249 @@
+
+
+
+
+
+Бойцовский Клуб - Политика Конфиеденцальности
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Политика конфиденциальности
Указанная Политика конфиденциальности применима ко всем веб-страницам, расположенными на домене https://new-combats.com. Перед использованием Сайта настоятельно рекомендуем ознакомиться с Политикой конфиденциальности, а в случае несогласия с какими-либо положениями изложенной Политики конфиденциальности, пожалуйста, прекратите использование данного Сайта.
+
+ Общие положения
+
+ Заполнив любую из форм и используя данный Сайт, Вы тем самым выражаете согласие с условиями изложенной ниже Политики конфиденциальности. Сайт охраняет конфиденциальность посетителей сайта. Обращаем внимание на то, что вся информация размещенная на этом Сайте не является публичной офертой, определяемой в соответствии с законодательством Российской Федерации.
+
+ Автоматически считываемая информация
+
+ Когда вы перемещаетесь по Сайту происходит автоматическое считывание технической информации: IP-адрес. Файлы cookies. Адреса запрашиваемых страниц. Типы и версии используемого программного обеспечения.
+
+ Автоматически считываемая, в результате посещения пользователями данного Сайта, информация носит исключительно аналитический характер. Используется без идентификации отдельных пользователей с целью обеспечения работоспособности Сайта в целом и анализа статистики использования Сайта. Файлы cookies используются только для хранения идентификаторов сессий и некоторых параметров отображения контента.
+
+ Использование информации
+
+ Мы являемся единственным владельцем информации, собранной на данном сайте. Информация используется только для обеспечения надлежащей работы данного Сайта и не подлежит передаче, продаже, обмену или какому-либо иному виду распространения в адрес третьих лиц или компаний за исключением случаев требований таковой законами Российской Федерации.
+
+ Безопасность
+
+ Мы не храним и не запрашиваем номера банковских карт пользователей, а все платежи производятся на сайтах платежных систем с использованием защищенного протокола HTTPS. Номера телефонов и адреса электронной почты запрашиваются с целью передачи платежным системам и только в случаях, когда это является необходимым в работе с конкретной платежной системой.
+
+ По вопросам, связанным с исполнением Соглашения, просьба обращаться строго по контактным данным Администратора
+Mail:admnew-combats@gmail.com
+
+Viber:+380688028300
+
+Skype:+380688028300
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Браузерная игра Новый Бойцовский Клуб (c) 2022
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/encicl/law4.html b/encicl/law4.html
new file mode 100644
index 00000000..0b1cace2
--- /dev/null
+++ b/encicl/law4.html
@@ -0,0 +1,318 @@
+
+
+
+
+
+Бойцовский Клуб - Договор публичной оферты
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Договор публичной Оферты
+
+
Общие положения
+
+
Настоящий Договор является официальным предложением (публичной офертой) проекта new-combats (в дальнейшем «Исполнитель») для полностью дееспособного физического лица (далее – «Заказчик»), которое примет настоящее предложение, на указанных ниже условиях.
+
В соответствии с пунктом 2 статьи 437 Гражданского Кодекса Российской Федерации (ГК РФ), в случае принятия изложенных ниже условий и оплаты услуг юридическое или физическое лицо, производящее акцепт этой оферты, становится Заказчиком (в соответствии с пунктом 3 статьи 438 ГК РФ акцепт оферты равносилен заключению Договора на условиях, изложенных в оферте).
+
Моментом полного и безоговорочного принятия Заказчиком предложения Исполнителя заключить Договор оферты (акцептом оферты) считается факт подтверждения готовности совершить оплату услуги Исполнителя, посредством нажатия кнопки «Пополнить Баланс» на сайте https://new-combats.com/ Текст настоящего Договора-оферты (далее по тексту – «Договор») расположен по адресу: открыть договор
+
Осуществляя акцепт Договора в порядке, определенном п. 1.3 Договора, Заказчик подтверждает, что он ознакомлен, согласен, полностью и безоговорочно принимает все условия Договора в том виде, в каком они изложены в тексте Договора, в том числе в приложениях к Договору, являющихся его неотъемлемой частью.
+
Клиент согласен, что акцепт Договора в порядке, указанном в п. 1.2 Договора является заключением Договора на условиях, изложенных в нем.
+
Договор не может быть отозван.
+
Договор не требует скрепления печатями и/или подписания Заказчиком и Исполнителем (далее по тексту - Стороны) и сохраняет при этом юридическую силу.
+
+
+
Предмет договора
+
+
Предметом настоящего Договора является возмездное оказание Исполнителем услуг в сфере развлечений соответствии с условиями настоящего Договора.
+
Заказчик полностью принимает условия Договора и оплачивает услуги Исполнителя в соответствии с условиями настоящего Договора.
+
Услугами, оказываемыми по настоящему договору, являются предоставление сервисов для онлайн игры Новый Бойцовский Клуб и иных не азартных игр, проводимых в онлайн режиме.
+
+
+
Оплата Услуг
+
+
Стоимость услуг по Договору определяется в соответствии с действующими ценами и указана на странице пополнения баланса по адресу: Покупка Еврокредитов
+
Стоимость услуги может быть изменена Исполнителем в одностороннем порядке.
+
Способы оплаты услуги указаны при оформлении платежа.
+
Заказчик имеет право на возврат оплаченных услуг в таких случаях как, прекращение
+ работы сайта по техническим или иным причинам на срок более одних суток, отмена
+ платности оказания услуг на сайте в связи с изменением маркетинговой политики
+ Исполнителя. Возврат платежей осуществляется по заявке Заказчика направленной
+ Исполнителю на адрес электронной почты admnew-combats@gmail.com
+
+
+
+
Интеллектуальная собственность
+
+
Вся текстовая информация и графические изображения, находящиеся на сайте https://new-combats.com/ являются собственностью Исполнителя.
+
+
+
Особые условия и ответственность сторон.
+
+
Исполнитель несет ответственность за своевременность предоставляемых услуг при выполнении Заказчиком установленных требований и правил, размещенных на сайте https://new-combats.com/.
+
Исполнитель освобождается от ответственности за нарушение условий Договора, если
+ такое нарушение вызвано действием обстоятельств непреодолимой силы (форс-мажор),
+ включая: действия органов государственной власти, пожар, наводнение, землетрясение,
+ другие стихийные действия, отсутствие электроэнергии, забастовки, гражданские
+ волнения, беспорядки, любые иные обстоятельства, не ограничиваясь перечисленным,
+ которые могут повлиять на выполнение Исполнителем Договора.
+
+
Исполнитель не несет ответственности за качество каналов связи общего пользования или служб, предоставляющих доступ Заказчика к его услугам.
+
+
+
Конфиденциальность и защита персональной информации
+
+
Исполнитель обязуется не разглашать полученную от Заказчика информацию.
+
Не считается нарушением обязательств разглашение информации в соответствии с обоснованными и применимыми требованиями закона.
+
Исполнитель получает информацию об IP-адресе посетителя Сайта https://new-combats.com/. Данная информация не используется для установления личности посетителя.
+
Исполнитель не несет ответственности за сведения, предоставленные Заказчиком на сайте https://new-combats.com/ в общедоступной форме.
+
+
+
Порядок рассмотрения претензий и споров
+
+
Претензии Заказчика по предоставляемым услугам принимаются Исполнителем к
+ рассмотрению по электронной почте в течение 2 (рабочих) дней с момента возникновения
+ спорной ситуации.
+
+
При рассмотрении спорных ситуаций Исполнитель вправе запросить у Заказчика всю
+ интересующую документацию относительно рассматриваемого мероприятия. В случае
+ непредоставления Заказчиком документов в течение 1 рабочего дня после дня требования,
+ претензия рассмотрению Исполнителем не подлежит.
+
+
Исполнитель и Заказчик, принимая во внимания характер оказываемой услуги,
+ обязуются в случае возникновения споров и разногласий, связанных с оказанием услуг,
+ применять досудебный порядок урегулирования спора. В случае невозможности
+ урегулирования спора в досудебном порядке стороны вправе обратиться в суд.
+
+
+
+
Прочие условия
+
+
Заказчик обладает всеми правами и полномочиями, необходимыми для заключения и исполнения Договора.
+
Заказчик вправе в любое время в одностороннем порядке отказаться от услуг Исполнителя. В случае одностороннего отказа Заказчика от услуг Исполнителя произведенная оплата не возвращается, но может быть перенесена на другую услугу.
+
Исполнитель оставляет за собой право изменять или дополнять любые из условий настоящего Договора в любое время, опубликовывая все изменения на своем сайте.
+
По всем вопросам, не урегулированным настоящим Договором, стороны руководствуются действующим законодательством Российской Федерации.
+
Признание судом недействительности какого-либо положения настоящего Договора и правил не влечет за собой недействительность остальных положений.
')
+}
+function DrawOnline(a,b){
+if(b==="online")doc.write("Персонаж сейчас находится в клубе.");
+else{
+doc.write("Персонаж не в клубе");a!=="hide"&&doc.write(", но был тут: "+CombatsUI.UTCMsec2PlainText(CombatsUI.UTCMsec2Moscow(a*1E3))+' ('+LocalText.PeriodToText("ru",b-a,2,"ACC")+" назад)")
+}
+}
+var rnd=Math.random(),delay=18,redHP=0.33,yellowHP=0.66,TimerOn=-1,tkHP,maxHP,speed=100,mspeed=100;
+function setHP(a,b,d){
+tkHP=a;maxHP=b;if(TimerOn>=0){clearTimeout(TimerOn);TimerOn=-1}speed=d;setHPlocal()
+}
+function setHPlocal(){
+if(tkHP>maxHP){tkHP=maxHP;TimerOn=-1}
+else TimerOn=0;
+var a=Math.round(tkHP)+"/"+maxHP;a=120;
+var b=Math.round(a/maxHP*tkHP);a=a-b;if(doc.all("HP")){doc.HP1.width=b;doc.HP2.width=a;doc.HP2.display=a?"":"none";doc.HP1.src=tkHP/maxHP=0){clearTimeout(MTimerOn);MTimerOn=-1}
+if(d<1)d=1;mspeed=d;setManalocal()}
+function setMPlocal(){
+if(maxMP==0)
+return 0;
+if(tkMP>maxMP){tkMP=maxMP;MTimerOn=-1}
+else MTimerOn=0;
+var a=Math.round(tkMP)+"/"+maxMP;a=120;
+var b=Math.round(a/maxMP*tkMP);a=a-b;
+if(doc.all("MP")){doc.MP1.width=b;doc.MP2.width=a;doc.MP2.display=a?"":"none";
+doc.MP1.src="http://img.new-combats.com/i/misc/bk_life_beg_33.gif";
+b=doc.all("MP").innerHTML;doc.all("MP").innerHTML=b.substring(0,b.lastIndexOf(":")+1)+Math.round(tkMP)+"/"+maxMP}tkMP+=maxMP/1E3*mspeed/100;
+if(MTimerOn!=-1)MTimerOn=setTimeout("setMPlocal()",Mdelay*100)
+}
\ No newline at end of file
diff --git a/img.new-combats.com/js/jx/jquery.form.js b/img.new-combats.com/js/jx/jquery.form.js
new file mode 100644
index 00000000..58cd571b
--- /dev/null
+++ b/img.new-combats.com/js/jx/jquery.form.js
@@ -0,0 +1,859 @@
+/*!
+ * jQuery Form Plugin
+ * version: 2.77 (23-MAY-2011)
+ * @requires jQuery v1.3.2 or later
+ *
+ * Examples and documentation at: http://malsup.com/jquery/form/
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ */
+;(function($) {
+
+/*
+ Usage Note:
+ -----------
+ Do not use both ajaxSubmit and ajaxForm on the same form. These
+ functions are intended to be exclusive. Use ajaxSubmit if you want
+ to bind your own submit handler to the form. For example,
+
+ $(document).ready(function() {
+ $('#myForm').bind('submit', function(e) {
+ e.preventDefault(); // <-- important
+ $(this).ajaxSubmit({
+ target: '#output'
+ });
+ });
+ });
+
+ Use ajaxForm when you want the plugin to manage all the event binding
+ for you. For example,
+
+ $(document).ready(function() {
+ $('#myForm').ajaxForm({
+ target: '#output'
+ });
+ });
+
+ When using ajaxForm, the ajaxSubmit function will be invoked for you
+ at the appropriate time.
+*/
+
+/**
+ * ajaxSubmit() provides a mechanism for immediately submitting
+ * an HTML form using AJAX.
+ */
+$.fn.ajaxSubmit = function(options) {
+ // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
+ if (!this.length) {
+ log('ajaxSubmit: skipping submit process - no element selected');
+ return this;
+ }
+
+ if (typeof options == 'function') {
+ options = { success: options };
+ }
+
+ var action = this.attr('action');
+ var url = (typeof action === 'string') ? $.trim(action) : '';
+ url = url || window.location.href || '';
+ if (url) {
+ // clean url (don't include hash vaue)
+ url = (url.match(/^([^#]+)/)||[])[1];
+ }
+
+ options = $.extend(true, {
+ url: url,
+ success: $.ajaxSettings.success,
+ type: this[0].getAttribute('method') || 'GET', // IE7 massage (see issue 57)
+ iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
+ }, options);
+
+ // hook for manipulating the form data before it is extracted;
+ // convenient for use with rich editors like tinyMCE or FCKEditor
+ var veto = {};
+ this.trigger('form-pre-serialize', [this, options, veto]);
+ if (veto.veto) {
+ log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
+ return this;
+ }
+
+ // provide opportunity to alter form data before it is serialized
+ if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
+ log('ajaxSubmit: submit aborted via beforeSerialize callback');
+ return this;
+ }
+
+ var n,v,a = this.formToArray(options.semantic);
+ if (options.data) {
+ options.extraData = options.data;
+ for (n in options.data) {
+ if(options.data[n] instanceof Array) {
+ for (var k in options.data[n]) {
+ a.push( { name: n, value: options.data[n][k] } );
+ }
+ }
+ else {
+ v = options.data[n];
+ v = $.isFunction(v) ? v() : v; // if value is fn, invoke it
+ a.push( { name: n, value: v } );
+ }
+ }
+ }
+
+ // give pre-submit callback an opportunity to abort the submit
+ if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
+ log('ajaxSubmit: submit aborted via beforeSubmit callback');
+ return this;
+ }
+
+ // fire vetoable 'validate' event
+ this.trigger('form-submit-validate', [a, this, options, veto]);
+ if (veto.veto) {
+ log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
+ return this;
+ }
+
+ var q = $.param(a);
+
+ if (options.type.toUpperCase() == 'GET') {
+ options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
+ options.data = null; // data is null for 'get'
+ }
+ else {
+ options.data = q; // data is the query string for 'post'
+ }
+
+ var $form = this, callbacks = [];
+ if (options.resetForm) {
+ callbacks.push(function() { $form.resetForm(); });
+ }
+ if (options.clearForm) {
+ callbacks.push(function() { $form.clearForm(); });
+ }
+
+ // perform a load on the target only if dataType is not provided
+ if (!options.dataType && options.target) {
+ var oldSuccess = options.success || function(){};
+ callbacks.push(function(data) {
+ var fn = options.replaceTarget ? 'replaceWith' : 'html';
+ $(options.target)[fn](data).each(oldSuccess, arguments);
+ });
+ }
+ else if (options.success) {
+ callbacks.push(options.success);
+ }
+
+ options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
+ var context = options.context || options; // jQuery 1.4+ supports scope context
+ for (var i=0, max=callbacks.length; i < max; i++) {
+ callbacks[i].apply(context, [data, status, xhr || $form, $form]);
+ }
+ };
+
+ // are there files to upload?
+ var fileInputs = $('input:file', this).length > 0;
+ var mp = 'multipart/form-data';
+ var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
+
+ // options.iframe allows user to force iframe mode
+ // 06-NOV-09: now defaulting to iframe mode if file input is detected
+ if (options.iframe !== false && (fileInputs || options.iframe || multipart)) {
+ // hack to fix Safari hang (thanks to Tim Molendijk for this)
+ // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
+ if (options.closeKeepAlive) {
+ $.get(options.closeKeepAlive, fileUpload);
+ }
+ else {
+ fileUpload();
+ }
+ }
+ else {
+ $.ajax(options);
+ }
+
+ // fire 'notify' event
+ this.trigger('form-submit-notify', [this, options]);
+ return this;
+
+
+ // private function for handling file uploads (hat tip to YAHOO!)
+ function fileUpload() {
+ var form = $form[0], s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
+
+ if ($(':input[name=submit],:input[id=submit]', form).length) {
+ // if there is an input with a name or id of 'submit' then we won't be
+ // able to invoke the submit fn on the form (at least not x-browser)
+ alert('Error: Form elements must not have name or id of "submit".');
+ return;
+ }
+
+ s = $.extend(true, {}, $.ajaxSettings, options);
+ s.context = s.context || s;
+ $io, id = 'jqFormIO' + (new Date().getTime());
+ if (s.iframeTarget) {
+ $io = $(s.iframeTarget);
+ n = $io.attr('name');
+ if (n == null)
+ $io.attr('name', id);
+ else
+ id = n;
+ }
+ else {
+ $io = $('');
+ $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
+ }
+ io = $io[0];
+
+
+ xhr = { // mock object
+ aborted: 0,
+ responseText: null,
+ responseXML: null,
+ status: 0,
+ statusText: 'n/a',
+ getAllResponseHeaders: function() {},
+ getResponseHeader: function() {},
+ setRequestHeader: function() {},
+ abort: function(status) {
+ var e = (status === 'timeout' ? 'timeout' : 'aborted');
+ log('aborting upload... ' + e);
+ this.aborted = 1;
+ $io.attr('src', s.iframeSrc); // abort op in progress
+ xhr.error = e;
+ s.error && s.error.call(s.context, xhr, e, e);
+ g && $.event.trigger("ajaxError", [xhr, s, e]);
+ s.complete && s.complete.call(s.context, xhr, e);
+ }
+ };
+
+ g = s.global;
+ // trigger ajax global events so that activity/block indicators work like normal
+ if (g && ! $.active++) {
+ $.event.trigger("ajaxStart");
+ }
+ if (g) {
+ $.event.trigger("ajaxSend", [xhr, s]);
+ }
+
+ if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
+ if (s.global) {
+ $.active--;
+ }
+ return;
+ }
+ if (xhr.aborted) {
+ return;
+ }
+
+ // add submitting element to data if we know it
+ sub = form.clk;
+ if (sub) {
+ n = sub.name;
+ if (n && !sub.disabled) {
+ s.extraData = s.extraData || {};
+ s.extraData[n] = sub.value;
+ if (sub.type == "image") {
+ s.extraData[n+'.x'] = form.clk_x;
+ s.extraData[n+'.y'] = form.clk_y;
+ }
+ }
+ }
+
+ // take a breath so that pending repaints get some cpu time before the upload starts
+ function doSubmit() {
+ // make sure form attrs are set
+ var t = $form.attr('target'), a = $form.attr('action');
+
+ // update form attrs in IE friendly way
+ form.setAttribute('target',id);
+ if (form.getAttribute('method') != 'POST') {
+ form.setAttribute('method', 'POST');
+ }
+ if (form.getAttribute('action') != s.url) {
+ form.setAttribute('action', s.url);
+ }
+
+ // ie borks in some cases when setting encoding
+ if (! s.skipEncodingOverride) {
+ $form.attr({
+ encoding: 'multipart/form-data',
+ enctype: 'multipart/form-data'
+ });
+ }
+
+ // support timout
+ if (s.timeout) {
+ timeoutHandle = setTimeout(function() { timedOut = true; cb(true); }, s.timeout);
+ }
+
+ // add "extra" data to form if provided in options
+ var extraInputs = [];
+ try {
+ if (s.extraData) {
+ for (var n in s.extraData) {
+ extraInputs.push(
+ $('')
+ .appendTo(form)[0]);
+ }
+ }
+
+ if (!s.iframeTarget) {
+ // add iframe to doc and submit the form
+ $io.appendTo('body');
+ io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
+ }
+ form.submit();
+ }
+ finally {
+ // reset attrs and remove "extra" input elements
+ form.setAttribute('action',a);
+ if(t) {
+ form.setAttribute('target', t);
+ } else {
+ $form.removeAttr('target');
+ }
+ $(extraInputs).remove();
+ }
+ }
+
+ if (s.forceSync) {
+ doSubmit();
+ }
+ else {
+ setTimeout(doSubmit, 10); // this lets dom updates render
+ }
+
+ var data, doc, domCheckCount = 50, callbackProcessed;
+
+ function cb(e) {
+ if (xhr.aborted || callbackProcessed) {
+ return;
+ }
+ if (e === true && xhr) {
+ xhr.abort('timeout');
+ return;
+ }
+
+ var doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
+ if (!doc || doc.location.href == s.iframeSrc) {
+ // response not received yet
+ if (!timedOut)
+ return;
+ }
+ io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
+
+ var status = 'success', errMsg;
+ try {
+ if (timedOut) {
+ throw 'timeout';
+ }
+
+ var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
+ log('isXml='+isXml);
+ if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {
+ if (--domCheckCount) {
+ // in some browsers (Opera) the iframe DOM is not always traversable when
+ // the onload callback fires, so we loop a bit to accommodate
+ log('requeing onLoad callback, DOM not available');
+ setTimeout(cb, 250);
+ return;
+ }
+ // let this fall through because server response could be an empty document
+ //log('Could not access iframe DOM after mutiple tries.');
+ //throw 'DOMException: not available';
+ }
+
+ //log('response detected');
+ var docRoot = doc.body ? doc.body : doc.documentElement;
+ xhr.responseText = docRoot ? docRoot.innerHTML : null;
+ xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
+ if (isXml)
+ s.dataType = 'xml';
+ xhr.getResponseHeader = function(header){
+ var headers = {'content-type': s.dataType};
+ return headers[header];
+ };
+ // support for XHR 'status' & 'statusText' emulation :
+ if (docRoot) {
+ xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;
+ xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
+ }
+
+ var scr = /(json|script|text)/.test(s.dataType.toLowerCase());
+ if (scr || s.textarea) {
+ // see if user embedded response in textarea
+ var ta = doc.getElementsByTagName('textarea')[0];
+ if (ta) {
+ xhr.responseText = ta.value;
+ // support for XHR 'status' & 'statusText' emulation :
+ xhr.status = Number( ta.getAttribute('status') ) || xhr.status;
+ xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
+ }
+ else if (scr) {
+ // account for browsers injecting pre around json response
+ var pre = doc.getElementsByTagName('pre')[0];
+ var b = doc.getElementsByTagName('body')[0];
+ if (pre) {
+ xhr.responseText = pre.textContent ? pre.textContent : pre.innerHTML;
+ }
+ else if (b) {
+ xhr.responseText = b.innerHTML;
+ }
+ }
+ }
+ else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
+ xhr.responseXML = toXml(xhr.responseText);
+ }
+
+ try {
+ data = httpData(xhr, s.dataType, s);
+ }
+ catch (e) {
+ status = 'parsererror';
+ xhr.error = errMsg = (e || status);
+ }
+ }
+ catch (e) {
+ log('error caught',e);
+ status = 'error';
+ xhr.error = errMsg = (e || status);
+ }
+
+ if (xhr.aborted) {
+ log('upload aborted');
+ status = null;
+ }
+
+ if (xhr.status) { // we've set xhr.status
+ status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
+ }
+
+ // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
+ if (status === 'success') {
+ s.success && s.success.call(s.context, data, 'success', xhr);
+ g && $.event.trigger("ajaxSuccess", [xhr, s]);
+ }
+ else if (status) {
+ if (errMsg == undefined)
+ errMsg = xhr.statusText;
+ s.error && s.error.call(s.context, xhr, status, errMsg);
+ g && $.event.trigger("ajaxError", [xhr, s, errMsg]);
+ }
+
+ g && $.event.trigger("ajaxComplete", [xhr, s]);
+
+ if (g && ! --$.active) {
+ $.event.trigger("ajaxStop");
+ }
+
+ s.complete && s.complete.call(s.context, xhr, status);
+
+ callbackProcessed = true;
+ if (s.timeout)
+ clearTimeout(timeoutHandle);
+
+ // clean up
+ setTimeout(function() {
+ if (!s.iframeTarget)
+ $io.remove();
+ xhr.responseXML = null;
+ }, 100);
+ }
+
+ var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
+ if (window.ActiveXObject) {
+ doc = new ActiveXObject('Microsoft.XMLDOM');
+ doc.async = 'false';
+ doc.loadXML(s);
+ }
+ else {
+ doc = (new DOMParser()).parseFromString(s, 'text/xml');
+ }
+ return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
+ };
+ var parseJSON = $.parseJSON || function(s) {
+ return window['eval']('(' + s + ')');
+ };
+
+ var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
+
+ var ct = xhr.getResponseHeader('content-type') || '',
+ xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
+ data = xml ? xhr.responseXML : xhr.responseText;
+
+ if (xml && data.documentElement.nodeName === 'parsererror') {
+ $.error && $.error('parsererror');
+ }
+ if (s && s.dataFilter) {
+ data = s.dataFilter(data, type);
+ }
+ if (typeof data === 'string') {
+ if (type === 'json' || !type && ct.indexOf('json') >= 0) {
+ data = parseJSON(data);
+ } else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
+ $.globalEval(data);
+ }
+ }
+ return data;
+ };
+ }
+};
+
+/**
+ * ajaxForm() provides a mechanism for fully automating form submission.
+ *
+ * The advantages of using this method instead of ajaxSubmit() are:
+ *
+ * 1: This method will include coordinates for elements (if the element
+ * is used to submit the form).
+ * 2. This method will include the submit element's name/value data (for the element that was
+ * used to submit the form).
+ * 3. This method binds the submit() method to the form for you.
+ *
+ * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely
+ * passes the options argument along after properly binding events for submit elements and
+ * the form itself.
+ */
+$.fn.ajaxForm = function(options) {
+ // in jQuery 1.3+ we can fix mistakes with the ready state
+ if (this.length === 0) {
+ var o = { s: this.selector, c: this.context };
+ if (!$.isReady && o.s) {
+ log('DOM not ready, queuing ajaxForm');
+ $(function() {
+ $(o.s,o.c).ajaxForm(options);
+ });
+ return this;
+ }
+ // is your DOM ready? http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
+ log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
+ return this;
+ }
+
+ return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {
+ if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
+ e.preventDefault();
+ $(this).ajaxSubmit(options);
+ }
+ }).bind('click.form-plugin', function(e) {
+ var target = e.target;
+ var $el = $(target);
+ if (!($el.is(":submit,input:image"))) {
+ // is this a child element of the submit el? (ex: a span within a button)
+ var t = $el.closest(':submit');
+ if (t.length == 0) {
+ return;
+ }
+ target = t[0];
+ }
+ var form = this;
+ form.clk = target;
+ if (target.type == 'image') {
+ if (e.offsetX != undefined) {
+ form.clk_x = e.offsetX;
+ form.clk_y = e.offsetY;
+ } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
+ var offset = $el.offset();
+ form.clk_x = e.pageX - offset.left;
+ form.clk_y = e.pageY - offset.top;
+ } else {
+ form.clk_x = e.pageX - target.offsetLeft;
+ form.clk_y = e.pageY - target.offsetTop;
+ }
+ }
+ // clear form vars
+ setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
+ });
+};
+
+// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
+$.fn.ajaxFormUnbind = function() {
+ return this.unbind('submit.form-plugin click.form-plugin');
+};
+
+/**
+ * formToArray() gathers form element data into an array of objects that can
+ * be passed to any of the following ajax functions: $.get, $.post, or load.
+ * Each object in the array has both a 'name' and 'value' property. An example of
+ * an array for a simple login form might be:
+ *
+ * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
+ *
+ * It is this array that is passed to pre-submit callback functions provided to the
+ * ajaxSubmit() and ajaxForm() methods.
+ */
+$.fn.formToArray = function(semantic) {
+ var a = [];
+ if (this.length === 0) {
+ return a;
+ }
+
+ var form = this[0];
+ var els = semantic ? form.getElementsByTagName('*') : form.elements;
+ if (!els) {
+ return a;
+ }
+
+ var i,j,n,v,el,max,jmax;
+ for(i=0, max=els.length; i < max; i++) {
+ el = els[i];
+ n = el.name;
+ if (!n) {
+ continue;
+ }
+
+ if (semantic && form.clk && el.type == "image") {
+ // handle image inputs on the fly when semantic == true
+ if(!el.disabled && form.clk == el) {
+ a.push({name: n, value: $(el).val()});
+ a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+ }
+ continue;
+ }
+
+ v = $.fieldValue(el, true);
+ if (v && v.constructor == Array) {
+ for(j=0, jmax=v.length; j < jmax; j++) {
+ a.push({name: n, value: v[j]});
+ }
+ }
+ else if (v !== null && typeof v != 'undefined') {
+ a.push({name: n, value: v});
+ }
+ }
+
+ if (!semantic && form.clk) {
+ // input type=='image' are not found in elements array! handle it here
+ var $input = $(form.clk), input = $input[0];
+ n = input.name;
+ if (n && !input.disabled && input.type == 'image') {
+ a.push({name: n, value: $input.val()});
+ a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
+ }
+ }
+ return a;
+};
+
+/**
+ * Serializes form data into a 'submittable' string. This method will return a string
+ * in the format: name1=value1&name2=value2
+ */
+$.fn.formSerialize = function(semantic) {
+ //hand off to jQuery.param for proper encoding
+ return $.param(this.formToArray(semantic));
+};
+
+/**
+ * Serializes all field elements in the jQuery object into a query string.
+ * This method will return a string in the format: name1=value1&name2=value2
+ */
+$.fn.fieldSerialize = function(successful) {
+ var a = [];
+ this.each(function() {
+ var n = this.name;
+ if (!n) {
+ return;
+ }
+ var v = $.fieldValue(this, successful);
+ if (v && v.constructor == Array) {
+ for (var i=0,max=v.length; i < max; i++) {
+ a.push({name: n, value: v[i]});
+ }
+ }
+ else if (v !== null && typeof v != 'undefined') {
+ a.push({name: this.name, value: v});
+ }
+ });
+ //hand off to jQuery.param for proper encoding
+ return $.param(a);
+};
+
+/**
+ * Returns the value(s) of the element in the matched set. For example, consider the following form:
+ *
+ *
+ *
+ * var v = $(':text').fieldValue();
+ * // if no values are entered into the text inputs
+ * v == ['','']
+ * // if values entered into the text inputs are 'foo' and 'bar'
+ * v == ['foo','bar']
+ *
+ * var v = $(':checkbox').fieldValue();
+ * // if neither checkbox is checked
+ * v === undefined
+ * // if both checkboxes are checked
+ * v == ['B1', 'B2']
+ *
+ * var v = $(':radio').fieldValue();
+ * // if neither radio is checked
+ * v === undefined
+ * // if first radio is checked
+ * v == ['C1']
+ *
+ * The successful argument controls whether or not the field element must be 'successful'
+ * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
+ * The default value of the successful argument is true. If this value is false the value(s)
+ * for each element is returned.
+ *
+ * Note: This method *always* returns an array. If no valid value can be determined the
+ * array will be empty, otherwise it will contain one or more values.
+ */
+$.fn.fieldValue = function(successful) {
+ for (var val=[], i=0, max=this.length; i < max; i++) {
+ var el = this[i];
+ var v = $.fieldValue(el, successful);
+ if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
+ continue;
+ }
+ v.constructor == Array ? $.merge(val, v) : val.push(v);
+ }
+ return val;
+};
+
+/**
+ * Returns the value of the field element.
+ */
+$.fieldValue = function(el, successful) {
+ var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
+ if (successful === undefined) {
+ successful = true;
+ }
+
+ if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
+ (t == 'checkbox' || t == 'radio') && !el.checked ||
+ (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
+ tag == 'select' && el.selectedIndex == -1)) {
+ return null;
+ }
+
+ if (tag == 'select') {
+ var index = el.selectedIndex;
+ if (index < 0) {
+ return null;
+ }
+ var a = [], ops = el.options;
+ var one = (t == 'select-one');
+ var max = (one ? index+1 : ops.length);
+ for(var i=(one ? index : 0); i < max; i++) {
+ var op = ops[i];
+ if (op.selected) {
+ var v = op.value;
+ if (!v) { // extra pain for IE...
+ v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
+ }
+ if (one) {
+ return v;
+ }
+ a.push(v);
+ }
+ }
+ return a;
+ }
+ return $(el).val();
+};
+
+/**
+ * Clears the form data. Takes the following actions on the form's input fields:
+ * - input text fields will have their 'value' property set to the empty string
+ * - select elements will have their 'selectedIndex' property set to -1
+ * - checkbox and radio inputs will have their 'checked' property set to false
+ * - inputs of type submit, button, reset, and hidden will *not* be effected
+ * - button elements will *not* be effected
+ */
+$.fn.clearForm = function() {
+ return this.each(function() {
+ $('input,select,textarea', this).clearFields();
+ });
+};
+
+/**
+ * Clears the selected form elements.
+ */
+$.fn.clearFields = $.fn.clearInputs = function() {
+ return this.each(function() {
+ var t = this.type, tag = this.tagName.toLowerCase();
+ if (t == 'text' || t == 'password' || tag == 'textarea') {
+ this.value = '';
+ }
+ else if (t == 'checkbox' || t == 'radio') {
+ this.checked = false;
+ }
+ else if (tag == 'select') {
+ this.selectedIndex = -1;
+ }
+ });
+};
+
+/**
+ * Resets the form data. Causes all form elements to be reset to their original value.
+ */
+$.fn.resetForm = function() {
+ return this.each(function() {
+ // guard against an input with the name of 'reset'
+ // note that IE reports the reset function as an 'object'
+ if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
+ this.reset();
+ }
+ });
+};
+
+/**
+ * Enables or disables any matching elements.
+ */
+$.fn.enable = function(b) {
+ if (b === undefined) {
+ b = true;
+ }
+ return this.each(function() {
+ this.disabled = !b;
+ });
+};
+
+/**
+ * Checks/unchecks any matching checkboxes or radio buttons and
+ * selects/deselects and matching option elements.
+ */
+$.fn.selected = function(select) {
+ if (select === undefined) {
+ select = true;
+ }
+ return this.each(function() {
+ var t = this.type;
+ if (t == 'checkbox' || t == 'radio') {
+ this.checked = select;
+ }
+ else if (this.tagName.toLowerCase() == 'option') {
+ var $sel = $(this).parent('select');
+ if (select && $sel[0] && $sel[0].type == 'select-one') {
+ // deselect all other options
+ $sel.find('option').selected(false);
+ }
+ this.selected = select;
+ }
+ });
+};
+
+// helper fn for console logging
+// set $.fn.ajaxSubmit.debug to true to enable debug logging
+function log() {
+ if ($.fn.ajaxSubmit.debug) {
+ var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
+ if (window.console && window.console.log) {
+ window.console.log(msg);
+ }
+ else if (window.opera && window.opera.postError) {
+ window.opera.postError(msg);
+ }
+ }
+};
+
+})(jQuery);
diff --git a/img.new-combats.com/js/jx/jquery.js b/img.new-combats.com/js/jx/jquery.js
new file mode 100644
index 00000000..12fc2d4f
--- /dev/null
+++ b/img.new-combats.com/js/jx/jquery.js
@@ -0,0 +1,7179 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$,
+
+ // A central reference to the root jQuery(document)
+ rootjQuery,
+
+ // A simple way to check for HTML strings or ID strings
+ // (both of which we optimize for)
+ quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
+
+ // Is it a simple selector
+ isSimple = /^.[^:#\[\.,]*$/,
+
+ // Check if a string has a non-whitespace character in it
+ rnotwhite = /\S/,
+ rwhite = /\s/,
+
+ // Used for trimming whitespace
+ trimLeft = /^\s+/,
+ trimRight = /\s+$/,
+
+ // Check for non-word characters
+ rnonword = /\W/,
+
+ // Check for digits
+ rdigit = /\d/,
+
+ // Match a standalone tag
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+ // JSON RegExp
+ rvalidchars = /^[\],:{}\s]*$/,
+ rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+ rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+ // Useragent RegExp
+ rwebkit = /(webkit)[ \/]([\w.]+)/,
+ ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+ rmsie = /(msie) ([\w.]+)/,
+ rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+ // Keep a UserAgent string for use with jQuery.browser
+ userAgent = navigator.userAgent,
+
+ // For matching the engine and version of the browser
+ browserMatch,
+
+ // Has the ready events already been bound?
+ readyBound = false,
+
+ // The functions to execute on DOM ready
+ readyList = [],
+
+ // The ready event handler
+ DOMContentLoaded,
+
+ // Save a reference to some core methods
+ toString = Object.prototype.toString,
+ hasOwn = Object.prototype.hasOwnProperty,
+ push = Array.prototype.push,
+ slice = Array.prototype.slice,
+ trim = String.prototype.trim,
+ indexOf = Array.prototype.indexOf,
+
+ // [[Class]] -> type pairs
+ class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+ init: function( selector, context ) {
+ var match, elem, ret, doc;
+
+ // Handle $(""), $(null), or $(undefined)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle $(DOMElement)
+ if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+ }
+
+ // The body element only exists once, optimize finding it
+ if ( selector === "body" && !context && document.body ) {
+ this.context = document;
+ this[0] = document.body;
+ this.selector = "body";
+ this.length = 1;
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ // Are we dealing with HTML string or an ID?
+ match = quickExpr.exec( selector );
+
+ // Verify a match, and that no context was specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ doc = (context ? context.ownerDocument || context : document);
+
+ // If a single string is passed in and it's a single tag
+ // just do a createElement and skip the rest
+ ret = rsingleTag.exec( selector );
+
+ if ( ret ) {
+ if ( jQuery.isPlainObject( context ) ) {
+ selector = [ document.createElement( ret[1] ) ];
+ jQuery.fn.attr.call( selector, context, true );
+
+ } else {
+ selector = [ doc.createElement( ret[1] ) ];
+ }
+
+ } else {
+ ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+ selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
+ }
+
+ return jQuery.merge( this, selector );
+
+ // HANDLE: $("#id")
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id !== match[2] ) {
+ return rootjQuery.find( selector );
+ }
+
+ // Otherwise, we inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $("TAG")
+ } else if ( !context && !rnonword.test( selector ) ) {
+ this.selector = selector;
+ this.context = document;
+ selector = document.getElementsByTagName( selector );
+ return jQuery.merge( this, selector );
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return (context || rootjQuery).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return jQuery( context ).find( selector );
+ }
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return rootjQuery.ready( selector );
+ }
+
+ if (selector.selector !== undefined) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ },
+
+ // Start with an empty selector
+ selector: "",
+
+ // The current version of jQuery being used
+ jquery: "1.4.4",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ // The number of elements contained in the matched element set
+ size: function() {
+ return this.length;
+ },
+
+ toArray: function() {
+ return slice.call( this, 0 );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num == null ?
+
+ // Return a 'clean' array
+ this.toArray() :
+
+ // Return just the object
+ ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems, name, selector ) {
+ // Build a new jQuery matched element set
+ var ret = jQuery();
+
+ if ( jQuery.isArray( elems ) ) {
+ push.apply( ret, elems );
+
+ } else {
+ jQuery.merge( ret, elems );
+ }
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ ret.context = this.context;
+
+ if ( name === "find" ) {
+ ret.selector = this.selector + (this.selector ? " " : "") + selector;
+ } else if ( name ) {
+ ret.selector = this.selector + "." + name + "(" + selector + ")";
+ }
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ ready: function( fn ) {
+ // Attach the listeners
+ jQuery.bindReady();
+
+ // If the DOM is already ready
+ if ( jQuery.isReady ) {
+ // Execute the function immediately
+ fn.call( document, jQuery );
+
+ // Otherwise, remember the function for later
+ } else if ( readyList ) {
+ // Add the function to the wait list
+ readyList.push( fn );
+ }
+
+ return this;
+ },
+
+ eq: function( i ) {
+ return i === -1 ?
+ this.slice( i ) :
+ this.slice( i, +i + 1 );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ),
+ "slice", slice.call(arguments).join(",") );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ end: function() {
+ return this.prevObject || jQuery(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: [].sort,
+ splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+ target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( length === i ) {
+ target = this;
+ --i;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ noConflict: function( deep ) {
+ window.$ = _$;
+
+ if ( deep ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+ },
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+ // A third-party is pushing the ready event forwards
+ if ( wait === true ) {
+ jQuery.readyWait--;
+ }
+
+ // Make sure that the DOM is not already loaded
+ if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( !document.body ) {
+ return setTimeout( jQuery.ready, 1 );
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ if ( readyList ) {
+ // Execute all of them
+ var fn,
+ i = 0,
+ ready = readyList;
+
+ // Reset the list of functions
+ readyList = null;
+
+ while ( (fn = ready[ i++ ]) ) {
+ fn.call( document, jQuery );
+ }
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.trigger ) {
+ jQuery( document ).trigger( "ready" ).unbind( "ready" );
+ }
+ }
+ }
+ },
+
+ bindReady: function() {
+ if ( readyBound ) {
+ return;
+ }
+
+ readyBound = true;
+
+ // Catch cases where $(document).ready() is called after the
+ // browser event has already occurred.
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ return setTimeout( jQuery.ready, 1 );
+ }
+
+ // Mozilla, Opera and webkit nightlies currently support this event
+ if ( document.addEventListener ) {
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", jQuery.ready, false );
+
+ // If IE event model is used
+ } else if ( document.attachEvent ) {
+ // ensure firing before onload,
+ // maybe late but safe also for iframes
+ document.attachEvent("onreadystatechange", DOMContentLoaded);
+
+ // A fallback to window.onload, that will always work
+ window.attachEvent( "onload", jQuery.ready );
+
+ // If IE and not a frame
+ // continually check to see if the document is ready
+ var toplevel = false;
+
+ try {
+ toplevel = window.frameElement == null;
+ } catch(e) {}
+
+ if ( document.documentElement.doScroll && toplevel ) {
+ doScrollCheck();
+ }
+ }
+ },
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray || function( obj ) {
+ return jQuery.type(obj) === "array";
+ },
+
+ // A crude way of determining if an object is a window
+ isWindow: function( obj ) {
+ return obj && typeof obj === "object" && "setInterval" in obj;
+ },
+
+ isNaN: function( obj ) {
+ return obj == null || !rdigit.test( obj ) || isNaN( obj );
+ },
+
+ type: function( obj ) {
+ return obj == null ?
+ String( obj ) :
+ class2type[ toString.call(obj) ] || "object";
+ },
+
+ isPlainObject: function( obj ) {
+ // Must be an Object.
+ // Because of IE, we also have to check the presence of the constructor property.
+ // Make sure that DOM nodes and window objects don't pass through, as well
+ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !hasOwn.call(obj, "constructor") &&
+ !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+ return false;
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own.
+
+ var key;
+ for ( key in obj ) {}
+
+ return key === undefined || hasOwn.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ for ( var name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ error: function( msg ) {
+ throw msg;
+ },
+
+ parseJSON: function( data ) {
+ if ( typeof data !== "string" || !data ) {
+ return null;
+ }
+
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
+ data = jQuery.trim( data );
+
+ // Make sure the incoming data is actual JSON
+ // Logic borrowed from http://json.org/json2.js
+ if ( rvalidchars.test(data.replace(rvalidescape, "@")
+ .replace(rvalidtokens, "]")
+ .replace(rvalidbraces, "")) ) {
+
+ // Try to use the native JSON parser first
+ return window.JSON && window.JSON.parse ?
+ window.JSON.parse( data ) :
+ (new Function("return " + data))();
+
+ } else {
+ jQuery.error( "Invalid JSON: " + data );
+ }
+ },
+
+ noop: function() {},
+
+ // Evalulates a script in a global context
+ globalEval: function( data ) {
+ if ( data && rnotwhite.test(data) ) {
+ // Inspired by code by Andrea Giammarchi
+ // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
+ var head = document.getElementsByTagName("head")[0] || document.documentElement,
+ script = document.createElement("script");
+
+ script.type = "text/javascript";
+
+ if ( jQuery.support.scriptEval ) {
+ script.appendChild( document.createTextNode( data ) );
+ } else {
+ script.text = data;
+ }
+
+ // Use insertBefore instead of appendChild to circumvent an IE6 bug.
+ // This arises when a base node is used (#2709).
+ head.insertBefore( script, head.firstChild );
+ head.removeChild( script );
+ }
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+ },
+
+ // args is for internal usage only
+ each: function( object, callback, args ) {
+ var name, i = 0,
+ length = object.length,
+ isObj = length === undefined || jQuery.isFunction(object);
+
+ if ( args ) {
+ if ( isObj ) {
+ for ( name in object ) {
+ if ( callback.apply( object[ name ], args ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( ; i < length; ) {
+ if ( callback.apply( object[ i++ ], args ) === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isObj ) {
+ for ( name in object ) {
+ if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( var value = object[0];
+ i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
+ }
+ }
+
+ return object;
+ },
+
+ // Use native String.trim function wherever possible
+ trim: trim ?
+ function( text ) {
+ return text == null ?
+ "" :
+ trim.call( text );
+ } :
+
+ // Otherwise use our own trimming functionality
+ function( text ) {
+ return text == null ?
+ "" :
+ text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( array, results ) {
+ var ret = results || [];
+
+ if ( array != null ) {
+ // The window, strings (and functions) also have 'length'
+ // The extra typeof function check is to prevent crashes
+ // in Safari 2 (See: #3039)
+ // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+ var type = jQuery.type(array);
+
+ if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+ push.call( ret, array );
+ } else {
+ jQuery.merge( ret, array );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, array ) {
+ if ( array.indexOf ) {
+ return array.indexOf( elem );
+ }
+
+ for ( var i = 0, length = array.length; i < length; i++ ) {
+ if ( array[ i ] === elem ) {
+ return i;
+ }
+ }
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ var i = first.length,
+ j = 0;
+
+ if ( typeof second.length === "number" ) {
+ for ( var l = second.length; j < l; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ } else {
+ while ( second[j] !== undefined ) {
+ first[ i++ ] = second[ j++ ];
+ }
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, inv ) {
+ var ret = [], retVal;
+ inv = !!inv;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( var i = 0, length = elems.length; i < length; i++ ) {
+ retVal = !!callback( elems[ i ], i );
+ if ( inv !== retVal ) {
+ ret.push( elems[ i ] );
+ }
+ }
+
+ return ret;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var ret = [], value;
+
+ // Go through the array, translating each of the items to their
+ // new value (or values).
+ for ( var i = 0, length = elems.length; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+
+ return ret.concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ proxy: function( fn, proxy, thisObject ) {
+ if ( arguments.length === 2 ) {
+ if ( typeof proxy === "string" ) {
+ thisObject = fn;
+ fn = thisObject[ proxy ];
+ proxy = undefined;
+
+ } else if ( proxy && !jQuery.isFunction( proxy ) ) {
+ thisObject = proxy;
+ proxy = undefined;
+ }
+ }
+
+ if ( !proxy && fn ) {
+ proxy = function() {
+ return fn.apply( thisObject || this, arguments );
+ };
+ }
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ if ( fn ) {
+ proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+ }
+
+ // So proxy can be declared as an argument
+ return proxy;
+ },
+
+ // Mutifunctional method to get and set values to a collection
+ // The value/s can be optionally by executed if its a function
+ access: function( elems, key, value, exec, fn, pass ) {
+ var length = elems.length;
+
+ // Setting many attributes
+ if ( typeof key === "object" ) {
+ for ( var k in key ) {
+ jQuery.access( elems, k, key[k], exec, fn, value );
+ }
+ return elems;
+ }
+
+ // Setting one attribute
+ if ( value !== undefined ) {
+ // Optionally, function values get executed if exec is true
+ exec = !pass && exec && jQuery.isFunction(value);
+
+ for ( var i = 0; i < length; i++ ) {
+ fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+ }
+
+ return elems;
+ }
+
+ // Getting an attribute
+ return length ? fn( elems[0], key ) : undefined;
+ },
+
+ now: function() {
+ return (new Date()).getTime();
+ },
+
+ // Use of jQuery.browser is frowned upon.
+ // More details: http://docs.jquery.com/Utilities/jQuery.browser
+ uaMatch: function( ua ) {
+ ua = ua.toLowerCase();
+
+ var match = rwebkit.exec( ua ) ||
+ ropera.exec( ua ) ||
+ rmsie.exec( ua ) ||
+ ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+ [];
+
+ return { browser: match[1] || "", version: match[2] || "0" };
+ },
+
+ browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+ jQuery.browser[ browserMatch.browser ] = true;
+ jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+ jQuery.browser.safari = true;
+}
+
+if ( indexOf ) {
+ jQuery.inArray = function( elem, array ) {
+ return indexOf.call( array, elem );
+ };
+}
+
+// Verify that \s matches non-breaking spaces
+// (IE fails on this test)
+if ( !rwhite.test( "\xA0" ) ) {
+ trimLeft = /^[\s\xA0]+/;
+ trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+ DOMContentLoaded = function() {
+ document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+ jQuery.ready();
+ };
+
+} else if ( document.attachEvent ) {
+ DOMContentLoaded = function() {
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( document.readyState === "complete" ) {
+ document.detachEvent( "onreadystatechange", DOMContentLoaded );
+ jQuery.ready();
+ }
+ };
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+ if ( jQuery.isReady ) {
+ return;
+ }
+
+ try {
+ // If IE is used, use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ document.documentElement.doScroll("left");
+ } catch(e) {
+ setTimeout( doScrollCheck, 1 );
+ return;
+ }
+
+ // and execute any waiting functions
+ jQuery.ready();
+}
+
+// Expose jQuery to the global object
+return (window.jQuery = window.$ = jQuery);
+
+})();
+
+
+(function() {
+
+ jQuery.support = {};
+
+ var root = document.documentElement,
+ script = document.createElement("script"),
+ div = document.createElement("div"),
+ id = "script" + jQuery.now();
+
+ div.style.display = "none";
+ div.innerHTML = "
a";
+
+ var all = div.getElementsByTagName("*"),
+ a = div.getElementsByTagName("a")[0],
+ select = document.createElement("select"),
+ opt = select.appendChild( document.createElement("option") );
+
+ // Can't get basic test support
+ if ( !all || !all.length || !a ) {
+ return;
+ }
+
+ jQuery.support = {
+ // IE strips leading whitespace when .innerHTML is used
+ leadingWhitespace: div.firstChild.nodeType === 3,
+
+ // Make sure that tbody elements aren't automatically inserted
+ // IE will insert them into empty tables
+ tbody: !div.getElementsByTagName("tbody").length,
+
+ // Make sure that link elements get serialized correctly by innerHTML
+ // This requires a wrapper element in IE
+ htmlSerialize: !!div.getElementsByTagName("link").length,
+
+ // Get the style information from getAttribute
+ // (IE uses .cssText insted)
+ style: /red/.test( a.getAttribute("style") ),
+
+ // Make sure that URLs aren't manipulated
+ // (IE normalizes it by default)
+ hrefNormalized: a.getAttribute("href") === "/a",
+
+ // Make sure that element opacity exists
+ // (IE uses filter instead)
+ // Use a regex to work around a WebKit issue. See #5145
+ opacity: /^0.55$/.test( a.style.opacity ),
+
+ // Verify style float existence
+ // (IE uses styleFloat instead of cssFloat)
+ cssFloat: !!a.style.cssFloat,
+
+ // Make sure that if no value is specified for a checkbox
+ // that it defaults to "on".
+ // (WebKit defaults to "" instead)
+ checkOn: div.getElementsByTagName("input")[0].value === "on",
+
+ // Make sure that a selected-by-default option has a working selected property.
+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+ optSelected: opt.selected,
+
+ // Will be defined later
+ deleteExpando: true,
+ optDisabled: false,
+ checkClone: false,
+ scriptEval: false,
+ noCloneEvent: true,
+ boxModel: null,
+ inlineBlockNeedsLayout: false,
+ shrinkWrapBlocks: false,
+ reliableHiddenOffsets: true
+ };
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as diabled)
+ select.disabled = true;
+ jQuery.support.optDisabled = !opt.disabled;
+
+ script.type = "text/javascript";
+ try {
+ script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
+ } catch(e) {}
+
+ root.insertBefore( script, root.firstChild );
+
+ // Make sure that the execution of code works by injecting a script
+ // tag with appendChild/createTextNode
+ // (IE doesn't support this, fails, and uses .text instead)
+ if ( window[ id ] ) {
+ jQuery.support.scriptEval = true;
+ delete window[ id ];
+ }
+
+ // Test to see if it's possible to delete an expando from an element
+ // Fails in Internet Explorer
+ try {
+ delete script.test;
+
+ } catch(e) {
+ jQuery.support.deleteExpando = false;
+ }
+
+ root.removeChild( script );
+
+ if ( div.attachEvent && div.fireEvent ) {
+ div.attachEvent("onclick", function click() {
+ // Cloning a node shouldn't copy over any
+ // bound event handlers (IE does this)
+ jQuery.support.noCloneEvent = false;
+ div.detachEvent("onclick", click);
+ });
+ div.cloneNode(true).fireEvent("onclick");
+ }
+
+ div = document.createElement("div");
+ div.innerHTML = "";
+
+ var fragment = document.createDocumentFragment();
+ fragment.appendChild( div.firstChild );
+
+ // WebKit doesn't clone checked state correctly in fragments
+ jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
+
+ // Figure out if the W3C box model works as expected
+ // document.body must exist before we can do this
+ jQuery(function() {
+ var div = document.createElement("div");
+ div.style.width = div.style.paddingLeft = "1px";
+
+ document.body.appendChild( div );
+ jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
+
+ if ( "zoom" in div.style ) {
+ // Check if natively block-level elements act like inline-block
+ // elements when setting their display to 'inline' and giving
+ // them layout
+ // (IE < 8 does this)
+ div.style.display = "inline";
+ div.style.zoom = 1;
+ jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
+
+ // Check if elements with layout shrink-wrap their children
+ // (IE 6 does this)
+ div.style.display = "";
+ div.innerHTML = "";
+ jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
+ }
+
+ div.innerHTML = "
t
";
+ var tds = div.getElementsByTagName("td");
+
+ // Check if table cells still have offsetWidth/Height when they are set
+ // to display:none and there are still other visible table cells in a
+ // table row; if so, offsetWidth/Height are not reliable for use when
+ // determining if an element has been hidden directly using
+ // display:none (it is still safe to use offsets if a parent element is
+ // hidden; don safety goggles and see bug #4512 for more information).
+ // (only IE 8 fails this test)
+ jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
+
+ tds[0].style.display = "";
+ tds[1].style.display = "none";
+
+ // Check if empty table cells still have offsetWidth/Height
+ // (IE < 8 fail this test)
+ jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
+ div.innerHTML = "";
+
+ document.body.removeChild( div ).style.display = "none";
+ div = tds = null;
+ });
+
+ // Technique from Juriy Zaytsev
+ // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+ var eventSupported = function( eventName ) {
+ var el = document.createElement("div");
+ eventName = "on" + eventName;
+
+ var isSupported = (eventName in el);
+ if ( !isSupported ) {
+ el.setAttribute(eventName, "return;");
+ isSupported = typeof el[eventName] === "function";
+ }
+ el = null;
+
+ return isSupported;
+ };
+
+ jQuery.support.submitBubbles = eventSupported("submit");
+ jQuery.support.changeBubbles = eventSupported("change");
+
+ // release memory in IE
+ root = script = div = all = a = null;
+})();
+
+
+
+var windowData = {},
+ rbrace = /^(?:\{.*\}|\[.*\])$/;
+
+jQuery.extend({
+ cache: {},
+
+ // Please use with caution
+ uuid: 0,
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + jQuery.now(),
+
+ // The following elements throw uncatchable exceptions if you
+ // attempt to add expando properties to them.
+ noData: {
+ "embed": true,
+ // Ban all objects except for Flash (which handle expandos)
+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+ "applet": true
+ },
+
+ data: function( elem, name, data ) {
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ elem = elem == window ?
+ windowData :
+ elem;
+
+ var isNode = elem.nodeType,
+ id = isNode ? elem[ jQuery.expando ] : null,
+ cache = jQuery.cache, thisCache;
+
+ if ( isNode && !id && typeof name === "string" && data === undefined ) {
+ return;
+ }
+
+ // Get the data from the object directly
+ if ( !isNode ) {
+ cache = elem;
+
+ // Compute a unique ID for the element
+ } else if ( !id ) {
+ elem[ jQuery.expando ] = id = ++jQuery.uuid;
+ }
+
+ // Avoid generating a new cache unless none exists and we
+ // want to manipulate it.
+ if ( typeof name === "object" ) {
+ if ( isNode ) {
+ cache[ id ] = jQuery.extend(cache[ id ], name);
+
+ } else {
+ jQuery.extend( cache, name );
+ }
+
+ } else if ( isNode && !cache[ id ] ) {
+ cache[ id ] = {};
+ }
+
+ thisCache = isNode ? cache[ id ] : cache;
+
+ // Prevent overriding the named cache with undefined values
+ if ( data !== undefined ) {
+ thisCache[ name ] = data;
+ }
+
+ return typeof name === "string" ? thisCache[ name ] : thisCache;
+ },
+
+ removeData: function( elem, name ) {
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ elem = elem == window ?
+ windowData :
+ elem;
+
+ var isNode = elem.nodeType,
+ id = isNode ? elem[ jQuery.expando ] : elem,
+ cache = jQuery.cache,
+ thisCache = isNode ? cache[ id ] : id;
+
+ // If we want to remove a specific section of the element's data
+ if ( name ) {
+ if ( thisCache ) {
+ // Remove the section of cache data
+ delete thisCache[ name ];
+
+ // If we've removed all the data, remove the element's cache
+ if ( isNode && jQuery.isEmptyObject(thisCache) ) {
+ jQuery.removeData( elem );
+ }
+ }
+
+ // Otherwise, we want to remove all of the element's data
+ } else {
+ if ( isNode && jQuery.support.deleteExpando ) {
+ delete elem[ jQuery.expando ];
+
+ } else if ( elem.removeAttribute ) {
+ elem.removeAttribute( jQuery.expando );
+
+ // Completely remove the data cache
+ } else if ( isNode ) {
+ delete cache[ id ];
+
+ // Remove all fields from the object
+ } else {
+ for ( var n in elem ) {
+ delete elem[ n ];
+ }
+ }
+ }
+ },
+
+ // A method for determining if a DOM node can handle the data expando
+ acceptData: function( elem ) {
+ if ( elem.nodeName ) {
+ var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+ if ( match ) {
+ return !(match === true || elem.getAttribute("classid") !== match);
+ }
+ }
+
+ return true;
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var data = null;
+
+ if ( typeof key === "undefined" ) {
+ if ( this.length ) {
+ var attr = this[0].attributes, name;
+ data = jQuery.data( this[0] );
+
+ for ( var i = 0, l = attr.length; i < l; i++ ) {
+ name = attr[i].name;
+
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = name.substr( 5 );
+ dataAttr( this[0], name, data[ name ] );
+ }
+ }
+ }
+
+ return data;
+
+ } else if ( typeof key === "object" ) {
+ return this.each(function() {
+ jQuery.data( this, key );
+ });
+ }
+
+ var parts = key.split(".");
+ parts[1] = parts[1] ? "." + parts[1] : "";
+
+ if ( value === undefined ) {
+ data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+ // Try to fetch any internally stored data first
+ if ( data === undefined && this.length ) {
+ data = jQuery.data( this[0], key );
+ data = dataAttr( this[0], key, data );
+ }
+
+ return data === undefined && parts[1] ?
+ this.data( parts[0] ) :
+ data;
+
+ } else {
+ return this.each(function() {
+ var $this = jQuery( this ),
+ args = [ parts[0], value ];
+
+ $this.triggerHandler( "setData" + parts[1] + "!", args );
+ jQuery.data( this, key, value );
+ $this.triggerHandler( "changeData" + parts[1] + "!", args );
+ });
+ }
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ jQuery.removeData( this, key );
+ });
+ }
+});
+
+function dataAttr( elem, key, data ) {
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ data = elem.getAttribute( "data-" + key );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ !jQuery.isNaN( data ) ? parseFloat( data ) :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ jQuery.data( elem, key, data );
+
+ } else {
+ data = undefined;
+ }
+ }
+
+ return data;
+}
+
+
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ if ( !elem ) {
+ return;
+ }
+
+ type = (type || "fx") + "queue";
+ var q = jQuery.data( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( !data ) {
+ return q || [];
+ }
+
+ if ( !q || jQuery.isArray(data) ) {
+ q = jQuery.data( elem, type, jQuery.makeArray(data) );
+
+ } else {
+ q.push( data );
+ }
+
+ return q;
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ fn = queue.shift();
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ }
+
+ if ( fn ) {
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift("inprogress");
+ }
+
+ fn.call(elem, function() {
+ jQuery.dequeue(elem, type);
+ });
+ }
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ }
+
+ if ( data === undefined ) {
+ return jQuery.queue( this[0], type );
+ }
+ return this.each(function( i ) {
+ var queue = jQuery.queue( this, type, data );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+
+ // Based off of the plugin by Clint Helfers, with permission.
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
+ delay: function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function() {
+ var elem = this;
+ setTimeout(function() {
+ jQuery.dequeue( elem, type );
+ }, time );
+ });
+ },
+
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ }
+});
+
+
+
+
+var rclass = /[\n\t]/g,
+ rspaces = /\s+/,
+ rreturn = /\r/g,
+ rspecialurl = /^(?:href|src|style)$/,
+ rtype = /^(?:button|input)$/i,
+ rfocusable = /^(?:button|input|object|select|textarea)$/i,
+ rclickable = /^a(?:rea)?$/i,
+ rradiocheck = /^(?:radio|checkbox)$/i;
+
+jQuery.props = {
+ "for": "htmlFor",
+ "class": "className",
+ readonly: "readOnly",
+ maxlength: "maxLength",
+ cellspacing: "cellSpacing",
+ rowspan: "rowSpan",
+ colspan: "colSpan",
+ tabindex: "tabIndex",
+ usemap: "useMap",
+ frameborder: "frameBorder"
+};
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return jQuery.access( this, name, value, true, jQuery.attr );
+ },
+
+ removeAttr: function( name, fn ) {
+ return this.each(function(){
+ jQuery.attr( this, name, "" );
+ if ( this.nodeType === 1 ) {
+ this.removeAttribute( name );
+ }
+ });
+ },
+
+ addClass: function( value ) {
+ if ( jQuery.isFunction(value) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ self.addClass( value.call(this, i, self.attr("class")) );
+ });
+ }
+
+ if ( value && typeof value === "string" ) {
+ var classNames = (value || "").split( rspaces );
+
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ var elem = this[i];
+
+ if ( elem.nodeType === 1 ) {
+ if ( !elem.className ) {
+ elem.className = value;
+
+ } else {
+ var className = " " + elem.className + " ",
+ setClass = elem.className;
+
+ for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+ if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
+ setClass += " " + classNames[c];
+ }
+ }
+ elem.className = jQuery.trim( setClass );
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ if ( jQuery.isFunction(value) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ self.removeClass( value.call(this, i, self.attr("class")) );
+ });
+ }
+
+ if ( (value && typeof value === "string") || value === undefined ) {
+ var classNames = (value || "").split( rspaces );
+
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ var elem = this[i];
+
+ if ( elem.nodeType === 1 && elem.className ) {
+ if ( value ) {
+ var className = (" " + elem.className + " ").replace(rclass, " ");
+ for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
+ className = className.replace(" " + classNames[c] + " ", " ");
+ }
+ elem.className = jQuery.trim( className );
+
+ } else {
+ elem.className = "";
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value,
+ isBool = typeof stateVal === "boolean";
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ state = stateVal,
+ classNames = value.split( rspaces );
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space seperated list
+ state = isBool ? state : !self.hasClass( className );
+ self[ state ? "addClass" : "removeClass" ]( className );
+ }
+
+ } else if ( type === "undefined" || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ jQuery.data( this, "__className__", this.className );
+ }
+
+ // toggle whole className
+ this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ";
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ val: function( value ) {
+ if ( !arguments.length ) {
+ var elem = this[0];
+
+ if ( elem ) {
+ if ( jQuery.nodeName( elem, "option" ) ) {
+ // attributes.value is undefined in Blackberry 4.7 but
+ // uses .value. See #6932
+ var val = elem.attributes.value;
+ return !val || val.specified ? elem.value : elem.text;
+ }
+
+ // We need to handle select boxes special
+ if ( jQuery.nodeName( elem, "select" ) ) {
+ var index = elem.selectedIndex,
+ values = [],
+ options = elem.options,
+ one = elem.type === "select-one";
+
+ // Nothing was selected
+ if ( index < 0 ) {
+ return null;
+ }
+
+ // Loop through all the selected options
+ for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+ var option = options[ i ];
+
+ // Don't return options that are disabled or in a disabled optgroup
+ if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+ (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+ // Get the specific value for the option
+ value = jQuery(option).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ }
+
+ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+ if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ }
+
+
+ // Everything else, we just grab the value
+ return (elem.value || "").replace(rreturn, "");
+
+ }
+
+ return undefined;
+ }
+
+ var isFunction = jQuery.isFunction(value);
+
+ return this.each(function(i) {
+ var self = jQuery(this), val = value;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call(this, i, self.val());
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+ } else if ( typeof val === "number" ) {
+ val += "";
+ } else if ( jQuery.isArray(val) ) {
+ val = jQuery.map(val, function (value) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
+ this.checked = jQuery.inArray( self.val(), val ) >= 0;
+
+ } else if ( jQuery.nodeName( this, "select" ) ) {
+ var values = jQuery.makeArray(val);
+
+ jQuery( "option", this ).each(function() {
+ this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+ });
+
+ if ( !values.length ) {
+ this.selectedIndex = -1;
+ }
+
+ } else {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ attrFn: {
+ val: true,
+ css: true,
+ html: true,
+ text: true,
+ data: true,
+ width: true,
+ height: true,
+ offset: true
+ },
+
+ attr: function( elem, name, value, pass ) {
+ // don't set attributes on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return undefined;
+ }
+
+ if ( pass && name in jQuery.attrFn ) {
+ return jQuery(elem)[name](value);
+ }
+
+ var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
+ // Whether we are setting (or getting)
+ set = value !== undefined;
+
+ // Try to normalize/fix the name
+ name = notxml && jQuery.props[ name ] || name;
+
+ // These attributes require special treatment
+ var special = rspecialurl.test( name );
+
+ // Safari mis-reports the default selected property of an option
+ // Accessing the parent's selectedIndex property fixes it
+ if ( name === "selected" && !jQuery.support.optSelected ) {
+ var parent = elem.parentNode;
+ if ( parent ) {
+ parent.selectedIndex;
+
+ // Make sure that it also works with optgroups, see #5701
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ }
+
+ // If applicable, access the attribute via the DOM 0 way
+ // 'in' checks fail in Blackberry 4.7 #6931
+ if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
+ if ( set ) {
+ // We can't allow the type property to be changed (since it causes problems in IE)
+ if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
+ jQuery.error( "type property can't be changed" );
+ }
+
+ if ( value === null ) {
+ if ( elem.nodeType === 1 ) {
+ elem.removeAttribute( name );
+ }
+
+ } else {
+ elem[ name ] = value;
+ }
+ }
+
+ // browsers index elements by id/name on forms, give priority to attributes.
+ if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
+ return elem.getAttributeNode( name ).nodeValue;
+ }
+
+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ if ( name === "tabIndex" ) {
+ var attributeNode = elem.getAttributeNode( "tabIndex" );
+
+ return attributeNode && attributeNode.specified ?
+ attributeNode.value :
+ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+ 0 :
+ undefined;
+ }
+
+ return elem[ name ];
+ }
+
+ if ( !jQuery.support.style && notxml && name === "style" ) {
+ if ( set ) {
+ elem.style.cssText = "" + value;
+ }
+
+ return elem.style.cssText;
+ }
+
+ if ( set ) {
+ // convert the value to a string (all browsers do this but IE) see #1070
+ elem.setAttribute( name, "" + value );
+ }
+
+ // Ensure that missing attributes return undefined
+ // Blackberry 4.7 returns "" from getAttribute #6938
+ if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
+ return undefined;
+ }
+
+ var attr = !jQuery.support.hrefNormalized && notxml && special ?
+ // Some attributes require a special call on IE
+ elem.getAttribute( name, 2 ) :
+ elem.getAttribute( name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return attr === null ? undefined : attr;
+ }
+});
+
+
+
+
+var rnamespaces = /\.(.*)$/,
+ rformElems = /^(?:textarea|input|select)$/i,
+ rperiod = /\./g,
+ rspace = / /g,
+ rescape = /[^\w\s.|`]/g,
+ fcleanup = function( nm ) {
+ return nm.replace(rescape, "\\$&");
+ },
+ focusCounts = { focusin: 0, focusout: 0 };
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+ // Bind an event to an element
+ // Original by Dean Edwards
+ add: function( elem, types, handler, data ) {
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // For whatever reason, IE has trouble passing the window object
+ // around, causing it to be cloned in the process
+ if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
+ elem = window;
+ }
+
+ if ( handler === false ) {
+ handler = returnFalse;
+ } else if ( !handler ) {
+ // Fixes bug #7229. Fix recommended by jdalton
+ return;
+ }
+
+ var handleObjIn, handleObj;
+
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ }
+
+ // Make sure that the function being executed has a unique ID
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure
+ var elemData = jQuery.data( elem );
+
+ // If no elemData is found then we must be trying to bind to one of the
+ // banned noData elements
+ if ( !elemData ) {
+ return;
+ }
+
+ // Use a key less likely to result in collisions for plain JS objects.
+ // Fixes bug #7150.
+ var eventKey = elem.nodeType ? "events" : "__events__",
+ events = elemData[ eventKey ],
+ eventHandle = elemData.handle;
+
+ if ( typeof events === "function" ) {
+ // On plain objects events is a fn that holds the the data
+ // which prevents this data from being JSON serialized
+ // the function does not need to be called, it just contains the data
+ eventHandle = events.handle;
+ events = events.events;
+
+ } else if ( !events ) {
+ if ( !elem.nodeType ) {
+ // On plain objects, create a fn that acts as the holder
+ // of the values to avoid JSON serialization of event data
+ elemData[ eventKey ] = elemData = function(){};
+ }
+
+ elemData.events = events = {};
+ }
+
+ if ( !eventHandle ) {
+ elemData.handle = eventHandle = function() {
+ // Handle the second event of a trigger and when
+ // an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
+ jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+ undefined;
+ };
+ }
+
+ // Add elem as a property of the handle function
+ // This is to prevent a memory leak with non-native events in IE.
+ eventHandle.elem = elem;
+
+ // Handle multiple events separated by a space
+ // jQuery(...).bind("mouseover mouseout", fn);
+ types = types.split(" ");
+
+ var type, i = 0, namespaces;
+
+ while ( (type = types[ i++ ]) ) {
+ handleObj = handleObjIn ?
+ jQuery.extend({}, handleObjIn) :
+ { handler: handler, data: data };
+
+ // Namespaced event handlers
+ if ( type.indexOf(".") > -1 ) {
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+ } else {
+ namespaces = [];
+ handleObj.namespace = "";
+ }
+
+ handleObj.type = type;
+ if ( !handleObj.guid ) {
+ handleObj.guid = handler.guid;
+ }
+
+ // Get the current list of functions bound to this event
+ var handlers = events[ type ],
+ special = jQuery.event.special[ type ] || {};
+
+ // Init the event handler queue
+ if ( !handlers ) {
+ handlers = events[ type ] = [];
+
+ // Check for a special event handler
+ // Only use addEventListener/attachEvent if the special
+ // events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ // Bind the global event handler to the element
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+
+ } else if ( elem.attachEvent ) {
+ elem.attachEvent( "on" + type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add the function to the element's handler list
+ handlers.push( handleObj );
+
+ // Keep track of which events have been used, for global triggering
+ jQuery.event.global[ type ] = true;
+ }
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ global: {},
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, pos ) {
+ // don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ if ( handler === false ) {
+ handler = returnFalse;
+ }
+
+ var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+ eventKey = elem.nodeType ? "events" : "__events__",
+ elemData = jQuery.data( elem ),
+ events = elemData && elemData[ eventKey ];
+
+ if ( !elemData || !events ) {
+ return;
+ }
+
+ if ( typeof events === "function" ) {
+ elemData = events;
+ events = events.events;
+ }
+
+ // types is actually an event object here
+ if ( types && types.type ) {
+ handler = types.handler;
+ types = types.type;
+ }
+
+ // Unbind all events for the element
+ if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+ types = types || "";
+
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types );
+ }
+
+ return;
+ }
+
+ // Handle multiple events separated by a space
+ // jQuery(...).unbind("mouseover mouseout", fn);
+ types = types.split(" ");
+
+ while ( (type = types[ i++ ]) ) {
+ origType = type;
+ handleObj = null;
+ all = type.indexOf(".") < 0;
+ namespaces = [];
+
+ if ( !all ) {
+ // Namespaced event handlers
+ namespaces = type.split(".");
+ type = namespaces.shift();
+
+ namespace = new RegExp("(^|\\.)" +
+ jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+ }
+
+ eventType = events[ type ];
+
+ if ( !eventType ) {
+ continue;
+ }
+
+ if ( !handler ) {
+ for ( j = 0; j < eventType.length; j++ ) {
+ handleObj = eventType[ j ];
+
+ if ( all || namespace.test( handleObj.namespace ) ) {
+ jQuery.event.remove( elem, origType, handleObj.handler, j );
+ eventType.splice( j--, 1 );
+ }
+ }
+
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+
+ for ( j = pos || 0; j < eventType.length; j++ ) {
+ handleObj = eventType[ j ];
+
+ if ( handler.guid === handleObj.guid ) {
+ // remove the given handler for the given type
+ if ( all || namespace.test( handleObj.namespace ) ) {
+ if ( pos == null ) {
+ eventType.splice( j--, 1 );
+ }
+
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+
+ if ( pos != null ) {
+ break;
+ }
+ }
+ }
+
+ // remove generic event handler if no more handlers exist
+ if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ ret = null;
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ var handle = elemData.handle;
+ if ( handle ) {
+ handle.elem = null;
+ }
+
+ delete elemData.events;
+ delete elemData.handle;
+
+ if ( typeof elemData === "function" ) {
+ jQuery.removeData( elem, eventKey );
+
+ } else if ( jQuery.isEmptyObject( elemData ) ) {
+ jQuery.removeData( elem );
+ }
+ }
+ },
+
+ // bubbling is internal
+ trigger: function( event, data, elem /*, bubbling */ ) {
+ // Event object or event type
+ var type = event.type || event,
+ bubbling = arguments[3];
+
+ if ( !bubbling ) {
+ event = typeof event === "object" ?
+ // jQuery.Event object
+ event[ jQuery.expando ] ? event :
+ // Object literal
+ jQuery.extend( jQuery.Event(type), event ) :
+ // Just the event type (string)
+ jQuery.Event(type);
+
+ if ( type.indexOf("!") >= 0 ) {
+ event.type = type = type.slice(0, -1);
+ event.exclusive = true;
+ }
+
+ // Handle a global trigger
+ if ( !elem ) {
+ // Don't bubble custom events when global (to avoid too much overhead)
+ event.stopPropagation();
+
+ // Only trigger if we've ever bound an event for it
+ if ( jQuery.event.global[ type ] ) {
+ jQuery.each( jQuery.cache, function() {
+ if ( this.events && this.events[type] ) {
+ jQuery.event.trigger( event, data, this.handle.elem );
+ }
+ });
+ }
+ }
+
+ // Handle triggering a single element
+
+ // don't do events on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return undefined;
+ }
+
+ // Clean up in case it is reused
+ event.result = undefined;
+ event.target = elem;
+
+ // Clone the incoming data, if any
+ data = jQuery.makeArray( data );
+ data.unshift( event );
+ }
+
+ event.currentTarget = elem;
+
+ // Trigger the event, it is assumed that "handle" is a function
+ var handle = elem.nodeType ?
+ jQuery.data( elem, "handle" ) :
+ (jQuery.data( elem, "__events__" ) || {}).handle;
+
+ if ( handle ) {
+ handle.apply( elem, data );
+ }
+
+ var parent = elem.parentNode || elem.ownerDocument;
+
+ // Trigger an inline bound script
+ try {
+ if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
+ if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
+ event.result = false;
+ event.preventDefault();
+ }
+ }
+
+ // prevent IE from throwing an error for some elements with some event types, see #3533
+ } catch (inlineError) {}
+
+ if ( !event.isPropagationStopped() && parent ) {
+ jQuery.event.trigger( event, data, parent, true );
+
+ } else if ( !event.isDefaultPrevented() ) {
+ var old,
+ target = event.target,
+ targetType = type.replace( rnamespaces, "" ),
+ isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
+ special = jQuery.event.special[ targetType ] || {};
+
+ if ( (!special._default || special._default.call( elem, event ) === false) &&
+ !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
+
+ try {
+ if ( target[ targetType ] ) {
+ // Make sure that we don't accidentally re-trigger the onFOO events
+ old = target[ "on" + targetType ];
+
+ if ( old ) {
+ target[ "on" + targetType ] = null;
+ }
+
+ jQuery.event.triggered = true;
+ target[ targetType ]();
+ }
+
+ // prevent IE from throwing an error for some elements with some event types, see #3533
+ } catch (triggerError) {}
+
+ if ( old ) {
+ target[ "on" + targetType ] = old;
+ }
+
+ jQuery.event.triggered = false;
+ }
+ }
+ },
+
+ handle: function( event ) {
+ var all, handlers, namespaces, namespace_re, events,
+ namespace_sort = [],
+ args = jQuery.makeArray( arguments );
+
+ event = args[0] = jQuery.event.fix( event || window.event );
+ event.currentTarget = this;
+
+ // Namespaced event handlers
+ all = event.type.indexOf(".") < 0 && !event.exclusive;
+
+ if ( !all ) {
+ namespaces = event.type.split(".");
+ event.type = namespaces.shift();
+ namespace_sort = namespaces.slice(0).sort();
+ namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
+ }
+
+ event.namespace = event.namespace || namespace_sort.join(".");
+
+ events = jQuery.data(this, this.nodeType ? "events" : "__events__");
+
+ if ( typeof events === "function" ) {
+ events = events.events;
+ }
+
+ handlers = (events || {})[ event.type ];
+
+ if ( events && handlers ) {
+ // Clone the handlers to prevent manipulation
+ handlers = handlers.slice(0);
+
+ for ( var j = 0, l = handlers.length; j < l; j++ ) {
+ var handleObj = handlers[ j ];
+
+ // Filter the functions by class
+ if ( all || namespace_re.test( handleObj.namespace ) ) {
+ // Pass in a reference to the handler function itself
+ // So that we can later remove it
+ event.handler = handleObj.handler;
+ event.data = handleObj.data;
+ event.handleObj = handleObj;
+
+ var ret = handleObj.handler.apply( this, args );
+
+ if ( ret !== undefined ) {
+ event.result = ret;
+ if ( ret === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+
+ if ( event.isImmediatePropagationStopped() ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // store a copy of the original event object
+ // and "clone" to set read-only properties
+ var originalEvent = event;
+ event = jQuery.Event( originalEvent );
+
+ for ( var i = this.props.length, prop; i; ) {
+ prop = this.props[ --i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Fix target property, if necessary
+ if ( !event.target ) {
+ // Fixes #1925 where srcElement might not be defined either
+ event.target = event.srcElement || document;
+ }
+
+ // check if target is a textnode (safari)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && event.fromElement ) {
+ event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+ }
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && event.clientX != null ) {
+ var doc = document.documentElement,
+ body = document.body;
+
+ event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+ event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
+ }
+
+ // Add which for key events
+ if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+ event.which = event.charCode != null ? event.charCode : event.keyCode;
+ }
+
+ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+ if ( !event.metaKey && event.ctrlKey ) {
+ event.metaKey = event.ctrlKey;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && event.button !== undefined ) {
+ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+ }
+
+ return event;
+ },
+
+ // Deprecated, use jQuery.guid instead
+ guid: 1E8,
+
+ // Deprecated, use jQuery.proxy instead
+ proxy: jQuery.proxy,
+
+ special: {
+ ready: {
+ // Make sure the ready event is setup
+ setup: jQuery.bindReady,
+ teardown: jQuery.noop
+ },
+
+ live: {
+ add: function( handleObj ) {
+ jQuery.event.add( this,
+ liveConvert( handleObj.origType, handleObj.selector ),
+ jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
+ },
+
+ remove: function( handleObj ) {
+ jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+ }
+ },
+
+ beforeunload: {
+ setup: function( data, namespaces, eventHandle ) {
+ // We only want to do this special case on windows
+ if ( jQuery.isWindow( this ) ) {
+ this.onbeforeunload = eventHandle;
+ }
+ },
+
+ teardown: function( namespaces, eventHandle ) {
+ if ( this.onbeforeunload === eventHandle ) {
+ this.onbeforeunload = null;
+ }
+ }
+ }
+ }
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+ function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+ } :
+ function( elem, type, handle ) {
+ if ( elem.detachEvent ) {
+ elem.detachEvent( "on" + type, handle );
+ }
+ };
+
+jQuery.Event = function( src ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !this.preventDefault ) {
+ return new jQuery.Event( src );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // timeStamp is buggy for some events on Firefox(#3843)
+ // So we won't rely on the native value
+ this.timeStamp = jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+ return false;
+}
+function returnTrue() {
+ return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ preventDefault: function() {
+ this.isDefaultPrevented = returnTrue;
+
+ var e = this.originalEvent;
+ if ( !e ) {
+ return;
+ }
+
+ // if preventDefault exists run it on the original event
+ if ( e.preventDefault ) {
+ e.preventDefault();
+
+ // otherwise set the returnValue property of the original event to false (IE)
+ } else {
+ e.returnValue = false;
+ }
+ },
+ stopPropagation: function() {
+ this.isPropagationStopped = returnTrue;
+
+ var e = this.originalEvent;
+ if ( !e ) {
+ return;
+ }
+ // if stopPropagation exists run it on the original event
+ if ( e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ // otherwise set the cancelBubble property of the original event to true (IE)
+ e.cancelBubble = true;
+ },
+ stopImmediatePropagation: function() {
+ this.isImmediatePropagationStopped = returnTrue;
+ this.stopPropagation();
+ },
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+ // Check if mouse(over|out) are still within the same parent element
+ var parent = event.relatedTarget;
+
+ // Firefox sometimes assigns relatedTarget a XUL element
+ // which we cannot access the parentNode property of
+ try {
+ // Traverse up the tree
+ while ( parent && parent !== this ) {
+ parent = parent.parentNode;
+ }
+
+ if ( parent !== this ) {
+ // set the correct event type
+ event.type = event.data;
+
+ // handle event if we actually just moused on to a non sub-element
+ jQuery.event.handle.apply( this, arguments );
+ }
+
+ // assuming we've left the element since we most likely mousedover a xul element
+ } catch(e) { }
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+ event.type = event.data;
+ jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ setup: function( data ) {
+ jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+ },
+ teardown: function( data ) {
+ jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+ }
+ };
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+ jQuery.event.special.submit = {
+ setup: function( data, namespaces ) {
+ if ( this.nodeName.toLowerCase() !== "form" ) {
+ jQuery.event.add(this, "click.specialSubmit", function( e ) {
+ var elem = e.target,
+ type = elem.type;
+
+ if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+ e.liveFired = undefined;
+ return trigger( "submit", this, arguments );
+ }
+ });
+
+ jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+ var elem = e.target,
+ type = elem.type;
+
+ if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+ e.liveFired = undefined;
+ return trigger( "submit", this, arguments );
+ }
+ });
+
+ } else {
+ return false;
+ }
+ },
+
+ teardown: function( namespaces ) {
+ jQuery.event.remove( this, ".specialSubmit" );
+ }
+ };
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+ var changeFilters,
+
+ getVal = function( elem ) {
+ var type = elem.type, val = elem.value;
+
+ if ( type === "radio" || type === "checkbox" ) {
+ val = elem.checked;
+
+ } else if ( type === "select-multiple" ) {
+ val = elem.selectedIndex > -1 ?
+ jQuery.map( elem.options, function( elem ) {
+ return elem.selected;
+ }).join("-") :
+ "";
+
+ } else if ( elem.nodeName.toLowerCase() === "select" ) {
+ val = elem.selectedIndex;
+ }
+
+ return val;
+ },
+
+ testChange = function testChange( e ) {
+ var elem = e.target, data, val;
+
+ if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+ return;
+ }
+
+ data = jQuery.data( elem, "_change_data" );
+ val = getVal(elem);
+
+ // the current data will be also retrieved by beforeactivate
+ if ( e.type !== "focusout" || elem.type !== "radio" ) {
+ jQuery.data( elem, "_change_data", val );
+ }
+
+ if ( data === undefined || val === data ) {
+ return;
+ }
+
+ if ( data != null || val ) {
+ e.type = "change";
+ e.liveFired = undefined;
+ return jQuery.event.trigger( e, arguments[1], elem );
+ }
+ };
+
+ jQuery.event.special.change = {
+ filters: {
+ focusout: testChange,
+
+ beforedeactivate: testChange,
+
+ click: function( e ) {
+ var elem = e.target, type = elem.type;
+
+ if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
+ return testChange.call( this, e );
+ }
+ },
+
+ // Change has to be called before submit
+ // Keydown will be called before keypress, which is used in submit-event delegation
+ keydown: function( e ) {
+ var elem = e.target, type = elem.type;
+
+ if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
+ (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+ type === "select-multiple" ) {
+ return testChange.call( this, e );
+ }
+ },
+
+ // Beforeactivate happens also before the previous element is blurred
+ // with this event you can't trigger a change event, but you can store
+ // information
+ beforeactivate: function( e ) {
+ var elem = e.target;
+ jQuery.data( elem, "_change_data", getVal(elem) );
+ }
+ },
+
+ setup: function( data, namespaces ) {
+ if ( this.type === "file" ) {
+ return false;
+ }
+
+ for ( var type in changeFilters ) {
+ jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+ }
+
+ return rformElems.test( this.nodeName );
+ },
+
+ teardown: function( namespaces ) {
+ jQuery.event.remove( this, ".specialChange" );
+
+ return rformElems.test( this.nodeName );
+ }
+ };
+
+ changeFilters = jQuery.event.special.change.filters;
+
+ // Handle when the input is .focus()'d
+ changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+ args[0].type = type;
+ return jQuery.event.handle.apply( elem, args );
+}
+
+// Create "bubbling" focus and blur events
+if ( document.addEventListener ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ if ( focusCounts[fix]++ === 0 ) {
+ document.addEventListener( orig, handler, true );
+ }
+ },
+ teardown: function() {
+ if ( --focusCounts[fix] === 0 ) {
+ document.removeEventListener( orig, handler, true );
+ }
+ }
+ };
+
+ function handler( e ) {
+ e = jQuery.event.fix( e );
+ e.type = fix;
+ return jQuery.event.trigger( e, null, e.target );
+ }
+ });
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+ jQuery.fn[ name ] = function( type, data, fn ) {
+ // Handle object literals
+ if ( typeof type === "object" ) {
+ for ( var key in type ) {
+ this[ name ](key, data, type[key], fn);
+ }
+ return this;
+ }
+
+ if ( jQuery.isFunction( data ) || data === false ) {
+ fn = data;
+ data = undefined;
+ }
+
+ var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
+ jQuery( this ).unbind( event, handler );
+ return fn.apply( this, arguments );
+ }) : fn;
+
+ if ( type === "unload" && name !== "one" ) {
+ this.one( type, data, fn );
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ jQuery.event.add( this[i], type, handler, data );
+ }
+ }
+
+ return this;
+ };
+});
+
+jQuery.fn.extend({
+ unbind: function( type, fn ) {
+ // Handle object literals
+ if ( typeof type === "object" && !type.preventDefault ) {
+ for ( var key in type ) {
+ this.unbind(key, type[key]);
+ }
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ jQuery.event.remove( this[i], type, fn );
+ }
+ }
+
+ return this;
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.live( types, data, fn, selector );
+ },
+
+ undelegate: function( selector, types, fn ) {
+ if ( arguments.length === 0 ) {
+ return this.unbind( "live" );
+
+ } else {
+ return this.die( types, null, fn, selector );
+ }
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+
+ triggerHandler: function( type, data ) {
+ if ( this[0] ) {
+ var event = jQuery.Event( type );
+ event.preventDefault();
+ event.stopPropagation();
+ jQuery.event.trigger( event, data, this[0] );
+ return event.result;
+ }
+ },
+
+ toggle: function( fn ) {
+ // Save reference to arguments for access in closure
+ var args = arguments,
+ i = 1;
+
+ // link all the functions, so any of them can unbind this click handler
+ while ( i < args.length ) {
+ jQuery.proxy( fn, args[ i++ ] );
+ }
+
+ return this.click( jQuery.proxy( fn, function( event ) {
+ // Figure out which function to execute
+ var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+ jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+ // Make sure that clicks stop
+ event.preventDefault();
+
+ // and execute the function
+ return args[ lastToggle ].apply( this, arguments ) || false;
+ }));
+ },
+
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ }
+});
+
+var liveMap = {
+ focus: "focusin",
+ blur: "focusout",
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+ jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+ var type, i = 0, match, namespaces, preType,
+ selector = origSelector || this.selector,
+ context = origSelector ? this : jQuery( this.context );
+
+ if ( typeof types === "object" && !types.preventDefault ) {
+ for ( var key in types ) {
+ context[ name ]( key, data, types[key], selector );
+ }
+
+ return this;
+ }
+
+ if ( jQuery.isFunction( data ) ) {
+ fn = data;
+ data = undefined;
+ }
+
+ types = (types || "").split(" ");
+
+ while ( (type = types[ i++ ]) != null ) {
+ match = rnamespaces.exec( type );
+ namespaces = "";
+
+ if ( match ) {
+ namespaces = match[0];
+ type = type.replace( rnamespaces, "" );
+ }
+
+ if ( type === "hover" ) {
+ types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+ continue;
+ }
+
+ preType = type;
+
+ if ( type === "focus" || type === "blur" ) {
+ types.push( liveMap[ type ] + namespaces );
+ type = type + namespaces;
+
+ } else {
+ type = (liveMap[ type ] || type) + namespaces;
+ }
+
+ if ( name === "live" ) {
+ // bind live handler
+ for ( var j = 0, l = context.length; j < l; j++ ) {
+ jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+ { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+ }
+
+ } else {
+ // unbind live handler
+ context.unbind( "live." + liveConvert( type, selector ), fn );
+ }
+ }
+
+ return this;
+ };
+});
+
+function liveHandler( event ) {
+ var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+ elems = [],
+ selectors = [],
+ events = jQuery.data( this, this.nodeType ? "events" : "__events__" );
+
+ if ( typeof events === "function" ) {
+ events = events.events;
+ }
+
+ // Make sure we avoid non-left-click bubbling in Firefox (#3861)
+ if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
+ return;
+ }
+
+ if ( event.namespace ) {
+ namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+ }
+
+ event.liveFired = this;
+
+ var live = events.live.slice(0);
+
+ for ( j = 0; j < live.length; j++ ) {
+ handleObj = live[j];
+
+ if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+ selectors.push( handleObj.selector );
+
+ } else {
+ live.splice( j--, 1 );
+ }
+ }
+
+ match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+ for ( i = 0, l = match.length; i < l; i++ ) {
+ close = match[i];
+
+ for ( j = 0; j < live.length; j++ ) {
+ handleObj = live[j];
+
+ if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) {
+ elem = close.elem;
+ related = null;
+
+ // Those two events require additional checking
+ if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+ event.type = handleObj.preType;
+ related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+ }
+
+ if ( !related || related !== elem ) {
+ elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+ }
+ }
+ }
+ }
+
+ for ( i = 0, l = elems.length; i < l; i++ ) {
+ match = elems[i];
+
+ if ( maxLevel && match.level > maxLevel ) {
+ break;
+ }
+
+ event.currentTarget = match.elem;
+ event.data = match.handleObj.data;
+ event.handleObj = match.handleObj;
+
+ ret = match.handleObj.origHandler.apply( match.elem, arguments );
+
+ if ( ret === false || event.isPropagationStopped() ) {
+ maxLevel = match.level;
+
+ if ( ret === false ) {
+ stop = false;
+ }
+ if ( event.isImmediatePropagationStopped() ) {
+ break;
+ }
+ }
+ }
+
+ return stop;
+}
+
+function liveConvert( type, selector ) {
+ return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
+}
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ if ( fn == null ) {
+ fn = data;
+ data = null;
+ }
+
+ return arguments.length > 0 ?
+ this.bind( name, data, fn ) :
+ this.trigger( name );
+ };
+
+ if ( jQuery.attrFn ) {
+ jQuery.attrFn[ name ] = true;
+ }
+});
+
+// Prevent memory leaks in IE
+// Window isn't included so as not to unbind existing unload events
+// More info:
+// - http://isaacschlueter.com/2006/10/msie-memory-leaks/
+if ( window.attachEvent && !window.addEventListener ) {
+ jQuery(window).bind("unload", function() {
+ for ( var id in jQuery.cache ) {
+ if ( jQuery.cache[ id ].handle ) {
+ // Try/Catch is to handle iframes being unloaded, see #4280
+ try {
+ jQuery.event.remove( jQuery.cache[ id ].handle.elem );
+ } catch(e) {}
+ }
+ }
+ });
+}
+
+
+/*!
+ * Sizzle CSS Selector Engine - v1.0
+ * Copyright 2009, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+ done = 0,
+ toString = Object.prototype.toString,
+ hasDuplicate = false,
+ baseHasDuplicate = true;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+// Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+ baseHasDuplicate = false;
+ return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+ results = results || [];
+ context = context || document;
+
+ var origContext = context;
+
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ var m, set, checkSet, extra, ret, cur, pop, i,
+ prune = true,
+ contextXML = Sizzle.isXML( context ),
+ parts = [],
+ soFar = selector;
+
+ // Reset the position of the chunker regexp (start from head)
+ do {
+ chunker.exec( "" );
+ m = chunker.exec( soFar );
+
+ if ( m ) {
+ soFar = m[3];
+
+ parts.push( m[1] );
+
+ if ( m[2] ) {
+ extra = m[3];
+ break;
+ }
+ }
+ } while ( m );
+
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+ set = posProcess( parts[0] + parts[1], context );
+
+ } else {
+ set = Expr.relative[ parts[0] ] ?
+ [ context ] :
+ Sizzle( parts.shift(), context );
+
+ while ( parts.length ) {
+ selector = parts.shift();
+
+ if ( Expr.relative[ selector ] ) {
+ selector += parts.shift();
+ }
+
+ set = posProcess( selector, set );
+ }
+ }
+
+ } else {
+ // Take a shortcut and set the context if the root selector is an ID
+ // (but not if it'll be faster if the inner selector is an ID)
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+ ret = Sizzle.find( parts.shift(), context, contextXML );
+ context = ret.expr ?
+ Sizzle.filter( ret.expr, ret.set )[0] :
+ ret.set[0];
+ }
+
+ if ( context ) {
+ ret = seed ?
+ { expr: parts.pop(), set: makeArray(seed) } :
+ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+ set = ret.expr ?
+ Sizzle.filter( ret.expr, ret.set ) :
+ ret.set;
+
+ if ( parts.length > 0 ) {
+ checkSet = makeArray( set );
+
+ } else {
+ prune = false;
+ }
+
+ while ( parts.length ) {
+ cur = parts.pop();
+ pop = cur;
+
+ if ( !Expr.relative[ cur ] ) {
+ cur = "";
+ } else {
+ pop = parts.pop();
+ }
+
+ if ( pop == null ) {
+ pop = context;
+ }
+
+ Expr.relative[ cur ]( checkSet, pop, contextXML );
+ }
+
+ } else {
+ checkSet = parts = [];
+ }
+ }
+
+ if ( !checkSet ) {
+ checkSet = set;
+ }
+
+ if ( !checkSet ) {
+ Sizzle.error( cur || selector );
+ }
+
+ if ( toString.call(checkSet) === "[object Array]" ) {
+ if ( !prune ) {
+ results.push.apply( results, checkSet );
+
+ } else if ( context && context.nodeType === 1 ) {
+ for ( i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+ results.push( set[i] );
+ }
+ }
+
+ } else {
+ for ( i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+ results.push( set[i] );
+ }
+ }
+ }
+
+ } else {
+ makeArray( checkSet, results );
+ }
+
+ if ( extra ) {
+ Sizzle( extra, origContext, results, seed );
+ Sizzle.uniqueSort( results );
+ }
+
+ return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+ if ( sortOrder ) {
+ hasDuplicate = baseHasDuplicate;
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ for ( var i = 1; i < results.length; i++ ) {
+ if ( results[i] === results[ i - 1 ] ) {
+ results.splice( i--, 1 );
+ }
+ }
+ }
+ }
+
+ return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+ return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+ return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+ var set;
+
+ if ( !expr ) {
+ return [];
+ }
+
+ for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+ var match,
+ type = Expr.order[i];
+
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+ var left = match[1];
+ match.splice( 1, 1 );
+
+ if ( left.substr( left.length - 1 ) !== "\\" ) {
+ match[1] = (match[1] || "").replace(/\\/g, "");
+ set = Expr.find[ type ]( match, context, isXML );
+
+ if ( set != null ) {
+ expr = expr.replace( Expr.match[ type ], "" );
+ break;
+ }
+ }
+ }
+ }
+
+ if ( !set ) {
+ set = context.getElementsByTagName( "*" );
+ }
+
+ return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+ var match, anyFound,
+ old = expr,
+ result = [],
+ curLoop = set,
+ isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+ while ( expr && set.length ) {
+ for ( var type in Expr.filter ) {
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+ var found, item,
+ filter = Expr.filter[ type ],
+ left = match[1];
+
+ anyFound = false;
+
+ match.splice(1,1);
+
+ if ( left.substr( left.length - 1 ) === "\\" ) {
+ continue;
+ }
+
+ if ( curLoop === result ) {
+ result = [];
+ }
+
+ if ( Expr.preFilter[ type ] ) {
+ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+ if ( !match ) {
+ anyFound = found = true;
+
+ } else if ( match === true ) {
+ continue;
+ }
+ }
+
+ if ( match ) {
+ for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+ if ( item ) {
+ found = filter( item, match, i, curLoop );
+ var pass = not ^ !!found;
+
+ if ( inplace && found != null ) {
+ if ( pass ) {
+ anyFound = true;
+
+ } else {
+ curLoop[i] = false;
+ }
+
+ } else if ( pass ) {
+ result.push( item );
+ anyFound = true;
+ }
+ }
+ }
+ }
+
+ if ( found !== undefined ) {
+ if ( !inplace ) {
+ curLoop = result;
+ }
+
+ expr = expr.replace( Expr.match[ type ], "" );
+
+ if ( !anyFound ) {
+ return [];
+ }
+
+ break;
+ }
+ }
+ }
+
+ // Improper expression
+ if ( expr === old ) {
+ if ( anyFound == null ) {
+ Sizzle.error( expr );
+
+ } else {
+ break;
+ }
+ }
+
+ old = expr;
+ }
+
+ return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+ throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+ order: [ "ID", "NAME", "TAG" ],
+
+ match: {
+ ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+ CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
+ TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+ CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+ },
+
+ leftMatch: {},
+
+ attrMap: {
+ "class": "className",
+ "for": "htmlFor"
+ },
+
+ attrHandle: {
+ href: function( elem ) {
+ return elem.getAttribute( "href" );
+ }
+ },
+
+ relative: {
+ "+": function(checkSet, part){
+ var isPartStr = typeof part === "string",
+ isTag = isPartStr && !/\W/.test( part ),
+ isPartStrNotTag = isPartStr && !isTag;
+
+ if ( isTag ) {
+ part = part.toLowerCase();
+ }
+
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+ if ( (elem = checkSet[i]) ) {
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+ elem || false :
+ elem === part;
+ }
+ }
+
+ if ( isPartStrNotTag ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ },
+
+ ">": function( checkSet, part ) {
+ var elem,
+ isPartStr = typeof part === "string",
+ i = 0,
+ l = checkSet.length;
+
+ if ( isPartStr && !/\W/.test( part ) ) {
+ part = part.toLowerCase();
+
+ for ( ; i < l; i++ ) {
+ elem = checkSet[i];
+
+ if ( elem ) {
+ var parent = elem.parentNode;
+ checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+ }
+ }
+
+ } else {
+ for ( ; i < l; i++ ) {
+ elem = checkSet[i];
+
+ if ( elem ) {
+ checkSet[i] = isPartStr ?
+ elem.parentNode :
+ elem.parentNode === part;
+ }
+ }
+
+ if ( isPartStr ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ }
+ },
+
+ "": function(checkSet, part, isXML){
+ var nodeCheck,
+ doneName = done++,
+ checkFn = dirCheck;
+
+ if ( typeof part === "string" && !/\W/.test(part) ) {
+ part = part.toLowerCase();
+ nodeCheck = part;
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+ },
+
+ "~": function( checkSet, part, isXML ) {
+ var nodeCheck,
+ doneName = done++,
+ checkFn = dirCheck;
+
+ if ( typeof part === "string" && !/\W/.test( part ) ) {
+ part = part.toLowerCase();
+ nodeCheck = part;
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+ }
+ },
+
+ find: {
+ ID: function( match, context, isXML ) {
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [m] : [];
+ }
+ },
+
+ NAME: function( match, context ) {
+ if ( typeof context.getElementsByName !== "undefined" ) {
+ var ret = [],
+ results = context.getElementsByName( match[1] );
+
+ for ( var i = 0, l = results.length; i < l; i++ ) {
+ if ( results[i].getAttribute("name") === match[1] ) {
+ ret.push( results[i] );
+ }
+ }
+
+ return ret.length === 0 ? null : ret;
+ }
+ },
+
+ TAG: function( match, context ) {
+ return context.getElementsByTagName( match[1] );
+ }
+ },
+ preFilter: {
+ CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+ match = " " + match[1].replace(/\\/g, "") + " ";
+
+ if ( isXML ) {
+ return match;
+ }
+
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+ if ( elem ) {
+ if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
+ if ( !inplace ) {
+ result.push( elem );
+ }
+
+ } else if ( inplace ) {
+ curLoop[i] = false;
+ }
+ }
+ }
+
+ return false;
+ },
+
+ ID: function( match ) {
+ return match[1].replace(/\\/g, "");
+ },
+
+ TAG: function( match, curLoop ) {
+ return match[1].toLowerCase();
+ },
+
+ CHILD: function( match ) {
+ if ( match[1] === "nth" ) {
+ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+ var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+ match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+ // calculate the numbers (first)n+(last) including if they are negative
+ match[2] = (test[1] + (test[2] || 1)) - 0;
+ match[3] = test[3] - 0;
+ }
+
+ // TODO: Move to normal caching system
+ match[0] = done++;
+
+ return match;
+ },
+
+ ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+ var name = match[1].replace(/\\/g, "");
+
+ if ( !isXML && Expr.attrMap[name] ) {
+ match[1] = Expr.attrMap[name];
+ }
+
+ if ( match[2] === "~=" ) {
+ match[4] = " " + match[4] + " ";
+ }
+
+ return match;
+ },
+
+ PSEUDO: function( match, curLoop, inplace, result, not ) {
+ if ( match[1] === "not" ) {
+ // If we're dealing with a complex expression, or a simple one
+ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+ match[3] = Sizzle(match[3], null, null, curLoop);
+
+ } else {
+ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+ if ( !inplace ) {
+ result.push.apply( result, ret );
+ }
+
+ return false;
+ }
+
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+ return true;
+ }
+
+ return match;
+ },
+
+ POS: function( match ) {
+ match.unshift( true );
+
+ return match;
+ }
+ },
+
+ filters: {
+ enabled: function( elem ) {
+ return elem.disabled === false && elem.type !== "hidden";
+ },
+
+ disabled: function( elem ) {
+ return elem.disabled === true;
+ },
+
+ checked: function( elem ) {
+ return elem.checked === true;
+ },
+
+ selected: function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ elem.parentNode.selectedIndex;
+
+ return elem.selected === true;
+ },
+
+ parent: function( elem ) {
+ return !!elem.firstChild;
+ },
+
+ empty: function( elem ) {
+ return !elem.firstChild;
+ },
+
+ has: function( elem, i, match ) {
+ return !!Sizzle( match[3], elem ).length;
+ },
+
+ header: function( elem ) {
+ return (/h\d/i).test( elem.nodeName );
+ },
+
+ text: function( elem ) {
+ return "text" === elem.type;
+ },
+ radio: function( elem ) {
+ return "radio" === elem.type;
+ },
+
+ checkbox: function( elem ) {
+ return "checkbox" === elem.type;
+ },
+
+ file: function( elem ) {
+ return "file" === elem.type;
+ },
+ password: function( elem ) {
+ return "password" === elem.type;
+ },
+
+ submit: function( elem ) {
+ return "submit" === elem.type;
+ },
+
+ image: function( elem ) {
+ return "image" === elem.type;
+ },
+
+ reset: function( elem ) {
+ return "reset" === elem.type;
+ },
+
+ button: function( elem ) {
+ return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
+ },
+
+ input: function( elem ) {
+ return (/input|select|textarea|button/i).test( elem.nodeName );
+ }
+ },
+ setFilters: {
+ first: function( elem, i ) {
+ return i === 0;
+ },
+
+ last: function( elem, i, match, array ) {
+ return i === array.length - 1;
+ },
+
+ even: function( elem, i ) {
+ return i % 2 === 0;
+ },
+
+ odd: function( elem, i ) {
+ return i % 2 === 1;
+ },
+
+ lt: function( elem, i, match ) {
+ return i < match[3] - 0;
+ },
+
+ gt: function( elem, i, match ) {
+ return i > match[3] - 0;
+ },
+
+ nth: function( elem, i, match ) {
+ return match[3] - 0 === i;
+ },
+
+ eq: function( elem, i, match ) {
+ return match[3] - 0 === i;
+ }
+ },
+ filter: {
+ PSEUDO: function( elem, match, i, array ) {
+ var name = match[1],
+ filter = Expr.filters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+
+ } else if ( name === "contains" ) {
+ return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+ } else if ( name === "not" ) {
+ var not = match[3];
+
+ for ( var j = 0, l = not.length; j < l; j++ ) {
+ if ( not[j] === elem ) {
+ return false;
+ }
+ }
+
+ return true;
+
+ } else {
+ Sizzle.error( "Syntax error, unrecognized expression: " + name );
+ }
+ },
+
+ CHILD: function( elem, match ) {
+ var type = match[1],
+ node = elem;
+
+ switch ( type ) {
+ case "only":
+ case "first":
+ while ( (node = node.previousSibling) ) {
+ if ( node.nodeType === 1 ) {
+ return false;
+ }
+ }
+
+ if ( type === "first" ) {
+ return true;
+ }
+
+ node = elem;
+
+ case "last":
+ while ( (node = node.nextSibling) ) {
+ if ( node.nodeType === 1 ) {
+ return false;
+ }
+ }
+
+ return true;
+
+ case "nth":
+ var first = match[2],
+ last = match[3];
+
+ if ( first === 1 && last === 0 ) {
+ return true;
+ }
+
+ var doneName = match[0],
+ parent = elem.parentNode;
+
+ if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+ var count = 0;
+
+ for ( node = parent.firstChild; node; node = node.nextSibling ) {
+ if ( node.nodeType === 1 ) {
+ node.nodeIndex = ++count;
+ }
+ }
+
+ parent.sizcache = doneName;
+ }
+
+ var diff = elem.nodeIndex - last;
+
+ if ( first === 0 ) {
+ return diff === 0;
+
+ } else {
+ return ( diff % first === 0 && diff / first >= 0 );
+ }
+ }
+ },
+
+ ID: function( elem, match ) {
+ return elem.nodeType === 1 && elem.getAttribute("id") === match;
+ },
+
+ TAG: function( elem, match ) {
+ return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+ },
+
+ CLASS: function( elem, match ) {
+ return (" " + (elem.className || elem.getAttribute("class")) + " ")
+ .indexOf( match ) > -1;
+ },
+
+ ATTR: function( elem, match ) {
+ var name = match[1],
+ result = Expr.attrHandle[ name ] ?
+ Expr.attrHandle[ name ]( elem ) :
+ elem[ name ] != null ?
+ elem[ name ] :
+ elem.getAttribute( name ),
+ value = result + "",
+ type = match[2],
+ check = match[4];
+
+ return result == null ?
+ type === "!=" :
+ type === "=" ?
+ value === check :
+ type === "*=" ?
+ value.indexOf(check) >= 0 :
+ type === "~=" ?
+ (" " + value + " ").indexOf(check) >= 0 :
+ !check ?
+ value && result !== false :
+ type === "!=" ?
+ value !== check :
+ type === "^=" ?
+ value.indexOf(check) === 0 :
+ type === "$=" ?
+ value.substr(value.length - check.length) === check :
+ type === "|=" ?
+ value === check || value.substr(0, check.length + 1) === check + "-" :
+ false;
+ },
+
+ POS: function( elem, match, i, array ) {
+ var name = match[2],
+ filter = Expr.setFilters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+ }
+ }
+ }
+};
+
+var origPOS = Expr.match.POS,
+ fescape = function(all, num){
+ return "\\" + (num - 0 + 1);
+ };
+
+for ( var type in Expr.match ) {
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+ array = Array.prototype.slice.call( array, 0 );
+
+ if ( results ) {
+ results.push.apply( results, array );
+ return results;
+ }
+
+ return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+ makeArray = function( array, results ) {
+ var i = 0,
+ ret = results || [];
+
+ if ( toString.call(array) === "[object Array]" ) {
+ Array.prototype.push.apply( ret, array );
+
+ } else {
+ if ( typeof array.length === "number" ) {
+ for ( var l = array.length; i < l; i++ ) {
+ ret.push( array[i] );
+ }
+
+ } else {
+ for ( ; array[i]; i++ ) {
+ ret.push( array[i] );
+ }
+ }
+ }
+
+ return ret;
+ };
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+ return a.compareDocumentPosition ? -1 : 1;
+ }
+
+ return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+ };
+
+} else {
+ sortOrder = function( a, b ) {
+ var al, bl,
+ ap = [],
+ bp = [],
+ aup = a.parentNode,
+ bup = b.parentNode,
+ cur = aup;
+
+ // The nodes are identical, we can exit early
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+
+ // If the nodes are siblings (or identical) we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+
+ // If no parents were found then the nodes are disconnected
+ } else if ( !aup ) {
+ return -1;
+
+ } else if ( !bup ) {
+ return 1;
+ }
+
+ // Otherwise they're somewhere else in the tree so we need
+ // to build up a full list of the parentNodes for comparison
+ while ( cur ) {
+ ap.unshift( cur );
+ cur = cur.parentNode;
+ }
+
+ cur = bup;
+
+ while ( cur ) {
+ bp.unshift( cur );
+ cur = cur.parentNode;
+ }
+
+ al = ap.length;
+ bl = bp.length;
+
+ // Start walking down the tree looking for a discrepancy
+ for ( var i = 0; i < al && i < bl; i++ ) {
+ if ( ap[i] !== bp[i] ) {
+ return siblingCheck( ap[i], bp[i] );
+ }
+ }
+
+ // We ended someplace up the tree so do a sibling check
+ return i === al ?
+ siblingCheck( a, bp[i], -1 ) :
+ siblingCheck( ap[i], b, 1 );
+ };
+
+ siblingCheck = function( a, b, ret ) {
+ if ( a === b ) {
+ return ret;
+ }
+
+ var cur = a.nextSibling;
+
+ while ( cur ) {
+ if ( cur === b ) {
+ return -1;
+ }
+
+ cur = cur.nextSibling;
+ }
+
+ return 1;
+ };
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+ var ret = "", elem;
+
+ for ( var i = 0; elems[i]; i++ ) {
+ elem = elems[i];
+
+ // Get the text from text nodes and CDATA nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+ ret += elem.nodeValue;
+
+ // Traverse everything else, except comment nodes
+ } else if ( elem.nodeType !== 8 ) {
+ ret += Sizzle.getText( elem.childNodes );
+ }
+ }
+
+ return ret;
+};
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+ // We're going to inject a fake input element with a specified name
+ var form = document.createElement("div"),
+ id = "script" + (new Date()).getTime(),
+ root = document.documentElement;
+
+ form.innerHTML = "";
+
+ // Inject it into the root element, check its status, and remove it quickly
+ root.insertBefore( form, root.firstChild );
+
+ // The workaround has to do additional checks after a getElementById
+ // Which slows things down for other browsers (hence the branching)
+ if ( document.getElementById( id ) ) {
+ Expr.find.ID = function( match, context, isXML ) {
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+
+ return m ?
+ m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+ [m] :
+ undefined :
+ [];
+ }
+ };
+
+ Expr.filter.ID = function( elem, match ) {
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+ return elem.nodeType === 1 && node && node.nodeValue === match;
+ };
+ }
+
+ root.removeChild( form );
+
+ // release memory in IE
+ root = form = null;
+})();
+
+(function(){
+ // Check to see if the browser returns only elements
+ // when doing getElementsByTagName("*")
+
+ // Create a fake element
+ var div = document.createElement("div");
+ div.appendChild( document.createComment("") );
+
+ // Make sure no comments are found
+ if ( div.getElementsByTagName("*").length > 0 ) {
+ Expr.find.TAG = function( match, context ) {
+ var results = context.getElementsByTagName( match[1] );
+
+ // Filter out possible comments
+ if ( match[1] === "*" ) {
+ var tmp = [];
+
+ for ( var i = 0; results[i]; i++ ) {
+ if ( results[i].nodeType === 1 ) {
+ tmp.push( results[i] );
+ }
+ }
+
+ results = tmp;
+ }
+
+ return results;
+ };
+ }
+
+ // Check to see if an attribute returns normalized href attributes
+ div.innerHTML = "";
+
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+ div.firstChild.getAttribute("href") !== "#" ) {
+
+ Expr.attrHandle.href = function( elem ) {
+ return elem.getAttribute( "href", 2 );
+ };
+ }
+
+ // release memory in IE
+ div = null;
+})();
+
+if ( document.querySelectorAll ) {
+ (function(){
+ var oldSizzle = Sizzle,
+ div = document.createElement("div"),
+ id = "__sizzle__";
+
+ div.innerHTML = "";
+
+ // Safari can't handle uppercase or unicode characters when
+ // in quirks mode.
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+ return;
+ }
+
+ Sizzle = function( query, context, extra, seed ) {
+ context = context || document;
+
+ // Make sure that attribute selectors are quoted
+ query = query.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+ // Only use querySelectorAll on non-XML documents
+ // (ID selectors don't work in non-HTML documents)
+ if ( !seed && !Sizzle.isXML(context) ) {
+ if ( context.nodeType === 9 ) {
+ try {
+ return makeArray( context.querySelectorAll(query), extra );
+ } catch(qsaError) {}
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ var old = context.getAttribute( "id" ),
+ nid = old || id;
+
+ if ( !old ) {
+ context.setAttribute( "id", nid );
+ }
+
+ try {
+ return makeArray( context.querySelectorAll( "#" + nid + " " + query ), extra );
+
+ } catch(pseudoError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+
+ return oldSizzle(query, context, extra, seed);
+ };
+
+ for ( var prop in oldSizzle ) {
+ Sizzle[ prop ] = oldSizzle[ prop ];
+ }
+
+ // release memory in IE
+ div = null;
+ })();
+}
+
+(function(){
+ var html = document.documentElement,
+ matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,
+ pseudoWorks = false;
+
+ try {
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( document.documentElement, "[test!='']:sizzle" );
+
+ } catch( pseudoError ) {
+ pseudoWorks = true;
+ }
+
+ if ( matches ) {
+ Sizzle.matchesSelector = function( node, expr ) {
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+ if ( !Sizzle.isXML( node ) ) {
+ try {
+ if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+ return matches.call( node, expr );
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle(expr, null, null, [node]).length > 0;
+ };
+ }
+})();
+
+(function(){
+ var div = document.createElement("div");
+
+ div.innerHTML = "";
+
+ // Opera can't find a second classname (in 9.6)
+ // Also, make sure that getElementsByClassName actually exists
+ if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+ return;
+ }
+
+ // Safari caches class attributes, doesn't catch changes (in 3.2)
+ div.lastChild.className = "e";
+
+ if ( div.getElementsByClassName("e").length === 1 ) {
+ return;
+ }
+
+ Expr.order.splice(1, 0, "CLASS");
+ Expr.find.CLASS = function( match, context, isXML ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+ return context.getElementsByClassName(match[1]);
+ }
+ };
+
+ // release memory in IE
+ div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+
+ if ( elem ) {
+ var match = false;
+
+ elem = elem[dir];
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 && !isXML ){
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+
+ if ( elem.nodeName.toLowerCase() === cur ) {
+ match = elem;
+ break;
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+
+ if ( elem ) {
+ var match = false;
+
+ elem = elem[dir];
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 ) {
+ if ( !isXML ) {
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+
+ if ( typeof cur !== "string" ) {
+ if ( elem === cur ) {
+ match = true;
+ break;
+ }
+
+ } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+ match = elem;
+ break;
+ }
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+if ( document.documentElement.contains ) {
+ Sizzle.contains = function( a, b ) {
+ return a !== b && (a.contains ? a.contains(b) : true);
+ };
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+ Sizzle.contains = function( a, b ) {
+ return !!(a.compareDocumentPosition(b) & 16);
+ };
+
+} else {
+ Sizzle.contains = function() {
+ return false;
+ };
+}
+
+Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context ) {
+ var match,
+ tmpSet = [],
+ later = "",
+ root = context.nodeType ? [context] : context;
+
+ // Position selectors must be done after the filter
+ // And so must :not(positional) so we move all PSEUDOs to the end
+ while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+ later += match[0];
+ selector = selector.replace( Expr.match.PSEUDO, "" );
+ }
+
+ selector = Expr.relative[selector] ? selector + "*" : selector;
+
+ for ( var i = 0, l = root.length; i < l; i++ ) {
+ Sizzle( selector, root[i], tmpSet );
+ }
+
+ return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+ rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+ // Note: This RegExp should be improved, or likely pulled from Sizzle
+ rmultiselector = /,/,
+ isSimple = /^.[^:#\[\.,]*$/,
+ slice = Array.prototype.slice,
+ POS = jQuery.expr.match.POS;
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var ret = this.pushStack( "", "find", selector ),
+ length = 0;
+
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ length = ret.length;
+ jQuery.find( selector, this[i], ret );
+
+ if ( i > 0 ) {
+ // Make sure that the results are unique
+ for ( var n = length; n < ret.length; n++ ) {
+ for ( var r = 0; r < length; r++ ) {
+ if ( ret[r] === ret[n] ) {
+ ret.splice(n--, 1);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return ret;
+ },
+
+ has: function( target ) {
+ var targets = jQuery( target );
+ return this.filter(function() {
+ for ( var i = 0, l = targets.length; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector, false), "not", selector);
+ },
+
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector, true), "filter", selector );
+ },
+
+ is: function( selector ) {
+ return !!selector && jQuery.filter( selector, this ).length > 0;
+ },
+
+ closest: function( selectors, context ) {
+ var ret = [], i, l, cur = this[0];
+
+ if ( jQuery.isArray( selectors ) ) {
+ var match, selector,
+ matches = {},
+ level = 1;
+
+ if ( cur && selectors.length ) {
+ for ( i = 0, l = selectors.length; i < l; i++ ) {
+ selector = selectors[i];
+
+ if ( !matches[selector] ) {
+ matches[selector] = jQuery.expr.match.POS.test( selector ) ?
+ jQuery( selector, context || this.context ) :
+ selector;
+ }
+ }
+
+ while ( cur && cur.ownerDocument && cur !== context ) {
+ for ( selector in matches ) {
+ match = matches[selector];
+
+ if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
+ ret.push({ selector: selector, elem: cur, level: level });
+ }
+ }
+
+ cur = cur.parentNode;
+ level++;
+ }
+ }
+
+ return ret;
+ }
+
+ var pos = POS.test( selectors ) ?
+ jQuery( selectors, context || this.context ) : null;
+
+ for ( i = 0, l = this.length; i < l; i++ ) {
+ cur = this[i];
+
+ while ( cur ) {
+ if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+ ret.push( cur );
+ break;
+
+ } else {
+ cur = cur.parentNode;
+ if ( !cur || !cur.ownerDocument || cur === context ) {
+ break;
+ }
+ }
+ }
+ }
+
+ ret = ret.length > 1 ? jQuery.unique(ret) : ret;
+
+ return this.pushStack( ret, "closest", selectors );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+ if ( !elem || typeof elem === "string" ) {
+ return jQuery.inArray( this[0],
+ // If it receives a string, the selector is used
+ // If it receives nothing, the siblings are used
+ elem ? jQuery( elem ) : this.parent().children() );
+ }
+ // Locate the position of the desired element
+ return jQuery.inArray(
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[0] : elem, this );
+ },
+
+ add: function( selector, context ) {
+ var set = typeof selector === "string" ?
+ jQuery( selector, context || this.context ) :
+ jQuery.makeArray( selector ),
+ all = jQuery.merge( this.get(), set );
+
+ return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+ all :
+ jQuery.unique( all ) );
+ },
+
+ andSelf: function() {
+ return this.add( this.prevObject );
+ }
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+ return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return jQuery.nth( elem, 2, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return jQuery.nth( elem, 2, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( elem.parentNode.firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return jQuery.nodeName( elem, "iframe" ) ?
+ elem.contentDocument || elem.contentWindow.document :
+ jQuery.makeArray( elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var ret = jQuery.map( this, fn, until );
+
+ if ( !runtil.test( name ) ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ ret = jQuery.filter( selector, ret );
+ }
+
+ ret = this.length > 1 ? jQuery.unique( ret ) : ret;
+
+ if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+ ret = ret.reverse();
+ }
+
+ return this.pushStack( ret, name, slice.call(arguments).join(",") );
+ };
+});
+
+jQuery.extend({
+ filter: function( expr, elems, not ) {
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 ?
+ jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+ jQuery.find.matches(expr, elems);
+ },
+
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ cur = elem[ dir ];
+
+ while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+ if ( cur.nodeType === 1 ) {
+ matched.push( cur );
+ }
+ cur = cur[dir];
+ }
+ return matched;
+ },
+
+ nth: function( cur, result, dir, elem ) {
+ result = result || 1;
+ var num = 0;
+
+ for ( ; cur; cur = cur[dir] ) {
+ if ( cur.nodeType === 1 && ++num === result ) {
+ break;
+ }
+ }
+
+ return cur;
+ },
+
+ sibling: function( n, elem ) {
+ var r = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ r.push( n );
+ }
+ }
+
+ return r;
+ }
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep(elements, function( elem, i ) {
+ var retVal = !!qualifier.call( elem, i, elem );
+ return retVal === keep;
+ });
+
+ } else if ( qualifier.nodeType ) {
+ return jQuery.grep(elements, function( elem, i ) {
+ return (elem === qualifier) === keep;
+ });
+
+ } else if ( typeof qualifier === "string" ) {
+ var filtered = jQuery.grep(elements, function( elem ) {
+ return elem.nodeType === 1;
+ });
+
+ if ( isSimple.test( qualifier ) ) {
+ return jQuery.filter(qualifier, filtered, !keep);
+ } else {
+ qualifier = jQuery.filter( qualifier, filtered );
+ }
+ }
+
+ return jQuery.grep(elements, function( elem, i ) {
+ return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+ });
+}
+
+
+
+
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+ rleadingWhitespace = /^\s+/,
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+ rtagName = /<([\w:]+)/,
+ rtbody = /\s]+\/)>/g,
+ wrapMap = {
+ option: [ 1, "" ],
+ legend: [ 1, "" ],
+ thead: [ 1, "
+
diff --git a/info.php b/info.php
deleted file mode 100644
index 9c2c6a98..00000000
--- a/info.php
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-phpinfo();
-?>
-
diff --git a/infoPHP.php b/infoPHP.php
deleted file mode 100644
index eb31727b..00000000
--- a/infoPHP.php
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/inx/18.png b/inx/18.png
new file mode 100644
index 00000000..f35b2da4
Binary files /dev/null and b/inx/18.png differ
diff --git a/inx/bck1line.png b/inx/bck1line.png
new file mode 100644
index 00000000..29b300b4
Binary files /dev/null and b/inx/bck1line.png differ
diff --git a/inx/bck1line2.png b/inx/bck1line2.png
new file mode 100644
index 00000000..32098edd
Binary files /dev/null and b/inx/bck1line2.png differ
diff --git a/inx/bck1line3.png b/inx/bck1line3.png
new file mode 100644
index 00000000..99e7a201
Binary files /dev/null and b/inx/bck1line3.png differ
diff --git a/inx/bgbottom1.png b/inx/bgbottom1.png
new file mode 100644
index 00000000..31e863fe
Binary files /dev/null and b/inx/bgbottom1.png differ
diff --git a/inx/bgbottom2.png b/inx/bgbottom2.png
new file mode 100644
index 00000000..105de6aa
Binary files /dev/null and b/inx/bgbottom2.png differ
diff --git a/inx/bgfone1.jpg b/inx/bgfone1.jpg
new file mode 100644
index 00000000..4bc67d94
Binary files /dev/null and b/inx/bgfone1.jpg differ
diff --git a/inx/bgfone1.psd b/inx/bgfone1.psd
new file mode 100644
index 00000000..446995e2
Binary files /dev/null and b/inx/bgfone1.psd differ
diff --git a/inx/bgmain1.jpg b/inx/bgmain1.jpg
new file mode 100644
index 00000000..3d04709b
Binary files /dev/null and b/inx/bgmain1.jpg differ
diff --git a/inx/bgmain2.jpg b/inx/bgmain2.jpg
new file mode 100644
index 00000000..c2807fc7
Binary files /dev/null and b/inx/bgmain2.jpg differ
diff --git a/inx/bgmain3.jpg b/inx/bgmain3.jpg
new file mode 100644
index 00000000..1920e0be
Binary files /dev/null and b/inx/bgmain3.jpg differ
diff --git a/inx/bgtop1.png b/inx/bgtop1.png
new file mode 100644
index 00000000..888a0dac
Binary files /dev/null and b/inx/bgtop1.png differ
diff --git a/inx/bgtop2.png b/inx/bgtop2.png
new file mode 100644
index 00000000..d7270ce5
Binary files /dev/null and b/inx/bgtop2.png differ
diff --git a/inx/bgtop3.png b/inx/bgtop3.png
new file mode 100644
index 00000000..f6cbe873
Binary files /dev/null and b/inx/bgtop3.png differ
diff --git a/inx/btn1.png b/inx/btn1.png
new file mode 100644
index 00000000..4ef8a0a8
Binary files /dev/null and b/inx/btn1.png differ
diff --git a/inx/btn2.png b/inx/btn2.png
new file mode 100644
index 00000000..60c610b9
Binary files /dev/null and b/inx/btn2.png differ
diff --git a/inx/btn3.png b/inx/btn3.png
new file mode 100644
index 00000000..63c6d179
Binary files /dev/null and b/inx/btn3.png differ
diff --git a/inx/btn4.png b/inx/btn4.png
new file mode 100644
index 00000000..2acf2c49
Binary files /dev/null and b/inx/btn4.png differ
diff --git a/inx/btn5.png b/inx/btn5.png
new file mode 100644
index 00000000..2e0558ed
Binary files /dev/null and b/inx/btn5.png differ
diff --git a/inx/btn6.png b/inx/btn6.png
new file mode 100644
index 00000000..28986a96
Binary files /dev/null and b/inx/btn6.png differ
diff --git a/inx/btn7.png b/inx/btn7.png
new file mode 100644
index 00000000..29b12ddc
Binary files /dev/null and b/inx/btn7.png differ
diff --git a/inx/ckeditor/CHANGES.md b/inx/ckeditor/CHANGES.md
new file mode 100644
index 00000000..d4bf24aa
--- /dev/null
+++ b/inx/ckeditor/CHANGES.md
@@ -0,0 +1,1903 @@
+CKEditor 4 Changelog
+====================
+
+## CKEditor 4.14.1
+
+Fixed Issues:
+
+* [#2607](https://github.com/ckeditor/ckeditor4/issues/2607): Fixed: The [Emoji](https://ckeditor.com/cke4/addon/emoji) plugin SVG icons file is not loaded in CORS context.
+* [#3866](https://github.com/ckeditor/ckeditor4/issues/3866): Fixed: The [`config.readOnly`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-readOnly) configuration option not considered for startup read-only mode of inline editor.
+* [#3931](https://github.com/ckeditor/ckeditor4/issues/3931): [IE] Fixed: An error is thrown when pasting using the Paste button after accepting the browser Clipboard Access Prompt dialog.
+* [#3938](https://github.com/ckeditor/ckeditor4/issues/3938): Fixed: Cannot navigate the [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) panel with the keyboard after switching to source mode.
+* [#2823](https://github.com/ckeditor/ckeditor4/issues/2823): [IE] Fixed: Cannot resize the last table column using the [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin.
+* [#909](https://github.com/ckeditor/ckeditor4/issues/909): Fixed: The [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin does not work when the editor is placed in an absolutely positioned container. Thanks to [Roland Petto](https://github.com/arpi68)!
+* [#1959](https://github.com/ckeditor/ckeditor4/issues/1959): Fixed: The [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin does not work in a [maximized](https://ckeditor.com/cke4/addon/maximize) editor when the [Div Editing Area](https://ckeditor.com/cke4/addon/divarea) feature is enabled. Thanks to [Roland Petto](https://github.com/arpi68)!
+* [#3156](https://github.com/ckeditor/ckeditor4/issues/3156): Fixed: [Autolink](https://ckeditor.com/cke4/addon/autolink) [`config.autolink_urlRegex`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-autolink_urlRegex) and [`config.autolink_emailRegex`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-autolink_emailRegex) options are not customizable. Thanks to [Sergiy Dobrovolsky](https://github.com/serggoodwill)!
+* [#624](https://github.com/ckeditor/ckeditor4/issues/624): Fixed: [Notification](https://ckeditor.com/cke4/addon/notification) does not work with the [bottom toolbar location](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-toolbarLocation).
+* [#3000](https://github.com/ckeditor/ckeditor4/issues/3000): Fixed: [Auto Embed](https://ckeditor.com/cke4/addon/autoembed) does not work with the [bottom toolbar location](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-toolbarLocation).
+* [#1883](https://github.com/ckeditor/ckeditor4/issues/1883): Fixed: The [`editor.resize()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-resize) method does not work with CSS units.
+* [#3926](https://github.com/ckeditor/ckeditor4/issues/3926): Fixed: Dragging and dropping a [widget](https://ckeditor.com/cke4/addon/widget) sometimes produces an error.
+* [#4008](https://github.com/ckeditor/ckeditor4/issues/4008): Fixed: [Remove Format](https://ckeditor.com/cke4/addon/removeformat) does not work with a collapsed selection.
+* [#3998](https://github.com/ckeditor/ckeditor4/issues/3998): Fixed: An error is thrown when switching to the [source mode](https://ckeditor.com/cke4/addon/sourcearea) using a custom Ctrl + Enter [keystroke](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-setKeystroke) with the [Widget](https://ckeditor.com/cke4/addon/widget) plugin present.
+
+Other Changes:
+
+* Updated [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) and [SpellCheckAsYouType](https://ckeditor.com/cke4/addon/scayt) (SCAYT) plugins:
+ * Fixed: Active [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) panel causes active suggestions to be unnecessarily checked by the SCAYT spell checking mechanism.
+
+## CKEditor 4.14
+
+**Security Updates:**
+
+* Fixed XSS vulnerability in the HTML data processor reported by [Michał Bentkowski](https://twitter.com/securitymb) of Securitum.
+
+ Issue summary: It was possible to execute XSS inside CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, and (iii) switch back to WYSIWYG mode or (i) copy the specially crafted HTML code, prepared by the attacker and (ii) paste it into CKEditor in WYSIWYG mode.
+
+* Fixed XSS vulnerability in the WebSpellChecker plugin reported by [Pham Van Khanh](https://twitter.com/rskvp93) from Viettel Cyber Security.
+
+ Issue summary: It was possible to execute XSS using CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, then (iii) switch back to WYSIWYG mode, and (iv) preview CKEditor content outside CKEditor editable area.
+
+**An upgrade is highly recommended!**
+
+New features:
+
+* [#2374](https://github.com/ckeditor/ckeditor4/issues/2374): Added support for pasting rich content from LibreOffice Writer with the [Paste from LibreOffice](https://ckeditor.com/cke4/addon/pastefromlibreoffice) plugin.
+* [#2583](https://github.com/ckeditor/ckeditor4/issues/2583): Changed [emoji](https://ckeditor.com/cke4/addon/emoji) suggestion box to show the matched emoji name instead of an ID.
+* [#3748](https://github.com/ckeditor/ckeditor4/issues/3748): Improved the [color button](https://ckeditor.com/cke4/addon/colorbutton) state to reflect the selected editor content colors.
+* [#3661](https://github.com/ckeditor/ckeditor4/issues/3661): Improved the [Print](https://ckeditor.com/cke4/addon/print) plugin to respect styling rendered by the [Preview](https://ckeditor.com/cke4/addon/preview) plugin.
+* [#3547](https://github.com/ckeditor/ckeditor4/issues/3547): Active [dialog](https://ckeditor.com/cke4/addon/dialog) tab now has the `aria-selected="true"` attribute.
+* [#3441](https://github.com/ckeditor/ckeditor4/issues/3441): Improved [`widget.getClipboardHtml()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#method-getClipboardHtml) support for dragging and dropping multiple [widgets](https://ckeditor.com/cke4/addon/widget).
+
+Fixed Issues:
+
+* [#3587](https://github.com/ckeditor/ckeditor4/issues/3587): [Edge, IE] Fixed: [Widget](https://ckeditor.com/cke4/addon/widget) with form input elements loses focus during typing.
+* [#3705](https://github.com/ckeditor/ckeditor4/issues/3705): [Safari] Fixed: Safari incorrectly removes blocks with the [`editor.extractSelectedHtml()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-extractSelectedHtml) method after selecting all content.
+* [#1306](https://github.com/ckeditor/ckeditor4/issues/1306): Fixed: The [Font](https://ckeditor.com/cke4/addon/colorbutton) plugin creates nested HTML `` tags when reapplying the same font multiple times.
+* [#3498](https://github.com/ckeditor/ckeditor4/issues/3498): Fixed: The editor throws an error during the copy operation when a [widget](https://ckeditor.com/cke4/addon/widget) is partially selected.
+* [#2517](https://github.com/ckeditor/ckeditor4/issues/2517): [Chrome, Firefox, Safari] Fixed: Inserting a new image when the selection partially covers an existing [enhanced image](https://ckeditor.com/cke4/addon/image2) widget throws an error.
+* [#3007](https://github.com/ckeditor/ckeditor4/issues/3007): [Chrome, Firefox, Safari] Fixed: Cannot modify the editor content once the selection is released over a [widget](https://ckeditor.com/cke4/addon/widget).
+* [#3698](https://github.com/ckeditor/ckeditor4/issues/3698): Fixed: Cutting the selected text when a [widget](https://ckeditor.com/cke4/addon/widget) is partially selected merges paragraphs.
+
+API Changes:
+
+* [#3387](https://github.com/ckeditor/ckeditor4/issues/3387): Added the [CKEDITOR.ui.richCombo.select()](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_richCombo.html#method-select) method.
+* [#3727](https://github.com/ckeditor/ckeditor4/issues/3727): Added new `textColor` and `bgColor` commands that apply the selected color chosen by the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) plugin.
+* [#3728](https://github.com/ckeditor/ckeditor4/issues/3728): Added new `font` and `fontSize` commands that apply the selected font style chosen by the [Font](https://ckeditor.com/cke4/addon/colorbutton) plugin.
+* [#3842](https://github.com/ckeditor/ckeditor4/issues/3842): Added the [`editor.getSelectedRanges()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getSelectedRanges) alias.
+* [#3775](https://github.com/ckeditor/ckeditor4/issues/3775): Widget [mask](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#property-mask) and [parts](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#property-parts) can now be refreshed dynamically via API calls.
+
+## CKEditor 4.13.1
+
+Fixed Issues:
+
+* [#875](https://github.com/ckeditor/ckeditor4/issues/875): Fixed: Pasting inside the editor that contains a table with the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin after selecting all content replaces only the table element instead of the entire content.
+* [#3415](https://github.com/ckeditor/ckeditor4/issues/3415): [Firefox] Fixed: Pasting individual list elements fails. Thanks to [Jack Wickham](https://github.com/jackwickham)!
+* [#3413](https://github.com/ckeditor/ckeditor4/issues/3413): Fixed: Menu items with labels containing double quotes are rendered incorrectly.
+* [#3475](https://github.com/ckeditor/ckeditor4/issues/3475): [Firefox] Fixed: Pasting plain text over existing content fails and throws an error.
+* [#2027](https://github.com/ckeditor/ckeditor4/issues/2027): Fixed: Incorrect email display text after reopening the [Link](https://ckeditor.com/cke4/addon/link) dialog for display names starting with `@`.
+* [#3544](https://github.com/ckeditor/ckeditor4/issues/3544): Fixed: The [Special Characters](https://ckeditor.com/cke4/addon/specialchar) dialog read incorrectly by screen readers due to empty table cells at the end.
+* [#1653](https://github.com/ckeditor/ckeditor4/issues/1653): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) is not repositioned when the editor is scrolled with the [Div Editing Area](https://ckeditor.com/cke4/addon/divarea) feature enabled.
+* [#3559](https://github.com/ckeditor/ckeditor4/issues/3559): Fixed: [Color Dialog](https://ckeditor.com/cke4/addon/colordialog) is incorrectly positioned when used with another dialog.
+* [#3593](https://github.com/ckeditor/ckeditor4/issues/3593): Fixed: Cannot access a text or comment node when replacing an element node with them via [`CKEDITOR.htmlParser.filter`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_htmlParser_filter.html).
+* [#3524](https://github.com/ckeditor/ckeditor4/issues/3524): Fixed: The [Easy Image](https://ckeditor.com/cke4/addon/easyimage) plugin throws an error when any image with an unsupported data type is pasted into the editor.
+* [#3552](https://github.com/ckeditor/ckeditor4/issues/3352): Fixed: Incorrect value of [`CKEDITOR.plugins.widget.repository#selected`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_repository.html#property-selected) after selecting the whole editor content.
+* [#3586](https://github.com/ckeditor/ckeditor4/issues/3586): Fixed: Content pasted from Microsoft Excel is not correctly recognised by the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#3585](https://github.com/ckeditor/ckeditor4/issues/3585): [Firefox] Fixed: Microsoft Excel content is pasted as an image.
+* [#3625](https://github.com/ckeditor/ckeditor4/issues/3625): [Firefox] Fixed: Microsoft PowerPoint content is pasted as an image.
+* [#3474](https://github.com/ckeditor/ckeditor4/issues/3474): Fixed: Incorrect focus order after any tab in a [dialog](https://ckeditor.com/cke4/addon/dialog) was clicked.
+* [#3689](https://github.com/ckeditor/ckeditor4/issues/3689): Fixed: Cannot change [dialog](https://ckeditor.com/cke4/addon/dialog) tabs with keyboard arrow keys after focusing any tab with a mouse click.
+
+API Changes:
+
+* [#3634](https://github.com/ckeditor/ckeditor4/issues/3634): Added the [`CKEDITOR.plugins.clipboard.dataTransfer#getTypes()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_clipboard_dataTransfer.html#method-getTypes) method.
+
+## CKEditor 4.13
+
+New Features:
+
+* [#835](https://github.com/ckeditor/ckeditor4/issues/835): Extended support for pasting from external applications:
+ * Added support for pasting rich content from Google Docs with the [Paste from Google Docs](https://ckeditor.com/cke4/addon/pastefromgdocs) plugin.
+ * Added a new [Paste Tools](https://ckeditor.com/cke4/addon/pastetools) plugin for unified paste handling.
+* [#3315](https://github.com/ckeditor/ckeditor4/issues/3315): Added support for strikethrough in the [BBCode](https://ckeditor.com/cke4/addon/bbcode) plugin. Thanks to [Alexander Kahl](https://github.com/akahl-owl)!
+* [#3175](https://github.com/ckeditor/ckeditor4/issues/3175): Introduced selection optimization mechanism for handling incorrect selection behaviors in various browsers:
+ * [#3256](https://github.com/ckeditor/ckeditor4/issues/3256): Triple-clicking in the last table cell and deleting content no longer pulls the content below into the table.
+ * [#3118](https://github.com/ckeditor/ckeditor4/issues/3118): Selecting a paragraph with a triple-click and applying a heading applies the heading only to the selected paragraph.
+ * [#3161](https://github.com/ckeditor/ckeditor4/issues/3161): Double-clicking a `` element containing just one word creates a correct selection including the clicked `` only.
+* [#3359](https://github.com/ckeditor/ckeditor4/issues/3359): Improved [dialog](https://ckeditor.com/cke4/addon/dialog) positioning and behavior when the dialog is resized or moved, or the browser window is resized.
+* [#2227](https://github.com/ckeditor/ckeditor4/issues/2227): Added the [`config.linkDefaultProtocol`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-linkDefaultProtocol) configuration option that allows setting the default URL protocol for the [Link](https://ckeditor.com/cke4/addon/link) plugin dialog.
+* [#3240](https://github.com/ckeditor/ckeditor4/issues/3240): Extended the [`CKEDITOR.plugins.widget#mask`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#property-mask) property to allow masking only the specified part of a [widget](https://ckeditor.com/cke4/addon/widget).
+* [#3138](https://github.com/ckeditor/ckeditor4/issues/3138): Added the possibility to use the [`widgetDefinition.getClipboardHtml()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#method-getClipboardHtml) method to customize the [widget](https://ckeditor.com/cke4/addon/widget) HTML during copy, cut and drag operations.
+
+Fixed Issues:
+
+* [#808](https://github.com/ckeditor/ckeditor4/issues/808): Fixed: [Widgets](https://ckeditor.com/cke4/addon/widget) and other content disappear on drag and drop in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_readonly.html).
+* [#3260](https://github.com/ckeditor/ckeditor4/issues/3260): Fixed: [Widget](https://ckeditor.com/cke4/addon/widget) drag handler is visible in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_readonly.html).
+* [#3261](https://github.com/ckeditor/ckeditor4/issues/3261): Fixed: A [widget](https://ckeditor.com/cke4/addon/widget) initialized using the dialog has an incorrect owner document.
+* [#3198](https://github.com/ckeditor/ckeditor4/issues/3198): Fixed: Blurring and focusing the editor when a [widget](https://ckeditor.com/cke4/addon/widget) is focused creates an additional undo step.
+* [#2859](https://github.com/ckeditor/ckeditor4/pull/2859): [IE, Edge] Fixed: Various editor UI elements react to right mouse button click:
+ * [#2845](https://github.com/ckeditor/ckeditor4/issues/2845): [Rich Combo](https://ckeditor.com/cke4/addon/richcombo).
+ * [#2857](https://github.com/ckeditor/ckeditor4/issues/2857): [List Block](https://ckeditor.com/cke4/addon/listblock).
+ * [#2858](https://github.com/ckeditor/ckeditor4/issues/2858): [Menu](https://ckeditor.com/cke4/addon/menu).
+* [#3158](https://github.com/ckeditor/ckeditor4/issues/3158): [Chrome, Safari] Fixed: [Undo](https://ckeditor.com/cke4/addon/undo) plugin breaks with the filling character.
+* [#504](https://github.com/ckeditor/ckeditor4/issues/504): [Edge] Fixed: The editor's selection is collapsed to the beginning of the content when focusing the editor for the first time.
+* [#3101](https://github.com/ckeditor/ckeditor4/issues/3101): Fixed: [`CKEDITOR.dom.range#_getTableElement()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-_getTableElement) returns `null` instead of a table element for edge cases.
+* [#3287](https://github.com/ckeditor/ckeditor4/issues/3287): Fixed: [`CKEDITOR.tools.promise`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_promise.html) initializes incorrectly if an AMD loader is present.
+* [#3379](https://github.com/ckeditor/ckeditor4/issues/3379): Fixed: Incorrect [`CKEDITOR.editor#getData()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getData) call when inserting content into the editor.
+* [#941](https://github.com/ckeditor/ckeditor4/issues/941): Fixed: An error is thrown after styling a table cell text selected using the native selection when the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin is enabled.
+* [#3136](https://github.com/ckeditor/ckeditor4/issues/3136): [Firefox] Fixed: Clicking [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) items removes the native table selection.
+* [#3381](https://github.com/ckeditor/ckeditor4/issues/3381): [IE8] Fixed: The [`CKEDITOR.tools.object.keys()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_object.html#method-keys) method does not accept non-objects.
+* [#2395](https://github.com/ckeditor/ckeditor4/issues/2395): [Android] Fixed: Focused input in a [dialog](https://ckeditor.com/cke4/addon/dialog) is scrolled out of the viewport when the soft keyboard appears.
+* [#453](https://github.com/ckeditor/ckeditor4/issues/453): Fixed: [Link](https://ckeditor.com/cke4/addon/link) dialog has an invalid width when the editor is maximized and the browser window is resized.
+* [#2138](https://github.com/ckeditor/ckeditor4/issues/2138): Fixed: An email address containing a question mark is mishandled by the [Link](https://ckeditor.com/cke4/addon/link) plugin.
+* [#14613](https://dev.ckeditor.com/ticket/14613): Fixed: Race condition when loading plugins for an already destroyed editor instance throws an error.
+* [#2257](https://github.com/ckeditor/ckeditor4/issues/2257): Fixed: The editor throws an exception when destroyed shortly after it was created.
+* [#3115](https://github.com/ckeditor/ckeditor4/issues/3115): Fixed: Destroying the editor during the initialization throws an error.
+* [#3354](https://github.com/ckeditor/ckeditor4/issues/3354): [iOS] Fixed: Pasting no longer works on iOS version 13.
+* [#3423](https://github.com/ckeditor/ckeditor4/issues/3423) Fixed: [Bookmarks](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-createBookmark) can be created inside temporary elements.
+
+API Changes:
+
+* [#3154](https://github.com/ckeditor/ckeditor4/issues/3154): Added the [`CKEDITOR.tools.array.some()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_array.html#method-some) method.
+* [#3245](https://github.com/ckeditor/ckeditor4/issues/3245): Added the [`CKEDITOR.plugins.undo.UndoManager.addFilterRule()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_undo_UndoManager.html#method-addFilterRule) method that allows filtering undo snapshot contents.
+* [#2845](https://github.com/ckeditor/ckeditor4/issues/2845): Added the [`CKEDITOR.tools.normalizeMouseButton()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-normalizeMouseButton) method.
+* [#2975](https://github.com/ckeditor/ckeditor4/issues/2975): Added the [`CKEDITOR.dom.element#fireEventHandler()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_element.html#method-fireEventHandler) method.
+* [#3247](https://github.com/ckeditor/ckeditor4/issues/3247): Extended the [`CKEDITOR.tools.bind()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-bind) method to accept arguments for bound functions.
+* [#3326](https://github.com/ckeditor/ckeditor4/issues/3326): Added the [`CKEDITOR.dom.text#isEmpty()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_text.html#method-isEmpty) method.
+* [#2423](https://github.com/ckeditor/ckeditor4/issues/2423): Added the [`CKEDITOR.plugins.dialog.getModel()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog.html#method-getModel) and [`CKEDITOR.plugins.dialog.getMode()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog.html#method-getMode) methods with their [`CKEDITOR.plugin.definition`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_definition.html) counterparts, allowing to get the dialog subject of a change.
+* [#3124](https://github.com/ckeditor/ckeditor4/issues/3124): Added the [`CKEDITOR.dom.element#isDetached()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_element.html#method-isDetached) method.
+
+## CKEditor 4.12.1
+
+Fixed Issues:
+
+* [#3220](https://github.com/ckeditor/ckeditor4/issues/3220): Fixed: Prevent [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) filter from deleting [Page Break](https://ckeditor.com/cke4/addon/pagebreak) elements on paste.
+
+## CKEditor 4.12
+
+New Features:
+
+* [#2598](https://github.com/ckeditor/ckeditor4/issues/2598): Added the [Page Break](https://ckeditor.com/cke4/addon/pagebreak) feature support for the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#1490](https://github.com/ckeditor/ckeditor4/issues/1490): Improved the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin to retain table cell borders.
+* [#2870](https://github.com/ckeditor/ckeditor4/issues/2870): Improved support for preserving the indentation of list items for nested lists pasted with the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#2048](https://github.com/ckeditor/ckeditor4/issues/2048): New [`CKEDITOR.config.image2_maxSize`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-image2_maxSize) configuration option for the [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugin that allows setting a maximum size that an image can be resized to with the resizer.
+* [#2639](https://github.com/ckeditor/ckeditor4/issues/2639): The [Color Dialog](https://ckeditor.com/cke4/addon/colordialog) plugin now shows the current selection's color when opened.
+* [#2084](https://github.com/ckeditor/ckeditor4/issues/2084): The [Table Tools](https://ckeditor.com/cke4/addon/tabletools) plugin now allows to change the cell height unit type to either pixels or percent.
+* [#3164](https://github.com/ckeditor/ckeditor4/issues/3164): The [Table Tools](https://ckeditor.com/cke4/addon/tabletools) plugin now accepts floating point values as the table cell width and height.
+
+Fixed Issues:
+
+* [#2672](https://github.com/ckeditor/ckeditor4/issues/2672): Fixed: When resizing an [Enhanced Image](https://ckeditor.com/cke4/addon/image2) to a minimum size with the resizer, the image dialog does not show actual values.
+* [#1478](https://github.com/ckeditor/ckeditor4/issues/1478): Fixed: Custom colors added to [Color Button](https://ckeditor.com/cke4/addon/colorbutton) with the [`config.colorButton_colors`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_colors) configuration option in the form of a label or code do not work correctly.
+* [#1469](https://github.com/ckeditor/ckeditor4/issues/1469): Fixed: Trying to get data from a nested editable inside a freshly pasted widget throws an error.
+* [#2235](https://github.com/ckeditor/ckeditor4/issues/2235): Fixed: An [Image](https://ckeditor.com/cke4/addon/image) in a table cell has an empty URL field when edited from the context menu opened by right-click when the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin is in use.
+* [#3098](https://github.com/ckeditor/ckeditor4/issues/3098): Fixed: Unit pickers for table cell width and height in the [Table Tools](https://ckeditor.com/cke4/addon/tabletools) plugin have a different width.
+* [#2923](https://github.com/ckeditor/ckeditor4/issues/2923): Fixed: The CSS `windowtext` color is not correctly recognized by the [`CKEDITOR.tools.style.parse`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_style_parse.html) methods.
+* [#3120](https://github.com/ckeditor/ckeditor4/issues/3120): [IE8] Fixed: The [`CKEDITOR.tools.extend()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tool.html#method-extend) method does not work with the [`DontEnum`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Properties) object property attribute.
+* [#2813](https://github.com/ckeditor/ckeditor4/issues/2813): Fixed: Editor HTML insertion methods ([`editor.insertHtml()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-insertHtml), [`editor.insertHtmlIntoRange()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-insertHtmlIntoRange), [`editor.insertElement()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-insertElement) and [`editor.insertElementIntoRange()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-insertElementIntoRange)) pollute the editable with empty `` elements.
+* [#2751](https://github.com/ckeditor/ckeditor4/issues/2751): Fixed: An editor with [`config.enterMode`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-enterMode) set to [`ENTER_DIV`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#property-ENTER_DIV) alters pasted content.
+
+API Changes:
+
+* [#1496](https://github.com/ckeditor/ckeditor4/issues/1496): The [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) plugin exposes the [`CKEDITOR.ui.balloonToolbar.reposition()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_balloonToolbar.html#reposition) and [`CKEDITOR.ui.balloonToolbarView.reposition()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_balloonToolbarView.html#reposition) methods.
+* [#2021](https://github.com/ckeditor/ckeditor4/issues/2021): Added new [`CKEDITOR.dom.documentFragment.find()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_documentFragment.html#method-find) and [`CKEDITOR.dom.documentFragment.findOne()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_documentFragment.html#method-findOne) methods.
+* [#2700](https://github.com/ckeditor/ckeditor4/issues/2700): Added the [`CKEDITOR.tools.array.find()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_array.html#method-find) method.
+* [#3123](https://github.com/ckeditor/ckeditor4/issues/3123): Added the [`CKEDITOR.tools.object.keys()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_object.html#method-keys) method.
+* [#3123](https://github.com/ckeditor/ckeditor4/issues/3123): Added the [`CKEDITOR.tools.object.entries()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_object.html#method-entries) method.
+* [#3123](https://github.com/ckeditor/ckeditor4/issues/3123): Added the [`CKEDITOR.tools.object.values()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_object.html#method-values) method.
+* [#2821](https://github.com/ckeditor/ckeditor4/issues/2821): The [`CKEDITOR.template#source`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_template.html#property-source) property can now be a function, so it can return the changed template values during the runtime. Thanks to [Jacek Pulit](https://github.com/jacek-pulit)!
+* [#2598](https://github.com/ckeditor/ckeditor4/issues/2598): Added the [`CKEDITOR.plugins.pagebreak.createElement()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_pagebreak.html#method-createElement) method allowing to create a [Page Break](https://ckeditor.com/cke4/addon/pagebreak) plugin [`CKEDITOR.dom.element`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_element.html) instance.
+* [#2748](https://github.com/ckeditor/ckeditor4/issues/2748): Enhanced error messages thrown when creating an editor on a non-existent element or when trying to instantiate the second editor on the same element. Thanks to [Byran Zaugg](https://github.com/blzaugg)!
+* [#2698](https://github.com/ckeditor/ckeditor4/issues/2698): Added the [`CKEDITOR.htmlParser.element.findOne()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_htmlParser_element.html#method-findOne) method.
+* [#2935](https://github.com/ckeditor/ckeditor4/issues/2935): Introduced the [`CKEDITOR.config.pasteFromWord_keepZeroMargins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-pasteFromWord_keepZeroMargins) configuration option that allows for keeping any `margin-*: 0` style that would be otherwise removed when pasting content with the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#2962](https://github.com/ckeditor/ckeditor4/issues/2962): Added the [`CKEDITOR.tools.promise`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_promise.html) class.
+* [#2924](https://github.com/ckeditor/ckeditor4/issues/2924): Added the [`CKEDITOR.tools.style.border`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_style_border.html) object wrapping CSS border style helpers under a single type.
+* [#2495](https://github.com/ckeditor/ckeditor4/issues/2495): The [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin can now be disabled for the given table with the `data-cke-tableselection-ignored` attribute.
+* [#2692](https://github.com/ckeditor/ckeditor4/issues/2692): Plugins can now expose information about the supported environment by implementing the [`pluginDefinition.isSupportedEnvironment()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_pluginDefinition.html#method-isSupportedEnvironment) method.
+
+Other Changes:
+
+* [#2741](https://github.com/ckeditor/ckeditor4/issues/2741): Replaced deprecated `arguments.callee` calls with named function expressions to allow the editor to work in strict mode.
+* [#2924](https://github.com/ckeditor/ckeditor4/issues/2924): Marked [`CKEDITOR.tools.style.parse.border()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_style_parse.html#method-border) as deprecated in favor of the [`CKEDITOR.tools.style.border.fromCssRule()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_style_border.html#static-method-fromCssRule) method.
+* [#3132](https://github.com/ckeditor/ckeditor4/issues/2924): Marked [`CKEDITOR.tools.objectKeys()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-objectKeys) as deprecated in favor of the [`CKEDITOR.tools.object.keys()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_object.html#method-keys) method.
+
+## CKEditor 4.11.4
+
+Fixed Issues:
+
+* [#589](https://github.com/ckeditor/ckeditor4/issues/589): Fixed: The editor causes memory leaks in create and destroy cycles.
+* [#1397](https://github.com/ckeditor/ckeditor4/issues/1397): Fixed: Using the dialog to remove headers from a [table](https://ckeditor.com/cke4/addon/table) with one header row only throws an error.
+* [#1479](https://github.com/ckeditor/ckeditor4/issues/1479): Fixed: [Justification](https://ckeditor.com/cke4/addon/justify) for styled content in BR mode is disabled.
+* [#2816](https://github.com/ckeditor/ckeditor4/issues/2816): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) resize handler is visible in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_readonly.html).
+* [#2874](https://github.com/ckeditor/ckeditor4/issues/2874): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) resize handler is not created when the editor is initialized in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_readonly.html).
+* [#2775](https://github.com/ckeditor/ckeditor4/issues/2775): Fixed: [Clipboard](https://ckeditor.com/cke4/addon/clipboard) paste buttons have wrong state when [read-only](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_readonly.html) mode is set by the mouse event listener with the [Div Editing Area](https://ckeditor.com/cke4/addon/divarea) plugin.
+* [#1901](https://github.com/ckeditor/ckeditor4/issues/1901): Fixed: Cannot open the context menu over a [Widget](https://ckeditor.com/cke4/addon/widget) with the Shift+F10 keyboard shortcut.
+
+Other Changes:
+
+* Updated [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) and [SpellCheckAsYouType](https://ckeditor.com/cke4/addon/scayt) (SCAYT) plugins:
+ * Language dictionary update: German language was extended with over 600k new words.
+ * Language dictionary update: Swedish language was extended with over 300k new words.
+ * Grammar support added for Australian and New Zealand English, Polish, Slovak, Slovenian and Austrian languages.
+ * Changed wavy red and green lines that underline spelling and grammar errors to straight ones.
+ * [#55](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/55): Fixed: WSC does not use [`CKEDITOR.getUrl()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-getUrl) when referencing style sheets.
+ * [#166](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/166): Fixed: SCAYT does not use [`CKEDITOR.getUrl()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-getUrl) when referencing style sheets.
+ * [#56](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/56): [Chrome] Fixed: SCAYT/WSC throws errors when running inside a Chrome extension.
+ * Fixed: After removing a dictionary, the words are not underlined and considered as incorrect.
+ * Fixed: The Slovenian (`sl_SL`) language does not work.
+ * Fixed: Quotes with code `U+2019` (Right single quotation mark) are considered separators.
+ * Fixed: Wrong error message formatting when the service ID is invalid.
+ * Fixed: Absent languages in the Languages tab when using SCAYT with the [Shared Spaces](https://ckeditor.com/cke4/addon/sharedspace) plugin.
+
+## CKEditor 4.11.3
+
+Fixed Issues:
+
+* [#2721](https://github.com/ckeditor/ckeditor4/issues/2721), [#487](https://github.com/ckeditor/ckeditor4/issues/487): Fixed: The order of sublist items is reversed when a higher level list item is removed.
+* [#2527](https://github.com/ckeditor/ckeditor4/issues/2527): Fixed: [Emoji](https://ckeditor.com/cke4/addon/emoji) autocomplete order does not prioritize emojis with the name starting from the used string.
+* [#2572](https://github.com/ckeditor/ckeditor4/issues/2572): Fixed: Icons in the [Emoji](https://ckeditor.com/cke4/addon/emoji) dropdown navigation groups are not centered.
+* [#1191](https://github.com/ckeditor/ckeditor4/issues/1191): Fixed: Items in the [elements path](https://ckeditor.com/cke4/addon/elementspath) are draggable.
+* [#2292](https://github.com/ckeditor/ckeditor4/issues/2292): Fixed: Dropping a list with a link on the editor's margin causes a console error and removes the dragged text from editor.
+* [#2756](https://github.com/ckeditor/ckeditor4/issues/2756): Fixed: The [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin causes an error when typing in the [source editing mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_sourcearea.html).
+* [#1986](https://github.com/ckeditor/ckeditor4/issues/1986): Fixed: The Cell Properties dialog from the [Table Tools](https://ckeditor.com/cke4/addon/tabletools) plugin shows styles that are not allowed through [`config.allowedContent`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-allowedContent).
+* [#2565](https://github.com/ckeditor/ckeditor4/issues/2565): [IE, Edge] Fixed: Buttons in the [editor toolbar](https://ckeditor.com/cke4/addon/toolbar) are activated by clicking them with the right mouse button.
+* [#2792](https://github.com/ckeditor/ckeditor4/pull/2792): Fixed: A bug in the [Copy Formatting](https://ckeditor.com/cke4/addon/copyformatting) plugin that caused the following issues:
+ * [#2780](https://github.com/ckeditor/ckeditor4/issues/2780): Fixed: Undo steps disappear after multiple changes of selection.
+ * [#2470](https://github.com/ckeditor/ckeditor4/issues/2470): [Firefox] Fixed: Widget's nested editable gets blurred upon focus.
+ * [#2655](https://github.com/ckeditor/ckeditor4/issues/2655): [Chrome, Safari] Fixed: Widget's nested editable cannot be focused under certain circumstances.
+
+## CKEditor 4.11.2
+
+Fixed Issues:
+
+* [#2403](https://github.com/ckeditor/ckeditor4/issues/2403): Fixed: Styling inline editor initialized inside a table with the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin is causing style leaks.
+* [#2514](https://github.com/ckeditor/ckeditor4/issues/2403): Fixed: Pasting table data into inline editor initialized inside a table with the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin inserts pasted content into the wrapping table.
+* [#2451](https://github.com/ckeditor/ckeditor4/issues/2451): Fixed: The [Remove Format](https://ckeditor.com/cke4/addon/removeformat) plugin changes selection.
+* [#2546](https://github.com/ckeditor/ckeditor4/issues/2546): Fixed: The separator in the toolbar moves when buttons are focused.
+* [#2506](https://github.com/ckeditor/ckeditor4/issues/2506): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) throws a type error when an empty `
` tag with an `image` class is upcasted.
+* [#2650](https://github.com/ckeditor/ckeditor4/issues/2650): Fixed: [Table](https://ckeditor.com/cke4/addon/table) dialog validator fails when the `getValue()` function is defined in the global scope.
+* [#2690](https://github.com/ckeditor/ckeditor4/issues/2690): Fixed: Decimal characters are removed from the inside of numbered lists when pasting content using the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#2205](https://github.com/ckeditor/ckeditor4/issues/2205): Fixed: It is not possible to add new list items under an item containing a block element.
+* [#2411](https://github.com/ckeditor/ckeditor4/issues/2411), [#2438](https://github.com/ckeditor/ckeditor4/issues/2438) Fixed: Apply numbered list option throws a console error for a specific markup.
+* [#2430](https://github.com/ckeditor/ckeditor4/issues/2430) Fixed: [Color Button](https://ckeditor.com/cke4/addon/colorbutton) and [List Block](https://ckeditor.com/cke4/addon/listblock) items are draggable.
+
+Other Changes:
+
+* Updated the [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) plugin:
+ * [#52](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/52) Fixed: Clicking "Finish Checking" without a prior action would hang the Spell Checking dialog.
+* [#2603](https://github.com/ckeditor/ckeditor4/issues/2603): Corrected the GPL license entry in the `package.json` file.
+
+## CKEditor 4.11.1
+
+Fixed Issues:
+
+* [#2571](https://github.com/ckeditor/ckeditor4/issues/2571): Fixed: Clicking the categories in the [Emoji](https://ckeditor.com/cke4/addon/emoji) dropdown panel scrolls the entire page.
+
+## CKEditor 4.11
+
+**Security Updates:**
+
+* Fixed XSS vulnerability in the HTML parser reported by [maxarr](https://hackerone.com/maxarr).
+
+ Issue summary: It was possible to execute XSS inside CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, and (iii) switch back to WYSIWYG mode.
+
+**An upgrade is highly recommended!**
+
+New Features:
+
+* [#2062](https://github.com/ckeditor/ckeditor4/pull/2062): Added the emoji dropdown that allows the user to choose the emoji from the toolbar and search for them using keywords.
+* [#2154](https://github.com/ckeditor/ckeditor4/issues/2154): The [Link](https://ckeditor.com/cke4/addon/link) plugin now supports phone number links.
+* [#1815](https://github.com/ckeditor/ckeditor4/issues/1815): The [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin supports typing link completion.
+* [#2478](https://github.com/ckeditor/ckeditor4/issues/2478): [Link](https://ckeditor.com/cke4/addon/link) can be inserted using the Ctrl/Cmd + K keystroke.
+* [#651](https://github.com/ckeditor/ckeditor4/issues/651): Text pasted using the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin preserves indentation in paragraphs.
+* [#2248](https://github.com/ckeditor/ckeditor4/issues/2248): Added support for justification in the [BBCode](https://ckeditor.com/cke4/addon/bbcode) plugin. Thanks to [Matěj Kmínek](https://github.com/KminekMatej)!
+* [#706](https://github.com/ckeditor/ckeditor4/issues/706): Added a different cursor style when selecting cells for the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin.
+* [#2072](https://github.com/ckeditor/ckeditor4/issues/2072): The [UI Button](https://ckeditor.com/cke4/addon/button) plugin supports custom `aria-haspopup` property values. The [Menu Button](https://ckeditor.com/cke4/addon/menubutton) `aria-haspopup` value is now `menu`, the [Panel Button](https://ckeditor.com/cke4/addon/panelbutton) and [Rich Combo](https://ckeditor.com/cke4/addon/richcombo) `aria-haspopup` value is now `listbox`.
+* [#1176](https://github.com/ckeditor/ckeditor4/pull/1176): The [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) can now be attached to a selection instead of an element.
+* [#2202](https://github.com/ckeditor/ckeditor4/issues/2202): Added the `contextmenu_contentsCss` configuration option to allow adding custom CSS to the [Context Menu](https://ckeditor.com/cke4/addon/contextmenu).
+
+Fixed Issues:
+
+* [#1477](https://github.com/ckeditor/ckeditor4/issues/1477): Fixed: On destroy, [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) does not destroy its content.
+* [#2394](https://github.com/ckeditor/ckeditor4/issues/2394): Fixed: [Emoji](https://ckeditor.com/cke4/addon/emoji) dropdown does not show up with repeated symbols in a single line.
+* [#1181](https://github.com/ckeditor/ckeditor4/issues/1181): [Chrome] Fixed: Opening the context menu in a read-only editor results in an error.
+* [#2276](https://github.com/ckeditor/ckeditor4/issues/2276): [iOS] Fixed: [Button](https://ckeditor.com/cke4/addon/button) state does not refresh properly.
+* [#1489](https://github.com/ckeditor/ckeditor4/issues/1489): Fixed: Table contents can be removed in read-only mode when the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin is used.
+* [#1264](https://github.com/ckeditor/ckeditor4/issues/1264) Fixed: Right-click does not clear the selection created with the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin.
+* [#586](https://github.com/ckeditor/ckeditor4/issues/586) Fixed: The `required` attribute is not correctly recognized by the [Form Elements](https://ckeditor.com/cke4/addon/forms) plugin dialog. Thanks to [Roli Züger](https://github.com/rzueger)!
+* [#2380](https://github.com/ckeditor/ckeditor4/issues/2380) Fixed: Styling HTML comments in a top-level element results in extra paragraphs.
+* [#2294](https://github.com/ckeditor/ckeditor4/issues/2294) Fixed: Pasting content from Microsoft Outlook and then bolding it results in an error.
+* [#2035](https://github.com/ckeditor/ckeditor4/issues/2035) [Edge] Fixed: `Permission denied` is thrown when opening a [Panel](https://ckeditor.com/cke4/addon/panel) instance.
+* [#965](https://github.com/ckeditor/ckeditor4/issues/965) Fixed: The [`config.forceSimpleAmpersand`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-forceSimpleAmpersand) option does not work. Thanks to [Alex Maris](https://github.com/alexmaris)!
+* [#2448](https://github.com/ckeditor/ckeditor4/issues/2448): Fixed: The [`Escape HTML Entities`] plugin with custom [additional entities](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-entities_additional) configuration breaks HTML escaping.
+* [#898](https://github.com/ckeditor/ckeditor4/issues/898): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) long alternative text protrudes into the editor when the image is selected.
+* [#1113](https://github.com/ckeditor/ckeditor4/issues/1113): [Firefox] Fixed: Nested contenteditable elements path is not updated on focus with the [Div Editing Area](https://ckeditor.com/cke4/addon/divarea) plugin.
+* [#1682](https://github.com/ckeditor/ckeditor4/issues/1682) Fixed: Hovering the [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) panel changes its size, causing flickering.
+* [#421](https://github.com/ckeditor/ckeditor4/issues/421) Fixed: Expandable [Button](https://ckeditor.com/cke4/addon/button) puts the `(Selected)` text at the end of the label when clicked.
+* [#1454](https://github.com/ckeditor/ckeditor4/issues/1454): Fixed: The [`onAbort`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-onAbort) method of the [Upload Widget](https://ckeditor.com/cke4/addon/uploadwidget) is not called when the loader is aborted.
+* [#1451](https://github.com/ckeditor/ckeditor4/issues/1451): Fixed: The context menu is incorrectly positioned when opened with Shift+F10.
+* [#1722](https://github.com/ckeditor/ckeditor4/issues/1722): [`CKEDITOR.filter.instances`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_filter.html#static-property-instances) is causing memory leaks.
+* [#2491](https://github.com/ckeditor/ckeditor4/issues/2491): Fixed: The [Mentions](https://ckeditor.com/cke4/addon/mentions) plugin is not matching diacritic characters.
+* [#2519](https://github.com/ckeditor/ckeditor4/issues/2519): Fixed: The [Accessibility Help](https://ckeditor.com/cke4/addon/a11yhelp) dialog should display all available keystrokes for a single command.
+
+API Changes:
+
+* [#2453](https://github.com/ckeditor/ckeditor4/issues/2453): The [`CKEDITOR.ui.panel.block.getItems`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_panel_block.html#method-getItems) method now also returns `input` elements in addition to links.
+* [#2224](https://github.com/ckeditor/ckeditor4/issues/2224): The [`CKEDITOR.tools.convertToPx`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-convertToPx) function now converts negative values.
+* [#2253](https://github.com/ckeditor/ckeditor4/issues/2253): The widget definition [`insert`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_definition.html#property-insert) method now passes `editor` and `commandData`. Thanks to [marcparmet](https://github.com/marcparmet)!
+* [#2045](https://github.com/ckeditor/ckeditor4/issues/2045): Extracted [`tools.eventsBuffer`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-eventsBuffer) and [`tools.throttle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-throttle) functions logic into a separate namespace.
+ * [`tools.eventsBuffer`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-eventsBuffer) was extracted into [`tools.buffers.event`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_buffers_event.html),
+ * [`tools.throttle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-throttle) was extracted into [`tools.buffers.throttle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_buffers_throttle.html).
+* [#2466](https://github.com/ckeditor/ckeditor4/issues/2466): The [`CKEDITOR.filter`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-constructor) constructor accepts an additional `rules` parameter allowing to bind the editor and filter together.
+* [#2493](https://github.com/ckeditor/ckeditor4/issues/2493): The [`editor.getCommandKeystroke`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getCommandKeystroke) method accepts an additional `all` parameter allowing to retrieve an array of all command keystrokes.
+* [#2483](https://github.com/ckeditor/ckeditor4/issues/2483): Button's DOM element created with the [`hasArrow`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui.html#method-addButton) definition option can by identified by the `.cke_button_expandable` CSS class.
+
+Other Changes:
+
+* [#1713](https://github.com/ckeditor/ckeditor4/issues/1713): Removed the redundant `lang.title` entry from the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin.
+
+## CKEditor 4.10.1
+
+Fixed Issues:
+
+* [#2114](https://github.com/ckeditor/ckeditor4/issues/2114): Fixed: [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) cannot be initialized before [`instanceReady`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-instanceReady).
+* [#2107](https://github.com/ckeditor/ckeditor4/issues/2107): Fixed: Holding and releasing the mouse button is not inserting an [autocomplete](https://ckeditor.com/cke4/addon/autocomplete) suggestion.
+* [#2167](https://github.com/ckeditor/ckeditor4/issues/2167): Fixed: Matching in [Emoji](https://ckeditor.com/cke4/addon/emoji) plugin is not case insensitive.
+* [#2195](https://github.com/ckeditor/ckeditor4/issues/2195): Fixed: [Emoji](https://ckeditor.com/cke4/addon/emoji) shows the suggestion box when the colon is preceded with other characters than white space.
+* [#2169](https://github.com/ckeditor/ckeditor4/issues/2169): [Edge] Fixed: Error thrown when pasting into the editor.
+* [#1084](https://github.com/ckeditor/ckeditor4/issues/1084) Fixed: Using the "Automatic" option with [Color Button](https://ckeditor.com/cke4/addon/colorbutton) on a text with the color already defined sets an invalid color value.
+* [#2271](https://github.com/ckeditor/ckeditor4/issues/2271): Fixed: Custom color name not used as a label in the [Color Button](https://ckeditor.com/cke4/addon/image2) plugin. Thanks to [Eric Geloen](https://github.com/egeloen)!
+* [#2296](https://github.com/ckeditor/ckeditor4/issues/2296): Fixed: The [Color Button](https://ckeditor.com/cke4/addon/colorbutton) plugin throws an error when activated on content containing HTML comments.
+* [#966](https://github.com/ckeditor/ckeditor4/issues/966): Fixed: Executing [`editor.destroy()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-destroy) during the [file upload](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-onUploading) throws an error. Thanks to [Maksim Makarevich](https://github.com/MaksimMakarevich)!
+* [#1719](https://github.com/ckeditor/ckeditor4/issues/1719): Fixed: Ctrl/Cmd + A inadvertently focuses inline editor if it is starting and ending with a list. Thanks to [theNailz](https://github.com/theNailz)!
+* [#1046](https://github.com/ckeditor/ckeditor4/issues/1046): Fixed: Subsequent new links do not include the `id` attribute. Thanks to [Nathan Samson](https://github.com/nathansamson)!
+* [#1348](https://github.com/ckeditor/ckeditor4/issues/1348): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugin aspect ratio locking uses an old width and height on image URL change.
+* [#1791](https://github.com/ckeditor/ckeditor4/issues/1791): Fixed: [Image](https://ckeditor.com/cke4/addon/image) and [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugins can be enabled when [Easy Image](https://ckeditor.com/cke4/addon/easyimage) is present.
+* [#2254](https://github.com/ckeditor/ckeditor4/issues/2254): Fixed: [Image](https://ckeditor.com/cke4/addon/image) ratio locking is too precise for resized images. Thanks to [Jonathan Gilbert](https://github.com/logiclrd)!
+* [#1184](https://github.com/ckeditor/ckeditor4/issues/1184): [IE8-11] Fixed: Copying and pasting data in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-readOnly) throws an error.
+* [#1916](https://github.com/ckeditor/ckeditor4/issues/1916): [IE9-11] Fixed: Pressing the Delete key in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-readOnly) throws an error.
+* [#2003](https://github.com/ckeditor/ckeditor4/issues/2003): [Firefox] Fixed: Right-clicking multiple selected table cells containing empty paragraphs removes the selection.
+* [#1816](https://github.com/ckeditor/ckeditor4/issues/1816): Fixed: Table breaks when Enter is pressed over the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin.
+* [#1115](https://github.com/ckeditor/ckeditor4/issues/1115): Fixed: The `` tag is not preserved when proper configuration is provided and a style is applied by the [Font](https://ckeditor.com/cke4/addon/font) plugin.
+* [#727](https://github.com/ckeditor/ckeditor4/issues/727): Fixed: Custom styles may be invisible in the [Styles Combo](https://ckeditor.com/cke4/addon/stylescombo) plugin.
+* [#988](https://github.com/ckeditor/ckeditor4/issues/988): Fixed: ACF-enabled custom elements prefixed with `object`, `embed`, `param` are removed from the editor content.
+
+API Changes:
+
+* [#2249](https://github.com/ckeditor/ckeditor4/issues/1791): Added the [`editor.plugins.detectConflict()`](https://ckeditor.com/docs/ckeditor4/latest/CKEDITOR_editor_plugins.html#method-detectConflict) method finding conflicts between provided plugins.
+
+## CKEditor 4.10
+
+New Features:
+
+* [#1751](https://github.com/ckeditor/ckeditor4/issues/1751): Introduced the **Autocomplete** feature that consists of the following plugins:
+ * [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) – Provides contextual completion feature for custom text matches based on user input.
+ * [Text Watcher](https://ckeditor.com/cke4/addon/textWatcher) – Checks whether an editor's text change matches the chosen criteria.
+ * [Text Match](https://ckeditor.com/cke4/addon/textMatch) – Allows to search [`CKEDITOR.dom.range`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html) for matching text.
+* [#1703](https://github.com/ckeditor/ckeditor4/issues/1703): Introduced the [Mentions](https://ckeditor.com/cke4/addon/mentions) plugin providing smart completion feature for custom text matches based on user input starting with a chosen marker character.
+* [#1746](https://github.com/ckeditor/ckeditor4/issues/1703): Introduced the [Emoji](https://ckeditor.com/cke4/addon/emoji) plugin providing completion feature for emoji ideograms.
+* [#1761](https://github.com/ckeditor/ckeditor4/issues/1761): The [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin now supports email links.
+
+Fixed Issues:
+
+* [#1458](https://github.com/ckeditor/ckeditor4/issues/1458): [Edge] Fixed: After blurring the editor it takes 2 clicks to focus a widget.
+* [#1034](https://github.com/ckeditor/ckeditor4/issues/1034): Fixed: JAWS leaves forms mode after pressing the Enter key in an inline editor instance.
+* [#1748](https://github.com/ckeditor/ckeditor4/pull/1748): Fixed: Missing [`CKEDITOR.dialog.definition.onHide`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_definition.html#property-onHide) API documentation. Thanks to [sunnyone](https://github.com/sunnyone)!
+* [#1321](https://github.com/ckeditor/ckeditor4/issues/1321): Fixed: Ideographic space character (`\u3000`) is lost when pasting text.
+* [#1776](https://github.com/ckeditor/ckeditor4/issues/1776): Fixed: Empty caption placeholder of the [Image Base](https://ckeditor.com/cke4/addon/imagebase) plugin is not hidden when blurred.
+* [#1592](https://github.com/ckeditor/ckeditor4/issues/1592): Fixed: The [Image Base](https://ckeditor.com/cke4/addon/imagebase) plugin caption is not visible after paste.
+* [#620](https://github.com/ckeditor/ckeditor4/issues/620): Fixed: The [`config.forcePasteAsPlainText`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-forcePasteAsPlainText) option is not respected in internal and cross-editor pasting.
+* [#1467](https://github.com/ckeditor/ckeditor4/issues/1467): Fixed: The resizing cursor of the [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin appearing in the middle of a merged cell.
+
+API Changes:
+
+* [#850](https://github.com/ckeditor/ckeditor4/issues/850): Backward incompatibility: Replaced the `replace` dialog from the [Find / Replace](https://ckeditor.com/cke4/addon/find) plugin with a `tabId` option in the `find` command.
+* [#1582](https://github.com/ckeditor/ckeditor4/issues/1582): The [`CKEDITOR.editor.addCommand()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-addCommand) method can now accept a [`CKEDITOR.command`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_command.html) instance as a parameter.
+* [#1712](https://github.com/ckeditor/ckeditor4/issues/1712): The [`extraPlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-extraPlugins), [`removePlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-removePlugins) and [`plugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-plugins) configuration options allow whitespace.
+* [#1802](https://github.com/ckeditor/ckeditor4/issues/1802): The [`extraPlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-extraPlugins), [`removePlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-removePlugins) and [`plugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-plugins) configuration options allow passing plugin names as an array.
+* [#1724](https://github.com/ckeditor/ckeditor4/issues/1724): Added an option to the [`getClientRect()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_element.html#method-getClientRect) function allowing to retrieve an absolute bounding rectangle of the element, i.e. a position relative to the upper-left corner of the topmost viewport.
+* [#1498](https://github.com/ckeditor/ckeditor4/issues/1498) : Added a new [`getClientRects()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-getClientRects) method to `CKEDITOR.dom.range`. It returns a list of rectangles for each selected element.
+* [#1993](https://github.com/ckeditor/ckeditor4/issues/1993): Added the [`CKEDITOR.tools.throttle()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-throttle) function.
+
+Other Changes:
+
+* Updated [SCAYT](https://ckeditor.com/cke4/addon/scayt) (Spell Check As You Type) and [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) plugins:
+ * Language dictionary update: Added support for the Uzbek Latin language.
+ * Languages no longer supported as additional languages: Manx - Isle of Man (`gv_GB`) and Interlingua (`ia_XR`).
+ * Extended and improved language dictionaries: Georgian and Swedish. Also added the missing word _"Ensure"_ to the American, British and Canada English language.
+ * [#141](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/141) Fixed: SCAYT throws "Uncaught Error: Error in RangyWrappedRange module: createRange(): Parameter must be a Window object or DOM node".
+ * [#153](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/153) [Chrome] Fixed: Correcting a word in the widget in SCAYT moves focus to another editable.
+ * [#155](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/155) [IE8] Fixed: SCAYT throws an error and does not work.
+ * [#156](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/156) [IE10] Fixed: SCAYT does not seem to work.
+ * Fixed: After some text is dragged and dropped, the markup is not refreshed for grammar problems in SCAYT.
+ * Fixed: Request to FastCGI fails when the user tries to replace a word with non-English characters with a proper suggestion in WSC.
+ * [Firefox] Fixed: Ctrl+Z removes focus in SCAYT.
+ * Grammar support for default languages was improved.
+ * New application source URL was added in SCAYT.
+ * Removed green marks and legend related to grammar-supported languages in the Languages tab of SCAYT. Grammar is now supported for almost all the anguages in the list for an additional fee.
+ * Fixed: JavaScript error in the console: "Cannot read property 'split' of undefined" in SCAYT and WSC.
+ * [IE10] Fixed: Markup is not set for a specific case in SCAYT.
+ * Fixed: Accessibility issue: No `alt` attribute for the logo image in the About tab of SCAYT.
+
+## CKEditor 4.9.2
+
+**Security Updates:**
+
+* Fixed XSS vulnerability in the [Enhanced Image](https://ckeditor.com/cke4/addon/image2) (`image2`) plugin reported by [Kyaw Min Thein](https://twitter.com/kyawminthein99).
+
+ Issue summary: It was possible to execute XSS inside CKEditor using the `` tag and specially crafted HTML. Please note that the default presets (Basic/Standard/Full) do not include this plugin, so you are only at risk if you made a custom build and enabled this plugin.
+
+We would like to thank the [Drupal security team](https://www.drupal.org/drupal-security-team) for bringing this matter to our attention and coordinating the fix and release process!
+
+## CKEditor 4.9.1
+
+Fixed Issues:
+
+* [#1835](https://github.com/ckeditor/ckeditor4/issues/1835): Fixed: Integration between [CKFinder](https://ckeditor.com/ckeditor-4/ckfinder/) and the [File Browser](https://ckeditor.com/cke4/addon/filebrowser) plugin does not work.
+
+## CKEditor 4.9
+
+New Features:
+
+* [#932](https://github.com/ckeditor/ckeditor4/issues/932): Introduced Easy Image feature for inserting images that are automatically rescaled, optimized, responsive and delivered through a blazing-fast CDN. Three new plugins were added to support it:
+ * [Easy Image](https://ckeditor.com/cke4/addon/easyimage),
+ * [Cloud Services](https://ckeditor.com/cke4/addon/cloudservices)
+ * [Image Base](https://ckeditor.com/cke4/addon/imagebase)
+* [#1338](https://github.com/ckeditor/ckeditor4/issues/1338): Keystroke labels are displayed for function keys (like F7, F8).
+* [#643](https://github.com/ckeditor/ckeditor4/issues/643): The [File Browser](https://ckeditor.com/cke4/addon/filebrowser) plugin can now upload files using XHR requests. This allows for setting custom HTTP headers using the [`config.fileTools_requestHeaders`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-fileTools_requestHeaders) configuration option.
+* [#1365](https://github.com/ckeditor/ckeditor4/issues/1365): The [File Browser](https://ckeditor.com/cke4/addon/filebrowser) plugin uses XHR requests by default.
+* [#1399](https://github.com/ckeditor/ckeditor4/issues/1399): Added the possibility to set [`CKEDITOR.config.startupFocus`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-startupFocus) as `start` or `end` to specify where the editor focus should be after the initialization.
+* [#1441](https://github.com/ckeditor/ckeditor4/issues/1441): The [Magic Line](https://ckeditor.com/cke4/addon/magicline) plugin line element can now be identified by the `data-cke-magic-line="1"` attribute.
+
+Fixed Issues:
+
+* [#595](https://github.com/ckeditor/ckeditor4/issues/595): Fixed: Pasting does not work on mobile devices.
+* [#869](https://github.com/ckeditor/ckeditor4/issues/869): Fixed: Empty selection clears cached clipboard data in the editor.
+* [#1419](https://github.com/ckeditor/ckeditor4/issues/1419): Fixed: The [Widget Selection](https://ckeditor.com/cke4/addon/widgetselection) plugin selects the editor content with the Alt+A key combination on Windows.
+* [#1274](https://github.com/ckeditor/ckeditor4/issues/1274): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) does not match a single selected image using the [`contextDefinition.cssSelector`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_balloontoolbar_contextDefinition.html#property-cssSelector) matcher.
+* [#1232](https://github.com/ckeditor/ckeditor4/issues/1232): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) buttons should be registered as focusable elements.
+* [#1342](https://github.com/ckeditor/ckeditor4/issues/1342): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) should be re-positioned after the [`change`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-change) event.
+* [#1426](https://github.com/ckeditor/ckeditor4/issues/1426): [IE8-9] Fixed: Missing [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) background in the [Kama](https://ckeditor.com/cke4/addon/kama) skin. Thanks to [Christian Elmer](https://github.com/keinkurt)!
+* [#1470](https://github.com/ckeditor/ckeditor4/issues/1470): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) is not visible after drag and drop of a widget it is attached to.
+* [#1048](https://github.com/ckeditor/ckeditor4/issues/1048): Fixed: [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) is not positioned properly when a margin is added to its non-static parent.
+* [#889](https://github.com/ckeditor/ckeditor4/issues/889): Fixed: Unclear error message for width and height fields in the [Image](https://ckeditor.com/cke4/addon/image) and [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugins.
+* [#859](https://github.com/ckeditor/ckeditor4/issues/859): Fixed: Cannot edit a link after a double-click on the text in the link.
+* [#1013](https://github.com/ckeditor/ckeditor4/issues/1013): Fixed: [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) does not work correctly with the [`config.forcePasteAsPlainText`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-forcePasteAsPlainText) option.
+* [#1356](https://github.com/ckeditor/ckeditor4/issues/1356): Fixed: [Border parse function](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_style_parse.html#method-border) does not allow spaces in the color value.
+* [#1010](https://github.com/ckeditor/ckeditor4/issues/1010): Fixed: The CSS `border` shorthand property was incorrectly expanded ignoring the `border-color` style.
+* [#1535](https://github.com/ckeditor/ckeditor4/issues/1535): Fixed: [Widget](https://ckeditor.com/cke4/addon/widget) mouseover border contrast is insufficient.
+* [#1516](https://github.com/ckeditor/ckeditor4/issues/1516): Fixed: Fake selection allows removing content in read-only mode using the Backspace and Delete keys.
+* [#1570](https://github.com/ckeditor/ckeditor4/issues/1570): Fixed: Fake selection allows cutting content in read-only mode using the Ctrl/Cmd + X keys.
+* [#1363](https://github.com/ckeditor/ckeditor4/issues/1363): Fixed: Paste notification is unclear and it might confuse users.
+
+
+API Changes:
+
+* [#1346](https://github.com/ckeditor/ckeditor4/issues/1346): [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) [context manager API](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.plugins.balloontoolbar.contextManager.html) is now available in the [`pluginDefinition.init()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_pluginDefinition.html#method-init) method of the [requiring](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_pluginDefinition.html#property-requires) plugin.
+* [#1530](https://github.com/ckeditor/ckeditor4/issues/1530): Added the possibility to use custom icons for [buttons](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_button.html.html).
+
+Other Changes:
+
+* Updated [SCAYT](https://ckeditor.com/cke4/addon/scayt) (Spell Check As You Type) and [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) plugins:
+ * SCAYT [`scayt_minWordLength`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#scayt_minWordLength) configuration option now defaults to 3 instead of 4.
+ * SCAYT default number of suggested words in the context menu changed to 3.
+ * [#90](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/90): Fixed: Selection is lost on link creation if SCAYT highlights the word.
+ * Fixed: SCAYT crashes when the browser `localStorage` is disabled.
+ * [IE11] Fixed: `Unable to get property type of undefined or null reference` error in the browser console when SCAYT is disabled/enabled.
+ * [#46](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/46): Fixed: Editing is blocked when remote spell checker server is offline.
+ * Fixed: User Dictionary cannot be created in WSC due to `You already have the dictionary` error.
+ * Fixed: Words with apostrophe `'` on the replacement make the WSC dialog inaccessible.
+ * Fixed: SCAYT/WSC causes the `Uncaught TypeError` error in the browser console.
+* [#1337](https://github.com/ckeditor/ckeditor4/issues/1337): Updated the samples layout with the new CKEditor 4 logo and color scheme.
+* [#1591](https://github.com/ckeditor/ckeditor4/issues/1591): CKBuilder and language tools are now downloaded over HTTPS. Thanks to [August Detlefsen](https://github.com/augustd)!
+
+## CKEditor 4.8
+
+**Important Notes:**
+
+* [#1249](https://github.com/ckeditor/ckeditor4/issues/1249): Enabled the [Upload Image](https://ckeditor.com/cke4/addon/uploadimage) plugin by default in standard and full presets. Also, it will no longer log an error in case of missing [`config.imageUploadUrl`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-imageUploadUrl) property.
+
+New Features:
+
+* [#933](https://github.com/ckeditor/ckeditor4/issues/933): Introduced [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) plugin.
+* [#662](https://github.com/ckeditor/ckeditor4/issues/662): Introduced image inlining for the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#468](https://github.com/ckeditor/ckeditor4/issues/468): [Edge] Introduced support for the Clipboard API.
+* [#607](https://github.com/ckeditor/ckeditor4/issues/607): Manually inserted Hex color is prefixed with a hash character (`#`) if needed. It ensures a valid Hex color value is used when setting the table cell border or background color with the [Color Dialog](https://ckeditor.com/cke4/addon/colordialog) window.
+* [#584](https://github.com/ckeditor/ckeditor4/issues/584): [Font size and Family](https://ckeditor.com/cke4/addon/font) and [Format](https://ckeditor.com/cke4/addon/format) drop-downs are not toggleable anymore. Default option to reset styles added.
+* [#856](https://github.com/ckeditor/ckeditor4/issues/856): Introduced the [`CKEDITOR.tools.keystrokeToArray()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-keystrokeToArray) method. It converts a keystroke into its string representation, returning every key name as a separate array element.
+* [#1053](https://github.com/ckeditor/ckeditor4/issues/1053): Introduced the [`CKEDITOR.tools.object.merge()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_object.html#method-merge) method. It allows to merge two objects, returning the new object with all properties from both objects deeply cloned.
+* [#1073](https://github.com/ckeditor/ckeditor4/issues/1073): Introduced the [`CKEDITOR.tools.array.every()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_array.html#method-every) method. It invokes a given test function on every array element and returns `true` if all elements pass the test.
+
+Fixed Issues:
+
+* [#796](https://github.com/ckeditor/ckeditor4/issues/796): Fixed: A list is pasted from OneNote in the reversed order.
+* [#834](https://github.com/ckeditor/ckeditor4/issues/834): [IE9-11] Fixed: The editor does not save the selected state of radio buttons inserted by the [Form Elements](https://ckeditor.com/cke4/addon/forms) plugin.
+* [#704](https://github.com/ckeditor/ckeditor4/issues/704): [Edge] Fixed: Using Ctrl/Cmd + Z breaks widget structure.
+* [#591](https://github.com/ckeditor/ckeditor4/issues/591): Fixed: A column is inserted in a wrong order inside the table if any cell has a vertical split.
+* [#787](https://github.com/ckeditor/ckeditor4/issues/787): Fixed: Using Cut inside a nested table does not cut the selected content.
+* [#842](https://github.com/ckeditor/ckeditor4/issues/842): Fixed: List style not restored when toggling list indent level in the [Indent List](https://ckeditor.com/cke4/addon/indentlist) plugin.
+* [#711](https://github.com/ckeditor/ckeditor4/issues/711): Fixed: Dragging widgets should only work with the left mouse button.
+* [#862](https://github.com/ckeditor/ckeditor4/issues/862): Fixed: The "Object Styles" group in the [Styles Combo](https://ckeditor.com/cke4/addon/stylescombo) plugin is visible only if the whole element is selected.
+* [#994](https://github.com/ckeditor/ckeditor4/pull/994): Fixed: Typo in the [`CKEDITOR.focusManager.focus()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_focusManager.html#method-focus) API documentation. Thanks to [benjy](https://github.com/benjy)!
+* [#1014](https://github.com/ckeditor/ckeditor4/issues/1014): Fixed: The [Table Tools](https://ckeditor.com/cke4/addon/tabletools) Cell Properties dialog is now [Advanced Content Filter](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_acf.html) aware — it is not possible to change the cell width or height if corresponding styles are disabled.
+* [#877](https://github.com/ckeditor/ckeditor4/issues/877): Fixed: A list with custom bullets with exotic characters crashes the editor when [pasted from Word](https://ckeditor.com/cke4/addon/pastefromword).
+* [#605](https://github.com/ckeditor/ckeditor4/issues/605): Fixed: Inline widgets do not preserve trailing spaces.
+* [#1008](https://github.com/ckeditor/ckeditor4/issues/1008): Fixed: Shorthand Hex colors from the [`config.colorButton_colors`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_colors) option are not correctly highlighted in the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) Text Color or Background Color panel.
+* [#1094](https://github.com/ckeditor/ckeditor4/issues/1094): Fixed: Widget definition [`upcast`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_definition.html#property-upcasts) methods are called for every element.
+* [#1057](https://github.com/ckeditor/ckeditor4/issues/1057): Fixed: The [Notification](https://ckeditor.com/addon/notification) plugin overwrites Web Notifications API due to leakage to the global scope.
+* [#1068](https://github.com/ckeditor/ckeditor4/issues/1068): Fixed: Upload widget paste listener ignores changes to the [`uploadWidgetDefinition`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.fileTools.uploadWidgetDefinition.html).
+* [#921](https://github.com/ckeditor/ckeditor4/issues/921): Fixed: [Edge] CKEditor erroneously perceives internal copy and paste as type "external".
+* [#1213](https://github.com/ckeditor/ckeditor4/issues/1213): Fixed: Multiple images uploaded using [Upload Image](https://ckeditor.com/cke4/addon/uploadimage) plugin are randomly duplicated or mangled.
+* [#532](https://github.com/ckeditor/ckeditor4/issues/532): Fixed: Removed an outdated user guide link from the [About](https://ckeditor.com/cke4/addon/about) dialog.
+* [#1221](https://github.com/ckeditor/ckeditor4/issues/1221): Fixed: Invalid CSS loaded by [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) plugin when [`config.skin`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-skin) is loaded using a custom path.
+* [#522](https://github.com/ckeditor/ckeditor4/issues/522): Fixed: Widget selection is not removed when widget is inside table cell with [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin enabled.
+* [#1027](https://github.com/ckeditor/ckeditor4/issues/1027): Fixed: Cannot add multiple images to the table with [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin in certain situations.
+* [#1069](https://github.com/ckeditor/ckeditor4/issues/1069): Fixed: Wrong shape processing by [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#995](https://github.com/ckeditor/ckeditor4/issues/995): Fixed: Hyperlinked image gets inserted twice by [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#1287](https://github.com/ckeditor/ckeditor4/issues/1287): Fixed: [Widget](https://ckeditor.com/cke4/addon/widget) plugin throws exception if included in editor build but not loaded into editor's instance.
+
+API Changes:
+
+* [#1097](https://github.com/ckeditor/ckeditor4/issues/1097): Widget [`upcast`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_definition.html#property-upcast) methods are now called in the [widget definition's](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#property-definition) context.
+* [#1118](https://github.com/ckeditor/ckeditor4/issues/1118): Added the `show` option in the [`balloonPanel.attach()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_balloonPanel.html#method-attach) method, allowing to attach a hidden [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) instance.
+* [#1145](https://github.com/ckeditor/ckeditor4/issues/1145): Added the [`skipNotifications`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-skipNotifications) option to the [`CKEDITOR.fileTools.uploadWidgetDefinition`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.fileTools.uploadWidgetDefinition.html), allowing to switch off default notifications displayed by upload widgets.
+
+Other Changes:
+
+* [#815](https://github.com/ckeditor/ckeditor4/issues/815): Removed Node.js dependency from the CKEditor build script.
+* [#1041](https://github.com/ckeditor/ckeditor4/pull/1041), [#1131](https://github.com/ckeditor/ckeditor4/issues/1131): Updated URLs pointing to [CKSource](https://cksource.com/) and [CKEditor](https://ckeditor.com/) resources after the launch of new websites.
+
+## CKEditor 4.7.3
+
+New Features:
+
+* [#568](https://github.com/ckeditor/ckeditor4/issues/568): Added possibility to adjust nested editables' filters using the [`CKEDITOR.filter.disallowedContent`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_filter.html#property-disallowedContent) property.
+
+Fixed Issues:
+
+* [#554](https://github.com/ckeditor/ckeditor4/issues/554): Fixed: [`change`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-change) event not fired when typing the first character after pasting into the editor. Thanks to [Daniel Miller](https://github.com/millerdev)!
+* [#566](https://github.com/ckeditor/ckeditor4/issues/566): Fixed: The CSS `border` shorthand property with zero width (`border: 0px solid #000;`) causes the table to have the border attribute set to 1.
+* [#779](https://github.com/ckeditor/ckeditor4/issues/779): Fixed: The [Remove Format](https://ckeditor.com/cke4/addon/removeformat) plugin removes elements with language definition inserted by the [Language](https://ckeditor.com/cke4/addon/language) plugin.
+* [#423](https://github.com/ckeditor/ckeditor4/issues/423): Fixed: The [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin pastes paragraphs into the editor even if [`CKEDITOR.config.enterMode`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-enterMode) is set to `CKEDITOR.ENTER_BR`.
+* [#719](https://github.com/ckeditor/ckeditor4/issues/719): Fixed: Image inserted using the [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugin can be resized when the editor is in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_readonly.html).
+* [#577](https://github.com/ckeditor/ckeditor4/issues/577): Fixed: The "Delete Columns" command provided by the [Table Tools](https://ckeditor.com/cke4/addon/tabletools) plugin throws an error when trying to delete columns.
+* [#867](https://github.com/ckeditor/ckeditor4/issues/867): Fixed: Typing into a selected table throws an error.
+* [#817](https://github.com/ckeditor/ckeditor4/issues/817): Fixed: The [Save](https://ckeditor.com/cke4/addon/save) plugin does not work in [Source Mode](https://ckeditor.com/cke4/addon/sourcearea).
+
+Other Changes:
+
+* Updated the [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) plugin:
+ * [#40](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/40): Fixed: IE10 throws an error when spell checking is started.
+* [#800](https://github.com/ckeditor/ckeditor4/issues/800): Added the [`CKEDITOR.dom.selection.isCollapsed()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_selection.html#method-isCollapsed) method which is a simpler way to check if the selection is collapsed.
+* [#830](https://github.com/ckeditor/ckeditor4/issues/830): Added an option to define which dialog tab should be shown by default when creating [`CKEDITOR.dialogCommand`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.dialogCommand.html).
+
+## CKEditor 4.7.2
+
+New Features:
+
+* [#455](https://github.com/ckeditor/ckeditor4/issues/455): Added [Advanced Content Filter](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_acf.html) integration with the [Justify](https://ckeditor.com/cke4/addon/justify) plugin.
+
+Fixed Issues:
+
+* [#663](https://github.com/ckeditor/ckeditor4/issues/663): [Chrome] Fixed: Clicking the scrollbar throws an `Uncaught TypeError: element.is is not a function` error.
+* [#694](https://github.com/ckeditor/ckeditor4/pull/694): Refactoring in the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin:
+ * [#520](https://github.com/ckeditor/ckeditor4/issues/520): Fixed: Widgets cannot be properly pasted into a table cell.
+ * [#460](https://github.com/ckeditor/ckeditor4/issues/460): Fixed: Editor gone after pasting into an editor within a table.
+* [#579](https://github.com/ckeditor/ckeditor4/issues/579): Fixed: Internal `cke_table-faked-selection-table` class is visible in the Stylesheet Classes field of the [Table Properties](https://ckeditor.com/cke4/addon/table) dialog.
+* [#545](https://github.com/ckeditor/ckeditor4/issues/545): [Edge] Fixed: Error thrown when pressing the [Select All](https://ckeditor.com/cke4/addon/selectall) button in [Source Mode](https://ckeditor.com/cke4/addon/sourcearea).
+* [#582](https://github.com/ckeditor/ckeditor4/issues/582): Fixed: Double slash in the path to stylesheet needed by the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin. Thanks to [Marius Dumitru Florea](https://github.com/mflorea)!
+* [#491](https://github.com/ckeditor/ckeditor4/issues/491): Fixed: Unnecessary dependency on the [Editor Toolbar](https://ckeditor.com/cke4/addon/toolbar) plugin inside the [Notification](https://ckeditor.com/cke4/addon/notification) plugin.
+* [#646](https://github.com/ckeditor/ckeditor4/issues/646): Fixed: Error thrown into the browser console after opening the [Styles Combo](https://ckeditor.com/cke4/addon/stylescombo) plugin menu in the editor without any selection.
+* [#501](https://github.com/ckeditor/ckeditor4/issues/501): Fixed: Double click does not open the dialog for modifying anchors inserted via the [Link](https://ckeditor.com/cke4/addon/link) plugin.
+* [#9780](https://dev.ckeditor.com/ticket/9780): [IE8-9] Fixed: Clicking inside an empty [read-only](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-readOnly) editor throws an error.
+* [#16820](https://dev.ckeditor.com/ticket/16820): [IE10] Fixed: Clicking below a single horizontal rule throws an error.
+* [#426](https://github.com/ckeditor/ckeditor4/issues/426): Fixed: The [`range.cloneContents()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-cloneContents) method selects the whole element when the selection starts at the beginning of that element.
+* [#644](https://github.com/ckeditor/ckeditor4/issues/644): Fixed: The [`range.extractContents()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-extractContents) method returns an incorrect result when multiple nodes are selected.
+* [#684](https://github.com/ckeditor/ckeditor4/issues/684): Fixed: The [`elementPath.contains()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_elementPath.html#method-contains) method incorrectly excludes the last element instead of root when the `fromTop` parameter is set to `true`.
+
+Other Changes:
+
+* Updated the [SCAYT](https://ckeditor.com/cke4/addon/scayt) (Spell Check As You Type) plugin:
+ * [#148](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/148): Fixed: SCAYT leaves underlined word after the CKEditor Replace dialog corrects it.
+* [#751](https://github.com/ckeditor/ckeditor4/issues/751): Added the [`CKEDITOR.dom.nodeList.toArray()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_nodeList.html#method-toArray) method which returns an array representation of a [node list](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.dom.nodeList.html).
+
+## CKEditor 4.7.1
+
+New Features:
+
+* Added a new Mexican Spanish localization. Thanks to [David Alexandro Rodriguez](https://www.transifex.com/user/profile/darsco16/)!
+* [#413](https://github.com/ckeditor/ckeditor4/issues/413): Added Paste as Plain Text keyboard shortcut to the [Accessibility Help](https://ckeditor.com/cke4/addon/a11yhelp) instructions.
+
+Fixed Issues:
+
+* [#515](https://github.com/ckeditor/ckeditor4/issues/515): [Chrome] Fixed: Mouse actions on CKEditor scrollbar throw an exception when the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin is loaded.
+* [#493](https://github.com/ckeditor/ckeditor4/issues/493): Fixed: Selection started from a nested table causes an error in the browser while scrolling down.
+* [#415](https://github.com/ckeditor/ckeditor4/issues/415): [Firefox] Fixed: Enter key breaks the table structure when pressed in a table selection.
+* [#457](https://github.com/ckeditor/ckeditor4/issues/457): Fixed: Error thrown when deleting content from the editor with no selection.
+* [#478](https://github.com/ckeditor/ckeditor4/issues/478): [Chrome] Fixed: Error thrown by the [Enter Key](https://ckeditor.com/cke4/addon/enterkey) plugin when pressing Enter with no selection.
+* [#424](https://github.com/ckeditor/ckeditor4/issues/424): Fixed: Error thrown by [Tab Key Handling](https://ckeditor.com/cke4/addon/tab) and [Indent List](https://ckeditor.com/cke4/addon/indentlist) plugins when pressing Tab with no selection in inline editor.
+* [#476](https://github.com/ckeditor/ckeditor4/issues/476): Fixed: Anchors inserted with the [Link](https://ckeditor.com/cke4/addon/link) plugin on collapsed selection cannot be edited.
+* [#417](https://github.com/ckeditor/ckeditor4/issues/417): Fixed: The [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin throws an error when used with a table with only header or footer rows.
+* [#523](https://github.com/ckeditor/ckeditor4/issues/523): Fixed: The [`editor.getCommandKeystroke()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getCommandKeystroke) method does not obtain the correct keystroke.
+* [#534](https://github.com/ckeditor/ckeditor4/issues/534): [IE] Fixed: [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) does not work in Quirks Mode.
+* [#450](https://github.com/ckeditor/ckeditor4/issues/450): Fixed: [`CKEDITOR.filter`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.filter.html) incorrectly transforms the `margin` CSS property.
+
+## CKEditor 4.7
+
+**Important Notes:**
+
+* [#13793](https://dev.ckeditor.com/ticket/13793): The [`embed_provider`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-embed_provider) configuration option for the [Media Embed](https://ckeditor.com/cke4/addon/embed) and [Semantic Media Embed](https://ckeditor.com/cke4/addon/embedsemantic) plugins is no longer preset by default.
+* The [UI Color](https://ckeditor.com/cke4/addon/uicolor) plugin now uses a custom color picker instead of the `YUI 2.7.0` library which has some known vulnerabilities (it's a security precaution, there was no security issue in CKEditor due to the way it was used).
+
+New Features:
+
+* [#16755](https://dev.ckeditor.com/ticket/16755): Added the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin that lets you select and manipulate an arbitrary rectangular table fragment (a few cells, a row or a column).
+* [#16961](https://dev.ckeditor.com/ticket/16961): Added support for pasting from Microsoft Excel.
+* [#13381](https://dev.ckeditor.com/ticket/13381): Dynamic code evaluation call in [`CKEDITOR.template`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.template.html) removed. CKEditor can now be used without the `unsafe-eval` Content Security Policy. Thanks to [Caridy Patiño](http://caridy.name)!
+* [#16971](https://dev.ckeditor.com/ticket/16971): Added support for color in the `background` property containing also other styles for table cells in the [Table Tools](https://ckeditor.com/cke4/addon/tabletools) plugin.
+* [#16847](https://dev.ckeditor.com/ticket/16847): Added support for parsing and inlining any formatting created using the Microsoft Word style system to the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#16818](https://dev.ckeditor.com/ticket/16818): Added table cell height parsing in the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#16850](https://dev.ckeditor.com/ticket/16850): Added a new [`config.enableContextMenu`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-enableContextMenu) configuration option for enabling and disabling the [context menu](https://ckeditor.com/cke4/addon/contextmenu).
+* [#16937](https://dev.ckeditor.com/ticket/16937): The `command` parameter in [`CKEDITOR.editor.getCommandKeystroke()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getCommandKeystroke) now also accepts a command name as an argument.
+* [#17010](https://dev.ckeditor.com/ticket/17010): The [`CKEDITOR.dom.range.shrink()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-shrink) method now allows for skipping bogus ` ` elements.
+
+Fixed Issues:
+
+* [#16935](https://dev.ckeditor.com/ticket/16935): [Chrome] Fixed: Blurring the editor in [Source Mode](https://ckeditor.com/cke4/addon/sourcearea) throws an error.
+* [#16825](https://dev.ckeditor.com/ticket/16825): [Chrome] Fixed: Error thrown when destroying a focused inline editor.
+* [#16857](https://dev.ckeditor.com/ticket/16857): Fixed: Ctrl+Shift+V blocked by [Copy Formatting](https://ckeditor.com/cke4/addon/copyformatting).
+* [#16845](https://dev.ckeditor.com/ticket/16845): [IE] Fixed: Cursor jumps to the top of the scrolled editor after focusing it when the [Copy Formatting](https://ckeditor.com/cke4/addon/copyformatting) plugin is enabled.
+* [#16786](https://dev.ckeditor.com/ticket/16786): Fixed: Added missing translations for the [Copy Formatting](https://ckeditor.com/cke4/addon/copyformatting) plugin.
+* [#14714](https://dev.ckeditor.com/ticket/14714): [WebKit/Blink] Fixed: Exception thrown on refocusing a blurred inline editor.
+* [#16913](https://dev.ckeditor.com/ticket/16913): [Firefox, IE] Fixed: [Paste as Plain Text](https://ckeditor.com/cke4/addon/pastetext) keystroke does not work.
+* [#16968](https://dev.ckeditor.com/ticket/16968): Fixed: [Safari] [Paste as Plain Text](https://ckeditor.com/cke4/addon/pastetext) is not handled by the editor.
+* [#16912](https://dev.ckeditor.com/ticket/16912): Fixed: Exception thrown when a single image is pasted using [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword).
+* [#16821](https://dev.ckeditor.com/ticket/16821): Fixed: Extraneous `` elements with `height` style stacked when [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword).
+* [#16866](https://dev.ckeditor.com/ticket/16866): [IE, Edge] Fixed: Whitespaces not preserved when [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword).
+* [#16860](https://dev.ckeditor.com/ticket/16860): Fixed: Paragraphs which only look like lists incorrectly transformed into them when [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword).
+* [#16817](https://dev.ckeditor.com/ticket/16817): Fixed: When [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword), paragraphs are transformed into lists with some corrupted data.
+* [#16833](https://dev.ckeditor.com/ticket/16833): [IE11] Fixed: Malformed list with headers [pasted from Word](https://ckeditor.com/cke4/addon/pastefromword).
+* [#16826](https://dev.ckeditor.com/ticket/16826): [IE] Fixed: Superfluous paragraphs within lists [pasted from Word](https://ckeditor.com/cke4/addon/pastefromword).
+* [#12465](https://dev.ckeditor.com/ticket/12465): Fixed: Cannot change the state of checkboxes or radio buttons if the properties dialog was invoked with a double-click.
+* [#13062](https://dev.ckeditor.com/ticket/13062): Fixed: Impossible to unlink when the caret is at the edge of the link.
+* [#13585](https://dev.ckeditor.com/ticket/13585): Fixed: Error when wrapping two adjacent `
` elements with a `
`.
+* [#16811](https://dev.ckeditor.com/ticket/16811): Fixed: Table alignment is not preserved by the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#16810](https://dev.ckeditor.com/ticket/16810): Fixed: Vertical align in tables is not supported by the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin.
+* [#11956](https://dev.ckeditor.com/ticket/11956): [Blink, IE] Fixed: [Link](https://ckeditor.com/cke4/addon/link) dialog does not open on a double click on the second word of the link with a background color or other styles.
+* [#10472](https://dev.ckeditor.com/ticket/10472): Fixed: Unable to use [Table Resize](https://ckeditor.com/cke4/addon/tableresize) on table header and footer.
+* [#14762](https://dev.ckeditor.com/ticket/14762): Fixed: Hovering over an empty table (without rows or cells) throws an error when the [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin is active.
+* [#16777](https://dev.ckeditor.com/ticket/16777): [Edge] Fixed: The [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin does not allow to drop widgets into the editor.
+* [#14894](https://dev.ckeditor.com/ticket/14894): [Chrome] Fixed: The editor scrolls to the top after focusing or when a dialog is opened.
+* [#14769](https://dev.ckeditor.com/ticket/14769): Fixed: URLs with '-' in host are not detected by the [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin.
+* [#16804](https://dev.ckeditor.com/ticket/16804): Fixed: Focus is not on the first menu item when the user opens a context menu or a drop-down list from the editor toolbar.
+* [#14407](https://dev.ckeditor.com/ticket/14407): [IE] Fixed: Non-editable widgets can be edited.
+* [#16927](https://dev.ckeditor.com/ticket/16927): Fixed: An error thrown if a bundle containing the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) plugin is run in ES5 strict mode. Thanks to [Igor Rubinovich](https://github.com/IgorRubinovich)!
+* [#16920](https://dev.ckeditor.com/ticket/16920): Fixed: Several plugins not using the [Dialog](https://ckeditor.com/cke4/addon/dialog) plugin as a direct dependency.
+* [PR#336](https://github.com/ckeditor/ckeditor4/pull/336): Fixed: Typo in [`CKEDITOR.getCss()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-getCss) API documentation. Thanks to [knusperpixel](https://github.com/knusperpixel)!
+* [#17027](https://dev.ckeditor.com/ticket/17027): Fixed: Command event data should be initialized as an empty object.
+* Fixed the behavior of HTML parser when parsing `src`/`srcdoc` attributes of the `