/* This has its origins in EditInPlace from acme.com, but has been so
 * hacked and changed as to be unrecognisable. In some ways it is less
 * elegant because it doesn't keep the tidy namespace, and is a lot
 * less versatile, but for this pupose - closely integrated with the
 * creole renderer - it's perfect.  It's also evolved to be a common
 * caller for a number of custom edit routines for special data */

var creole = new Parse.Simple.Creole( {
        interwiki: {
	    place: '../cgi-bin/gazetteer.cgi?id=',
	    waterway: '../cgi-bin/waterway.cgi?id=',
            WikiCreole: 'http://www.wikicreole.org/wiki/',
            Wikipedia: 'http://en.wikipedia.org/wiki/',
	    issue: 'http://code.google.com/p/canalplanac9/issues/detail?id='
        },
        linkFormat: '../cgi-bin/wiki.can?pageid='
    } );


var oCustomContextMenu = null;
var active_menu = null;

var loggedon_cache = null;

function $(id) {
    return document.getElementById(id);
}

function Fix_Entities(str) {
    str = str.replace(/-&gt;/g,'&rarr;');
    str = str.replace(/&lt;-/g,'&larr;');
    str = str.replace(/\(c\)/g,'&copy;');
    str = str.replace(/\(tm\)/g,'&trade;');
    str = str.replace(/---/g,'&mdash;');
    str = str.replace(/--/g,'&ndash;');
    return str;
}

function Setup_Creole(name) {
    var tabbox = $(name+'_edittab');
    if(!tabbox)
	return false;
    var et = new Tabs(tabbox);
    et.Add('Text',function(el) {
      if(el.innerHTML == '') {
        var or = $(name+'_original');
	var input = document.createElement('textarea');
	input.style.width = '80em';
	input.rows = 20;
	input.value = or.value;
	input.id = name+'_edtext';
	el.appendChild(input);
        var yousee = $(name+'_show');
        var render = function() {
          yousee.innerHTML = '';
	  creole.parse(yousee, input.value);
	  yousee.innerHTML = Fix_Entities(yousee.innerHTML);
        };
        input.onkeyup = function() {
            render();
        };

        render();
	var butts = document.createElement('div');
	butts.innerHTML = Edit_Buttons(name,'creole');
	el.appendChild(butts);
      }
    });
    et.Add('History',function(el) {
      Show_History(name,el);
    });
    et.Add('Help',function(el) {
      if(el.innerHTML == '') {
        el.innerHTML = '<img style="float:left; padding-right:1em" src="../images/creole_cheat_sheet.png">';
	el.innerHTML += HelpText();
      }
    });
    return true;
}

function Create_Custom_Menu(name) {
    var OnClick = function(Sender, EventArgs, name) {
	if(EventArgs.CommandName.indexOf('photo_') == 0) {
	    var num = edit_boxes[active_menu].field.substring(7);
	    //	    var photoinf = cp_info.photo_i[num];
	    oCustomContextMenu.Hide();
	    Action_Photo_Menu(num, EventArgs);  // loads new page
	    return;
	}
	if(EventArgs.CommandName.indexOf('sphoto_') == 0) {
	    var photoinf = edit_boxes[active_menu].field.substring(7);
	    oCustomContextMenu.Hide();
	    Action_Photo_Menu(photoinf, EventArgs);
	    return;
	}
	// Do other sorts here - don't forget that cancel falls out here
	oCustomContextMenu.Hide();   
    };
    var Arguments = {
	Base: null,
	Width: 200,
	FontColor: null,
	HoverFontColor: null,
	HoverBackgroundColor: null,
	HoverBorderColor: null,
	ClickEventListener: OnClick
    };
        
    return new CustomContextMenu(Arguments); 
}

function Setup_Photo(name) {
    if(oCustomContextMenu == null) {
	oCustomContextMenu = Create_Custom_Menu(name);
	oCustomContextMenu.AddItem('../images/icons/menu/camera.png','View', false, 'photo_view');
	oCustomContextMenu.AddItem('../images/icons/menu/move.png', 'Move', false, 'photo_move');
	oCustomContextMenu.AddItem('../images/icons/menu/delete.png', 'Delete', false, 'photo_delete');
	oCustomContextMenu.AddItem('../images/icons/menu/database_edit.png', 'Edit data', false, 'edit_photo_data');
	oCustomContextMenu.AddSeparatorItem();
	oCustomContextMenu.AddItem('../images/icons/menu/exit.png', 'Cancel', false, 'Cancel');
    }
    return true;
}

