/*
This code and all content on easyprompter.com is Copyrighted (c) 2009 by Michael Drob

If you're looking through this to learn some JavaScript, good for you, I hope you can understand my
poorly commented code.  If you're looking to blatantly steal ideas, or just use this code verbatim for your own purposes, please understand that I put many many hours into this and am not making any money on this at all, so as Patrice O'Neal put it, you're raping my time.  

The service that this code provides is absolutely free.  But it is NOT open source.

For those interested in licensing this code, please contact me at info@easyprompter.com

Thanks for all your interest.  Email me with any comments/sugestions you may have.  Happy coding!

-Michael Drob
*/
function escapeHTML(s) {
	//&#38 is equivalent of amp; but is used on iphone and not on desktop
	var r = s.replace(/&#38;/g,"&amp;");
	//replace all & with &amp; except in special cases - this prevents the issues of seeing something like &amp;amp;amp;
	r = r.replace(/&(?!amp;|apos;|quot;|gt;|lt;|#\d+;)/gi, "&amp;");
	//replace special chars
	r = r.replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;");

	return r;
}


String.prototype.reverse = function () {
	return this.split("").reverse().join("");
}
	
function formatit() {

	$('textentry').style.display="none";
	
	var str=escapeHTML($('pInputBR').value);
	var initspeed=parseInt($('initialspeed').value);
	var initfont = parseInt($('initialfont').value);
	
	Controller.setSpeed(initspeed);
	Controller.setFontSize(initfont);
	Controller.reset();
	var replaceWith="<span class='pause' id='pause'>[pause]</span>";
	
	str = str.replace(/&lt;br \/&gt;/g,'<br/>');
	if (isFlip) {
		newstr=str;
	} else {
		var newstr = str.replace(/\[pause\]/g,replaceWith);
		var newstr = newstr.replace(/\[hl\]/g,"<span class='hl'>");
		var newstr = newstr.replace(/\[\/hl\]/g,"</span>");
	}

	$('prompter').innerHTML=newstr;
	
	if (!isFlip) {
		var pauses = getElementsByClassName("pause");
	
		for (i in pauses) {
			pauses[i].id = "pause" + i;
		}
	}

	$('controller').style.display="block";

	var pr = $('prompter');
	pr.style.display='none';
	pr.style.textTransform= isCaps ? "uppercase" : "none";

	if (isFlip) {
		var ref = $('reference');
		var timeref = $('timecodeFlip');

		pr.style.fontFamily= "'dv easyprompter sans'";
		pr.style.textAlign="right";
		ref.style.fontFamily= "'dv easyprompter sans'";
		ref.style.textAlign="right";
	} else {
			var timeref = $('timecode');
	}
	pr.style.display='block';

	if (isFlip) {
		explicitWrap(pr,ref,true);

		str=pr.innerHTML;

		var replaceWith="<span class='pause' id='pause'>]esuap[</span>";
		var newstr = str.replace(/\]esuap\[/g,replaceWith);
		var newstr = newstr.replace(/\]lh\/\[/g,"<span class='hl'>");
		var newstr = newstr.replace(/\]lh\[/g,"</span>");
		pr.innerHTML=newstr;

		var pauses = getElementsByClassName("pause");
	
		for (i in pauses) {
			pauses[i].id = "pause" + i;
		}

		ref.style.display='none';
	}
	
	startmsg = "[Hit Play to start]";
	endmsg="[END]";
	if (isFlip) { 
		startmsg = startmsg.reverse();
		endmsg=endmsg.reverse();
	}
	
	pr.innerHTML = "<br/><br/>" + startmsg + "<br/><br/>" + pr.innerHTML + "<span id='endmarker'><br/><br/>" + endmsg + "<br/><br/><br/></span>";
	$('container').style.overflow = 'hidden';
	document.body.style.padding="2px 2px 78px 2px";
	$('topper').style.display='none';
	//var displayTime = true;
	
	if (displayTime) {
		if (isFlip) 
			$('timecodeFlip').style.visibility='visible';
		else
			$('timecode').style.visibility='visible';
	}
}
function windowWidth() {
  var myWidth = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
  }
  return myWidth;
}
		
function explicitWrap(element, reference, doReverse) {
//alert(windowWidth());
	//element.style.width = (windowWidth() - 51) + "px";
	var refHeight=reference.clientHeight;
	//alert(concatObject(reference));
	//alert(element.clientHeight + ":" + refHeight);
	if (element.clientHeight >= refHeight) { //check if it's actually more than 1 line
	//element.style.visibility='hidden';
		var elementTextArray = [];
		var inhtml = element.innerHTML.toString();
		var r = new RegExp("\\s+","gi");

		var res = inhtml.replace(/(\S)<br>/ig, "$1 <br>");
		var res = res.replace(/(\S)<br\/>/ig, "$1 <br>");
		var res = res.replace(/(\S)<br \/>/ig, "$1 <br>");

		elementTextArray = res.split(r); //split words

		var b = [];
		var output="";
		for (var i=0; i<elementTextArray.length; i++) {
			b.push(elementTextArray[i].trim()); //add 1 more word
			
			if (isWrapped(b)) {
				output += b.toString() + "\n";
				elementTextArray[i-1]+="<br>";
				
				b=[];
				b.push(elementTextArray[i]);
			}
			
		}

		var wrappedStr=elementTextArray.join(" ");

		if (doReverse) {

			var br = /<br>|<br\/>|<br \/>/ig;
			var strArray = wrappedStr.split(br);

			for (i in strArray) {
					strArray[i]=strArray[i].reverse();	
			}
			wrappedStr = strArray.join("<br>");
		}
		
		element.innerHTML=wrappedStr;
	}
	element.style.visibility='visible';
	
	function isWrapped(lineArray) {
			var str = lineArray.join(" ");

			var br = /<br>|<br\/>|<br \/>/ig;
			
			var a = str.split(br);
			
			if (a.length >1 ) //br actually exists
				str=a.pop();

			element.innerHTML = str;
			
			return (element.clientHeight > refHeight); 

	}
}
function getPromptHeight(p) {
  var myWidth = 0, myHeight = 0;

  if( typeof( p.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = p.innerWidth;
    myHeight = p.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = p.clientWidth;
    myHeight = p.clientHeight;
  }
  
  return myHeight;
}

function printConsole(text) {
	$('console').innerHTML = text;
}

function interpretKey(e,from) {
	var event=e || window.event;

	//alert(concatObject(event));
	if (event.type == 'keydown') {	
		switch(event.keyCode)
		{
			case 37: //left
				Controller.speedDown();
				break;
			case 39: //right
				Controller.speedUp();
				break;
			case 38: //up
				Controller.rollBack(true);
				break;    
			case 40: //down
				Controller.rollFwd(true);
				break;
			case 32: //space
				Controller.toggle();
				break;
			case 27: //escape
				Controller.reset();
				break;
				
		}
	} else {
		switch(event.keyCode)
		{
			case 38: //left
				Controller.rollBack(false);
				break;
			case 40: //right
				Controller.rollFwd(false);
				break;
		}
	}

}


function handle(delta) {
        if (delta < 0)
			Controller.speedDown();
        else
			Controller.speedUp();
}

function wheel(event){
		if (isEditing) return false;
        var delta = 0;
        if (!event) /* For IE. */
                event = window.event;
        if (event.wheelDelta) { /* IE/Opera. */
                delta = event.wheelDelta/120;
        } else if (event.detail) { /** Mozilla case. */
                delta = -event.detail/3;
        }
        if (delta)
                handle(delta);
        if (event.preventDefault)
                event.preventDefault();
	event.returnValue = false;
}

if (!isEditing) {
	if (window.addEventListener) window.addEventListener('DOMMouseScroll', wheel, false);
	window.onmousewheel = document.onmousewheel = wheel;
}


function checkOpenWindow (openWin)
{
    var exists = false;
    if (openWin && !openWin.closed)
    {
        exists = true;
        try {
            openWin.focus();
        }
        catch (e) {
            exists = false;
        }
    }
	
	return(exists);
}
var winInterval=null;

function intervalCheck() {
	if (externControllerWindow == null || !checkOpenWindow(externControllerWindow))
		restoreController();
	else
		winInterval = setTimeout(function () {intervalCheck()},1000);
		
}

function restoreController() {
	clearInterval(winInterval);
	externControllerWindow.close();
	externControllerWindow = null;
	document.body.style.padding="2px 2px 78px 2px";
	$('controller').style.display='block';

}

function openController() {
	document.body.style.padding="2px";
	$('controller').style.display='none';
	externControllerWindow = window.open('controller.php','_new','scrollbars=no,menubar=no,height=250,width=600,resizable=no,toolbar=no,location=no,status=no');

	winInterval = setTimeout(function () {intervalCheck()},1000);
}