
//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/string/wordwrap [v1.0]
String.prototype.wordWrap = function(m, b, c){
	var i, j, l, s, r;
	if(m < 1)
		return this;
		for(i = -1, l = (r = this.split("\n")).length; ++i < l; r[i] += s)
			for(s = r[i], r[i] = ""; s.length > m; r[i] += s.slice(0, j) + ((s = s.slice(j)).length ? b : ""))
				j = c == 2 || (j = s.slice(0, m + 1).match(/\S*(\s)?$/))[1] ? m : j.input.length - j[0].length
				|| c == 1 && m || j.input.length + (j = s.slice(m).match(/^\S*/)).input.length;
	return r.join("\n");
}

String.prototype.normalizeSpace = function(){
	var l = this.split("\n");
	for(i=0;i<l.length;i++){
		l[i] = l[i].replace(/\ +/g," ").replace(/^\ +/g,"").replace(/\ +$/g,"");
	}
	return l.join("\n");
} 
 

var TextAreaId = "text";

function IsSave(evt){
	if(!evt){ evt = event; }
	if(!evt.which){ evt.which = evt.keyCode; }
	if(evt.keyCode == '27'){ Salva(); }
	return false;
}

function Unsaved(){
	if(el('text').value != el('text-copy').value){
		el('save-status').value = 1;
    	el('save-the-text').disabled = false;
    	el('save-the-text').value = "SaveNow";
    	el('save-the-text').setAttribute('class','tosave');
    	Notify('saved',"Press 'ESC' or 'SaveNow' for save the this content",'yellow',0);
    }
}

function Notify(ID,msg,color,time){
	el(ID).innerHTML = "<span class=\""+color+"\">"+msg+"</span>";
	if(el(ID).style.display == "none"){
		el(ID).style.display = "block";
	}
	if(time > 0){
		setTimeout(
			function(){
				el(ID).innerHTML = "";
				el(ID).style.display = "none";	
				}, time
			);
	}
}

function Salva() {

	if(el('save-status').value == 0){
		return false;
	}

	el('save-the-text').disabled = true;
	el('save-the-text').setAttribute('class','saved');
	el('save-the-text').value = "Wait...";
	
	// Raccolgo i valori
	var text = 	el('text').value;
	var text = 	text.replace(/\+/g,'ISPLUSCHARS'); // escape char "+"
	var text =  text.replace(/\\/g,'ISBACKSLASH'); // escape char "\"
	var filename = 	el('filename').value;
	
	if(el('version').checked){
		var version = "yes";
	}else{
		var version = "no";
	}		
	
	// Costrutisco la url
	var content = "&filename="+escape(filename);
	var content = content+"&version="+escape(version);
	var content = content+"&text="+escape(text);
	
	// Invio i dati
	var save = httpSave('./?page=save', content);

	// Ottengo una risposta
	if ((typeof save == "boolean" && !save) || typeof save == "string") {
        	Notify('logs',"<b>Errore durante il salvataggio!</b>","red",10000);
        	Unsaved();
	}else{
		Notify('saved',"<b>Saved at "+new Date()+"</b>","green",0);
		el('save-the-text').value = "Saved!";
		el('save-status').value = 0;
		el('text-copy').value = el('text').value;
		//el('text').style.borderTop = "solid 1px green";
	}
	el('text').focus();
}


function addText(insert){
    //Get the textarea
    var area = el(TextAreaId);
 
    //Get the selection bounds
    var start = area.selectionStart;
    var end = area.selectionEnd;
 
    //Break up the text by selection
    var text = area.value;
    var pre = String.substring(text,0, start);
    var sel = String.substring(text, start, end);
    var post = String.substring(text,end);
 
    //Insert the text at the beginning of the selection
    text = pre + insert + sel + post;
    //text = pre + insert + post;
 
    //Put the text in the textarea
    area.value = text;
    
    //Re-establish the selection, adjusted for the added characters.
    area.selectionStart = start+insert.length;
    area.selectionEnd = end+insert.length;
    area.focus();
}

