/*
* JavaScript for live comment preview (based on nhn_livecommentpreview)
* dotjay (2006-2008)
*
* This was originally a hack by Jon Hicks
* described at http://www.hicksdesign.co.uk/journal/live-comment-previews
*
* Add required behaviour only if JavaScript is enabled.
* Only show the "comment-preview" div if JavaScript is enabled.
*/

var preview_element_id = 'comment-preview';
var preview_button_id = 'preview';
var message_element_id = 'message';
var preview_text_element_id = 'TextDisplay';
var name_element_id = 'comment_name_input';

// live preview of the comment
function ReloadTextDiv(){
	var commentString = document.getElementById(message_element_id).value;
	var con = superTextile(commentString);
	document.getElementById(preview_text_element_id).innerHTML = con;
	return true;
}

// live preview of the name
function ReloadNameDiv(){
	var NewText = document.getElementById(name_element_id).value;
	var DivElement = document.getElementById('NameDisplay');
	DivElement.innerHTML = NewText;
	return true;
}

/* LIVE TEXTILE PREVIEW
* Orginial function from Stuart Langridge at http://www.kryogenix.org/
* updated by Jeff Minard - http://www.jrm.cc/
*/
function superTextile(s){
    var r = s;
    // quick tags first
    qtags = [['\\*', 'strong'],
             ['\\?\\?', 'cite'],
             ['\\+', 'ins'],  //fixed
             ['~', 'sub'],   
             ['\\^', 'sup'], // me
             ['@', 'code']];
    for (var i=0;i<qtags.length;i++) {
        ttag = qtags[i][0]; htag = qtags[i][1];
        re = new RegExp(ttag+'\\b(.+?)\\b'+ttag,'g');
        r = r.replace(re,'<'+htag+'>'+'$1'+'</'+htag+'>');
    }
    // underscores count as part of a word, so do them separately
    re = new RegExp('\\b_(.+?)_\\b','g');
    r = r.replace(re,'<em>$1</em>');
	
	//jeff: so do dashes
    re = new RegExp('[\s\n]-(.+?)-[\s\n]','g');
    r = r.replace(re,'<del>$1</del>');

    // links
    re = new RegExp('"\\b([^î]+?)\\(\\b(.+?)\\b\\)":([^\\s]+)','g');
    r = r.replace(re,'<a href="$3" title="$2">$1</a>');
    re = new RegExp('"\\b([^î]+?)\\b":([^\\s]+)','g');
    r = r.replace(re,'<a href="$2">$1</a>');

    // images
    re = new RegExp('!\\b(.+?)\\(\\b(.+?)\\b\\)!','g');
    r = r.replace(re,'<img src="$1" alt="$2">');
    re = new RegExp('!\\b(.+?)\\b!','g');
    r = r.replace(re,'<img src="$1">');
    
    // block level formatting
	
		// Jeff's hack to show single line breaks as they should.
		// insert breaks - but you get some....stupid ones
	    re = new RegExp('(.*)\n([^#\*\n].*)','g');
	    r = r.replace(re,'$1<br />$2');
		// remove the stupid breaks.
	    re = new RegExp('\n<br />','g');
	    r = r.replace(re,'\n');
	
    lines = r.split('\n');
    nr = '';
    for (var i=0;i<lines.length;i++) {
        line = lines[i].replace(/\s*$/,'');
        changed = 0;
        if (line.search(/^\s*bq\.\s+/) != -1) { 
			line = line.replace(/^\s*bq\.\s+/,'\t<blockquote>')+'</blockquote>'; 
			changed = 1; 
		}
		
		// jeff adds h#.
        if (line.search(/^\s*h[1|2|3|4|5|6]\.\s+/) != -1) { 
	    	re = new RegExp('h([1|2|3|4|5|6])\.(.+)','g');
	    	line = line.replace(re,'<h$1>$2</h$1>');
			changed = 1; 
		}
		
		if (line.search(/^\s*\*\s+/) != -1) { line = line.replace(/^\s*\*\s+/,'\t<liu>') + '</liu>'; changed = 1; } // * for bullet list; make up an liu tag to be fixed later
        if (line.search(/^\s*#\s+/) != -1) { line = line.replace(/^\s*#\s+/,'\t<lio>') + '</lio>'; changed = 1; } // # for numeric list; make up an lio tag to be fixed later
        if (!changed && (line.replace(/\s/g,'').length > 0)) line = '<p>'+line+'</p>';
        lines[i] = line + '\n';
    }
	
    // Second pass to do lists
    inlist = 0; 
	listtype = '';
    for (var i=0;i<lines.length;i++) {
        line = lines[i];
        if (inlist && listtype == 'ul' && !line.match(/^\t<liu/)) { line = '</ul>\n' + line; inlist = 0; }
        if (inlist && listtype == 'ol' && !line.match(/^\t<lio/)) { line = '</ol>\n' + line; inlist = 0; }
        if (!inlist && line.match(/^\t<liu/)) { line = '<ul>' + line; inlist = 1; listtype = 'ul'; }
        if (!inlist && line.match(/^\t<lio/)) { line = '<ol>' + line; inlist = 1; listtype = 'ol'; }
        lines[i] = line;
    }

    r = lines.join('\n');
	// jeff added : will correctly replace <li(o|u)> AND </li(o|u)>
    r = r.replace(/li[o|u]>/g,'li>');

    return r;
}

function superTextile2(s){
    var r = s;
    // quick tags first
    qtags = [['\\\\*', 'strong'],
             ['\\\\?\\\\?', 'cite'],
             ['\\\\+', 'ins'],  //fixed
             ['~', 'sub'],
             ['\\\\^', 'sup'], // me
             ['@', 'code']];
    for (var i=0;i<qtags.length;i++) {
        ttag = qtags[i][0]; htag = qtags[i][1];
        re = new RegExp(ttag+'\\\\b(.+?)\\\\b'+ttag,'g');
        r = r.replace(re,'<'+htag+'>'+'$1'+'</'+htag+'>');
    }
    // underscores count as part of a word, so do them separately
    re = new RegExp('\\\\b_(.+?)_\\\\b','g');
    r = r.replace(re,'<em>$1</em>');

	//jeff: so do dashes
    re = new RegExp('[\\s\\n]-(.+?)-[\\s\\n]','g');
    r = r.replace(re,'<del>$1</del>');

    // links
    re = new RegExp('\\\"\\\\b(.+?)\\\\(\\\\b(.+?)\\\\b\\\\)\\\":([^\\\\s]+)','g');
    r = r.replace(re,'<a href=\\\"$3\\\" title=\\\"$2\\\">$1</a>');
    re = new RegExp('\\\"\\\\b(.+?)\\\\b\\\":([^\\\\s]+)','g');
    r = r.replace(re,'<a href=\\\"$2\\\">$1</a>');

    // images
    re = new RegExp('!\\\\b(.+?)\\\\(\\\\b(.+?)\\\\b\\\\)!','g');
    r = r.replace(re,'<img src=\\\"$1\\\" alt=\\\"$2\\\">');
    re = new RegExp('!\\\\b(.+?)\\\\b!','g');
    r = r.replace(re,'<img src=\\\"$1\\\">');

    // block level formatting

		// Jeff's hack to show single line breaks as they should.
		// insert breaks - but you get some....stupid ones
	    re = new RegExp('(.*)\\n([^#\\*\\n].*)','g');
	    r = r.replace(re,'$1<br />$2');
		// remove the stupid breaks.
	    re = new RegExp('\\n<br />','g');
	    r = r.replace(re,'\\n');

    lines = r.split('\\n');
    nr = '';
    for (var i=0;i<lines.length;i++) {
        line = lines[i].replace(/\\s*$/,'');
        changed = 0;
        if (line.search(/^\\s*bq\\.\\s+/) != -1) { line = line.replace(/^\\s*bq\\.\\s+/,'\\t<blockquote>')+'</blockquote>'; changed = 1; }

		// jeff adds h#.
        if (line.search(/^\\s*h[1-6]\\.\\s+/) != -1) {
	    	re = new RegExp('h([1-6])\\.(.+)','g');
	    	line = line.replace(re,'<h$1>$2</h$1>');
			changed = 1;
		}

		if (line.search(/^\\s*\\*\\s+/) != -1) { line = line.replace(/^\\s*\\*\\s+/,'\\t<liu>') + '</liu>'; changed = 1; } // * for bullet list; make up an liu tag to be fixed later
        if (line.search(/^\\s*#\\s+/) != -1) { line = line.replace(/^\\s*#\\s+/,'\\t<lio>') + '</lio>'; changed = 1; } // # for numeric list; make up an lio tag to be fixed later
        if (!changed && (line.replace(/\\s/g,'').length > 0)) line = '<p>'+line+'</p>';
        lines[i] = line;
    }

    // Second pass to do lists
    inlist = 0;
	listtype = '';
    for (var i=0;i<lines.length;i++) {
        line = lines[i];
        if (inlist && listtype == 'ul' && !line.match(/^\\t<liu/)) { line = '</ul>\\n' + line; inlist = 0; }
        if (inlist && listtype == 'ol' && !line.match(/^\\t<lio/)) { line = '</ol>\\n' + line; inlist = 0; }
        if (!inlist && line.match(/^\\t<liu/)) { line = '<ul>' + line; inlist = 1; listtype = 'ul'; }
        if (!inlist && line.match(/^\\t<lio/)) { line = '<ol>' + line; inlist = 1; listtype = 'ol'; }
        lines[i] = line;
    }

    r = lines.join('');
	// jeff added : will correctly replace <li(o|u)> AND </li(o|u)>
    r = r.replace(/li[o|u]>/g,'li>');

	// Nils added: magic quotes
    re = new RegExp('\"\\\\b','g');
    r = r.replace(re,'?');
    re = new RegExp('\\\\b\"','g');
    r = r.replace(re,'?');
		r = r.replace('\"\"','??');

	// Nils added: ndash
		r = r.replace('--','?');

    return r;
}

function insertAfter(a,b){
b.parentNode.insertBefore(a,b.nextSibling);
}

// initiate live comment preview
function initLiveCommentPreview(){
	if (!document.getElementById || !document.getElementById(message_element_id)) return false;

	var preview_element = document.createElement("div");
	preview_element.id = preview_element_id;
	preview_element.innerHTML = preview_markup;
	insertAfter(preview_element,document.getElementById('comment-submit'));

	if (!document.getElementById(preview_element_id) || !document.getElementById(preview_text_element_id)) return false;

	var preview_element = document.getElementById(preview_element_id);
	var preview_button = document.getElementById(preview_button_id);
	var message_element = document.getElementById(message_element_id);
	var preview_text_element = document.getElementById(preview_text_element_id);

	// show the preview div (should have display:none; set in CSS)
	if (preview_element.nodeName.toLowerCase()=="div"){
		preview_element.style.display = 'block';
	}

	preview_button.style.display = 'none';

	// add keyup behaviour to message textarea
	if (message_element.nodeName.toLowerCase()=="textarea"){
		message_element.onkeyup = ReloadTextDiv;
		if (message_element.captureEvents) message_element.captureEvents(Event.KEYUP);
	}

	var name_element = document.getElementById(name_element_id);
	if (name_element){
		name_element.onkeyup = ReloadNameDiv;
		if (name_element.captureEvents) name_element.captureEvents(Event.KEYUP);
	}

	// set up initial text in the preview
	preview_text_element.innerHTML = '<p><em>Your message will appear here.</em></p>';
}

addLoadEvent(initLiveCommentPreview);