function Setup_Sphoto(name) {
    if(oCustomContextMenu == null) {
	oCustomContextMenu = Create_Custom_Menu(name);
	oCustomContextMenu.AddItem('../images/icons/menu/camera.png','View', false, 'photo_view');
	oCustomContextMenu.AddItem('../images/icons/menu/move.png', 'Move', false, 'sphoto_move');
	oCustomContextMenu.AddItem('../images/icons/menu/delete.png', 'Delete', false, 'sphoto_delete');
	oCustomContextMenu.AddItem('../images/icons/menu/database_edit.png', 'Edit data', false, 'edit_sphoto_data');
	oCustomContextMenu.AddSeparatorItem();
	oCustomContextMenu.AddItem('../images/icons/menu/exit.png', 'Cancel', false, 'Cancel');
    }
    return true;
}

function Setup_Simple(name) {
    var tabbox = $(name+'_edittab');
    if(!tabbox)
	return false;
    var et = new Tabs(tabbox);
    et.Add('Text',function(el) {
      if(el.innerHTML == '') {
        var or = $(name+'_original');
	var input = document.createElement('textarea');
	input.style.width = '80em';
	input.rows = 1;
	input.value = or.value;
	input.id = name+'_edtext';
	el.appendChild(input);
        var yousee = $(name+'_show');
        var render = function() {
	  yousee.innerHTML = Fix_Entities(input.value);
        };
        input.onkeyup = function() {
            render();
        };

        render();
	var butts = document.createElement('div');
	butts.innerHTML = Edit_Buttons(name,'simple');
	el.appendChild(butts);
      }
    });
    et.Add('History',function(el) {
      Show_History(name,el);
    });
    return true;
}
 
function Prepare_Editables() {   // called once at page load
    /* Now called before loading necessarily complete, so return
     * status based on whether all can be done */
    var allok = true;
    for(i in edit_boxes) {
	if(edit_boxes[i].set == false) {
	    switch(edit_boxes[i].mode) {
	    case 'simple':
		edit_boxes[i].set = Setup_Simple(edit_boxes[i].field);
		break;
	    case 'dropdown':
		edit_boxes[i].set = true;
		break;
	    case 'photo':
		edit_boxes[i].set = Setup_Photo(edit_boxes[i].field);
		break;
	    case 'sphoto':
		edit_boxes[i].set = Setup_Sphoto(edit_boxes[i].field);
		break;
	    case '':
		edit_boxes[i].set = Setup_Creole(edit_boxes[i].field);
		break;
	    }
	    if(!edit_boxes[i].set)
		allok = false;
	}
    }
    return allok;
}

// called to turn editing on and off
function Setup_Editables(loggedon) {
    if(loggedon) {
	for(i in edit_boxes) {
	    Make_Editable(i);
	}
    } else {
	for(i in edit_boxes) {
	    Make_UnEditable(i);
	}
    }
    loggedon_cache = loggedon;
}

// called when a new item is added to the DOM after page load
function Perhaps_Make_Editable(idx) {
    if(loggedon_cache)
	Make_Editable(idx);
    else {
	Make_UnEditable(idx);
    }
}

function do_nothing() {
}

function Make_XMLHttp() {
    var xmlhttp=null
	// first for all but IE<7, else for IE
	if (window.XMLHttpRequest) {
	    xmlhttp=new XMLHttpRequest()
	} else if (window.ActiveXObject) {
	    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
		}
    if (xmlhttp==null)
	alert("Sorry, your browser can't do this");
    return xmlhttp;
}

function Make_Editable(index) {
    var base = edit_boxes[index].field
	var item = $(base+'_show');
    if(item == null) {
	alert("Error: '"+base+"_show' can't be found");
	return;
    }
    var background = item.style.backgroundColor;
    var border = item.style.border;
    item.title = 'Click to edit';
    // creating closures like this preserves the values
    item.onmouseover = function() {
	item.style.backgroundColor = '#ffffcc';
	item.style.border = "dashed black 1px";
    };
    item.onmouseout = function() {
	item.style.backgroundColor = background;
	item.style.border = border;
    }
    item.onclick = function(event) {
	Do_Edit(index,event);
    }
}