//Thanks to MediaWiki www.mediawiki.org
//Copyright unsolved. Please, contact us!
//From: http://it.wikipedia.org/skins-1.5/common/edit.js
function insertTags(tagOpen, tagClose, sampleText) {
	var txtarea = el(TextAreaId);
	var selText, isSample = false;
	if (document.selection  && document.selection.createRange) { // IE/Opera
		//save window scroll position
		if (document.documentElement && document.documentElement.scrollTop)
			var winScroll = document.documentElement.scrollTop
		else if (document.body)
			var winScroll = document.body.scrollTop;
		//get current selection  
		txtarea.focus();
		var range = document.selection.createRange();
		selText = range.text;
		//insert tags
		checkSelectedText();
		range.text = tagOpen + selText + tagClose;
		//mark sample text as selected
		if (isSample && range.moveStart) {
			if (window.opera)
				tagClose = tagClose.replace(/\n/g,'');
			range.moveStart('character', - tagClose.length - selText.length); 
			range.moveEnd('character', - tagClose.length); 
		}
		range.select();   
		//restore window scroll position
		if (document.documentElement && document.documentElement.scrollTop)
			document.documentElement.scrollTop = winScroll
		else if (document.body)
			document.body.scrollTop = winScroll;
	} else if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Mozilla
		//save textarea scroll position
		var textScroll = txtarea.scrollTop;
		//get current selection
		txtarea.focus();
		var startPos = txtarea.selectionStart;
		var endPos = txtarea.selectionEnd;
		selText = txtarea.value.substring(startPos, endPos);
		//insert tags
		checkSelectedText();
		txtarea.value = txtarea.value.substring(0, startPos)
			+ tagOpen + selText + tagClose
			+ txtarea.value.substring(endPos, txtarea.value.length);
		//set new selection
		if (isSample) {
			txtarea.selectionStart = startPos + tagOpen.length;
			txtarea.selectionEnd = startPos + tagOpen.length + selText.length;
		} else {
			txtarea.selectionStart = startPos + tagOpen.length + selText.length + tagClose.length;
			txtarea.selectionEnd = txtarea.selectionStart;
		}
		//restore textarea scroll position
		txtarea.scrollTop = textScroll;
	} 
	function checkSelectedText(){
		if (!selText) {
			selText = sampleText;
			isSample = true;
		} else if (selText.charAt(selText.length - 1) == ' ') { //exclude ending space char
			selText = selText.substring(0, selText.length - 1);
			tagClose += ' '
		} 
	}
	Unsaved();
}

function ReplaceStart(){
    ShowHide('findreplace','block');
    ResizeTextArea();
	el("find").value = ""; el("replace").value = "";
    var area = el(TextAreaId);
    var start = area.selectionStart;
    var end = area.selectionEnd;
    var text = area.value;
    var sel = String.substring(text, start, end);
    if(sel){ 
    	el("find").value = sel; 
    	el("replace").focus();
    }else{
    	el("find").focus();
    }
}

//TODO: maiuscole, regex
function Replace(){

	// Getting values
	var to_find = el("find").value;
	var to_replace = el("replace").value;
	
	// Set area and selection
	var area = el(TextAreaId);
    var start = area.selectionStart;
    var end = area.selectionEnd;
	
	if(to_find){
		
		// Set parameters
		if(el("case").checked == true){
			var casekey = "g";
		}else{
			var casekey = "gi";
		}
		
		if(el("regex").checked == true){
			var to_find_path = new RegExp(to_find,casekey);
		}else{
			var to_find_path = new RegExp(EscapeRegex(to_find),casekey);
		}
	
		// Replacing
		var text = area.value;
		area.value = text.replace(to_find_path,to_replace);
		
		// Restore selection (TODO)
		area.selectionStart = start; //text.lastIndexOf(to_replace); //start;
		area.selectionEnd = end; //text.lastIndexOf(to_replace); //end;
		area.focus();
		
		Unsaved();
		
		// User notifications
		ShowHide('findreplace'); 
		ResizeTextArea();
		Notify('logs',"Ho cercato <b>\""+to_find+"\"</b> e l'ho sostituito con <b>\""+to_replace+"\"</b>","green",3000);
	}
}

