/***********  OnAvailable function **********/


/**
 * Script to overcome difficulties with window.onload function.
 * This functionality is replicated in YAHOO events but they are only run with xforms.
 **/
var stack = [],
interval,
loaded = false; // has window.onload fired?

function doPoll() {

  var notFound = [];
  for (var i=0; i < stack.length; i++) {
    if (stack[i].fun()) {
      stack[i].callback();
    } else {
      notFound.push(stack[i]);
    }
  }
  stack = notFound;
  if (notFound.length < 1 || loaded) {
    stopPolling();
  }
}

function startPolling() {
  if (interval) {return;}
  interval = setInterval(doPoll, 10);
}

function stopPolling() {
  if (!interval) {return;}
  clearInterval(interval);
  interval = null;
}

function onAvailable(fun, callback) {
  stack.push({fun:fun, callback:callback});
  startPolling();
}

window.onload = function() {
  loaded = true;
  doPoll();
};



/***********  Helper & prototype functions **********/


/**
 * Function returns an array of elements with specific class name
 * If node is provided, search just within sub-elements of that node
 *
 * See: http://www.dustindiaz.com/getelementsbyclass
 * E.g. getElementsByClass('canvasChanged',document,"span");
 **/
function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

function findElementByClassDown(searchClass,node,tag) {
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	if ( node == null ) node = document;
	if ( tag == null ) tag = '*';

	if ( pattern.test(node.className) ) return node;

	var children = node.childNodes;
	var childrenLen = children.length;
	for (var i = 0; i < childrenLen; i++)
	{
		var subnode = findElementByClassDown(searchClass,children[i],tag);
		if (subnode != "") return subnode;
	}
	return "";
}

function findElementByClassUp(searchClass,node,tag) {
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	if ( node == null || node == document) return "";
	if ( tag == null ) tag = '*';

	if ( pattern.test(node.className) ) return node;

	var children = node.childNodes;
	var childrenLen = children.length;
	for (var i = 0; i < childrenLen; i++)
	{
		if ( pattern.test(children[i].className) ) return children[i];
	}
	// else go up a branch
	return findElementByClassUp(searchClass,node.parentNode,tag);
}


/**
 * Function to add a startsWith property to Strings
 * See: http://surguy.net/rediscovering-javascript.html
 **/
if( !String.prototype.startsWith )
	String.prototype.startsWith = function(s) { return this.indexOf(s)==0; }


/**
 * Early version of Safari does not have hasOwnProperty so we add it here if needed
 */
if( !Object.prototype.hasOwnProperty )
{
	Object.prototype.hasOwnProperty = function( property )
	{
		try
		{
			var prototype = this.constructor.prototype;
			while( prototype )
			{
				if( prototype[ property ] == this[ property ] )
				{
					return false;
				}
				prototype = prototype.prototype;
			}
		} catch( e ) {}
			return true;
		}
}
canvasArray = new Array();

function fullyLoaded()
{
	return window.loaded;
}