function Make_UnEditable(index) {
    var base = edit_boxes[index].field;
    var item = $(base+'_show');
    item.onmouseover = do_nothing;
    item.onmouseout = do_nothing;
    item.ondblclick = do_nothing;
    item.onclick = function(event) {
	Do_Default(index,event);
    }
}

function Do_Edit(index,event) {
    var base = edit_boxes[index].field
	if(edit_boxes[index].mode == 'dropdown') {
	    var dbox = $(base+'_selectorbox');
	    dbox.style.display = 'inline';
	    var txt = $(base+'_show');
	    txt.style.display = 'none';
	    // FIXME - autoexpansion on click sticks up, not down
	    //      var sel = $(base+'_selector');
	    //      sel.size = sel.length;
	    return
	}
    if(edit_boxes[index].mode == 'photo' || edit_boxes[index].mode == 'sphoto') {
	Setup_Photo();   // harmless if already done
	active_menu = index;
	oCustomContextMenu.Display(event);
	return;
    }
    // simple and wiki mode
    var eb = $(base+'_edittab');
    eb.style.display = 'block';
    var ib = $(base+'_edtext');
    ib.focus();
    var tb = $(base+'_show');
    tb.style.border = "dashed black 1px";
    tb.onmouseover = do_nothing();
}

function Do_Default(index,event) {
    var base = edit_boxes[index].field
	if(edit_boxes[index].mode == 'photo' || edit_boxes[index].mode == 'sphoto') {
	    var item = $(edit_boxes[index].field+'_show');
	    var num = edit_boxes[index].field.substring(7);
	    item.onclick = function() {Action_Photo_Menu(num,{CommandName:'photo_view'});};
	}
}

function Edit_Restore(base) {
   var eb = $(base+'_edittab');
   eb.style.display = 'none';
    var tb = $(base+'_show');
    tb.onmouseover = function() {
	tb.style.backgroundColor = '#ffffcc';
	tb.style.border = "dashed black 1px";
    };
}

function Edit_Save(base,mode) {
    Edit_Restore(base);
    // saving makes original into this version
    var or = $(base+'_original');
    var orig = or.value;
    var ib = $(base+'_edtext');
    var why = $(base+'_comment');
    or.value = ib.value;
    Send_Update(base,ib.value,why.value,orig,mode);
}

function Revert_Edit(base,value,mode) {
    // put it back - edit failed (calledback from database update)
    var or = $(base+'_original');
    or.value = value;
    Edit_Cancel(base,mode);
}

function Selector_Changed(base) {
   var sb = $(base+'_selector');
   var dbox = $(base+'_selectorbox');
   var txt = $(base+'_show');
   txt.innerHTML = sb.options[sb.selectedIndex].text;
   dbox.style.display = 'none';
   txt.style.display = 'inline';  
   Send_Update(base,sb.options[sb.selectedIndex].value,'','','');
}

function Selector_Clear(base) {
   var sb = $(base+'_selector');
   var dbox = $(base+'_selectorbox');
   var txt = $(base+'_show');
   dbox.style.display = 'none';
   txt.style.display = 'inline';  
}

function Edit_Cancel(base, mode) {
    Edit_Restore(base);
    var or = $(base+'_original');
    var ib = $(base+'_edtext');
    var tb = $(base+'_show');
    // restore the original
    if(mode == 'creole') {
	tb.innerHTML = '';
	creole.parse(tb,or.value);
    }
    if(mode == 'simple') {
	tb.innerHTML = or.value;
    }
    ib.value = or.value;
}

function Action_Photo_Menu(photoinf, EventArgs) {
    var cmd = EventArgs.CommandName.slice(EventArgs.CommandName.indexOf('photo_')+6);
    var ses = '';
    if(cp_info && cp_info.session)
	ses = '&session='+cp_info.session;
    var dl = document.location.toString();  // coerce to string
    if(dl.indexOf("localhost") == -1)  // real version
	document.location = '/cgi-bin/action_photo.cgi?act='+cmd+ses+'&phid='+photoinf;
    else  // live version doesn't have root in the right place
	document.location = 'action_photo.cgi?act='+cmd+ses+'&phid='+photoinf;
    return false;
}

