// -------------------------------------------------------------------------
//
// @file wizardlib.js
// @auth: Andrea Raggi
// @date: 25/08/2008
// @descr:
// Libreria per gli oggetti del wizard
// @require:
//		- wizcommon.js
// -------------------------------------------------------------------------


function WizardObject(idObj, label, top, left, width, height, fontSize, fontColor, backColor) {
	this.type = -1;
		//Attributo type
		//99 = DIV	id WLAY_xxxx       = Div contenitore generico  		
		// 0 = DIV	id WLAY_ST_xxxx    = Static con innerHTML variabile
		// 1 = DIV	id WLAY_OPT_xxxx   = Div con group option (studiare)
		// 2 = DIV	id WLAY_SEL_xxxx   = Div con select o combobox (studiare)
		// 3 = DIV	id WLAY_CHK_xxxx   = Div con checkbox (studiare)
		// 4 = DIV	id WLAY_HR_xxxx    = Div con hr (studiare)
		// 5 = INPUT id WLAY_BUT_xxxx   = Bottone
		// 6 = INPUT id WLAY_TXT_xxxx   = Casella di testo
		// 7 = INPUT id WLAY_TXTAR_xxxx = Textarea
		// 8 = DIV id WLAY_IMG_xxxx = Div con immagine

	this.id = idObj;
	this.label = label;
	this.top = top;
	this.left = left;
	this.absoluteTop = top;
	this.absoluteLeft = left;
	
	this.width = width;
	this.height = height;
	this.fontSize = fontSize;
	this.fontColor = fontColor;
	this.backColor = backColor;
	this.backColorReal = backColor;
	
	this.parentId = "";
	this.title = "";
	this.checked=false;
	this.name="";

	//calcolo fontSize unit e int val
	var tmp_fnt_str = new String("" + this.fontSize);
	this.fontSizeUnit = "px";
	if(containsString(tmp_fnt_str, "pt"))this.fontUnit = "pt";
	if(containsString(tmp_fnt_str, "px"))this.fontUnit= "px";
	
	this.fontSizeInt = parseInt("" + tmp_fnt_str, 10);

  	this.setProperties = function(label, top, left , width , height, fontSize, fontColor, backColor) {
    			this.label = label;
    			this.top = top;
    			this.left = left;
    			this.width = width;
    			this.height = height;
				this.fontSize = fontSize;
				this.fontColor = fontColor;
				this.backColor = backColor;

				//calcolo fontSize unit e int val
				var tmp_fnt_str = new String("" + this.fontSize);
				this.fontSizeUnit = "px";
				if(containsString(tmp_fnt_str, "pt"))this.fontUnit = "pt";
				if(containsString(tmp_fnt_str, "px"))this.fontUnit= "px";
				
				this.fontSizeInt = parseInt("" + tmp_fnt_str, 10);
  		};

	this.isEqual = function(objWiz){
			if(  (this.id   == objWiz.id)
			   &&(this.type == objWiz.type)
			   &&(this.label == objWiz.label)
			   &&(this.top == objWiz.top)
			   &&(this.left == objWiz.left)
			   &&(this.width == objWiz.width)
			   &&(this.height == objWiz.height)
			   &&(this.fontSize == objWiz.fontSize)
			   &&(this.fontColor == objWiz.fontColor)
			   &&(this.backColor == objWiz.backColor)
			  )
			  return true;
			else return false;
		};

	this.toString = function(){
			return "WizardObject(" + this.id + "," + this.label + "," + this.top + "," + this.left + "," + this.width + "," + this.height + "," + this.fontSize + "," + this.fontColor + "," + this.backColor + ");"; 
		};

	this.clone = function(){
			var rit = new WizardObject(this.id,
						this.label,
						this.top,
						this.left,
						this.width,
						this.height,
						this.fontSize,
						this.fontColor,
						this.backColor,
						this.backColorReal
						);
			rit.type = this.type;
			rit.parentId = this.parentId;
			rit.title = this.title
			rit.checked = this.checked
			rit.name= this.name
			
			return rit;
		};
}

