/**
    @ver 1.0
    @author coco
*/
var FormManager=(function(){
	var name="";
	var objects;
	var lastError;
	var lastErrorString;
	var self;
	var bufferUI;
    var errorStyle=new Array();
    var eventList= new Array();
    var cacheCollection= new Array();
    var cacheGroupsCollection= new Array();

    function constructor()
	{

	}
	constructor.init=function()
	{
        errorStyle["backgroundColor"]="#FFC5B0";
        //errorStyle["border"]        ="1px solid #000000";
        //errorStyle["borderRight"]   ="#333333 1px solid"; 
        //errorStyle["borderTop"]     ="#cccccc 1px solid";
        //errorStyle["borderLeft"]    ="#cccccc 1px solid"; 
        //errorStyle["borderBottom"]  ="#333333 1px solid";
        bufferUI= new Array();
        bufferUI["style"]=new Array();
        bufferUI["class"]=new Array();
        cacheCollection= new Array();
        cacheGroupsCollection= new Array();
                
        if (!objects) objects= new Array();
        if (!objects[name]) objects[name]= new Array();  
		  
    }
	constructor.setFormName=function(_name)
	{
		name=_name;	 
		return constructor;   
	}
	constructor.getFormName=function()
			{
			    return name;
			}
	constructor.getObj=function(name)
    {
        var fName=this.getFormName()+"_"+name;
        return document.getElementById(fName);
    }
    constructor.attachByObj=function(obj,event,handler)
	        { 
                if (obj)
	            {
                    obj[event]=handler;
	                if (!objects) objects= new Array();
	                if (!objects[name]) objects[name]= new Array();
	                objects[name][obj.id]=obj;
	            }
	           
            }
    
	constructor.attach=function(objId,event,handler)
	        {
			    var obj=document.getElementById(name+"_"+objId);
			    if (!obj)
	            {
                	//alert("Element not found "+objId);
                }
                else
                {
                    this.attachByObj(obj,event,handler);   
                }
                
	        }
	

	constructor.getElementsByTagGroupName=function (groupId,tag)
	        {
                var out=new Array();
                var objs;
                var outC=cacheGroupsCollection[tag+"."+groupId];
                var buildCache=true;
                var cachePresent=cacheGroupsCollection[tag+".present"];
                if (cachePresent) buildCache=false;                 
                if (!buildCache){
                    if (outC) {
                        //Error.noteHTML("cached.getElementsByTagGroupName("+groupId+","+tag+")","err");
                        return  outC;                                                   
                    }else{
                        var len=0;
                        for(var index in  cacheGroupsCollection){len++;break;}
                        if (len>0) { //are elemente dar nu are grupul specificat, poate nu exista campul
                            //Error.noteHTML("cutoff.getElementsByTagGroupName("+groupId+","+tag+")","err");
                            return out;                    
                        }
                    }          
                }
                objs=document.getElementsByTagName(tag);
				//var groupParts=groupId.split(".");
                for(var index in objs)
                {
                    var obj=objs[index];
                    if (obj.id)
                    {
                        idParts=(obj.id+"").split("@");
                        nGroupId=idParts[0];
                        if (nGroupId==groupId) out.push(obj);
                        //if ((nGroupId.indexOf(groupParts[0])!=-1)&&(nGroupId.indexOf(groupParts[1])!=-1)) out.push(obj);
                        //buffers groups

                        var key=tag+"."+nGroupId;
                        var temp=cacheGroupsCollection[key];
                        if (!temp) 
                            cacheGroupsCollection[key]= new Array();
                        cacheGroupsCollection[key].push(obj);
                    }
                }
                cacheGroupsCollection[tag+".present"]=1;
                return out;
            }
	constructor.getElementsByGroupName=function(groupId)
	        {
                var input=this.getElementsByTagGroupName(name+"_"+groupId,"input");
                var select=this.getElementsByTagGroupName(name+"_"+groupId,"select");
                var textarea=this.getElementsByTagGroupName(name+"_"+groupId,"textarea");
                var out=XArray.merge(input,select,textarea);
                return out;
            }

    constructor.attachGroup=function(groupId,event,handler)
            {
                
				var types= new Array("input","select","textarea");
                
                for(var type in types){
                    //Error.noteHTML("start.attachGroup.getElementsByTagGroupName("+groupId+","+event+")","err");
                    var all=this.getElementsByTagGroupName(name+"_"+groupId,types[type]);
                    //Error.noteHTML("stop.attachGroup.getElementsByTagGroupName("+groupId+","+event+")","err");
                    for(var index in all){
                        //Error.noteHTML("start.attachGroup.getElementsByTagGroupName("+groupId+","+event+")","err");
                        this.attachByObj(all[index],event,handler);
                    }
                }
            }
	
	constructor.createBasic = function(obj,dataSerialized)
	            {
					//alert(dataSerialized); 
	                var data=XTLString.unserialize(dataSerialized);
					for(i = 0 ; i < obj.length; i++)
	                {
						if (!obj[i]) continue;
	                    var aTagName = obj[i].tagName;
	                    var value=data[obj[i].id];
	                    if (!value) continue;
	                    if(aTagName.toLowerCase() == "input")
	                        obj[i].value = value;
	
	                    if(aTagName.toLowerCase() == "textarea")
	                        obj[i].innerHTML = value
	
	                  //  if(aTagName.toLowerCase() == "option")
	                  //      obj[i].value = data[i]
	                }
	            }
	
	
	constructor.setLastError=function(sender,err)
				{
					if (!lastError) lastError= new Array();
					lastError[name]=err;
				}
	constructor.getLastError=function()
				{
					if ((lastError)&&(lastError[name])) 
						return lastError[name]
					else
						return null;
				}
	constructor.setLastErrorString=function(sender,err)
				{
					if (!lastErrorString) lastErrorString= new Array();
					lastErrorString[name]=err;
				}
	constructor.getLastErrorString=function()
				{
					if ((lastErrorString)&&(lastErrorString[name])) 
						return lastErrorString[name]
					else
						return null;
				}
	constructor.onCreate=function()
				{
					var objs=objects[name];
					var objError;
					for(var i in objs){
						var obj=objs[i];
						if (!obj) continue;
						if (obj.onCreate){
						    obj.onCreate();
						}
					}
				}
	constructor.stateSaveStyle= function (obj)
	{
        var id=obj.id;
        var style= bufferUI["style"][id];
        var className= bufferUI["class"][id];        
        if (!style)
        {
             bufferUI["style"][id]=new Array();
             bufferUI["class"][id]=obj.className;
             for(var i in errorStyle)
             {
                bufferUI["style"][id][i]=obj.style[i]; 
                obj.style[i]=errorStyle[i];
             }
             //alert(bufferUI["style"][id]);
        }
    }
    constructor.stateRestoreStyle=function(obj)
    {
        var id=obj.id;
        var style= bufferUI["style"][id];
        var className= bufferUI["class"][id];      
        //alert(style+":"+id);  
        if (style) 
        {
//            alert("restored");
            var out="";
            for(var i in style)
            {
                obj.style[i]=style[i];
//                out+=i+"="+style[i]+",";
            }
            if (className){
//                alert(className);
                obj.className=className;    
            }
             bufferUI["style"][id]=null;
        }
    }
    
	constructor.onSave=function(sender, operation, msg)
				{
					var errGlobal=false;
					var objs=objects[name];
					var objError;
                    for(var i in objs)
	                {
	                    var obj=objs[i];
                        this.stateRestoreStyle(obj);
                    }				
					//alert(name+":save");	
                    for(var i in objs)
	                {
						var obj=objs[i];
						if (!obj) continue;
						var id=obj.getAttribute("id");
						//alert("Executing:"+obj.id);
						if ((obj.onValidate)&&(id.indexOf("-1")==-1))
						{
						    //alert("validationg");
                            var err=obj.onValidate(obj);
						    if (err!=0) 
						    {
//								obj.className = "otherUser5";
                                this.stateSaveStyle(obj);
								objError=obj;
								this.setLastError(obj,err);
							    errGlobal=true;
							    break;
							}
							if (obj.onSave) obj.onSave(obj);
						}
						
	                }
					if (errGlobal)
					{
						alert(this.getLastErrorString()+"["+this.getLastError()+"]");		
						objError.focus();    
					} 
					else
					{
                        Core.initCall(sender,operation,msg);		    
					}
				}        

    constructor.processId=function(obj)
    {
        var id=obj.id;
//        id=XString.replaceAll(id,FormManager.getFormName()+"_","");
        id=id.replace(FormManager.getFormName()+"_","");
        var idAr=id.split("@");
        return idAr[0];
    }


    

    constructor.populate=function(obj,defaultValue,values)
    {
    	
/*		var t=false;
        if (!t) t=populateInput(obj,defaultValue);        
        if (!t) t=populateSelect(obj,defaultValue,values);    
        if (!t) t=populateTextArea(obj,defaultValue,values);
*/
		if (obj.tagName=='INPUT') return populateInput(obj,defaultValue,values);
		if (obj.tagName=='SELECT') return populateSelect(obj,defaultValue,values);
		if (obj.tagName=='TEXTAREA') return populateTextArea(obj,defaultValue,values);
	        
    }
    
    function populateSelect(obj,defaultValue,values)
    {
        if (obj.tagName=="SELECT")
        {
            //pupulate first
            //TODO : populate
            if (values)
            {
                var n=obj.options.length;
                for(var i=n-1;i>=0;i--) obj.remove(i);
//                Error.dumpObject(values);
                for(var i in values)
                {
                    var elOptNew = document.createElement('option');
                    elOptNew.text =  values[i];
                    elOptNew.value = i;
                    try 
                    {
                        obj.add(elOptNew,null); // standards compliant; doesn't work in IE
                    }
                    catch(ex) 
                    {
                        obj.add(elOptNew); // IE only       
                    }
                }
                            
            }     
            var n=obj.options.length;
            if (defaultValue){
                for(var i=0;i<n;i++)
                {
                   obj.options[i].selected=false;
                }
                for(var i=0;i<n;i++)
                {
                    var value=obj.options[i].value;
                    if (value==defaultValue) obj.options[i].selected=true;
					else{
						//alert(obj.options[i].text);
						if (obj.options[i].text==defaultValue){
							obj.options[i].selected=true;
						}
					}
                }
            }
            return true;
        }
        return false;
    }
    function populateTextArea(obj,defaultValue,values)
    {
        if (obj.tagName=="TEXTAREA"){
            obj.innerHTML=defaultValue;            
            return true;
        }    
        return false;
    }
    function populateInput(obj,defaultValue)
    {
        if (obj.tagName=="INPUT"){
            var type=obj.getAttribute("type");
            switch (type)
            {
                case "checkbox":
                case "radio":
                        if (defaultValue) obj.checked=true;
                        else obj.checked=false;
                    break;
                case "hidden":
                case "button":
                case "text":
                    obj.value=defaultValue;
                    break;
                default:
                    obj.value=defaultValue;

            }
            return true
        }
        return false;
    }

    constructor.getElementsByTagName=function (parent,tag)
            {
                {
                    var out=new Array();
                    var objs=parent.getElementsByTagName(tag);
                    for(var index in objs)
                    {
                        var obj=objs[index];
                        out[out.length]=obj;
                    }
                    return out;
                }        
            }
    
    function _prepareFieldsForPOST(objForm,tag)
            {
                return;
                var allObjects=objForm.getElementsByTagName(tag);
                window.status=allObjects.length;
                var t=null;
                var index=0;
                for(index in allObjects){
                    t= allObjects[index];
                    if ((t)&&(t.disabled)){
                       var value=t.value;
                       var name=t.name;
                       var id=t.id;
                        var pn=t.parentNode;
                        var oldSize=t.size;
                        pn.removeChild(t);
                        var o=document.createElement("INPUT");
                        o.type="text";
                        o.size=oldSize;
                        o.readOnly=true;
                        o.onclick=function(){
                            alert("Eroare:Aceasta este un camp nemodificabil!!!");
                        }
                        o.id=id;
                        o.name=name;
                        o.value=value;
                        pn.appendChild(o);
                       //window.status=index;
                    }
                }
                allObjects=null;
            }     
 
    constructor.prepareFieldsForPOST=function(obj)
            {
                var objForm=Core.detectParent(obj,"FORM");   
                _prepareFieldsForPOST(objForm, "input");        
//                alert("end");    
        		return constructor;   
            }     


    function _convertToText(lObj){
            
			if ((!lObj)||(!lObj.tagName)){
//                    alert("aborting "+lObj);
                 return;
            }

            if (lObj.style.display=="none") return ;
			//check for special Conditions           
		    var options=lObj.getAttribute("options");
            if (options){ 
			    if (typeof(options)=="string"){
				    var ce=new ConfigEvaluator();
				    ce.loadText(options);
				    if (ce.value("visibleOnPrint")==1) return;
				}
            }
			var tagName=lObj.tagName;
            var value="";
            var convert=true;
            switch (tagName){
                case "INPUT":
                            var type=lObj.type;
                            switch (type){
                                case "radio":
                                case "checkbox":
                                    if (lObj.checked) value='<font color="black"><b>X</b></font>&nbsp;';
                                    else value='<font color="white">M</font>&nbsp;';
                                    break;
                                case "hidden":
                                    value="";
                                    break;
                                case "text":
                                    value=lObj.value;                                         
                                    break;
                                case "submit":
                                case "file":
								case "button":
                                    lObj.style.display="none";
                                default:
                                    convert=false;
                                
                            }
                            
                        break;
                case "SELECT":
                        if(lObj.selectedIndex>=0) 
							value=lObj.options[lObj.selectedIndex].text;
                        break;
                case "TEXTAREA":
                        value=lObj.innerHTML;
                        break;
                default:
                    convert=false;
            }
            try {
                if (convert){
                    var pn=lObj.parentNode;
                    var nObj=document.createElement("span");
                    nObj.id="p_"+lObj.id;
                    pn.insertBefore(nObj,lObj);
                    //do no remove, just hide
                    lObj
					.style.display="none";
					//pn.removeChild(lObj);
                    //pn.appendChild(nObj);
                    nObj.innerHTML=value;
                }
            }catch(e){
                alert(e+lObj.id);            
            }
            

    }
    function _prepareForPrint(allObjects){
        for(var index in allObjects){
            var lObj=allObjects[index];
            if (lObj.tagName)  _convertToText(lObj);
            else{
//                _prepareForPrint(lObj);                
            }
        }
    }
    
    constructor.prepareForPrintById=function(id)
            {
                    var obj=document.getElementById(id);
                    if (obj)
                        this.prepareForPrint(obj);
                    else alert(id+" print() [not found]!");
            }
    constructor.prepareForPrint=function(obj)
            {
                if (!obj){
//                    alert("NO Print OBJ"+obj);
                    return;
                }
                
                var allObjects=XArray.merge(
                                    obj.getElementsByTagName('SELECT')
                                    ,obj.getElementsByTagName('INPUT')
                                    ,obj.getElementsByTagName('TEXTAREA')
        //                          ,this.getElementsByTagName(objLine,'label')
                                );

                _prepareForPrint(allObjects);
                
        		return constructor;   
            }
    

    function _cloneNodeCopy(src,dest,handlerField){
        var data=new Array();
        data["*"]="class,className,id,align,valign,@style";
        data["span"]="innerHTML";
        data["label"]="innerHTML";
        data["table"]="cellspacing,cellpadding,border,width,height";
        data["tbody"]="";
        data["tr"]="rowspan";
        data["td"]="colspan,valign,width,height";
        data["input"]="name,size,value,type,width";
        data["select"]="name";
        data["option"]="innerHTML,value,selected";
        data["textarea"]="name";
        data["div"]="";
        data["br"]="";

        data["events"]="onValidate,onabort,onblur,onchange,onclick,ondblclick,onerror,onfocus,onkeydown,onkeypress,onkeyup,onload,onmousedown,onmousemove,onmouseout,onmouseover,onmouseup,onreset,onresize,onselect,onsubmit,onunload";
        if (src.tagName){
            var tagName=src.tagName.toLowerCase();
            var sKeys=data["*"]+","+data[tagName];
            var keys=sKeys.split(",");
//            alert(sKeys);
            while(keys.length>0){
                var key=keys.shift();
                if (key!=""){
                    var value=src[key];
                    
                   //is an object
                    if (key.charAt(0)=="@"){
                        key=key.substring(1);
                        value=src[key];                        
                        //TODO: check if is doing the copy ok
                        for(var index in value){
                            try{
                                if (value[index])
                                    dest[key][index]=value[index];
                            }
                            catch(e){
                            
                            }
                        }
                    }
                    else{    
                        if (src[key])
                        {
                            if (!value){
                                 value=src.getAttribute(key);
                                 dest.setAttribute(key,value);
                            }else {
                                 dest[key]=value;
                            }
                        }
                    }
                }
            }
            keys=data["events"].split(",");
            while(keys.length>0){
                var key=keys.shift();
                dest[key]=src[key];
            } 

            if (handlerField) handlerField(src,dest);           
        }
    }

    
    function _cloneNode(src,dest,handlerField){
        
        var n=src.childNodes.length;
        for (var i=0;i<n;i++){
            var obj=src.childNodes[i];
            if (obj.tagName){
                var tagName=obj.tagName;
                var dObj=document.createElement(tagName);
                _cloneNodeCopy(obj,dObj,handlerField);
                dest.appendChild(dObj);
                _cloneNode(obj,dObj,handlerField);
            }
        }
    }     

    constructor.cloneNode=function(src,handlerField){

        var dest=document.createElement(src.tagName);
        _cloneNodeCopy(src,dest,handlerField);
        _cloneNode(src,dest,handlerField);
        return dest;
    }
    
    constructor.createVariables=function(obj,vars,defaultVars){
        //TODO: test pentru tabele imbricate
        var objTable= Core.detectParent(obj,"TABLE");   
        var idTable=FormManager.processId(objTable);
//        alert(idTable);
        var objTR= Core.detectParent(obj,"TR");   
        var allObjects=XArray.merge(
                            objTR.getElementsByTagName('SELECT')
                            ,objTR.getElementsByTagName('INPUT')
                            ,objTR.getElementsByTagName('TEXTAREA'));
        var variables=new Array();
        if(defaultVars) variables=defaultVars;
        var varsArray=vars.split(",");
        //alert(varsArray);
        //Error.dumpObject(allObjects,1);
        for(var o in allObjects){
            var objCurent= allObjects[o];
            if (objCurent.tagName){
                var id=objCurent.getAttribute("id");
                var value=objCurent.value;
				//alert(id);
				if (!id) continue;

                for(var i in varsArray){
                    var idC=varsArray[i];
                    //alert(idC);
                    if (id.indexOf(idC)!=-1){
                        variables[idC]=value;
                    }
                }
            }
        }                            
		//Error.dumpObject(variables);
        Core.createVariables(obj,variables);
        return constructor;
    }
    
    constructor.initCall=function(sender,operation,msg){
        Core.initCall(sender,operation,msg);
    }
	return constructor;	
})();