function Show_History(field,element) {
    var xmlhttp=Make_XMLHttp();
    var t = 'mode=history&field='+field+'&id='+cp_info.id;
    xmlhttp.onreadystatechange=function() {
	if (xmlhttp.readyState==4 && xmlhttp.status==200) {
	    var x = xmlhttp.responseText.slice(xmlhttp.responseText.indexOf('text/html')+11);
	    element.innerHTML = x;
	    return;
	} 
    };
    xmlhttp.open("GET","../cgi-bin/edit_item.cgi?"+t,true);
    xmlhttp.send(null);
}

/* Gets a specific version and shows i */
function Show_Edit(page,field,revision) {
    var xmlhttp = Make_XMLHttp();
    var t = 'mode=revision&field='+field+'&id='+revision;
    xmlhttp.onreadystatechange=function() {
	if (xmlhttp.readyState==4 && xmlhttp.status==200) {
	    Create_Popup(xmlhttp.responseText);
	    return;
	} 
    };
    xmlhttp.open("GET","../cgi-bin/edit_item.cgi?"+t,true);
    xmlhttp.send(null);
}

function Create_Popup(contents) {
    alert(contents);
}

function Send_Update(called,value,reason,orig,mode) {
    var ts = 'field='+called;
    if(called.indexOf('photo_caption__') == 0) {
	var idx = called.slice(15);
	ts += '&id=' + idx;
    } else
	ts += '&id=' + cp_info.id;
    ts += '&reason=' + encodeURIComponent(reason);
    ts += '&new=' + encodeURIComponent(value);
    ts += '&session='+cp_info.session;
    Actually_Send_It(ts,called,orig,mode);
}

function Actually_Send_It(params,field,orig,mode) {
    var xmlhttp=Make_XMLHttp();
    xmlhttp.onreadystatechange=function() {
	if (xmlhttp.readyState==4 && xmlhttp.status==200) {
	    if(xmlhttp.responseText.charAt(0) == '!') {
		alert(xmlhttp.responseText.slice(1));
		Revert_Edit(field,orig,mode);
	    } else {
		alert(xmlhttp.responseText);
	    }
	    return;
	} 
    };
    xmlhttp.open("POST","../cgi-bin/edit_item.cgi",true);
    //Send the proper header information along with the request
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.setRequestHeader('User-Agent','XMLHTTP/1.0');
    xmlhttp.setRequestHeader("Content-length", params.length);
    xmlhttp.setRequestHeader("Connection", "close");
    xmlhttp.send(params);
}

function Edit_Buttons(name, calledfrom) {
    var b = 'Reason for edit: <input type="text" size="90" id="'+name+'_comment">'
    b += '<b class="rtop"><b class="r9"></b><b class="r6"></b><b class="r4"></b><b class="r3"></b><b class="r2-2"></b><b class="r1-3"></b></b>';
    b+= '<div class="panel">';
    b+='<div class="gobutton"><button type="button" onclick="Edit_Save(\''+name+'\',\''+calledfrom+'\')">Save</button></div>';
    b+='<div class="gobutton"><button type="button" onclick="Edit_Cancel(\''+name+'\',\''+calledfrom+'\')">Cancel</button></div>';
     b+='<br></div>';
    b+='<b class="rtop"><b class="r1-3"></b><b class="r2-2"></b><b class="r3"></b><b class="r4"></b><b class="r6"></b><b class="r9"></b></b>';
    return b;
}

function HelpText() {
    var b = 'Special wiki and wiki-like links are available as follows:<ul>';
    b+='<li>[[place or waterway]] - a link to the gazetteer</li>';
    b+='<li>[Wikipedia:page]] - a link to that page in Wikipedia</li>';

    b+='</ul>';
    return b;
}

function Show_Version(name) {
    // find tab
    var tb;
    for(i in edit_boxes)
	if(edit_boxes[i].field == name)
	    tb = edit_state[i];
    if(tb.vtab == null)
	tb.tabptr.Add('Previous',function(el) {
		el.innerHTML = 'YO!';
	    });
}


// produce a pop-up menu of editable sections
var popupedit;
function Edit_Section_Menu(event) {
    var x = event.screenX;
    var y = event.screenY;
    //    alert(x+' '+y);
    if(typeof(popupedit) == 'undefined') {
	popupedit = document.createElement('div');
	document.body.appendChild(popupedit);
    }
    popupedit.innerHTML = '';
    for(i in edit_boxes) {
	popupedit.innerHTML += edit_boxes[i].field;
    }
}