function doWizardObjectFromObj(obj){
	if(obj){
		try{
			var objTipo = trovaTipo(obj);

			var objTop = obj.offsetTop;
			var objLeft = obj.offsetLeft;
			
			var objWidth = obj.offsetWidth;
			var objHeight = obj.offsetHeight;
			
			var objFontSize = getFontSize(obj);
			var objFontColor = getFontColor(obj);
			var objBackColor = getBackColor(obj);
			if(objTipo==2){
				if (obj.hasChildNodes()){
					var children = obj.childNodes;
					var fnd = null;
					for (var i = 0; i < children.length; i++) {
   					if(children[i].nodeType!=3){
							//trovato oggetto checkbox
							fnd = children[i];
							break;
						}
					}
					if(fnd!=null){
						objFontSize = getFontSize(fnd);
						objFontColor = getFontColor(fnd);
						objBackColor = getBackColor(fnd);
					}
				}
			}
			
			var objCaption = trovaCaptionNew(obj);
			
			var rit = new WizardObject(obj.id, objCaption, objTop, objLeft, objWidth, objHeight, objFontSize, objFontColor, objBackColor);
			
			var objBackColor2 = getBackColorNoTransparent(obj);
			rit.backColorReal = objBackColor2;

			rit.absoluteTop = wiz_getAbsoluteTop(obj);
			rit.absoluteLeft = wiz_getAbsoluteLeft(obj);

			//title-alt
			rit.title = trovaTitle(obj);
			
			rit.checked = trovaChecked(obj);
			rit.name = trovaName(obj);
			
			rit.parentId = "";
			if(obj.parentNode){
				if(obj.parentNode.id)rit.parentId = obj.parentNode.id;
			}
			
			rit.type = objTipo;
					
			return rit;
		}
		catch(exIstanzia){
			alert("Errore in istanzia WizardObject = " + exIstanzia);
		}
	}
	return null;
}


function WizardAction(idAction, objAction){
	this.idAction = idAction;
	//IdAction list
	//-1 = cambia finta risoluzione
	//0 = cambia tutte proprietà
	//1 = cambia top obj
	//2 = cambia left obj
	//3 = cambia width obj
	//4 = cambia height obj
	//5 = cambia text obj
	//6 = cambia font size
	//7 = cambia font color
	//8 = cambia background color
	//9 = cambia alt/title (txt field, button, img)
	//10 = cambia checked  (checkbox , option)
	//11 = cambia name (input varie)
	//99 = nuovo oggetto
	this.objAction = objAction;
	this.fakeAction = false;
}

function WizardUndoRedoAction(idAction, oldObj, newObj){
	this.idAction = idAction;
	//IdAction list
	//-1 = cambia finta risoluzione
	//0 = drag/resize assieme
	//1 = cambia top obj
	//2 = cambia left obj
	//3 = cambia width obj
	//4 = cambia height obj
	//5 = cambia text obj
	//6 = cambia font size
	//7 = cambia font color
	//8 = cambia background color
	//9 = cambia alt/title (txt field, button, img)
	//10 = cambia checked  (checkbox , option)
	//99 = nuovo oggetto
	this.oldObj = oldObj;
	this.newObj = newObj;
	
	this.fakeAction=false;
}



//Funzioni utili
function trovaTipo(obj){
	var tmp_name =("" + obj.nodeName).toUpperCase();	
	var tmp_id = "" + obj.id;

	switch(tmp_name){
		case "DIV":
			if(startsWith(tmp_id, "WLAY_ST_")){
				return 0;
			}
			if(startsWith(tmp_id, "WLAY_OPT_")){
				return 1;
			}
			if(startsWith(tmp_id, "WLAY_SEL_")){
				return 2;
			}
			if(startsWith(tmp_id, "WLAY_CHK_")){
				return 3;
			}			
			if(startsWith(tmp_id, "WLAY_HR_")){
				return 4;
			}
			if(startsWith(tmp_id,"WLAY_IMG_")){
				return 8;
			}
			//99 = div contenitore generico... può contenere qualsiasi cosa ma
			//nn saremo in grado di stabilire cosa e quindi di effettuare modifiche
		 	break;
		case "INPUT":
			if(startsWith(tmp_id, "WLAY_BT")){
				return 5;
			}
			if(startsWith(tmp_id, "WLAY_TXT")){
				return 6;
			}
			/*
			var tmp_type =("" + obj.type).toUpperCase();
			switch(tmp_type){
				case "BUTTON":
					return 5;
					break;
				case "TEXT":
					return 6;
					break;
			}
			*/
			break;
		case "TEXTAREA":
			if(startsWith(tmp_id, "WLAY_TXTAR")){
				return 7;
			}
			break;
	}
	return 99;
	//Setto il tipo sul bean oggetto in base al contenuto
	//99 = DIV	id WLAY_xxxx       = Div contenitore generico  		
	// 0 = DIV	id WLAY_ST_xxxx    = Static con innerHTML variabile
	// 1 = DIV	id WLAY_OPT_xxxx   = Div con group option (studiare)
	// 2 = DIV	id WLAY_SEL_xxxx   = Div con select o combobox (studiare)
	// 3 = DIV	id WLAY_CHK_xxxx   = Div con checkbox (studiare)
	// 4 = DIV	id WLAY_HR_xxxx    = Div con hr (studiare)
	// 5 = INPUT id WLAY_BUT_xxxx   = Bottone
	// 6 = INPUT id WLAY_TXT_xxxx   = Casella di testo
	// 7 = INPUT id WLAY_TXTAR_xxxx = Textarea
	// 8 = DIV id WLAY_IMG_xxxx = Div con immagine
}