function ChangeCase(tocase){
    var area = el(TextAreaId);
    var start = area.selectionStart;
    var end = area.selectionEnd;
    var text = area.value;
    var pre = String.substring(text,0, start);
    var sel = String.substring(text, start, end);
    if(tocase == "upper"){ var sel = sel.toUpperCase(); }
    if(tocase == "lower"){ var sel = sel.toLowerCase(); }
    var post = String.substring(text,end);
    text = pre + sel + post;
 	if(sel){
		area.value = text;
		area.selectionStart = start;
		area.selectionEnd = end;
		area.focus();
		Unsaved();
 	}
}

function ResizeTextArea(){
	var nodes = document.body.childNodes;
	var WH = 0;
	for(i=0;i<nodes.length;i++){
		if(nodes[i].tagName){
			if(nodes[i].getAttribute('id')){
				var ID = nodes[i].getAttribute('id');
			}else{
				var ID = "continue";
			}
			if(ID != "theform" && ID != "rmenu"){
				//if(nodes[i].style.display != "none"){}
				var H = nodes[i].offsetHeight;
				WH = WH + H;
			}
		}
	}
	var txt = window.innerHeight-WH-50;
	if(txt > 0){
		var h = txt;
	}else{
		var h = 600;
		// I'm looking for IE6 compatible solution!
		// 		var txt = screen.availHeight-WH-50;
		// 		if(txt > 0){
		// 			var h = txt;
		// 		}else{
		// 			var h = 400;
		// 		}
	}	
	el('text').style.height = h+"px";
}

function FontTextArea(dir){
	var s = el('text').style.fontSize;
	if(!s){ 
		s = 95;
	}else{
		s = s.replace("%","");
	}
	if(dir == "up"){ s = parseInt(s)+5; }
	if(dir == "down"){ s = parseInt(s)-5; }
	if(s < 70){ s = 70; }
	el('text').style.fontSize = s+"%";
}

function ZoomSimbols(act,sign){
	if(act == "in"){
		el("zoom").style.display = "block";
		el("zoom").innerHTML = sign;
	}
	if(act == "out"){
		el("zoom").innerHTML = "";
		el("zoom").style.display = "none";
	}
}

function TextAreaPlainView(){
	el('CurrentStyle').value = "PlainView";
	el('theform').style.padding = '0';
	var t = el('text');
	t.style.border = 'none';
	t.style.margin = '0';
	t.style.maxWidth = '100%';
	t.style.width = '100%';
	t.style.borderTop = 'solid 1px #ccc';
	t.style.borderBottom = 'solid 1px #ccc';
	ResizeTextArea();
	t.focus();
}

function TextAreaFixView(){
	el('CurrentStyle').value = "FixView";
	el('theform').style.paddingTop = '15px';
	var t = el('text');
	t.style.border = 'none';
	t.style.margin = '0';
	t.style.maxWidth = '1200px';
	t.style.width = '800px';
	t.style.border = 'solid 1px #aaa';
	t.style.borderRight = 'solid 2px #333';
	t.style.borderBottom = 'solid 2px #333';
	ResizeTextArea();
	t.focus();
}

function TextAreaWidth(w){
	if(el('CurrentStyle').value != "FixView"){
		TextAreaFixView();
	}
	w = w.replace("px","");
	el('text').style.maxWidth = w+"px";
	el('text').style.width = w+"px";
	el('text').focus();
}

function TextAreaFont(font){
	el('text').style.fontFamily = font;
	el('text').focus();
}

function TextAreaFontSize(size){
	if(size != "up" && size != "down"){
		el('text').style.fontSize = size.replace("px","")+"px";
	}else{
		var s = el('text').style.fontSize;
		if(!s){ var s = "105%"; }
		
		var px = s.search(/px/); //Font in px
		if(px > -1){ var t = "px"; } 
		
		var pr = s.search(/%/); //Font in pr
		if(pr > -1){ var t = "pr"; }
		
		if(t != "pr" && t != "px"){
			s = 105; t = "pr";
		}
		
		if(t == "pr"){ var i = 5; var sign = "%"; var min = 70; }
		if(t == "px"){ var i = 1; var sign = "px"; var min = 5; }
		
		var s = s.replace(sign,"");
		
		if(size == "up"){ s = parseInt(s)+i; }
		if(size == "down"){ s = parseInt(s)-i; }
		
		if(s < min){ s = min; }
		
		el('text').style.fontSize = s+sign;
	}
	el('text').focus();
}


