init
This commit is contained in:
commit
bbd9bbc248
2 files changed
+546
No files matched your search
Executable
+542
@@ -0,0 +1,542 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class JapScan
|
||||||
|
{
|
||||||
|
const HTTP = 'http://';
|
||||||
|
const JAPSCAN_DOMAIN = 'japscan.com';
|
||||||
|
const READ_PATH = 'lecture-en-ligne';
|
||||||
|
const CACHE_FOLDER = 'cache/';
|
||||||
|
|
||||||
|
public $asMangas; // safe manga => manga
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->asMangas = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getInitParameters()
|
||||||
|
{
|
||||||
|
$asMangas = $this->getMangas();
|
||||||
|
return json_encode(array( 'asConsts' => array('domain'=>self::JAPSCAN_DOMAIN, 'read_path'=>self::READ_PATH),
|
||||||
|
'asMangas' => $asMangas['mangas'],
|
||||||
|
'asMangaIds' => $asMangas['mangaids']));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMangas()
|
||||||
|
{
|
||||||
|
//TODO delete
|
||||||
|
//return json_decode('{"mangas":[{"short":"3-gatsu-no-lion","long":"3 Gatsu No Lion"},{"short":"a-bout","long":"A Bout"},{"short":"a-fairytale-for-the-demon-lord","long":"A Fairytale For The Demon Lord"},{"short":"abide-in-the-wind","long":"Abide In The Wind"},{"short":"ability","long":"Ability"},{"short":"abnormal-kei-joshi","long":"Abnormal Kei Joshi"},{"short":"absolute-duo","long":"Absolute Duo"},{"short":"ace-of-diamond","long":"Ace Of Diamond"},{"short":"again","long":"Again"},{"short":"aiki","long":"Aiki"},{"short":"aiki-s","long":"Aiki S"},{"short":"aimane","long":"Aimane"},{"short":"air-gear","long":"Air Gear"},{"short":"aiyoku-no-eustia","long":"Aiyoku No Eustia"},{"short":"ajin","long":"Ajin"},{"short":"akame-ga-kiru","long":"Akame Ga Kiru"},{"short":"all-you-need-is-kill","long":"All You Need Is Kill"},{"short":"amagoi","long":"Amagoi"},{"short":"amilova","long":"Amilova"},{"short":"anagle-mole","long":"Anagle Mole"},{"short":"ane-log","long":"Ane Log"},{"short":"angel-beats","long":"Angel Beats"},{"short":"apocalypse-no-toride","long":"Apocalypse No Toride"},{"short":"arachnid","long":"Arachnid"},{"short":"arago","long":"Arago"},{"short":"area-d","long":"Area D"},{"short":"area-no-kishi","long":"Area No Kishi"},{"short":"ares","long":"Ares"},{"short":"arslan-senki","long":"Arslan Senki"},{"short":"assassination-classroom","long":"Assassination Classroom"},{"short":"ayu-mayu","long":"Ayu Mayu"},{"short":"b-ichi","long":"B Ichi"},{"short":"bad-company","long":"Bad Company"},{"short":"bakudan","long":"Bakudan"},{"short":"bakuman","long":"Bakuman"},{"short":"bamboo-blade-b","long":"Bamboo Blade B"},{"short":"beelzebub","long":"Beelzebub"},{"short":"beelzebub-side-story","long":"Beelzebub Side Story"},{"short":"birdmen","long":"Birdmen"},{"short":"black-bullet","long":"Black Bullet"},{"short":"black-butler","long":"Black Butler"},{"short":"black-haze","long":"Black Haze"},{"short":"black-wind","long":"Black Wind"},{"short":"blast","long":"Blast"},{"short":"bleach","long":"Bleach"},{"short":"blind-faith-descent","long":"Blind Faith Descent"},{"short":"blood-parade","long":"Blood Parade"},{"short":"bocchiman","long":"Bocchiman"},{"short":"bonnouji","long":"Bonnouji"},{"short":"bowling-king","long":"Bowling King"},{"short":"broken-blade","long":"Broken Blade"},{"short":"btooom","long":"Btooom"},{"short":"buyuden","long":"Buyuden"},{"short":"cavalier-of-the-abyss","long":"Cavalier Of The Abyss"},{"short":"cerberus","long":"Cerberus"},{"short":"chaos-head","long":"Chaos Head"},{"short":"chaser","long":"Chaser"},{"short":"cherry-x-cherry","long":"Cherry X Cherry"},{"short":"choukakou","long":"Choukakou"},{"short":"chrome-shelled-regios-missing-mail","long":"Chrome Shelled Regios Missing Mail"},{"short":"chronos-deep","long":"Chronos Deep"},{"short":"city-of-darkness","long":"City Of Darkness"},{"short":"city-of-dead-sorcerer","long":"City of Dead Sorcerer"},{"short":"classmate-kamimura-yuuka-wa-kou-itta","long":"Classmate Kamimura Yuuka Wa Kou Itta"},{"short":"claymore","long":"Claymore"},{"short":"clockwork-planet","long":"Clockwork Planet"},{"short":"clover","long":"Clover"},{"short":"code-breaker","long":"Code Breaker"},{"short":"countrouble","long":"Countrouble"},{"short":"crepuscule","long":"Crepuscule"},{"short":"cromartie-high-school","long":"Cromartie High School"},{"short":"cross-manage","long":"Cross Manage"},{"short":"crows","long":"Crows"},{"short":"crows-zero-ii","long":"Crows Zero II"},{"short":"d-gray-man","long":"D Gray Man"},{"short":"d-fragments","long":"D-Fragments"},{"short":"dice","long":"D.I.C.E"},{"short":"dagasy","long":"Dagasy"},{"short":"darker-than-black-shikkoku-no-hana","long":"Darker Than Black - Shikkoku No Hana"},{"short":"deadman-wonderland","long":"Deadman Wonderland"},{"short":"death-note","long":"Death Note"},{"short":"deathtopia","long":"Deathtopia"},{"short":"dendrobates","long":"Dendrobates"},{"short":"denpa-kyoushi","long":"Denpa Kyoushi"},{"short":"densetsu-no-yuusha-no-densetsu","long":"Densetsu no Yuusha no Densetsu"},{"short":"dimension-w","long":"Dimension W"},{"short":"donten-prism-solar-car","long":"Donten Prism Solar Car"},{"short":"donyatsu","long":"Donyatsu"},{"short":"dragon-recipe","long":"Dragon Recipe"},{"short":"dragons-rioting","long":"Dragons Rioting"},{"short":"drop","long":"Drop"},{"short":"drop-og","long":"Drop OG"},{"short":"durarara","long":"Durarara!!"},{"short":"eden-no-ori","long":"Eden No Ori"},{"short":"eternal-sonata","long":"Eternal Sonata"},{"short":"fable","long":"Fable"},{"short":"fairy-tail","long":"Fairy Tail"},{"short":"fairy-tail-ice-trail","long":"Fairy Tail Ice Trail"},{"short":"fairy-tail-zero","long":"Fairy Tail Zero"},{"short":"feng-shen-ji","long":"Feng Shen Ji"},{"short":"flags","long":"Flags"},{"short":"fullmetal-alchemist","long":"Fullmetal Alchemist"},{"short":"fuuka","long":"Fuuka"},{"short":"gamaran","long":"Gamaran"},{"short":"gamble-fish","long":"Gamble Fish"},{"short":"gepetto","long":"Gepetto"},{"short":"giant-k
Line truncated
|
||||||
|
|
||||||
|
if(empty($this->asMangas))
|
||||||
|
{
|
||||||
|
$oDom = $this->getPageDom();
|
||||||
|
$aoOptions = $this->getSelectOptions($oDom, 'mangas');
|
||||||
|
foreach($aoOptions as $oOption)
|
||||||
|
{
|
||||||
|
//Manga Short Name
|
||||||
|
$sShortManga = mb_strstr(mb_substr($oOption->getAttribute('value'), mb_strlen('/'.self::READ_PATH.'/')), '/', true);
|
||||||
|
|
||||||
|
//Manga Long Name
|
||||||
|
$sMangaLong = $oOption->nodeValue;
|
||||||
|
|
||||||
|
//Manga Id
|
||||||
|
$iMangaId = count($this->asMangas);
|
||||||
|
$this->asMangas[$iMangaId] = array('short'=>$sShortManga, 'long'=>$sMangaLong);
|
||||||
|
$asMangaIds[$sShortManga] = $iMangaId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return array('mangas'=>$this->asMangas, 'mangaids'=>$asMangaIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getChapters($sShortManga, $sLongManga)
|
||||||
|
{
|
||||||
|
//TODO delete
|
||||||
|
//return json_decode('{"chapters":[{"short":"1","long":"Rei Kiriyama"},{"short":"2","long":"La Ville Sur Le Fleuve"},{"short":"3","long":"Gatsu No Lion Akari"},{"short":"4","long":"De L\'autre C\u00f4t\u00e9 Du Pont"},{"short":"5","long":"Harunobu"},{"short":"6","long":"Par-Del\u00e0 Le Ciel \u00c9toil\u00e9"},{"short":"7","long":"Hina"},{"short":"8","long":"Comparaison"},{"short":"9","long":"Un Pacte"},{"short":"10","long":"Au Dessus D\'un Rid De Coucou"},{"short":"11","long":"L\'enfant Divin (1)"},{"short":"12","long":"L\'enfant Divin (2)"},{"short":"13","long":"Prochainement Sur Japscan.com"}],"chapterids":{"1":0,"2":1,"3":2,"4":3,"5":4,"6":5,"7":6,"8":7,"9":8,"10":9,"11":10,"12":11,"13":12}}', true);
|
||||||
|
|
||||||
|
$asChapters = array();
|
||||||
|
$oDom = $this->getPageDom($sShortManga);
|
||||||
|
$aoOptions = $this->getSelectOptions($oDom, 'chapitres');
|
||||||
|
for($iIndex=($aoOptions->length-1);$iIndex>=0;$iIndex--) $aoSortedOptions[] = $aoOptions->item($iIndex);
|
||||||
|
foreach($aoSortedOptions as $oOption)
|
||||||
|
{
|
||||||
|
//Chapter Short Name
|
||||||
|
$sChapterPath = $oOption->getAttribute('value');
|
||||||
|
if(substr($sChapterPath, -1)=='/') $sChapterPath = substr($sChapterPath, 0, -1);
|
||||||
|
$sShortChapter = substr($sChapterPath, strrpos($sChapterPath, '/')+1);
|
||||||
|
|
||||||
|
//Chapter Long Name
|
||||||
|
$sChapterDesc = $oOption->nodeValue;
|
||||||
|
$sLongChapter = self::mb_ucwords(trim(str_replace(array('Scan ', $sShortChapter.' ', $sLongManga, ' VF ', '--', ), '', $sChapterDesc)));
|
||||||
|
|
||||||
|
//Chapter Id
|
||||||
|
$iChapterId = count($asChapters);
|
||||||
|
$asChapters[$iChapterId] = array('short'=>$sShortChapter, 'long'=>$sLongChapter);
|
||||||
|
$asChapterIds[$sShortChapter] = $iChapterId;
|
||||||
|
}
|
||||||
|
return array('chapters'=>$asChapters, 'chapterids'=>$asChapterIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPages($sShortManga, $sChapter)
|
||||||
|
{
|
||||||
|
//TODO delete
|
||||||
|
//return json_decode('{"pages":[{"short":"01","long":"Page 01"},{"short":"02","long":"Page 02"},{"short":"03","long":"Page 03"},{"short":"04","long":"Page 04"},{"short":"05","long":"Page 05"},{"short":"06","long":"Page 06"},{"short":"07","long":"Page 07"},{"short":"08","long":"Page 08"},{"short":"09","long":"Page 09"},{"short":"10","long":"Page 10"},{"short":"11","long":"Page 11"},{"short":"12","long":"Page 12"},{"short":"13","long":"Page 13"},{"short":"14","long":"Page 14"},{"short":"15","long":"Page 15"},{"short":"16","long":"Page 16"},{"short":"17","long":"Page 17"},{"short":"18","long":"Page 18"},{"short":"19","long":"Page 19"}],"pageids":{"01":0,"02":1,"03":2,"04":3,"05":4,"06":5,"07":6,"08":7,"09":8,"10":9,"11":10,"12":11,"13":12,"14":13,"15":14,"16":15,"17":16,"18":17,"19":18}}', true);
|
||||||
|
|
||||||
|
$asPages = array();
|
||||||
|
$oDom = $this->getPageDom($sShortManga, $sChapter);
|
||||||
|
$aoOptions = $this->getSelectOptions($oDom, 'pages');
|
||||||
|
foreach($aoOptions as $oOption)
|
||||||
|
{
|
||||||
|
//Page Short Name
|
||||||
|
$sPagePath = $oOption->getAttribute('value'); //e.g. /lecture-en-ligne/rrr/33/03.html
|
||||||
|
$sShortPage = substr($sPagePath, strrpos($sPagePath, '/')+1, -5); // 5 = strlen(.html)
|
||||||
|
|
||||||
|
//Page Long Name
|
||||||
|
$sPageLong = $oOption->nodeValue;
|
||||||
|
|
||||||
|
//Page Id
|
||||||
|
$iPageId = count($asPages);
|
||||||
|
$asPages[$iPageId] = array('short'=>$sShortPage, 'long'=>$sPageLong);
|
||||||
|
$asPageIds[$sShortPage] = $iPageId;
|
||||||
|
}
|
||||||
|
return array('pages'=>$asPages, 'pageids'=>$asPageIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getPage($sShortManga, $sChapter, $sPage)
|
||||||
|
{
|
||||||
|
$oDom = $this->getPageDom($sShortManga, $sChapter, $sPage);
|
||||||
|
$aoImages = $oDom->getElementsByTagName('img');
|
||||||
|
foreach($aoImages as $oImage)
|
||||||
|
{
|
||||||
|
if($oImage->getAttribute('id')=='imgscan') break;
|
||||||
|
}
|
||||||
|
return 'http:'.$oImage->getAttribute('src');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPic($sLongManga, $sShortManga, $sShortChapter, $sShortPage, $bDoubleCheck=false)
|
||||||
|
{
|
||||||
|
//referer: http://www.japscan.com/lecture-en-ligne/samurai-high-school/1/22.html
|
||||||
|
//Pic: //cdn.japscan.com/lecture-en-ligne/Samurai%20High%20School/1/22.jpg
|
||||||
|
|
||||||
|
$sUrl = self::getUrl(array(self::READ_PATH, $sLongManga, $sShortChapter, $sShortPage.'.jpg'), 'cdn', true);
|
||||||
|
$sReferer = self::getUrl(array(self::READ_PATH, $sShortManga, $sShortChapter, $sShortPage.'.html'));
|
||||||
|
|
||||||
|
if($bDoubleCheck) $sUrl = $this->getPage($sShortManga, $sShortChapter, $sShortPage);
|
||||||
|
|
||||||
|
$oCurl = curl_init();
|
||||||
|
curl_setopt($oCurl, CURLOPT_URL, $sUrl);
|
||||||
|
curl_setopt($oCurl, CURLOPT_HEADER, false);
|
||||||
|
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($oCurl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
|
||||||
|
curl_setopt($oCurl, CURLOPT_REFERER, $sReferer);
|
||||||
|
$sContent = curl_exec($oCurl);
|
||||||
|
$asInfo = curl_getinfo($oCurl);
|
||||||
|
curl_close($oCurl);
|
||||||
|
|
||||||
|
return $asInfo['http_code']!=404?$sContent:$this->getPic($sLongManga, $sShortManga, $sShortChapter, $sShortPage, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getSelectOptions($oDom, $sSelectId)
|
||||||
|
{
|
||||||
|
$aoSelects = $oDom->getElementsByTagName('select');
|
||||||
|
foreach($aoSelects as $oSelect)
|
||||||
|
{
|
||||||
|
if($oSelect->getAttribute('id')==$sSelectId) break;
|
||||||
|
}
|
||||||
|
return $oSelect->getElementsByTagName('option');
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getPageDom($sShortManga='', $sChapter='', $sPage='')
|
||||||
|
{
|
||||||
|
$oDom = new DOMDocument();
|
||||||
|
$sHtmlContent = $this->getRemotePage($sShortManga, $sChapter, $sPage);
|
||||||
|
@$oDom->loadHTML($sHtmlContent);
|
||||||
|
return $oDom->getElementsByTagName('body')->item(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getRemotePage($sShortManga='', $sChapter='', $sPage='')
|
||||||
|
{
|
||||||
|
$sFileName = 'cache_'.$sShortManga.'_'.$sChapter.'_'.$sPage.'.html';
|
||||||
|
$sPage = ($sPage!='')?$sPage.'.html':'';
|
||||||
|
$sUrl = self::getUrl(array(self::READ_PATH, $sShortManga, $sChapter, $sPage));
|
||||||
|
$sFilePath = self::CACHE_FOLDER.str_replace("&",'\&', str_replace(" ",'\ ', addslashes($sFileName)));
|
||||||
|
|
||||||
|
if(!file_exists($sFilePath)) file_put_contents($sFilePath, file_get_contents($sUrl));
|
||||||
|
return file_get_contents($sFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getSafeManga($sManga)
|
||||||
|
{
|
||||||
|
//FIXME use safename
|
||||||
|
$asMangasInfo = $this->getMangas();
|
||||||
|
foreach($asMangasInfo['mangas'] as $asMangaInfo) {if($asMangaInfo['long']==$sManga) break;}
|
||||||
|
|
||||||
|
return $asMangaInfo['short'];
|
||||||
|
//return $sSafeManga = str_replace(array(' ', '.', '!', '\'', '&'), array('-', '', '', '', 'and'), mb_strtolower($sManga));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getUrl($asArgs=array(), $sVirtualHost='www', $bUrlEncode=false)
|
||||||
|
{
|
||||||
|
if($bUrlEncode) $asArgs = array_map('rawurlencode', $asArgs);
|
||||||
|
$sArgs = implode('/', array_filter($asArgs));
|
||||||
|
return self::HTTP.$sVirtualHost.'.'.self::JAPSCAN_DOMAIN.'/'.$sArgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function mb_ucwords($sText)
|
||||||
|
{
|
||||||
|
return mb_convert_case($sText, MB_CASE_TITLE, "UTF-8");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sAction = isset($_GET['a'])?$_GET['a']:'';
|
||||||
|
$sType = isset($_GET['type'])?$_GET['type']:'json';
|
||||||
|
$sShortManga = isset($_GET['shortmanga'])?$_GET['shortmanga']:'';
|
||||||
|
$sLongManga = isset($_GET['longmanga'])?$_GET['longmanga']:'';
|
||||||
|
$sChapter = isset($_GET['chapter'])?$_GET['chapter']:'';
|
||||||
|
$sPage = isset($_GET['page'])?$_GET['page']:'';
|
||||||
|
|
||||||
|
$oJapScan = new JapScan();
|
||||||
|
if($sAction!='')
|
||||||
|
{
|
||||||
|
$sResult = '';
|
||||||
|
switch($sAction)
|
||||||
|
{
|
||||||
|
case 'chapters':
|
||||||
|
$oData = $oJapScan->getChapters($sShortManga, $sLongManga);
|
||||||
|
break;
|
||||||
|
case 'pages':
|
||||||
|
$oData = $oJapScan->getPages($sShortManga, $sChapter);
|
||||||
|
break;
|
||||||
|
case 'pic':
|
||||||
|
$oData = $oJapScan->getPic($sLongManga, $sShortManga, $sChapter, $sPage);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Return Json
|
||||||
|
switch($sType)
|
||||||
|
{
|
||||||
|
case 'json':
|
||||||
|
header('Content-type: application/json');
|
||||||
|
$sResult = json_encode($oData);
|
||||||
|
break;
|
||||||
|
case 'jpeg':
|
||||||
|
header("Content-Type: image/jpeg");
|
||||||
|
$sResult = $oData;
|
||||||
|
default:
|
||||||
|
$sResult = $oData;
|
||||||
|
}
|
||||||
|
echo $sResult;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$jVars = $oJapScan->getInitParameters();
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>JapScan</title>
|
||||||
|
<script type="text/javascript" src="script/jquery.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
function JapScan(asVars)
|
||||||
|
{
|
||||||
|
self = this;
|
||||||
|
$.each(asVars, function(sVarName, asValues){self[sVarName] = asValues;});
|
||||||
|
this.sUrl = window.location.pathname;
|
||||||
|
this.sFileName = this.sUrl.substring(this.sUrl.lastIndexOf('/')+1);
|
||||||
|
|
||||||
|
//Refs
|
||||||
|
//this.asMangas -- loaded from PHP
|
||||||
|
//this.asMangaIds -- loaded from PHP
|
||||||
|
this.asChapters = {};
|
||||||
|
this.asChapterIds = {};
|
||||||
|
this.asPages = {};
|
||||||
|
this.asPageIds = {};
|
||||||
|
|
||||||
|
//Current position
|
||||||
|
this.iMangaId = -2;
|
||||||
|
this.iChapterId = -2;
|
||||||
|
this.iPageId = -2;
|
||||||
|
|
||||||
|
this.$Progress = {};
|
||||||
|
|
||||||
|
this.init = function()
|
||||||
|
{
|
||||||
|
//Keyboard navi
|
||||||
|
$(document).keydown(function(e)
|
||||||
|
{
|
||||||
|
switch(e.keyCode)
|
||||||
|
{
|
||||||
|
case 37: self.naviPage(-1); break; //left
|
||||||
|
case 38: self.naviPage(-1); break; //up
|
||||||
|
case 39: self.naviPage(+1); break; //right
|
||||||
|
case 40: self.naviPage(+1); break; //down
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
self.$Progress = $('<p>', {'class':'prog'});
|
||||||
|
|
||||||
|
$(window).bind('hashchange', self.onHash);
|
||||||
|
self.onHash();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.get = function(sType, sOutput, iItemid)
|
||||||
|
{
|
||||||
|
var sUpType = sType.substr(0, 1).toUpperCase()+sType.substr(1);
|
||||||
|
var iItemId = (typeof iItemid === 'undefined')?self['i'+sUpType+'Id']:iItemid;
|
||||||
|
|
||||||
|
//console.log('accessing '+sOutput+' of '+sType+'. context: '+sType+' id = '+self['i'+sUpType+'Id']);
|
||||||
|
//console.log('result = '+self['as'+sUpType+'s'][iItemId][sOutput]);
|
||||||
|
|
||||||
|
return self['as'+sUpType+'s'][iItemId][sOutput];
|
||||||
|
};
|
||||||
|
|
||||||
|
this.commit = function(sType)
|
||||||
|
{
|
||||||
|
var sUpType = sType.substr(0, 1).toUpperCase()+sType.substr(1);
|
||||||
|
var sShortItem = self.asNew['short'+sType];
|
||||||
|
var iItemId = 0;
|
||||||
|
|
||||||
|
switch(sShortItem)
|
||||||
|
{
|
||||||
|
case '' : iItemId = 0; break;
|
||||||
|
case '_last_' : iItemId = self['as'+sUpType+'s'].length - 1; break;
|
||||||
|
default : iItemId = self['as'+sUpType+'Ids'][sShortItem]; break;
|
||||||
|
}
|
||||||
|
var bDelta = (iItemId !== self['i'+sUpType+'Id'] || sShortItem=='');
|
||||||
|
self['i'+sUpType+'Id'] = iItemId;
|
||||||
|
|
||||||
|
//console.log('setting bDelta = '+bDelta+' and self.i'+sUpType+'Id = '+iItemId+' (from short = '+sShortItem+')');
|
||||||
|
return bDelta;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getInfo = function(sAction, fOnSuccess, asVars, sType)
|
||||||
|
{
|
||||||
|
asVars = asVars || {};
|
||||||
|
sType = sType || 'json';
|
||||||
|
asVars.a = sAction;
|
||||||
|
$.ajax(
|
||||||
|
{
|
||||||
|
url: self.sFileName,
|
||||||
|
data: asVars,
|
||||||
|
dataType: sType
|
||||||
|
})
|
||||||
|
.done(function(oResult)
|
||||||
|
{
|
||||||
|
fOnSuccess(oResult);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getUrl = function(sAction, oVars)
|
||||||
|
{
|
||||||
|
oVars = oVars || {};
|
||||||
|
sVars = '';
|
||||||
|
$.each(oVars, function(sParam, sValue){sVars += '&'+sParam+'='+sValue;});
|
||||||
|
return window.location.protocol+'//'+window.location.host+window.location.pathname+'?a='+sAction+sVars;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.onHash = function()
|
||||||
|
{
|
||||||
|
//Parse hash
|
||||||
|
var asHash = self.hash();
|
||||||
|
|
||||||
|
self.oMangaLoader = new $.Deferred();
|
||||||
|
self.oChapterLoader = new $.Deferred();
|
||||||
|
self.oPageLoader = new $.Deferred();
|
||||||
|
|
||||||
|
if(asHash.shortmanga != '')
|
||||||
|
{
|
||||||
|
self.asNew = asHash;
|
||||||
|
self.oMangaLoader.done(function(){ var bDelta = self.commit('manga'); self.loadChapters(bDelta);});
|
||||||
|
self.oChapterLoader.done(function(){var bDelta = self.commit('chapter'); self.loadPages(bDelta);});
|
||||||
|
self.oPageLoader.done(function(){ var bDelta = self.commit('page'); self.displayPage(bDelta);});
|
||||||
|
}
|
||||||
|
self.loadMangas();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.hash = function(asHash)
|
||||||
|
{
|
||||||
|
var sSplitChar = ':';
|
||||||
|
if(!asHash)
|
||||||
|
{
|
||||||
|
//Parse hash
|
||||||
|
var sHash = window.location.hash.slice(1);
|
||||||
|
var asHash = sHash.split(sSplitChar);
|
||||||
|
|
||||||
|
var sShortManga = (typeof asHash[0] != 'undefined')?asHash[0]:'';
|
||||||
|
var sShortChapter = (typeof asHash[1] != 'undefined')?asHash[1]:'';
|
||||||
|
var sShortPage = (typeof asHash[2] != 'undefined')?asHash[2]:'';
|
||||||
|
|
||||||
|
return {shortmanga:sShortManga, shortchapter:sShortChapter, shortpage:sShortPage};
|
||||||
|
}
|
||||||
|
else window.location.hash = asHash.join(sSplitChar);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.loadMangas = function()
|
||||||
|
{
|
||||||
|
//Display all mangas
|
||||||
|
var $Mangas = $('#mangas').find('ul');
|
||||||
|
if($Mangas.children('li').length == 0)
|
||||||
|
{
|
||||||
|
var sShortManga, sLongManga;
|
||||||
|
$.each(self.asMangas, function(iMangaId, asMangaInfo)
|
||||||
|
{
|
||||||
|
$Mangas.append($('<li>').append($('<a>', {id:'m_'+asMangaInfo['short'], href:'#'+asMangaInfo['short']}).text(asMangaInfo['long'])));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
self.oMangaLoader.resolve();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.loadChapters = function(bMangaDelta)
|
||||||
|
{
|
||||||
|
if(bMangaDelta)
|
||||||
|
{
|
||||||
|
self.getInfo('chapters', function(asInfo)
|
||||||
|
{
|
||||||
|
self.asChapters = [];
|
||||||
|
self.asChapters = asInfo.chapters;
|
||||||
|
self.asChapterIds = {};
|
||||||
|
self.asChapterIds = asInfo.chapterids;
|
||||||
|
|
||||||
|
$Chapter = $('#chapters').empty();
|
||||||
|
for(var i in self.asChapters)
|
||||||
|
{
|
||||||
|
sShortChapter = self.asChapters[i]['short'];
|
||||||
|
sLongChapter = self.asChapters[i]['long'];
|
||||||
|
|
||||||
|
$('<div>', {id:'c_'+sShortChapter, 'class':'chapter'})
|
||||||
|
.data('chapter', sShortChapter)
|
||||||
|
.append($('<p class="id">').text(sShortChapter))
|
||||||
|
.append($('<p class="name">').text(sLongChapter))
|
||||||
|
.click(function(){self.hash([self.get('manga', 'short'), $(this).data('chapter')]);})
|
||||||
|
.appendTo($Chapter);
|
||||||
|
}
|
||||||
|
self.oChapterLoader.resolve();
|
||||||
|
}
|
||||||
|
, {shortmanga:self.get('manga', 'short'), longmanga:self.get('manga', 'long')});
|
||||||
|
}
|
||||||
|
else self.oChapterLoader.resolve();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.loadPages = function(bChapterDelta)
|
||||||
|
{
|
||||||
|
if(bChapterDelta)
|
||||||
|
{
|
||||||
|
self.getInfo('pages', function(asInfo)
|
||||||
|
{
|
||||||
|
self.asPages = asInfo.pages;
|
||||||
|
self.asPageIds = asInfo.pageids;
|
||||||
|
self.oPageLoader.resolve();
|
||||||
|
}
|
||||||
|
, {shortmanga:self.get('manga', 'short'), chapter:self.get('chapter', 'short')});
|
||||||
|
}
|
||||||
|
else self.oPageLoader.resolve();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.naviPage = function(iDirection)
|
||||||
|
{
|
||||||
|
var iMangaId = self.iMangaId;
|
||||||
|
var iChapterId = self.iChapterId;
|
||||||
|
var iPageId = self.iPageId;
|
||||||
|
if((self.iPageId + iDirection < self.asPages.length) && (self.iPageId + iDirection >= 0)) //next/previous page
|
||||||
|
{
|
||||||
|
iPageId += iDirection;
|
||||||
|
self.hash([self.get('manga', 'short'), self.get('chapter', 'short'), self.get('page', 'short', iPageId)]);
|
||||||
|
}
|
||||||
|
else if((self.iChapterId + iDirection < self.asChapters.length) && (self.iChapterId + iDirection >= 0)) //next/previous chapter
|
||||||
|
{
|
||||||
|
iChapterId += iDirection;
|
||||||
|
if(self.iPageId + iDirection == self.asPages.length) self.hash([self.get('manga', 'short'), self.get('chapter', 'short', iChapterId)]);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sShortPage = '_last_';
|
||||||
|
self.hash([self.get('manga', 'short'), self.get('chapter', 'short', iChapterId), sShortPage]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.displayPage = function()
|
||||||
|
{
|
||||||
|
var sUrl = self.getUrl('pic', { longmanga: self.get('manga', 'long'),
|
||||||
|
shortmanga: self.get('manga', 'short'),
|
||||||
|
chapter: self.get('chapter', 'short'),
|
||||||
|
page: self.get('page', 'short'),
|
||||||
|
type: 'jpeg'});
|
||||||
|
|
||||||
|
//console.log('loading image : '+sUrl);
|
||||||
|
$('#pic').attr('src', sUrl);
|
||||||
|
|
||||||
|
//Updating progress status
|
||||||
|
$('.chapter').add('.manga').removeClass('active');
|
||||||
|
var $Manga = $('#m_'+self.get('manga', 'short')).focus().addClass('active');
|
||||||
|
var $Chapter = $('#c_'+self.get('chapter', 'short')).focus().addClass('active');
|
||||||
|
self.$Progress
|
||||||
|
.remove()
|
||||||
|
.text('Page '+(self.iPageId + 1)+' sur '+(self.asPages.length))
|
||||||
|
.appendTo($Chapter);
|
||||||
|
|
||||||
|
//Preloading next images
|
||||||
|
for(var i=1;i<3;i++)
|
||||||
|
{
|
||||||
|
if(self.iPageId + i < self.asPages.length)
|
||||||
|
{
|
||||||
|
var oImage = new Image();
|
||||||
|
oImage.src = self.getUrl('pic', { longmanga: self.get('manga', 'long'),
|
||||||
|
shortmanga: self.get('manga', 'short'),
|
||||||
|
chapter: self.get('chapter', 'short'),
|
||||||
|
page: self.get('page', 'short', self.iPageId + i),
|
||||||
|
type: 'jpeg'});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var asParams = <?php echo $jVars; ?>;
|
||||||
|
var oJapScan = new JapScan(asParams);
|
||||||
|
$(document).ready(oJapScan.init);
|
||||||
|
</script>
|
||||||
|
<style type="text/css">
|
||||||
|
|
||||||
|
/* Generals */
|
||||||
|
a {color:black; text-decoration:none;}
|
||||||
|
a:visited {color:black; text-decoration:none;}
|
||||||
|
p {margin:0; padding:0;}
|
||||||
|
img {margin:0; padding:0; border:none;}
|
||||||
|
ul {list-style:none; margin:0; padding-left:0;}
|
||||||
|
|
||||||
|
/* Main Parts */
|
||||||
|
body {margin:0; padding:0; font-family: "Open Sans","Droid Sans",Helvetica,Arial,sans-serif; font-size:0.8em;}
|
||||||
|
#container {width:100vw; height:100vh; box-sizing:border-box;}
|
||||||
|
#mangas {width:20vw; height:100vh; float:left; overflow:auto;}
|
||||||
|
#chapters {width:9vw; height:100vh; float:left; overflow:auto;}
|
||||||
|
#scan {width:71vw; height:100vh; float:right; overflow:hidden; text-align:center; background:grey 50% 50% no-repeat;}
|
||||||
|
|
||||||
|
/* Mangas */
|
||||||
|
#mangas ul li a {display: block; margin:0.5vw; padding:0.5vw; background:#4F5B93; color:white; border-radius:0.5vw;}
|
||||||
|
#mangas ul li a.active {background:#8892BF; color:black;}
|
||||||
|
#mangas ul li a:visited {font-weight:bold;}
|
||||||
|
|
||||||
|
/* Chapters */
|
||||||
|
#chapters .chapter {width:6vw; height:6vw; position: relative; margin:0.5vw; padding:0.5vw; background:#4F5B93; color:white; border-radius:1vw; text-align: center; cursor:pointer;}
|
||||||
|
#chapters .chapter:hover {background:#8892BF;}
|
||||||
|
#chapters .chapter .id {margin-top:25%; font-size:3em;}
|
||||||
|
#chapters .chapter.active {background:#8892BF; color:black;}
|
||||||
|
#chapters .chapter.active .prog {margin-top:25%; font-style:italic;}
|
||||||
|
#chapters .chapter.active .id {margin-top:0%;}
|
||||||
|
|
||||||
|
/* Scan */
|
||||||
|
#pic {max-width:65vw; max-height:100vh;}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="container">
|
||||||
|
<div id="mangas"><ul></ul></div>
|
||||||
|
<div id="chapters"></div>
|
||||||
|
<div id="scan"><img id="pic" alt="Pick a manga" /></div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
|
||||||
|
!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"Line truncated
|
||||||
|
},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExpLine truncated
|
||||||
|
},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$b[b]=function(a,b,d){var e,f;return d||(f=$b[b],$b[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$b[b]=f),e}});var _b=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_b.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ac=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ac," ").indexOf(b)>=0)return!0;return!1}});var bc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.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 contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||Line truncated
|
||||||
Reference in new issue
Block a user