function initCanvas()
{
	// get all canvases
	canvases = getElementsByClass('canvasTable',document,'table');

	for (var d = 0; d < canvases.length; d++)
	{
		if (!canvases[d].loaded || canvases[d].loaded == false)
		{
			var n = canvases[d];
			var c = findElementByClassDown('cer_canvas', n, 'canvas');
			var ci = findElementByClassDown('cer_canvasInterface', n, 'canvas');
			if (ci == "") continue;
			var sc = findElementByClassDown('cer_saveChanges', n, 'div');
			var data = findElementByClassDown('canvas_data', n, 'div');

			var canvasPainter = new CanvasPainter(c, ci, {x: 0, y: 0}, ((data.innerHTML && data.className.indexOf('editable') < 0) ? true : false), sc);
			canvasPainter.setLineWidth(20);
			canvasPainter.setDrawAction(1);

			var lc = findElementByClassDown('cer_lineWidthChooser', n, 'div');
			if (lc != "")
			{
				var lineWidthWidget = new LineWidthWidget(lc, 20, {x: 0, y: 0});
				canvasPainter.setLineWidth(20);
				lineWidthWidget.addWidgetListener(function() {
					canvasPainter.setLineWidth(lineWidthWidget.lineWidth);
				});
			}
			
			var cc = findElementByClassDown('cer_colorChooser', n, 'canvas');
			if (cc != "")
			{
				var colorWidget = new ColorWidget(cc, {x: 500, y: 10});
				colorWidget.setCanvas(canvasPainter);
				colorWidget.addWidgetListener(function() {
					canvasPainter.setColor(colorWidget.colorString);
				});
			}

			var sd = new CPDrawing(canvasPainter); //init save objects
			if (data.innerHTML && data.innerHTML != "")
			{
				sd.loadDrawing(data.innerHTML.replace(/\\"/g, '"'));
				data.innerHTML = "";
			}
			
			thisCanvas = new Array(); // stores all objects for this canvas
			thisCanvas[0] = canvasPainter;
			thisCanvas[1] = sd;
			thisCanvas[2] = c;
			thisCanvas[3] = ci;
			thisCanvas[4] = sc;

			// add canvas to globalArray
			var arrayPos = canvasArray.length;
			canvasArray[arrayPos] = thisCanvas;

			canvases[d].loaded = true;
			// give all divs in this table a handle to the canvasPainter obj
			var refs = getElementsByClass('canref',n,"*");
			for (var i = 0; i < refs.length; i++)
			{
				refs[i].painter = arrayPos;
			}

			var action = parseInt('0'+getCookie('action'));
			setCPDrawAction(findElementByClassDown('btn_1', n, 'img'),1);
			setCPDrawAction(findElementByClassDown('btn_'+action.toString(), n, 'img'),action);
			ci.style.borderColor = "#aaaaaa";
			if (sc != "") sc.style.display = "none";
		}
	}
}

// attach to browser onload event
onAvailable(fullyLoaded,initCanvas);


// used by the control buttons
function setControlLook(btnid, node, color) {
	if (node.painter == null || canvasArray[node.painter] == null) return;
	var canvasPainter = canvasArray[node.painter][0]; // get handle to painter obj
	if (canvasPainter.selectedButton != node) node.style.background = color;
}

function setCPDrawAction(node, action) {
	setCookie( 'action', action);
	if (node.painter == null || canvasArray[node.painter] == null) return;
	var canvasPainter = canvasArray[node.painter][0]; // get handle to painter obj
	var ci = canvasArray[node.painter][3];
	var sc = canvasArray[node.painter][4];
	if (canvasPainter.curDrawAction)
	{
		el = findElementByClassDown('btn_'+canvasPainter.curDrawAction, canvasArray[node.painter][2].parentNode);
		if (el != "")
		{
			el.style.borderColor = "#cccccc";
			el.style.backgroundColor = "#ffffff";
		}
	}

	canvasPainter.setDrawAction(action);

	// record change
	if (action == 5) sc.getElementsByTagName('span')[0].innerHTML='cleared';
	else
	{
		// revert exsiting node
		if (canvasPainter.selectedButton != null)
		{
			canvasPainter.selectedButton.style.borderColor = "#cccccc";
			canvasPainter.selectedButton.style.backgroundColor = "#ffffff";
		}

		// set new node style
		node.style.borderColor = "#000000";
		node.style.backgroundColor = "#cccccc";
		canvasPainter.selectedButton = node;
	}
}

function setCPDrawColor(node,color) {
	if (node.painter == null || canvasArray[node.painter] == null) return;
	var canvasPainter = canvasArray[node.painter][0]; // get handle to painter obj

	// convert rgb to rgba

	// obtain existing alpha
	var currentColor = canvasPainter.drawColor;

	// convert rgb to rgba
	var color_alpha = 1;

	var m = /rgba\((.*),(.*),(.*),(.*)\)/.exec(currentColor);
	if (m != null) {
		color_alpha = m[4];
	}


	var m = /rgb\((.*),(.*?),(.*)\)/.exec(color);
	if (m != null) {
		color = "rgba("+m[1]+","+m[2]+","+m[3]+","+color_alpha+")";
	}	
	
	canvasPainter.setColor(color);
}

function setCPAlpha(node,alphaVal) {
	if (node.painter == null || canvasArray[node.painter] == null) return;
	var canvasPainter = canvasArray[node.painter][0]; // get handle to painter obj

	var color = canvasPainter.drawColor;

	// convert rgb to rgba
	var m = /rgba\((.*),(.*),(.*),(.*)\)/.exec(color);
	if (m != null)
	{
		color = "rgba("+m[1]+","+m[2]+","+m[3]+","+canvasPainter.color_alpha+")";
		alert("Color:"+color);
	}
	else
	{
		re = new RegExp("rgb\((.*),(.*),(.*)\)");
		if (color.match(re))
		{
			var m = re.exec(color);
			color = "rgba("+m[1]+","+m[2]+","+m[3]+","+canvasPainter.color_alpha+")";
		}
	}
	
	canvasPainter.setColor(color);
}

function setBrushSize(node,size) {
	if (node.painter == null || canvasArray[node.painter] == null) return;
	var canvasPainter = canvasArray[node.painter][0]; // get handle to painter obj
	if(size != canvasPainter.getLineWidth())
	{
		el = findElementByClassDown('btn_'+canvasPainter.getLineWidth(), canvasArray[node.painter][2].parentNode);
		el.style.background = "#FFFFFF";
	}
	node.style.background = "#CCCCCC";
	canvasPainter.setLineWidth(size);
}

function undo(node)
{
	if (node.painter == null || canvasArray[node.painter] == null) return;
	var saveDrawing = canvasArray[node.painter][1]; // get handle to saveDrawing obj
	var ci = canvasArray[node.painter][3];
	var sc = canvasArray[node.painter][4];
	saveDrawing.removeLastNode();
}


//added for cookie
function getCookie( name ) {

  var start = document.cookie.indexOf( name + "=" );

  var len = start + name.length + 1;

  if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {

    return null;

  }

  if ( start == -1 ) return null;

  var end = document.cookie.indexOf( ";", len );

  if ( end == -1 ) end = document.cookie.length;

  return unescape( document.cookie.substring( len, end ) );

}

function setCookie( name, value, expires, path, domain, secure ) {

  var today = new Date();

  today.setTime( today.getTime() );

  if ( expires ) {

   // expires = expires * 1000 * 60 * 60 * 24;

  }

  var expires_date = new Date( today.getTime() + (expires) );

  document.cookie = name+"="+escape( value ) +

    ( ( expires ) ? ";expires="+expires_date.toGMTString() : "" ) + //expires.toGMTString()

    ( ( path ) ? ";path=" + path : "" ) +

    ( ( domain ) ? ";domain=" + domain : "" ) +

    ( ( secure ) ? ";secure" : "" );

}

function deleteCookie( name, path, domain ) {

  if ( getCookie( name ) ) document.cookie = name + "=" +

    ( ( path ) ? ";path=" + path : "") +

    ( ( domain ) ? ";domain=" + domain : "" ) +

    ";expires=Thu, 01-Jan-1970 00:00:01 GMT";

}

