forked from lxm_front/Mergely
Mergely 3.0 that works with CodeMirror 3.0 beta.
This commit is contained in:
322
editor/editor.js
Executable file
322
editor/editor.js
Executable file
@@ -0,0 +1,322 @@
|
||||
String.prototype.random = function(length) {
|
||||
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
|
||||
var randomstring = ''
|
||||
for (var i=0; i<length; i++) {
|
||||
var rnum = Math.floor(Math.random() * chars.length);
|
||||
randomstring += chars.substring(rnum,rnum+1);
|
||||
}
|
||||
return randomstring;
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
$('.button-search').button({icons:{primary:'ui-icon-search'}, text:false});
|
||||
$('.button-merger').button({icons:{primary:'ui-icon-arrowreturnthick-1-e'}, text:false});
|
||||
$('.button-mergel').button({icons:{primary:'ui-icon-arrowreturnthick-1-w'}, text:false});
|
||||
$('.button-swap').button({icons:{primary:'ui-icon-transferthick-e-w'}, text:false});
|
||||
$('.button-clear').button({icons:{primary:'ui-icon-circle-close'}, text:false});
|
||||
$('.button-download').button({icons:{primary:'ui-icon-disk'}, text:false});
|
||||
$('.button-upload').button({icons:{primary:'ui-icon-folder-open'}, text:false});
|
||||
$('.button-share').button({icons:{primary:'ui-icon-triangle-1-s'}, text:true});
|
||||
$('.button-download-diff').button({icons:{primary:'ui-icon-script'}, text:false});
|
||||
|
||||
$('#share').live({
|
||||
mouseenter: function () { $('#share-menu').fadeIn(500); },
|
||||
mouseleave: function () {
|
||||
if (hover_timeout) clearTimeout(hover_timeout);
|
||||
hover_timeout = setTimeout(function(){$('#share-menu').hide();}, 100);
|
||||
}
|
||||
});
|
||||
$('#share-menu').live({
|
||||
mouseenter: function () { if (hover_timeout) clearTimeout(hover_timeout); },
|
||||
mouseleave: function () {
|
||||
if (hover_timeout) clearTimeout(hover_timeout);
|
||||
hover_timeout = setTimeout(function(){$('#share-menu').hide();}, 100);
|
||||
}
|
||||
});
|
||||
var hover_timeout = null;
|
||||
|
||||
$('#lhs-upload, #rhs-upload').button({icons:{primary:'ui-icon-folder-open'}, text:false}).upload({
|
||||
upload: function(target, evt) {
|
||||
var files = evt.target.files;
|
||||
var side = target.attr('id').split('-')[0];
|
||||
var sides = [side];
|
||||
if (files.length > 1) {
|
||||
if (side == 'lhs') sides.push('rhs');
|
||||
else sides.push('lhs');
|
||||
}
|
||||
// html5 file upload to browser
|
||||
function load_file(side, file) {
|
||||
var reader = new FileReader();
|
||||
reader.onprogress = function (evt) { }
|
||||
reader.onload = function (evt) {
|
||||
$('#compare').mergely(side, evt.target.result);
|
||||
document.body.style.cursor = 'default';
|
||||
}
|
||||
reader.onerror = function (evt) {
|
||||
alert( evt.target.error.name );
|
||||
}
|
||||
try {
|
||||
reader.readAsText(file, "UTF-8");
|
||||
}
|
||||
catch (e) {
|
||||
alert(e);
|
||||
document.body.style.cursor = 'default';
|
||||
}
|
||||
}
|
||||
if (files.length >= 1) load_file(sides[0], files[0]);
|
||||
if (files.length >= 2) load_file(sides[1], files[1]);
|
||||
}
|
||||
});
|
||||
|
||||
$('#compare').mergely({
|
||||
readonly: key == '4qsmsDyb',
|
||||
linewrapping: false,
|
||||
height: function(h) {
|
||||
return h - 100;
|
||||
},
|
||||
loaded: function() {
|
||||
$('.toolbar, .title').fadeIn('fast');
|
||||
$('button').css({'visibility':'visible'});
|
||||
},
|
||||
resized: function() {
|
||||
var lhsx = $('#compare-editor-lhs .CodeMirror-gutter').offset().left + $('#compare-editor-lhs .CodeMirror-gutter').width() + 1;
|
||||
var rhsx = $('#compare-editor-rhs .CodeMirror-gutter').offset().left + $('#compare-editor-rhs .CodeMirror-gutter').width() + 1 - $('#lhs-toolbar').width();
|
||||
$('#lhs-toolbar, #title-lhs').css({'position':'relative', 'left':lhsx});
|
||||
$('#rhs-toolbar, #title-rhs').css({'position':'relative', 'left':rhsx});
|
||||
$('#title-rhs').css({'left':rhsx});
|
||||
},
|
||||
cmsettings: {
|
||||
mode: 'text/plain'
|
||||
},
|
||||
_debug: ''
|
||||
});
|
||||
if (key.length == 8) {
|
||||
$.when(
|
||||
$.ajax({
|
||||
type: 'GET', async: true, dataType: 'text',
|
||||
data: { 'key':key, 'name': 'lhs' },
|
||||
url: '/ajax/handle_get.php',
|
||||
success: function (response) {
|
||||
$('#compare').mergely('lhs', response);
|
||||
},
|
||||
error: function(xhr, ajaxOptions, thrownError){
|
||||
}
|
||||
}),
|
||||
$.ajax({
|
||||
type: 'GET', async: true, dataType: 'text',
|
||||
data: { 'key':key, 'name': 'rhs' },
|
||||
url: '/ajax/handle_get.php',
|
||||
success: function (response) {
|
||||
$('#compare').mergely('rhs', response);
|
||||
},
|
||||
error: function(xhr, ajaxOptions, thrownError){
|
||||
}
|
||||
})
|
||||
).done(function() {
|
||||
var anchor = window.location.hash.substring(1);
|
||||
if (anchor) {
|
||||
// if an anchor has been provided, then parse the anchor in the
|
||||
// form of: 'lhs' or 'rhs', followed by a line, e.g: lhs100.
|
||||
var m = anchor.match(/([lr]hs)([0-9]+)/);
|
||||
if (m.length == 3) {
|
||||
console.log(m);
|
||||
$('#compare').mergely('scrollTo', m[1], parseInt(m[2],10));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
if (newbie) {
|
||||
$('#compare').mergely('lhs', 'the quick brown fox jumped over\nthe hairy cat\n');
|
||||
$('#compare').mergely('rhs', 'the quick brown fox jumped over\nthe lazy dog\n');
|
||||
}
|
||||
}
|
||||
$('#lhs-search, #rhs-search').click(function(){
|
||||
var side = $(this).attr('id').split('-')[0];
|
||||
var text = $('#' + side + '-search-text').val();
|
||||
$('#compare').mergely('search', side, text);
|
||||
return false;
|
||||
});
|
||||
$('#lhs-search-text, #rhs-search-text').keydown(function (ev) {
|
||||
var id = $(this).attr('id').split('-')[0];
|
||||
if (ev.which === $.ui.keyCode.ENTER) { $('#' + id + '-search').click(); return false; }
|
||||
return true;
|
||||
});
|
||||
$('#lhs-clear, #rhs-clear').click(function(){
|
||||
var side = $(this).attr('id').split('-')[0];
|
||||
$('#compare').mergely('clear', side);
|
||||
return false;
|
||||
});
|
||||
$('#lhs-swap, #rhs-swap').click(function(){
|
||||
$('#compare').mergely('swap');
|
||||
return false;
|
||||
});
|
||||
$('#lhs-merge, #rhs-merge').click(function(){
|
||||
var side = $(this).attr('id').split('-')[0];
|
||||
// clicking rhs-merge means 'merge left'
|
||||
if (side == 'rhs') side = 'lhs';
|
||||
else side = 'rhs';
|
||||
$('#compare').mergely('merge', side);
|
||||
return false;
|
||||
});
|
||||
$('#save, #fork').click(function(){
|
||||
var fork = $(this).attr('id') == 'fork';
|
||||
if (key == '') key = ''.random(8);
|
||||
var count = 0;
|
||||
function post_save(side, text) {
|
||||
$.ajax({
|
||||
type: 'POST', async: true, dataType: 'text',
|
||||
url: '/ajax/handle_file.php',
|
||||
data: { 'key': key, 'name': side, 'content': text },
|
||||
success: function (nkey) {
|
||||
++count;
|
||||
if (count == 2) {
|
||||
var url = '/ajax/handle_save.php?key=' + key;
|
||||
if (fork) url += '&nkey=' + ''.random(8);
|
||||
$.ajax({
|
||||
type: 'GET', async: false, dataType: 'text',
|
||||
url: url,
|
||||
success: function (nkey) {
|
||||
// redirect
|
||||
if (nkey.length) window.location.href = '/' + $.trim(nkey) + '/';
|
||||
},
|
||||
error: function(xhr, ajaxOptions, thrownError){
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(xhr, ajaxOptions, thrownError){
|
||||
alert(thrownError);
|
||||
}
|
||||
});
|
||||
}
|
||||
function call_save() {
|
||||
var lhs = $('#compare').mergely('get', 'lhs');
|
||||
var rhs = $('#compare').mergely('get', 'rhs');
|
||||
post_save('lhs', lhs);
|
||||
post_save('rhs', rhs);
|
||||
}
|
||||
|
||||
if ($(this).attr('id') == 'save') {
|
||||
$( '#dialog-confirm' ).dialog({
|
||||
resizable: false, height:210, modal: true,
|
||||
buttons: {
|
||||
"Save for Sharing": function() {
|
||||
$( this ).dialog( "close" );
|
||||
call_save();
|
||||
},
|
||||
Cancel: function() {
|
||||
$( this ).dialog( "close" );
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
call_save();
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#lhs-download, #rhs-download').click(function(){
|
||||
var side = $(this).attr('id').split('-')[0];
|
||||
var content = $('#compare').mergely('get', side);
|
||||
|
||||
var MIME_TYPE = 'text/plain';
|
||||
console.log('downloading...');
|
||||
var windowURL = window.webkitURL || window.URL;
|
||||
var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
|
||||
var bb = new BlobBuilder();
|
||||
bb.append(content);
|
||||
var a = document.createElement('a');
|
||||
a.download = side + '.txt';
|
||||
a.target = '_blank';
|
||||
a.href = windowURL.createObjectURL(bb.getBlob(MIME_TYPE));
|
||||
a.textContent = 'Download ready';
|
||||
a.dataset.downloadurl = [MIME_TYPE, a.download, a.href].join(':');
|
||||
a.draggable = true;
|
||||
a = $(a);
|
||||
window.open(a.attr('href'), '_blank');
|
||||
windowURL.revokeObjectURL()
|
||||
return false;
|
||||
});
|
||||
$('#lhs-download-diff, #rhs-download-diff').click(function(){
|
||||
var text = $('#compare').mergely('diff');
|
||||
if (key == '') key = ''.random(8);
|
||||
$.post('/ajax/handle_download.php', { 'key': key, 'content': text }, function(response) {
|
||||
window.location = response;
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
var dlg = $('#dialog-settings').css('visibility','visible').hide();
|
||||
var f = $.farbtastic('#picker');
|
||||
var sd = $('<span style="display:none" class="mergely ch d lhs">C</span>');
|
||||
var sa = $('<span style="display:none" class="mergely a rhs start end">C</span>');
|
||||
var sc = $('<span style="display:none" class="mergely c rhs start end">C</span>');
|
||||
$('body').append(sd);
|
||||
$('body').append(sa);
|
||||
$('body').append(sc);
|
||||
var conf = {
|
||||
'c-border': {id: '#c-border', defaultColor: '#cccccc', getColor: function() { return sc.css('border-top-color'); } },
|
||||
'a-border': {id: '#a-border', defaultColor: '#4ba3fa', getColor: function() { return sa.css('border-top-color'); }, setColor: function(color) { $('#'+this.id).val(color) }},
|
||||
'd-border': {id: '#d-border', defaultColor: '#ff7f7f', getColor: function() { return sd.css('border-top-color'); }, setColor: function(color) { $('#'+this.id).val(color) }},
|
||||
'a-bg': {id: '#a-bg', defaultColor: '#ddeeff', getColor: function() { return sa.css('background-color'); }, setColor: function(color) { $('#'+this.id).val(color) }},
|
||||
'd-bg': {id: '#d-bg', defaultColor: '#f9e9e9', getColor: function() { return sd.css('background-color'); }, setColor: function(color) { $('#'+this.id).val(color) }},
|
||||
};
|
||||
|
||||
$.each(conf, function(key, item){ $(item.id).val(item.getColor()); });
|
||||
|
||||
$('#settings').click(function(){
|
||||
dlg.dialog({
|
||||
height: 330, width: 450, modal: true,
|
||||
buttons: {
|
||||
Apply: function() {
|
||||
var cborder = $('#c-border').val();
|
||||
var aborder = $('#a-border').val();
|
||||
var dborder = $('#d-border').val();
|
||||
var abg = $('#a-bg').val();
|
||||
var dbg = $('#d-bg').val();
|
||||
var cbg = $('#c-bg').val();
|
||||
var text =
|
||||
'.mergely.a.rhs.start { border-top: 1px solid ' + aborder + ' }\n\
|
||||
.mergely.a.lhs.start.end,\n\
|
||||
.mergely.a.rhs.end { border-bottom: 1px solid ' + aborder + ' }\n\
|
||||
.mergely.a.rhs { background-color: ' + abg + ' }\n\
|
||||
.mergely.d.lhs { background-color: ' + dbg + ' }\n\
|
||||
.mergely.d.lhs.end,\n\
|
||||
.mergely.d.rhs.start.end { border-bottom: 1px solid ' + dborder + '; }\n\
|
||||
.mergely.d.lhs.start { border-top: 1px solid ' + dborder + '; }\n\
|
||||
.mergely.c.lhs,\n\
|
||||
.mergely.c.rhs { background-color: ' + cbg + '; }\n\
|
||||
.mergely.c.lhs.start,\n\
|
||||
.mergely.c.rhs.start { border-top: 1px solid ' + cborder + '; }\n\
|
||||
.mergely.c.lhs.end,\n\
|
||||
.mergely.c.rhs.end { border-bottom: 1px solid ' + cborder + '; }\n\
|
||||
.mergely.ch.a.rhs { background-color: ' + abg + '; }\n\
|
||||
.mergely.ch.d.lhs { background-color: ' + dbg + '; text-decoration: line-through; color: #888; }\n'
|
||||
$('<style type="text/css">' + text + '</style>').appendTo('head');
|
||||
|
||||
$('#compare').mergely('options', {fgcolor:{a:aborder,c:cborder,d:dborder}});
|
||||
$('#compare').mergely('update');
|
||||
},
|
||||
Reset: function() {
|
||||
$.each(conf, function(key){
|
||||
var id = '#'+key;
|
||||
f.linkTo($(id).get(0));
|
||||
f.setColor(conf[key].defaultColor);
|
||||
});
|
||||
},
|
||||
Close: function() {
|
||||
$(this).dialog('close');
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
$('.colorwell').each(function(){ f.linkTo(this); }).focus(function(){
|
||||
var tthis = $(this);
|
||||
f.linkTo(this);
|
||||
var item = conf[tthis.attr('id')];
|
||||
f.setColor(item.getColor());
|
||||
});
|
||||
|
||||
});
|
||||
61
editor/gatag.js
Executable file
61
editor/gatag.js
Executable file
@@ -0,0 +1,61 @@
|
||||
// This javascript tags file downloads and external links in Google Analytics.
|
||||
// You need to be using the Google Analytics New Tracking Code (ga.js)
|
||||
// for this script to work.
|
||||
// To use, place this file on all pages just above the Google Analytics tracking code.
|
||||
// All outbound links and links to non-html files should now be automatically tracked.
|
||||
//
|
||||
// This script has been provided by Goodwebpractices.com
|
||||
// Thanks to ShoreTel, MerryMan and Colm McBarron
|
||||
//
|
||||
// www.goodwebpractices.com
|
||||
// VKI has made changes as indicated below.
|
||||
|
||||
if (document.getElementsByTagName) {
|
||||
// Initialize external link handlers
|
||||
var hrefs = document.getElementsByTagName("a");
|
||||
for (var l = 0; l < hrefs.length; l++) {
|
||||
// try {} catch{} block added by erikvold VKI
|
||||
try{
|
||||
//protocol, host, hostname, port, pathname, search, hash
|
||||
if (hrefs[l].protocol == "mailto:") {
|
||||
startListening(hrefs[l],"click",trackMailto);
|
||||
} else if (hrefs[l].hostname == location.host) {
|
||||
var path = hrefs[l].pathname + hrefs[l].search;
|
||||
var isDoc = path.match(/\.(?:doc|eps|jpg|png|svg|xls|ppt|pdf|xls|zip|txt|vsd|vxd|js|css|rar|exe|wma|mov|avi|wmv|mp3)($|\&|\?)/);
|
||||
if (isDoc) {
|
||||
startListening(hrefs[l],"click",trackExternalLinks);
|
||||
}
|
||||
} else if (!hrefs[l].href.match(/^javascript:/)) {
|
||||
startListening(hrefs[l],"click",trackExternalLinks);
|
||||
}
|
||||
}
|
||||
catch(e){
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function startListening (obj,evnt,func) {
|
||||
if (obj.addEventListener) {
|
||||
obj.addEventListener(evnt,func,false);
|
||||
} else if (obj.attachEvent) {
|
||||
obj.attachEvent("on" + evnt,func);
|
||||
}
|
||||
}
|
||||
|
||||
function trackMailto (evnt) {
|
||||
var href = (evnt.srcElement) ? evnt.srcElement.href : this.href;
|
||||
var mailto = "/mailto/" + href.substring(7);
|
||||
if (typeof(pageTracker) == "object") pageTracker._trackPageview(mailto);
|
||||
}
|
||||
|
||||
function trackExternalLinks (evnt) {
|
||||
var e = (evnt.srcElement) ? evnt.srcElement : this;
|
||||
while (e.tagName != "A") {
|
||||
e = e.parentNode;
|
||||
}
|
||||
var lnk = (e.pathname.charAt(0) == "/") ? e.pathname : "/" + e.pathname;
|
||||
if (e.search && e.pathname.indexOf(e.search) == -1) lnk += e.search;
|
||||
if (e.hostname != location.host) lnk = "/external/" + e.hostname + lnk;
|
||||
if (typeof(pageTracker) == "object") pageTracker._trackPageview(lnk);
|
||||
}
|
||||
42
editor/jquery.edit.js
Executable file
42
editor/jquery.edit.js
Executable file
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* jQuery Edit Plugin
|
||||
* version: 1.0 (2011/06/30)
|
||||
* @requires jQuery v1.1 or later
|
||||
*
|
||||
* Examples at:
|
||||
* License:
|
||||
*/
|
||||
(function ($) {
|
||||
|
||||
$.fn.editable = function (method) {
|
||||
return this.each(function (index) {
|
||||
var tthis = $(this);
|
||||
var settings = {
|
||||
cancel: function (target) { },
|
||||
accept: function (target) { }
|
||||
};
|
||||
$(this).addClass('editable-default');
|
||||
$(this).mouseenter(function(){
|
||||
$(this).addClass('editable-hover').removeClass('editable-default').attr('contenteditable', 'true');
|
||||
}).mouseleave(function(){
|
||||
$(this).addClass('editable-default').removeClass('editable-hover').attr('contenteditable', 'false');
|
||||
});
|
||||
|
||||
var methods = {
|
||||
init: function (options) {
|
||||
if (options) $.extend(settings, options);
|
||||
}
|
||||
};
|
||||
if (methods[method]) {
|
||||
return methods[method].apply(this, Array.prototype.slice.call(method, 1));
|
||||
}
|
||||
else if (typeof (method) == 'object' || !method) {
|
||||
return methods.init(method);
|
||||
}
|
||||
else {
|
||||
$.error('Method ' + method + ' does not exist on jQuery.edit');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
})(jQuery);
|
||||
54
editor/jquery.upload.js
Executable file
54
editor/jquery.upload.js
Executable file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* jQuery File Upload Plugin
|
||||
* version: 1.1 (2011/06/30)
|
||||
* @requires jQuery v1.1 or later
|
||||
*
|
||||
* Examples at:
|
||||
* License:
|
||||
*/
|
||||
(function ($) {
|
||||
|
||||
$.fn.upload = function (method) {
|
||||
return this.each(function (index) {
|
||||
var tthis = $(this);
|
||||
var settings = {
|
||||
beforeupload: function (target, evt) { },
|
||||
upload: function (target, evt) { }
|
||||
};
|
||||
var methods = {
|
||||
init: function (options) {
|
||||
if (options) $.extend(settings, options);
|
||||
var container = $('<div style="display: inline-block;overflow:hidden;"></div>');
|
||||
var input = $('<input type="file" name="files[]" multiple="" style="float:left;position:relative;left:-19px;height:16px;width:18px;cursor:pointer;opacity:0;-moz-opacity:0; filter:alpha(opacity=20)" />');
|
||||
if ($.browser.mozilla) {
|
||||
input.css({'left':'-190px','height':'16px'});
|
||||
}
|
||||
var button = tthis.clone();
|
||||
button.css({position:'relative', float:'left', left:'0px'});
|
||||
container.append(button);
|
||||
container.append(input);
|
||||
container.mouseover(function(){button.addClass('ui-state-hover').css({'cursor':'pointer'});});
|
||||
container.mouseleave(function(){button.removeClass('ui-state-hover').css({'cursor':'default'});});
|
||||
tthis.after(container);
|
||||
container.css({overflow:'hidden'});
|
||||
tthis.remove();
|
||||
input.change(function (evt) {
|
||||
var fname = input.val().replace(/^.*\\/, '');
|
||||
if (fname.length) {
|
||||
settings.upload(tthis, evt);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
if (methods[method]) {
|
||||
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
||||
}
|
||||
else if (typeof (method) == 'object' || !method) {
|
||||
return methods.init(method);
|
||||
}
|
||||
else {
|
||||
$.error('Method ' + method + ' does not exist on jQuery.upload');
|
||||
}
|
||||
});
|
||||
}
|
||||
})(jQuery);
|
||||
Reference in New Issue
Block a user