// ==UserScript==
// @name DMMGirl
// @namespace null
// @description DMM.R18/mono/dvd tweak for non-member: show big cover, preload sample picture, local wishlist, remove member functions...
// @version 1.1.2
// @grant GM_addStyle
// @include http://www.dmm.co.jp/*
// @include http://www.dmm.co.jp/mono/dvd/-/list/*
// @include http://www.dmm.co.jp/top/-/error/area/*
// @include http://www.dmm.co.jp/mono/dvd/-/detail/=/cid=*
// ==/UserScript==
var detail = {
videoEnable: false,
init: function(c) {
GM_addStyle(' \
#mybox {font-size:1.2em; font-weight:bold; background-color:#F7FDFF; border:1px solid #CCCCCC; padding:5px 10px; margin-bottom:10px;} \
#mybox a {display:block; color:#005FC0; cursor:pointer; text-decoration:none; padding-left:10px; \
background:url("http://p.dmm.co.jp/p/common/arrow_common.gif") no-repeat scroll left center transparent} \
#mybox a:active, #mybox a:hover {color:#EE2200 !important; text-decoration:underline !important;} \
#mybox a:visited {color:#990099 !important;}');
this.replaceRcolumn(c.comment);
this.checkVideo();
this.showCover();
this.addPreloadRadio(c.preload);
},
//==Add preload radio button==
addPreloadRadio: function(c) {
var headline = document.getElementsByClassName('headline mg-b10 lh3')[0];
var nosample = document.querySelectorAll('span.nw')[0];
if(headline && !nosample) {
var link = document.createElement('input');
link.type = 'radio';
link.id = 'prelink';
link.addEventListener('click', this.onPreloadSample, false);
headline.appendChild(link);
headline.appendChild(document.createTextNode('Preload '));
if(c) {
link.click();
}
}
},
//==Preload previews==
onPreloadSample: function() {
this.removeEventListener('click', detail.onPreloadSample, false);
var sample = document.getElementsByName('sample-image'); //
var block = document.getElementById('sample-image-block');
var newblock = document.createElement('div');
for(var i = 0; i < sample.length; i++) {
var pic = document.createElement('img');
pic.src = sample[i].firstChild.src.replace('-', 'jp-');
pic.height = 73;
pic.className = 'galpic';
pic.addEventListener('click', gal.onShowPic, false);
newblock.appendChild(pic);
}
block.parentNode.replaceChild(newblock, block);
},
checkVideo: function() {
var video = document.getElementById('sample-video');
if(video.lastElementChild.tagName === 'NOSCRIPT') {
this.videoEnable = true;
}
},
//==Show big cover==
showCover: function() {
var sample = document.getElementsByClassName('float-l mg-b20 mg-r12')[0];
var img = document.getElementsByClassName('tdmm')[0];
img.src = img.src.replace('ps.jpg', 'pl.jpg');
removeChildren(sample);
sample.className = 'mg-b20 mg-r12';
sample.appendChild(img);
},
replaceRcolumn: function(c) {
var rcolumn = document.getElementsByClassName('vline')[0].nextElementSibling;
var info = document.getElementsByClassName('mg-b20')[1];
info.id = 'infot';
var tbody = info.firstElementChild; //remove last 2 rows
tbody.removeChild(tbody.lastElementChild);
var review = document.getElementById('review');
if(review) {
var star = tbody.lastElementChild.lastElementChild;
var vote = document.getElementsByClassName('overview')[0];
if(vote && star.lastElementChild) {
star.lastElementChild.innerHTML = '(' + vote.firstElementChild.lastElementChild.innerHTML + ')';
} else {
star.lastElementChild.innerHTML = '(0)';
}
if(c) {
review.parentNode.removeChild(review);
}
}
var box = document.getElementsByClassName('bx-option mg-t20')[0];
if(box) {
box.parentNode.removeChild(box);
}
var tag = document.getElementById('producttag');
if(tag) {
tag.parentNode.removeChild(tag);
}
var desc = info.nextElementSibling.nextElementSibling;
var another = document.getElementsByClassName('another')[0];
removeChildren(rcolumn);
var div = document.createElement('div');
div.id = 'mybox';
var add = document.createElement('a');
add.textContent = 'Add to Wishlist';
add.addEventListener('click', this.onAddWish, false);
var view = document.createElement('a');
view.href = '/top/-/error/area/';
view.textContent = 'View Wishlist';
var search = document.createElement('a');
search.href = 'https://www.google.com/#q=' + getCid(location.pathname, true)[0];
search.target = '_blank';
search.textContent = 'Google It';
div.appendChild(add);
div.appendChild(view);
div.appendChild(search);
rcolumn.appendChild(div);
rcolumn.appendChild(info);
rcolumn.appendChild(desc);
if(another) {
rcolumn.appendChild(another);
}
var ad = document.getElementsByClassName('mg-b12 center')[0];
ad.parentNode.removeChild(ad);
},
//==Add to wishlist==
onAddWish: function() {
var tds = document.querySelectorAll('td.nw'); //[type,date,length,actress,director,series,maker,label,genre,cid]
var date = tds[1].nextElementSibling;
var actress = tds[3].nextElementSibling;
var maker = tds[6].nextElementSibling;
var cid = tds[9].nextElementSibling.innerHTML;
var title = document.getElementById('title'); //get title
var detail = date.innerHTML + '#' + actress.innerHTML + '#' + maker.innerHTML + '#' + title.innerHTML;
localStorage.setItem(cid, detail);
}
};
var list = {
init: function() {
var smallThumb = document.getElementsByClassName('img');
for(var i = 0; i < smallThumb.length; i++) {
smallThumb[i].firstElementChild.addEventListener('mouseover', this.onShowThumb, false);
}
var thumb = new Image();
thumb.id = 'hoverpic';
thumb.style.position = 'absolute';
thumb.style.zIndex = 22;
thumb.style.display = 'none';
thumb.addEventListener('mouseout', this.onRemoveThumb, false);
var a = document.createElement('a');
a.appendChild(thumb);
document.body.appendChild(a);
},
onShowThumb: function() {
if(this.src.search('noimage') === -1) {
var thumb = document.getElementById('hoverpic');
thumb.src = this.src.replace('pt.jpg', 'ps.jpg');
var pos = this.getBoundingClientRect();
thumb.style.left = pos.left - 29 + window.pageXOffset + 'px'; //147*200,90*122
thumb.style.top = pos.top - 39 + window.pageYOffset + 'px';
thumb.width = 147;
thumb.height = 200;
thumb.style.display = 'block';
thumb.parentNode.href = '/mono/dvd/-/detail/=/cid=' + getCid(this.src)[1] + '/';
}
},
onRemoveThumb: function() {
this.style.display = 'none';
this.src = null;
this.parentNode.href = null;
}
};
var wish = {
dvd: [],
sortType: ['cid', 'date', 'actress', 'maker'],
init: function() {
document.title = 'Wishlist';
GM_addStyle(' \
body,table {color:#333333; font-size:12px; font-family:"MS PGothic","Osaka";} \
a:link {color:#005FC0; text-decoration:none;} \
a:visited {color:#005FC0; text-decoration:none;} \
a:hover,a:active {color:#EE2200; text-decoration:underline;} \
table {text-align:center; width:590px; border-collapse:separate; border-spacing:5px;} \
table th {font-size:1.1em; padding:2px; background-color:#242424; color:#ffffff} \
table th:hover {cursor:pointer} \
table td {padding:2px; background-color:#F8F8F8; border:1px solid #CCCCCC;} \
p {text-align:left}');
document.body.innerHTML = ' \
<table> \
<thead> \
<tr> \
<th width="3%">#</th> \
<th width=15%">Cover</th> \
<th width="30%" id="cid">CID</th> \
<th width="17%" id="actress">Actress</th> \
<th width="17%" id="maker">Maker</th> \
<th width="14%" id="date">Date</th> \
<th width="4%">X</th> \
</tr> \
</thead> \
<tbody id="wishlist"></tbody> \
</table>';
this.createObj();
this.fillTable();
},
onSort: function() {
for(var i = 0; i < 4; i++) {
document.getElementById(wish.sortType[i]).style.backgroundColor = '#242424';
}
this.style.backgroundColor = '#C10000';
wish.dvd.sort(wish.by(this.id));
wish.fillTable();
},
by: function(type) {
return function(a, b) {
var c = a[type];
var d = b[type];
if(c === d) {
return 0;
}
if(c < d) {
return -1;
} else {
return 1;
}
};
},
createObj: function() {
function Dvd(cid, date, actress, maker, title) {
this.cid = cid;
this.date = date;
this.actress = actress;
this.maker = maker;
this.title = title;
}
for(var i = 0, j = 0; i < localStorage.length; i++) {
var cid = localStorage.key(i);
if(cid[0] !== '#' && cid[0] !== '_' && cid.slice(0,3) !== 'cX_') {
var info = localStorage[cid].split('#'); //Date[0]#Actress[1]#Maker[2]#Title[3]
info[1] = info[1].replace(/></g, '><br /><');
this.dvd[j] = new Dvd(cid, info[0], info[1], info[2], info[3]);
j++;
}
}
this.dvd.sort(this.by('date'));
},
fillTable: function() {
for(var i = 0; i < 4; i++) {
document.getElementById(this.sortType[i]).addEventListener('click', this.onSort, false);
}
var list = document.getElementById('wishlist');
removeChildren(list);
for(i = 0; i < this.dvd.length; i++) {
var item = document.createElement('tr');
item.innerHTML = ' \
<td height="130">' + (i + 1) + '</td> \
<td><img src="http://pics.dmm.co.jp/mono/movie/' + this.dvd[i].cid + '/' + this.dvd[i].cid + 'pt.jpg" /></td> \
<td><a href="/mono/dvd/-/detail/=/cid=' + this.dvd[i].cid.replace(/so$/, '') + '/">' + this.dvd[i].cid + '<br /></a><p>' + this.dvd[i].title + '</p></td> \
<td>' + this.dvd[i].actress + '</td> \
<td name="maker">' + this.dvd[i].maker + '</td> \
<td>' + this.dvd[i].date + '</td> \
<td><a href="" onclick="localStorage.removeItem(\'' + this.dvd[i].cid + '\')">' + 'X' + '</a></td>';
list.appendChild(item);
}
}
};
var fav = {
menus: [],
init: function() {
GM_addStyle(' \
#header .hd-lnav ul li ul li {float:none; margin:0; background-color:#242424; position:relative; z-index:99} \
#header .hd-lnav ul li ul {display:none; position:absolute;} \
#header .hd-lnav ul li>ul {top:auto; left:auto;} \
#header .hd-lnav ul li:hover ul {display:block}');
this.addLink();
this.setMenu();
},
addLink: function() {
var wishLink = document.createElement('a');
wishLink.href = '/top/-/error/area/';
wishLink.textContent = 'Wishlist';
wishLink.style.marginLeft = '5px';
var key = document.getElementsByClassName('popular-keyword')[0];
key.appendChild(wishLink);
key.style.right = '-3em';
},
setMenu: function() {
function Menu(label, key) {
this.label = label;
this.key = key;
}
this.menus[0] = new Menu('Actress', 'actress');
this.menus[1] = new Menu('Maker', 'maker');
this.menus[2] = new Menu('Genre', 'keyword', '#GId', '#GName');
for(var i = 0; i < this.menus.length; i++) {
var type = this.menus[i].key[0];
var id = '#' + type + 'ID';
var name = '#' + type + 'NAME';
var sid = localStorage.getItem(id);
if(!sid) {
localStorage.setItem(id, '[]');
localStorage.setItem(name, '[]');
} else {
var idList = JSON.parse(sid);
var nameList = JSON.parse(localStorage.getItem(name));
this.createMenu(this.menus[i].label, this.menus[i].key, idList, nameList);
}
}
},
createMenu: function(label, key, id, name) {
var navBar = document.getElementsByClassName('hd-lnav group')[0].firstElementChild;
var liMenu = document.createElement('li');
var aMenu = document.createElement('a');
aMenu.href = '/mono/dvd/-/' + label.toLowerCase() + '/';
aMenu.textContent = label;
liMenu.appendChild(aMenu);
var ulMenu = document.createElement('ul');
liMenu.appendChild(ulMenu);
navBar.appendChild(liMenu);
for(var i = 0; i < id.length; i++) {
var liSubmenu = document.createElement('li');
var aSubmenu = document.createElement('a');
aSubmenu.href = '/mono/dvd/-/list/=/article=' + key + '/id=' + id[i] + '/sort=date/';
aSubmenu.textContent = name[i];
liSubmenu.appendChild(aSubmenu);
ulMenu.appendChild(liSubmenu);
}
}
};
var addfav = {
init: function() {
GM_addStyle(' \
#dropzone {position:absolute; left:0; top:0; width:100%; height:100%;} \
#dropbox {position:relative; font-size:1.2em; font-weight:bold; text-align:center; padding-top:10px; color:#005FC0; \
height:30px; background-color:#F7FDFF; border:2px dashed #EE2200; margin-bottom:5px; display:none} \
#dropbox.over {border:2px solid #005FC0;}');
this.addFav();
},
addFav: function() {
var actress = document.getElementById('performer');
var performer = actress.querySelectorAll('a');
for(var c = 0 ; c < performer.length; c++) {
actress.parentNode.insertBefore(performer[c], actress);
}
actress.parentNode.removeChild(actress);
var tds = document.getElementsByClassName('nw');
var k = [3, 6, 8]; //3:actress, 6: maker, 8: genre
for(var i = 0; i < k.length; i++) {
var link = tds[k[i]].nextElementSibling.children;
for(var j = 0; j < link.length; j++) {
link[j].addEventListener('dragstart', this.onDragStart, false);
link[j].addEventListener('dragend', this.onDragEnd, false);
}
}
var info = document.getElementById('infot');
var box = document.createElement('div');
box.id = 'dropbox';
var zone = document.createElement('div');
zone.id = 'dropzone';
box.appendChild(zone);
box.appendChild(document.createTextNode('Drop Here'));
info.parentNode.insertBefore(box, info);
zone.addEventListener('dragenter', this.onDragEnter, false);
zone.addEventListener('dragover', this.onDragOver, false);
zone.addEventListener('dragleave', this.onDragLeave, false);
zone.addEventListener('drop', this.onDrop, false);
},
onDragStart: function(e) {
document.getElementById('dropbox').style.display = 'block';
e.dataTransfer.effectAllowed = 'link';
e.dataTransfer.setData('aName', this.text);
e.dataTransfer.setData('aLink', this.href);
},
onDragOver: function(e) {
e.preventDefault();
e.dataTransfer.dropEffect = 'link';
},
onDragEnter: function() {
this.parentNode.classList.add('over');
},
onDragLeave: function() {
this.parentNode.classList.remove('over');
},
onDrop: function(e) {
e.stopPropagation();
e.preventDefault();
this.classList.remove('over');
var aName = e.dataTransfer.getData('aName');
var aLink = e.dataTransfer.getData('aLink');
var aId = aLink.match(/\d+/)[0];
var aType = aLink.match(/article=([a-z])/)[1];
var itemId = '#' + aType + 'ID';
var itemName = '#' + aType + 'NAME';
//this.innerHTML=aType + ':'aName + ',' + aId;
var aIdList = JSON.parse(localStorage.getItem(itemId));
if(aIdList) {
if(aIdList.indexOf(aId) === -1) {
aIdList.push(aId);
var aNameList = JSON.parse(localStorage.getItem(itemName));
aNameList.push(aName);
localStorage.setItem(itemId, JSON.stringify(aIdList));
localStorage.setItem(itemName, JSON.stringify(aNameList));
}
} else {
aIdList = [];
aNameList = [];
}
},
onDragEnd: function() {
document.getElementById('dropbox').style.display = 'none';
}
};
var gal = {
init: function(e, width, height) {
var div = document.createElement('div');
var background = document.createElement('div');
background.setAttribute('style', 'position:fixed; height:100%; width:100%; left:0; top:0; background-color:black; opacity:0.8;z-index:20');
background.addEventListener('click', function() {
document.body.removeChild(div);
}, true);
var box = document.createElement('div');
box.id = 'box';
box.style.position = 'absolute';
box.style.left = window.pageXOffset + (window.innerWidth - width) / 2 + 'px';
box.style.top = window.pageYOffset + (window.innerHeight - height) / 2 + 'px';
box.style.zIndex = 21;
document.body.appendChild(div);
div.appendChild(background);
div.appendChild(box);
box.appendChild(e);
},
//==Show preview gallery==
onShowPic: function() {
var origin = new Image();
origin.src = this.src;
var leftd = document.createElement('div');
leftd.id = 'leftd';
leftd.setAttribute('style', 'position:absolute; left:0; top:0; height:100%; width:50%');
leftd.addEventListener('click', gal.onShowNext, true);
var rightd = document.createElement('div');
rightd.id = 'rightd';
rightd.setAttribute('style', 'position:absolute; right:0; top:0; height:100%; width:50%');
rightd.addEventListener('click', gal.onShowNext, true);
var image = document.createElement('div');
image.appendChild(origin);
image.appendChild(leftd);
image.appendChild(rightd);
gal.init(image, origin.width, origin.height);
},
//==Show next preview==
onShowNext: function() {
var box = document.getElementById('box');
var curpic = box.firstChild.firstChild;
var gal = document.getElementsByClassName('galpic').length;
var num = (this.id === 'leftd') ? -1 : 1;
var patt = /\d+(?=\.jpg$)/;
patt.compile(patt);
var nextnum = parseInt(curpic.src.match(patt)[0], 10) + num;
if(nextnum <= gal && nextnum > 0) {
var nextpic = new Image();
nextpic.src = curpic.src.replace(patt, nextnum);
box.style.left = window.pageXOffset + (window.innerWidth - nextpic.width) / 2 + 'px';
box.style.top = window.pageYOffset + (window.innerHeight - nextpic.height) / 2 + 'px';
box.firstChild.insertBefore(nextpic, curpic);
box.firstChild.removeChild(curpic);
} else {
document.body.removeChild(box.parentNode);
}
},
onPlay: function() {
var video = document.createElement('div');
video.id = 'samplevideo';
video.width = 560;
video.height = 440;
video.setAttribute('style', 'border:5px solid #FFFFFF; color: #F4F4F4; font-weight:bold;');
video.textContent = 'Loading...';
gal.init(video, video.width, video.height);
}
};
var sample = {
init: function() {
if(detail.videoEnable) {
this.createLink();
}
},
createLink: function() {
var mybox = document.getElementById('mybox');
var play = document.createElement('a');
play.textContent = 'Play Sample';
play.addEventListener('click', gal.onPlay, false);
play.addEventListener('click', sample.injectScript, false);
mybox.appendChild(play);
},
injectScript: function() {
function handelVideo() {
$('#samplevideo').load(location.pathname + 'ajax=movie/');
}
function closePlayer() {
$('#box').parent().remove();
}
var inject = document.createElement('script');
inject.appendChild(document.createTextNode('(' + handelVideo + ')();'));
inject.appendChild(document.createTextNode(closePlayer));
var sample = document.getElementsByClassName('mg-b20 mg-r12')[0];
sample.parentNode.insertBefore(inject, sample);
}
};
//Get cid of the dvd: type ? realcid : dmmcid
//realcid[abcd123, abcd, 123] dmmcid[abcd123so, abcd123]
function getCid(str, type) {
return type ? str.match(/([a-z]+)([0-9]+)/) : str.match(/(\w+\d+)(?:so)?/);
}
function removeChildren(e) {
while(e.firstChild) {
e.removeChild(e.firstChild);
}
}
(function() {
//hide welcome
GM_addStyle('#welcome {display:none !important;}');
var page = /\/top\/-\/error\/area\/|\/detail\/|\/list\//.exec(location.pathname);
if(page) {
var config = {
comment: true,
//remove comments
preload: false //auto preload
};
switch(page[0]) {
case '/list/':
list.init();
fav.init();
break;
case '/top/-/error/area/':
wish.init();
break;
case '/detail/':
detail.init(config);
sample.init();
fav.init();
addfav.init();
break;
}
}
})();