var tmp_dbg = true;

function stripHtmlTag(txt){ 
	var re= /<\S[^>]*>/g; 
	//var rit = txt.replace(re,""); 
	var rit = trim(""+txt);
	rit = rit.replace("\n", "");
	rit = rit.replace(/(<([^>]+)>)/ig,"");
	return rit;
}

function trovaCaptionNew(obj){
	var tmp_name =("" + obj.nodeName).toUpperCase();	
	var tmp_id = "" + obj.id;

	switch(tmp_name){
		case "DIV":
			if(startsWith(tmp_id, "WLAY_ST_")){
				return obj.innerHTML;
			}
			if(startsWith(tmp_id, "WLAY_OPT_")){
				return stripHtmlTag(obj.innerHTML);
			}
			if(startsWith(tmp_id, "WLAY_SEL_")){
				//TODO
				return "";
			}
			if(startsWith(tmp_id, "WLAY_CHK_")){
				return stripHtmlTag(obj.innerHTML);
			}			
			if(startsWith(tmp_id, "WLAY_HR_")){
				return "";
			}			
			if(startsWith(tmp_id, "WLAY_IMG_")){

				if (obj.hasChildNodes()){
   					var children = obj.childNodes;
   					var fnd = null;
   					for (var i = 0; i < children.length; i++) {
   						if(children[i].nodeType==1){
   							//trovato oggetto immagine 
   							fnd = children[i];
   							break;
   						}
   					}
   					if(fnd!=null){
   						return fnd.src;	
   					}
				}
				return "";
			}			
		 	break;
		case "INPUT":
			if(startsWith(tmp_id, "WLAY_BT")){
				return obj.value;
			}
			if(startsWith(tmp_id, "WLAY_TXT")){
				return obj.value;
			}
			break;
		case "TEXTAREA":
			if(startsWith(tmp_id, "WLAY_TXTAR")){
				return obj.value;
			}
			break;
	}
	return "";
}




function trovaTitle(obj){
	var tmp_name =("" + obj.nodeName).toUpperCase();	
	var tmp_id = "" + obj.id;

	switch(tmp_name){
		case "DIV":
			if(startsWith(tmp_id, "WLAY_ST_")){
				return "";
			}
			if(startsWith(tmp_id, "WLAY_OPT_")){
				return "";
			}
			if(startsWith(tmp_id, "WLAY_SEL_")){
				//TODO
				return "";
			}
			if(startsWith(tmp_id, "WLAY_CHK_")){
				return "";
			}			
			if(startsWith(tmp_id, "WLAY_HR_")){
				return "";
			}			
			if(startsWith(tmp_id, "WLAY_IMG_")){

				if (obj.hasChildNodes()){
   					var children = obj.childNodes;
   					var fnd = null;
   					for (var i = 0; i < children.length; i++) {
   						if(children[i].nodeType==1){
   							//trovato oggetto immagine 
   							fnd = children[i];
   							break;
   						}
   					}
   					if(fnd!=null){
   						var rit = "";
   						if(fnd.title)rit = children[i].title;
   						if(fnd.alt)rit = children[i].alt;
   						return rit;	
   					}
				}
			}	
		 	break;
		case "INPUT":
			if(startsWith(tmp_id, "WLAY_BT")){
				var rit = "";
				if(obj.title)rit = obj.title;
				if(obj.alt)rit = obj.alt;
				return rit;	
			}
			if(startsWith(tmp_id, "WLAY_TXT")){
				return "";
			}
			break;
		case "TEXTAREA":
			if(startsWith(tmp_id, "WLAY_TXTAR")){
				return "";
			}
			break;
	}
	return "";
}