function TextAreaSetStyle(cook){
	var view = el('CurrentStyle').value;
	var font = el('text').style.fontFamily;
	var size = el('text').style.fontSize;
	var cols = el('text').style.width;
	var cook = view+"::"+font+"::"+size+"::"+cols;
	httpLoad("./?page=ajaxutils&act=TextAreaSetStyle&c="+cook);
	Notify('logs',"<b>Your style has been saved!</b>","blue",3000);
}

// TODO
// function TextAreaResetStyle(){
// 	var cook = "::::";
// 	httpLoad("./?page=setcookies&c="+cook);
// 	TextAreaGetStyle(cook);
// }

function TextAreaGetStyle(st){
	if(st){
		var s = new Array(3);
		s = st.split("::");
		if(s[0] == "FixView" || !s[0]){ TextAreaFixView(); }
		if(s[0] == "PlainView"){ TextAreaPlainView(); }
		if(s[1]){ TextAreaFont(s[1]); }
		if(s[2]){ TextAreaFontSize(s[2]); }
		if(s[3]){ TextAreaWidth(s[3]); }
	}
}


function Lines(act){
    var area = el('text');

    var start = area.selectionStart;
    var end = area.selectionEnd;

    var text = area.value;
    var pre = String.substring(text,0, start);
    var sel = String.substring(text, start, end);
    var sel_length = sel.length;
    var post = String.substring(text,end);
 
 	if(act == "join"){
    	sel = sel.replace(/\n/g," ").normalizeSpace();
    }
    
    if(act == "wrap"){
    	//sel = NormalizeSpace(WordWrap(sel,82,"\n",false));
    	sel = sel.wordWrap(82,"\n",false).normalizeSpace();
    }	
    
    if(act == "space"){
    	sel = sel.normalizeSpace();
    }
    
    var diff = sel.length-sel_length;
    text = pre + sel + post;
    area.value = text;
    area.selectionStart = start; //parseInt(end)+parseInt(diff);
    area.selectionEnd = parseInt(end)+parseInt(diff);
    area.focus();
    Unsaved();
}

function ChooseLink(){
	var mediatype = el("mediatype").value;
	var mediafile = el("mediafile").value;
	var result = httpLoad("./?page=ajaxutils&act=ChooseLink&mediatype="+mediatype+"&mediafile="+mediafile);
	if(result){
		el("medialist").innerHTML = result;
		el("medialist").style.display = "block";
		ResizeTextArea();
	}
}

function ChooseLinkClose(){
	el("medialist").innerHTML = "";
	el("medialist").style.display = "none";
	el("mediatype").value = "ALL";
	el("mediafile").value = "";
	el("chooselink").style.display = "none";
	ResizeTextArea();
}

function ChooseLinkOpen(){
	el("chooselink").style.display = "block";
	ResizeTextArea();
}


// TextArea contextual menu (onrightclick);
// oncontextmenu="RMenu(event);"
// function RMenu(e){
// 
// 	e.stopPropagation(); // No other actions!
// 	
// 	var rmenu = el('rmenu');
// 	
// 	var PointX = e.pageX;
// 	var PointY = e.pageY;
// 	var offSet = 10;
// 
// 	rmenu.style.display 	= "block";
// 	rmenu.style.position 	= "absolute";
// 	rmenu.style.top 		= parseInt(PointY)+parseInt(offSet) + "px";
// 	rmenu.style.left 		= parseInt(PointX)+parseInt(offSet) + "px";
// 	
// 	document.oncontextmenu = function(){ return true; }
// 	rmenu.oncontextmenu = function(){ return false; }
// 	
// 	var c = document.body.childNodes;
// 	for(i=0;i<c.length;i++){
// 		if(c[i].tagName){
// 			if(c[i].getAttribute('id') != "rmenu"){
// 				c[i].onmousedown = function(){
// 					el('rmenu').style.display = "none";
// 					el('text').focus();
// 				}
// 			}
// 		}
// 	}
// 	
// 	ResizeTextArea();
// 	return false;
// }
// 
// function RMenu_Hide(){
// 	el('rmenu').style.display = "none";
// 	el('text').focus();
// }
// 
// function R_copy(){
// 	RMenu_Hide();
//     alert("Hello");
// }