function trovaChecked(obj){
	var tmp_name =("" + obj.nodeName).toUpperCase();	
	var tmp_id = "" + obj.id;

	switch(tmp_name){
		case "DIV":
			if(startsWith(tmp_id, "WLAY_ST_")){
				return false;
			}
			if(startsWith(tmp_id, "WLAY_OPT_")){
				if (obj.hasChildNodes()){
   					var children = obj.childNodes;
   					var fnd = null;
   					for (var i = 0; i < children.length; i++) {
	   					if(children[i].nodeType!=3){
   							//trovato oggetto checkbox
   							fnd = children[i];
   							break;
   						}
   					}
   					if(fnd!=null){
   						return fnd.checked;
   					}
				}
				return false;
			}
			if(startsWith(tmp_id, "WLAY_SEL_")){
				//TODO
				return false;
			}
			if(startsWith(tmp_id, "WLAY_CHK_")){
				if (obj.hasChildNodes()){
   					var children = obj.childNodes;
   					var fnd = null;
   					for (var i = 0; i < children.length; i++) {
	   					if(children[i].nodeType!=3){
   							//trovato oggetto checkbox
   							fnd = children[i];
   							break;
   						}
   					}
   					if(fnd!=null){
   						return fnd.checked;
   					}
				}
				return false;
			}
			
			if(startsWith(tmp_id, "WLAY_HR_")){
				return false;
			}			
			if(startsWith(tmp_id, "WLAY_IMG_")){
				return false;
			}	
		 	break;
		case "INPUT":
			if(startsWith(tmp_id, "WLAY_BT")){
				return false;
			}
			if(startsWith(tmp_id, "WLAY_TXT")){
				return false;
			}
			break;
		case "TEXTAREA":
			if(startsWith(tmp_id, "WLAY_TXTAR")){
				return false;
			}
			break;
	}
	return false;
}


function trovaName(obj){
	var tmp_name =("" + obj.nodeName).toUpperCase();	
	var tmp_id = "" + obj.id;

	switch(tmp_name){
		case "DIV":
			if(startsWith(tmp_id, "WLAY_ST_")){
			}
			if(startsWith(tmp_id, "WLAY_OPT_")){
				if (obj.hasChildNodes()){
   					var children = obj.childNodes;
   					var fnd = null;
   					for (var i = 0; i < children.length; i++) {
	   					if(children[i].nodeType!=3){
   							//trovato oggetto checkbox
   							fnd = children[i];
   							break;
   						}
   					}
   					if(fnd!=null){
   						if(fnd.name)return fnd.name;
   						else return "";
   					}
				}
			}
			if(startsWith(tmp_id, "WLAY_SEL_")){
				if (obj.hasChildNodes()){
   					var children = obj.childNodes;
   					var fnd = null;
   					for (var i = 0; i < children.length; i++) {
	   					if(children[i].nodeType!=3){
   							//trovato oggetto checkbox
   							fnd = children[i];
   							break;
   						}
   					}
   					if(fnd!=null){
   						if(fnd.name)return fnd.name;
   						else return "";
   					}
				}
			}
			if(startsWith(tmp_id, "WLAY_CHK_")){
				if (obj.hasChildNodes()){
   					var children = obj.childNodes;
   					var fnd = null;
   					for (var i = 0; i < children.length; i++) {
	   					if(children[i].nodeType!=3){
   							//trovato oggetto checkbox
   							fnd = children[i];
   							break;
   						}
   					}
   					if(fnd!=null){
   						if(fnd.name)return fnd.name;
   						else return "";
   					}
				}
			}
			
			if(startsWith(tmp_id, "WLAY_HR_")){
			}			
			if(startsWith(tmp_id, "WLAY_IMG_")){
				if (obj.hasChildNodes()){
   					var children = obj.childNodes;
   					var fnd = null;
   					for (var i = 0; i < children.length; i++) {
	   					if(children[i].nodeType!=3){
   							//trovato oggetto checkbox
   							fnd = children[i];
   							break;
   						}
   					}
   					if(fnd!=null){
   						if(fnd.name)return fnd.name;
   						else return "";
   					}
				}
			}	
		 	break;
		case "INPUT":
			if(startsWith(tmp_id, "WLAY_BT")){
				//ritorno sempre obj.name alla fine
			}
			if(startsWith(tmp_id, "WLAY_TXT")){
				//ritorno sempre obj.name alla fine
			}
			break;
		case "TEXTAREA":
			if(startsWith(tmp_id, "WLAY_TXTAR")){
				//ritorno sempre obj.name alla fine
			}
			break;
	}
	if(obj.name)return obj.name
	return "";
}



