Cmg.runAlerts=function( node, list, doSiblings ) {
	
	if( !node ) return;
	var ch=null;
	if( node.nodeType==1 ) {
		if( !list ) list=Cmg.alertList;
		var call=node.getAttribute( 'data-cmg_call' );
		if( call ) {
			for( var i=0, len=list.length; i<len; ++i ) {
				var f;
				f=list[i].newMethodNode;
				if( f ) {
					try {	
						f( node, info );
					} catch(e) {
						//console.info( 'Error: '+e.message );
					}
				}
			}
		}
		var id=node.getAttribute( "data-cmg_id" );
		if( id ) {
			var info=null;
			if( Cmg.pageInfo.objects ) info=Cmg.pageInfo.objects[id];
			for( var i=0, len=list.length; i<len; ++i ) {
				var f;
				f=list[i].newObjectNode;
				if( f ) {
					try {	
						f( node, info );
					} catch(e) {
						//console.info( 'Error: '+e.message );
					}
				}
			}
		}
		var areaId=node.getAttribute( "data-cmg_area" );
		if( areaId ) {
			var info=null;
			if( Cmg.pageInfo.areas ) info=Cmg.pageInfo.areas[id];
			for( var i=0, len=list.length; i<len; ++i ) {
				var f;
				f=list[i].newAreaNode;
				if( f ) {
					try {	
						f( node, info );
					} catch(e) {
						//console.info( 'Error: '+e.message );
					}
				}
			}
		}
		this.runAlerts( node.firstChild, list, 1 );
	}
	if( doSiblings ) {
		ch=node.nextSibling;
		if( !ch || ch==node ) return;
		this.runAlerts( ch, list, 1 );
	}
	
}

Cmg.children=[];

Cmg.closingWindow=function() {
	var root=this.getRoot();
	root.unbindChild(this);
	if( root==this ) {
		var channels='';
		for( var chid in this.windows ) {
			channels+=' '+chid;
		}
		if( channels ) Cmg.callAJAX( 'cmg/cleanup', { 'channels':channels } ); 
	}
}

Cmg.unbindChild=function(w) {
	var i=this.children.indexOf(w);
	if( i>=0 ) delete this.children[i];
}

Cmg.bindChild=function(cmg) {
	if( cmg===this ) return;
	this.children.push( cmg );
}


Cmg.documentReady=function() {
	if( this.docReady ) return;
	for( i in this.readyList ) {
		var f=this.readyList[i];
		if( f ) try { f(); } catch( e ) {}
	}
	var b=window.document.body;
	this.runAlerts( b, null, 1 );
	this.docReady=1;
	this.getRoot().bindChild( this );
}


Cmg.listeners=[];
Cmg.windows=[];

Cmg.createAJAXRequest=function() {
	if (window.XMLHttpRequest) return( new XMLHttpRequest() );
	else return( new ActiveXObject("Microsoft.XMLHTTP"));
}

// the listener must implement a .processResponse(response) method.
Cmg.callMethod=function( addr, args, listener, windowargs ) {
	if( !args ) args=[];
	
	var urlParams='';
	args['cmg_addr']=addr;
	var silent=args['cmg_silent'];
	delete args['cmg_silent'];
	var asJSON=args['cmg_asJSON'];
	delete args['cmg_asJSON'];
	var resultOnly=args['cmg_resultOnly'];
	delete args['cmg_resultOnly'];
	
	if( args['cmg_noEditor']!==0 ) args['cmg_noEditor']=1;
//	if( args['cmg_noTaskbar']!==0 ) args['cmg_noTaskbar']=1;
	if( silent && !asJSON ) resultOnly=1;
	var sep='';
	for( var n in args ) {
		v=args[n];
		if( v instanceof Object ) v=JSON.stringify(v);
		else if( v===null ) v='';
		else if( v===false ) v=0;
		else if( v===true ) v=1;
		urlParams+=sep+encodeURIComponent(n)+"="+encodeURIComponent(v);
		sep='&';
	}
	
	var root=this.getRoot();
	
	if( !silent ) {
		var url=Cmg.ROOT_HTTP+'/index.php?cmg_callInfo='+encodeURIComponent(args['cmg_addr'])+'&'+urlParams+'&cmg_silent=1&cmg_resultOnly=1';
		var req=this.createAJAXRequest();
		req.open( "GET", url, false );
		req.send();
		if( req.readyState!=4 || req.status!=200 || !req.responseText ) {
			alert( "Ajax error!" );
			return( 0 );
		}
		var resp=null;
		try {
			eval( "resp="+req.responseText );
		} catch( e ) {
			resp={ 'status':'ERROR', 'errorMessage':req.responseText };
		}
		if( resp.status=="ERROR" ) {
			this.alertError( resp );
			return;
		}
		if( resp.status!="OK" ) {
			this.alertError( "Bad response." );
			return;
		}
		var channelId=resp.data.channelId;
		urlParams='cmg_channelId='+encodeURIComponent(channelId)+'&'+urlParams;
		if( asJSON ) urlParams+='&cmg_asJSON=1';
		if( resultOnly ) urlParams+='&cmg_resultOnly=1';
		var wparams=resp.data.wparams;
		
		var url=Cmg.ROOT_HTTP+'/index.php?cmg_call='+encodeURIComponent(args['cmg_addr'])+'&'+urlParams;
//		var url=Cmg.SRC_HTTP+'/cmg/call/index.php?'+urlParams;
		if( listener ) root.listeners[channelId]=listener;
		if( args['cmg_load'] ) window.location.href=url;
		else root.windows[channelId]=this.openWindow( url, wparams );
	}
	else {
		urlParams+='&cmg_silent=1';
		if( asJSON ) urlParams+='&cmg_asJSON=1';
		if( resultOnly ) urlParams+='&cmg_resultOnly=1';	
		var url=Cmg.ROOT_HTTP+'/index.php?cmg_call='+encodeURIComponent(args['cmg_addr'])+'&'+urlParams;
//		var url=Cmg.SRC_HTTP+'/cmg/call/index.php?'+urlParams;
		req=this.createAJAXRequest();
		if( !listener ) {
			req.open( "GET", url, false );
			req.send();
			if( req.readyState!=4 || req.status!=200 || !req.responseText ) {
				alert( "Ajax error!" );
				return( 0 );
			}
			var json=null;
			try {
				eval( "json="+req.responseText );
			} catch( e ) {
				if( req.responseText ) alert( 'JSON response not valid: '+req.responseText );
				return;
			}
			if( listener ) root.listeners[channelId]=listener;
			return( this.processResponse(json) );
		} else {
			req.onreadystatechange=function() {
				if( req.readyState==4 ) {
					var json=null;
					try {
						eval( "json="+req.responseText );
					} catch( e ) {
						if( req.responseText ) alert( 'JSON response not valid: '+req.responseText );
						return;
					}
					root.listeners[json.channelId]=listener;
					Cmg.processResponse(json);
				}
			}
			req.open( "GET", url, true );
			req.send();
		}
	}
}

Cmg.loadNode=function( args, callBack ) {
	if( !args ) return;
	args.cmg_silent=1;
	args.cmg_asJSON=1;
	var addr=args.cmg_addr;
	delete args.cmg_addr;
	return( Cmg.callMethod( addr, args, callBack ) );
}

Cmg.callAJAX=function( addr, args, callBack ) {
	if( !args ) args={};
	args.cmg_silent=1;
	args.cmg_resultOnly=1;
	return( Cmg.callMethod( addr, args, callBack ) );
}

Cmg.passResponse=function( resp ) {
	this.processResponse(resp);
}

Cmg.getRoot=function() {
	try {
		if( window.opener && window.opener!=window && window.opener.Cmg ) {
			return( window.opener.Cmg.getRoot() );
		}
		else if( window.parent && window.parent!=window && window.parent.Cmg ) {
			return( window.parent.Cmg.getRoot() );
		}
		else return( this );
	} catch( e ) {
		return this;
	}
}


Cmg.processResponse=function( resp ) {
	
	if( resp.status=="ERROR" ) {
		this.alertError( resp );
//		if( this.windows[resp.channelId] ) this.windows[resp.channelId].close();
		return;
	}
	if( resp.status!="OK" ) {
		this.alertError( "Bad response." );
		return;
	}
	var root=this.getRoot();
	if( resp.operations ) root.processOperations(resp.operations);
	if( resp.data!='cmg_cancel' ) {
		if( root.listeners[resp.channelId] ) {
			root.listeners[resp.channelId](resp.data);
		}
		delete root.listeners[resp.channelId];
		if( root.windows[resp.channelId] ) root.windows[resp.channelId].close();
		return( resp.data );
	} 
	if( root.windows[resp.channelId] ) root.windows[resp.channelId].close();
}



Cmg.processOperations=function(ops, caller) {
	if( !ops ) return;
	if(  caller || this.getRoot()===this ) {
		var redirect=false;
		for( var i in ops ) {
			var op=ops[i];
			if( op.type=='d' ) {
				Cmg.deleteNodes( op.id );
				if( Cmg.currentPageId && op.id==Cmg.currentPageId ) redirect=1;
				if( Cmg.currentContentId && op.id==Cmg.currentContentId ) redirect=1;
			} else if( op.type=='u' ) {
				Cmg.refreshNodes( op.id );
				if( op.id==Cmg.currentPageId ) {
					window.location.reload();
					return;
				}
			} else if( op.type=='c' ) {
				Cmg.deleteNodes( op.id, true );
				if( op.nextSiblingId ) {
					Cmg.prependNode( op.id, op.typeName, op.isPointer, op.nextSiblingId );
				} else if( op.parentId && op.areaName ) {
					Cmg.appendNode( op.id, op.typeName, op.isPointer, op.parentId, op.areaName );
				}
				Cmg.refreshNodes( op.id, null, true );
			}
		}
		for( i in this.children ) {
			if( this.children[i] && this.children[i].processOperations ) this.children[i].processOperations(ops,this);
		}
	} else {
		this.getRoot().processOperations(ops,this);
	}
	if( redirect ) window.location.href=Cmg.ROOT_HTTP+'/index.php';
	
}


// overload this function and return anything you want as long as it has a .close() method.
Cmg.openWindow=function( url, windowargs ) {
	return( window.open( url ) );
}

// overload this function
Cmg.alertError=function( resp ) {
	if( !resp.errorDetail ) resp.errorDetail='';
	alert( resp.errorMessage + "\n" + resp.errorDetail );
}


// the element grabber
Cmg.alertMe( {
	newObjectNode: function( node  ) {
		var id=node.getAttribute( 'data-cmg_id' );
		if( id ) {
			if( !Cmg.pageInfo.objects ) {
				Cmg.pageInfo.objects=[];
			}
			var ob=Cmg.pageInfo.objects[id];
			if( !ob ) ob = Cmg.pageInfo.objects[id]=ob = {"elements":[]};
			ob.elements.push(node);
			var refId=node.getAttribute( 'data-cmg_refid' );
			if( refId ) {
				ob.isPointer=1;
				if( !Cmg.pageInfo.pointerToObject ) Cmg.pageInfo.pointerToObject=[];
				Cmg.pageInfo.pointerToObject[id]=refId;
				if( !Cmg.pageInfo.objectToPointers ) Cmg.pageInfo.objectToPointers=[];
				if( !Cmg.pageInfo.objectToPointers[refId] ) Cmg.pageInfo.objectToPointers[refId]=[];
				if( Cmg.pageInfo.objectToPointers[refId].indexOf( id )<0 ) {
					Cmg.pageInfo.objectToPointers[refId].push( id );
				}
				//ob.ptypePath=node.getAttribute( 'data-cmg_ptype' );
				//var i=ob.ptypePath.lastIndexOf('/');
				//if( i==-1 ) i=0;
				//else i+=1;
				//ob.ptype=ob.ptypePath.substr( i );
				node.cmg_refId=refId;
			} 
			ob.typePath=node.getAttribute( 'data-cmg_type' );
			ob.accessLevel=node.getAttribute( 'data-cmg_al' );
			ob.locked=node.getAttribute( 'data-cmg_locked' );
			var i=ob.typePath.lastIndexOf('/');
			if( i==-1 ) i=0;
			else i+=1;
			ob.type=ob.typePath.substr( i );
			ob.id=id;
			node.cmg_type=ob.type;
			node.cmg_typePath=ob.typePath;
			node.cmg_isPointer=ob.isPointer;
			node.cmg_accessLevel=ob.accessLevel;
			node.cmg_locked=ob.locked;
			node.cmg_id=ob.id;
			node.cmg_enabled=node.getAttribute('data-cmg_enabled')=='1'?1:0;
			node.cmg_noedit=node.getAttribute('data-cmg_noedit')=='1'?1:0;
			var call=node.getAttribute( 'data-cmg_call' );
			if( call ) {
				eval( 'ob.call=('+call+');' );
				node.cmg_call=ob.call;
			}
		}
	},
	newAreaNode: function( node  ) {
		var id=node.getAttribute( 'data-cmg_area' );
		if( id ) {
			if( !Cmg.pageInfo.areas ) {
				Cmg.pageInfo.areas=[];
			}
			var a=Cmg.pageInfo.areas[id];
			if( !a ) a = Cmg.pageInfo.areas[id]=ob = {"elements":[]};
			a.elements.push(node);
			var arr=id.split('__');
			a.parentId=arr[0];
			a.areaName=arr[1];
			a.id=id;
			var settings=node.getAttribute( 'data-cmg_settings' );
			if( settings ) eval( 'a.settings='+settings );
			a.parentAccessLevel=node.getAttribute( 'data-cmg_parental' );
			var allow=node.getAttribute( 'data-cmg_allow' );
			var deny=node.getAttribute( 'data-cmg_deny' );
			if( allow ) {
				arr=allow.split(' ');
				a.allow=[];
				for( var i in arr ) {
					a.allow[arr[i]]=arr[i];
				}
			}
			if( deny ) {
				arr=deny.split(' ');
				a.deny=[];
				for( var i in arr ) {
					a.deny[arr[i]]=arr[i];
				}
			}
			node.cmg_allow=a.allow;
			node.cmg_deny=a.deny;
			node.cmg_settings=a.settings;
			node.cmg_parentAccessLevel=a.parentAccessLevel;
			node.cmg_parentId=a.parentId;
			node.cmg_areaName=a.areaName;
			node.cmg_label=node.getAttribute( 'data-cmg_label' );
		}
	},
	newMethodNode: function( node ) {
		var call=node.getAttribute( 'data-cmg_call' );
		if( call ) {
			eval( 'node.cmg_call=('+call+');' );
		}
	}
} );

Cmg.firstElementChild=function( el ) {
	if( !el ) return;
	ch=el.firstChild;
	if( ch==el ) return;
	while( ch && ch.nodeType!=1 ) ch=ch.nextSibling;
	return( ch );
}

Cmg.nodeCall=function(node) {
	var call=node.getAttribute( 'data-cmg_call' );
	if( call ) {
		eval( 'call=('+call+');' );
	}
	return( call );
}


if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function (obj, fromIndex) {
    if (fromIndex == null) {
        fromIndex = 0;
    } else if (fromIndex < 0) {
        fromIndex = Math.max(0, this.length + fromIndex);
    }
    for (var i = fromIndex, j = this.length; i < j; i++) {
        if (this[i] === obj)
            return i;
    }
    return -1;
  };
}

if(typeof String.prototype.trim !== 'function') {
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, ''); 
  }
}

Cmg.mergePageInfo=function( pageInfo ) {
	// merge the css
	if( pageInfo.css ) {
		for( var css in pageInfo.css ) {
			if( !Cmg.pageInfo.css[css] ) {
				var node=document.createElement( "link" );
				node.setAttribute( "rel", "stylesheet" );
				node.setAttribute( "type", "text/css" );
				node.setAttribute( "href", css );
				Cmg.findHead().appendChild( node );
				Cmg.pageInfo.css[css]=css;
			}
		}
	}
	// merge the js
	if( pageInfo.js ) {
		for( var js in pageInfo.js ) {
			if( !Cmg.pageInfo.js[js] ) {
				var node=document.createElement( "script" );
				node.setAttribute( "type", "text/javascript" );
				node.setAttribute( "src", js );
				Cmg.findHead().appendChild( node );
				Cmg.pageInfo.js[js]=js;
			}
		}
	}
	
}

Cmg.recallNode=function( node, args, callBack, makeSpinner ) {
	var call=node.getAttribute( 'data-cmg_call' );
	if( !call ) return;
	eval( 'call=('+call+');' );
	if( !args ) args=[];
	for( var i in args ) {
		call[i]=args[i];
	}
	if(makeSpinner){
		var offset = $(node).offset();
		var html = '<div style="z-index: 99999; position:absolute; top: 50%; left:50%; margin: -8px 0 0 -8px;"><img src="'+Cmg.SRC_HTTP+'/@lib/loading.gif" alt="loading"></div>';
		$(node).prepend(html);
	}
	Cmg.loadNode( call, function( n ) {
		if( !n ) return;
		if( !n.html ) node.parentNode.removeChild( node );
		else if( node.parentNode ) {
			Cmg.mergePageInfo(n.pageInfo);
			/*
			var div=document.createElement( "DIV" );
			div.innerHTML=n.html;
			w=Cmg.firstElementChild(div);
			*/
			w=$(n.html).get(0);
			node.parentNode.replaceChild( w, node );
			Cmg.runAlerts( w );
		}
		if( callBack ) callBack(w);
	} );
}

Cmg.refreshNodes=function( id, callerId, thoseNotInAreaOnly ) {

	var ob=Cmg.pageInfo.objects[id];
	if( ob ) {
		var els=ob.elements;
	}
	
	var list=[];
	if( els ) {
		var toDelete=[];
		for( var i in els ) {
			var el=els[i];
			if( el && el.parentNode && (!thoseNotInAreaOnly || !el.parentNode.cmg_areaName) ) {
				var call=el.getAttribute( 'data-cmg_call' );
				if( call ) {
					eval( 'call=('+call+');' );
				} else {
					call=ob.call;
				}
				if( call['cmg_pointer'] ) delete call['cmg_id'];
				var n=Cmg.loadNode( call );
				if( !n ) continue;
				if( !n.html ) {
					el.parentNode.removeChild(el);
				}
				else {
					Cmg.mergePageInfo( n.pageInfo );
					/*
					var div=document.createElement( "DIV" );
					div.innerHTML=n.html;
					w=Cmg.firstElementChild(div);
					*/
					w=$(n.html).get(0);
					el.parentNode.replaceChild( w, el );
					list.push( w );
				}
				toDelete.push(i);
			}
		}
		for( var i in toDelete ) delete els[toDelete[i]];
	}
	
	
	for( var i in list ) {
		Cmg.runAlerts( list[i] );
	}
	
	var realId=Cmg.pageInfo.pointerToObject[id];
	
	if( !realId ) {
		// call the refresh of the pointers
		var pointers=Cmg.pageInfo.objectToPointers[id];
		if( pointers ) {
			for( var i=0, len=pointers.length; i<len; ++i ) {
				if( pointers[i]!=callerId ) Cmg.refreshNodes( pointers[i], id, 0 );
			}
		}
	}
	else if( !callerId ) {
		// call the refresh of the object minus this pointer
		Cmg.refreshNodes( realId, id, 1 );
	}
	
}

Cmg.findHead=function() {
	var n=document.documentElement.firstChild;
	while( n && n.nodeName.toLowerCase()!="head" ) {
		n=n.nextSibling;
	}
	return( n );
}

Cmg.injectObject=function( obId, obType, obIsPointer, pid, areaName, nsId ) {
	if( pid ) {
		if( !areaName ) areaName="default";
		var id=pid+"__"+areaName;
		var area=Cmg.pageInfo.areas[id];
		if( !area ) return;
		var els=area.elements;
		if( !els ) return;
	}
	else if( nsId ) {
		var ob=Cmg.pageInfo.objects[nsId];
		if( !ob ) return;
		var els=ob.elements;
		if( !els ) return;
	}
	
	
	var list=[];
	// inject the HTML
	for( var i in els) {
		var el=els[i];
		if( !el.parentNode ) {
			delete els[i];
			continue;
		}
		var args=[];
		var entry=null;
		if( pid ) {
			entry=Cmg.acceptEntry( el, obType, obIsPointer );
		} else {
			entry=Cmg.acceptEntry( el.parentNode, obType, obIsPointer );
		}
		if( obIsPointer ) args['cmg_pointer']=obId;
		else args['cmg_id']=obId;
		if( entry ) {
			for( var k in entry ) {
				args[k]=entry[k];
			}
			if( entry.viewer ) args.cmg_viewer=entry.viewer; // old
			if( entry.method ) args.cmg_addr=entry.method; // old
			else args.cmg_addr='./showUp';
			if( entry.style ) args.cmg_style=entry.style;  // old
			if( entry.args ) for( k in entry.args ) args[k]=entry.args[k]; // old
		} else args.cmg_addr='./showUp';
		var n=Cmg.loadNode( args );
		if( !n || !n.html ) continue;
		Cmg.mergePageInfo( n.pageInfo );
		if( pid ) {
			/*
			var div=document.createElement( "DIV" );
			div.innerHTML=n.html;
			w=Cmg.firstElementChild(div);
			*/
			w=$(n.html).get(0);
			el.appendChild( w );
			list.push( w );
		} else {
			/*
			var div=document.createElement( "DIV" );
			div.innerHTML=n.html;
			w=Cmg.firstElementChild(div);
			*/
			w=$(n.html).get(0);
			el.parentNode.insertBefore( w, el );
			list.push( w );
		}
	}
	
	
	for( var i=0, len=list.length; i<len; ++i ) {
		Cmg.runAlerts( list[i] );
	}
	

}

Cmg.appendNode=function( id, type, isPointer, pid, area ) {
	Cmg.injectObject( id, type, isPointer, pid, area, null );
}

Cmg.prependNode=function( id, type, isPointer, nsid ) {
	Cmg.injectObject( id, type, isPointer, null, null, nsid );
}


Cmg.editListener=function(r) {
//	if( r.id ) Cmg.refreshNodes( r.id );
}


Cmg.appendToArea=function( node, entry ) {
	var args=[];
	if( entry.args ) {
		for( var n in entry.args ) { args[n]=entry.args[n]; }
	}
	if( entry.pointer ) {
		args['cmg_withPointer']=1;
	} else if( entry.pointer!=undefined && !entry.pointer ) {
		args['cmg_withPointer']=0;
	}
	if( entry.type ) args['cmg_newType']=entry.type;
	else args['cmg_newType']='sancho_Object';
	
	if( !(args['cmg_parentId']=node.cmg_parentId) ) return;
	if( !(args['cmg_areaName']=node.cmg_areaName) ) return;
	if( entry.policy ) args['policy']=entry.policy;
	
	var addr='./edit';
//	if( entry.editMethod ) addr=entry.editMethod;
	
/*
	if( entry.type=='cmg_Media' && entry.pointer==1 ) {
		Cmg.callMethod( 'cmg/MediaManager', { 'mode':'choose', 'cmg_noEditor':0, 'cmg_noTaskbar':1 }, function(r) {
				delete args['cmg_newType'];
				args['cmg_id']=r;
				addr='./pointerEdit';
				Cmg.callMethod( addr, args );
		});
	} else {
		Cmg.callMethod( addr, args );
	}
	*/
	
	if( entry.pointer==1 ) {
		Cmg.callMethod( './find', { 'cmg_type':entry.type, 'mode':'choose', 'cmg_noEditor':0, 'cmg_noTaskbar':1 }, function(r) {
				delete args['cmg_newType'];
				args['cmg_id']=r;
				addr='./pointerEdit';
				Cmg.callMethod( addr, args );
		});
	} else {
		Cmg.callMethod( addr, args, function(r) {
			if( r=='choose' ) {
				Cmg.callMethod( './find', { 'cmg_type':entry.type, 'mode':'choose', 'cmg_noEditor':0, 'cmg_noTaskbar':1 }, function(r) {
						delete args['cmg_newType'];
						args['cmg_id']=r;
						addr='./pointerEdit';
						Cmg.callMethod( addr, args );
				});
			}
		});
	}
	
}

Cmg.insertBefore=function( node, entry ) {
	var info=Cmg.getObjectByElement(node);
	if( !info || !info.id ) return;
	var args=[];
	if( entry.args ) {
		for( var n in entry.args ) { args[n]=entry.args[n]; }
	}
	args['cmg_nextSiblingId']=info.id;
	if( entry.pointer ) {
		args['cmg_withPointer']=1;
	} else if( entry.pointer!=undefined && !entry.pointer ) {
		args['cmg_withPointer']=0;
	}
	if( entry.type ) args['cmg_newType']=entry.type;
	else args['cmg_newType']='sancho_Object';
	
	if( entry.policy ) args['policy']=entry.policy;
	var addr='./edit';
//	if( entry.editMethod ) addr=entry.editMethod;
/*
	if( entry.type=='cmg_Media' && entry.pointer==1 ) {
		Cmg.callMethod( 'cmg/MediaManager', { 'mode':'choose', 'cmg_noEditor':0, 'cmg_noTaskbar':1 }, function(r) {
				delete args['cmg_newType'];
				args['cmg_id']=r;
				addr='./pointerEdit';
				Cmg.callMethod( addr, args );
		});
	} else {
		Cmg.callMethod( addr, args );
	}
*/	
	if( entry.pointer==1 ) {
		Cmg.callMethod( './find', { 'cmg_type':entry.type, 'mode':'choose', 'cmg_noEditor':0, 'cmg_noTaskbar':1 }, function(r) {
				delete args['cmg_newType'];
				args['cmg_id']=r;
				addr='./pointerEdit';
				Cmg.callMethod( addr, args );
		});
	} else {
		Cmg.callMethod( addr, args, function(r) {
			if( r=='choose' ) {
				Cmg.callMethod( './find', { 'cmg_type':entry.type, 'mode':'choose', 'cmg_noEditor':0, 'cmg_noTaskbar':1 }, function(r) {
						delete args['cmg_newType'];
						args['cmg_id']=r;
						addr='./pointerEdit';
						Cmg.callMethod( addr, args );
				});
			}
		});
	}
	
	
}

Cmg.deleteListener=function(r) {
	/*
	if( r ) {
		var redirect=false;
		for( i in r ) {
			Cmg.deleteNodes( i );
			if( Cmg.currentPageId && i==Cmg.currentPageId ) redirect=1;
			if( Cmg.currentURLId && i==Cmg.currentURLId ) redirect=1;
		}
	}
	if( redirect ) window.location.href=Cmg.ROOT_HTTP+'/index.php';
	*/
}


Cmg.deleteNodes=function( id, thoseInAreaOnly ) {
	var ob=Cmg.pageInfo.objects[id];
	if( ob ) {
		var els=ob.elements;
		if( els ) {
			for( var i in els ) {
				var el=els[i];
				if( el && el.parentNode && (!thoseInAreaOnly || el.parentNode.cmg_areaName) ) {
					el.parentNode.removeChild(el);
					delete ob.elements[i];
				}
			}
		}
		//if( !thoseInAreaOnly ) ob.elements=[];
	}
	var realId=Cmg.pageInfo.pointerToObject[id];
	if( !realId ) {
		var pointers=Cmg.pageInfo.objectToPointers[id];
		if( pointers ) {
			for( var i=0, len=pointers.length; i<len; ++i ) {
				Cmg.deleteNodes( pointers[i], id );
			}
		}
		delete Cmg.pageInfo.objectToPointers[id];
	}
	else {
		var pointers=Cmg.pageInfo.objectToPointers[realId];
		if( pointers ) {
			var pos=pointers.indexOf(id);
			delete pointers[pos];
		}
//		delete Cmg.pageInfo.pointerToObject[id];
	}
	
//	delete Cmg.pageInfo.objects[id];
	
}


Cmg.getObjectByElement=function( el ) {
	var id=el.getAttribute( "data-cmg_id" );
	if( !id ) return;
	var ob=Cmg.pageInfo.objects[id];
	if( !ob ) return;
	return( ob );
}

Cmg.getAreaByElement=function( el ) {
	var id=el.getAttribute( "data-cmg_area" );
	if( !id ) return;
	var a=Cmg.pageInfo.areas[id];
	if( !a ) return;
	return( a );
}


Cmg.moveBefore=function( id, nsNode ) {
	var ob=Cmg.pageInfo.objects[id];
	if( ob ) {
		var els=ob.elements;
		for( var i in els ) {
			var el=els[i];
			if( el && el.parentNode ) el.parentNode.removeChild(el);
			delete els[i];
		}
	}
	var ns=Cmg.getObjectByElement( nsNode );
	if( !ns ) return;
	
	Cmg.callAJAX( 'cmg/moveNode', {'id':id,'nsId':ns.id } );
	
}

Cmg.aliasBefore=function( id, nsNode ) {

	var ns=Cmg.getObjectByElement( nsNode );
	if( !ns ) return;
	
	Cmg.callAJAX( 'cmg/aliasNode', {'id':id,'nsId':ns.id } );
	
	
}

Cmg.duplicateBefore=function( id, nsNode, entry ) {
	Cmg.callMethod( './duplicate', {cmg_id:id,nextSiblingId:nsNode.cmg_id} );
	/*
	if( !entry ) return( false );
	if( !entry.args ) entry.args=[];
	entry.args['cmg_duplicate']=id;
	Cmg.insertBefore( nsNode, entry );
	*/
}


Cmg.moveAtEnd=function( id, areaNode ) {
	var ob=Cmg.pageInfo.objects[id];
	if( ob ) {
		var els=ob.elements;
		for( var i in els ) {
			var el=els[i];
			if( el && el.parentNode ) el.parentNode.removeChild(el);
			delete els[i];
		}
	}
	var area=Cmg.getAreaByElement( areaNode );
	if( !area ) return;
	
	Cmg.callAJAX( 'cmg/moveNode', {'id':id,'parentId':area.parentId,'areaName':area.areaName } );

}

Cmg.aliasAtEnd=function( id, areaNode ) {

	var area=Cmg.getAreaByElement( areaNode );
	if( !area ) return;
	
	Cmg.callAJAX( 'cmg/aliasNode', {'id':id,'parentId':area.parentId,'areaName':area.areaName } );
	
}

Cmg.duplicateAtEnd=function( id, areaNode, entry ) {
	Cmg.callMethod( './duplicate', {cmg_id:id,parentId:areaNode.cmg_parentId,areaName:areaNode.cmg_areaName} );
	/*
	if( !entry ) return( false );
	if( !entry.args ) entry.args=[];
	entry.args['cmg_duplicate']=id;
	Cmg.appendToArea( areaNode, entry );
	*/
}


Cmg.objectActions=[];
Cmg.objectAction=function( obj ) {
	this.objectActions.push(obj);
}
Cmg.areaActions=[];
Cmg.areaAction=function( obj ) {
	this.areaActions.push(obj);
}

Cmg.i18n=function( key, s ) {                    
	data=this.i18ndata[key];
	if( data && s in data ) return( data[s] );
	return( s );
}

Cmg.canMove=function( node ) {
	var a=Cmg.getAreaByElement( node.parentNode );
	if( !a ) return( 0 );
	if( a.parentAccessLevel & Cmg.P_WRITE ) return( 1 );
	return( 0 );
}

Cmg.isInstanceOf=function( ob, type ) {
	return( ('/'+ob.typePath+'/').indexOf('/'+type+'/' )>=0 );
}

Cmg.isInstance=function( node, type ) {
	return( ('/'+node.cmg_typePath+'/').indexOf('/'+type+'/' )>=0 );
}


Cmg.editNode=function(node) {
	if( !node.cmg_id ) return;
	var args=[];
	var addr='./edit';
	if( node.cmg_isPointer ) {
		args['cmg_pointer']=node.cmg_id;
		addr='./pointerEdit';
	} else {
		args['cmg_id']=node.cmg_id;
	}
	if( node.cmg_typePath.indexOf('/cmg_Media/')>=0 && node.cmg_isPointer ) addr='./pointerEdit';
	if( node.parentNode.cmg_settings ) {
		var s=node.parentNode.cmg_settings;
		var tp=node.cmg_typePath.split('/').reverse();
		var entry=null;
		for( var i in tp ) {
			if( s[tp[i]] ) {
				entry=s[tp[i]];
				if( entry.editMethod ) {
					addr=entry.editMethod;
					break;
				}
			}
		}
	}
	Cmg.callMethod( addr, args );
}

Cmg.editObject=function( id, args, callBack ) {
	var info=Cmg.pageInfo.objects[id];
	if( !args ) args=[];
	var addr='./edit';
	if( info ) {
		if( info.isPointer ) {
			args['cmg_pointer']=info.id;
			delete args['cmg_id'];
			addr='./pointerEdit';
		}
		else args['cmg_id']=info.id;
	} else {
		args['cmg_id']=id;
	}
	if( args['editMethod'] ) addr=args['editMethod'];
	Cmg.callMethod( addr, args,  callBack );

}

Cmg.deleteObject=function( id, args ) {
	var info=Cmg.pageInfo.objects[id];
	if( !args ) args=[];
	if( info && info.isPointer ) {
		args['cmg_pointer']=info.id;
		delete args['cmg_id'];
	}
	else args['cmg_id']=id;
	var addr='./delete';
	Cmg.callMethod( addr, args,  Cmg.deleteListener );
}

Cmg.removeObject=function( id, args ) {
	var info=Cmg.pageInfo.objects[id];
	if( !info ) return;
	if( !args ) args=[];
	if( !info.isPointer ) {
		return;
	}
	args['cmg_id']=info.id;
	var addr='./delete';
	Cmg.callMethod( addr, args,  Cmg.deleteListener );
}


Cmg.createCookie=function(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

Cmg.readCookie=function(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

Cmg.deleteCookie=function(name) {
	this.createCookie(name,"",-1);
}


Cmg.getSubTypes=function( typeName ) {
	var t=Cmg.pageInfo.types[typeName];
	if( !t ) return( {} );
	var tlen=t.path.length+1;
	var tpre=t.path+'/';
	var r={};
	for( var tn in Cmg.pageInfo.types ) {
		var st=Cmg.pageInfo.types[tn];
		if( st.path.substring(0,tlen)==tpre ) r[tn]=st;
	}
	return r;
}

Cmg.getSuperTypes=function( typeName ) {
	var t=Cmg.pageInfo.types[typeName];
	if( !t ) return null;
	var tp=t.path.split('/');
	var r={};
	for( var i in tp ) {
		var tn=tp[i];
		r[tn]=Cmg.pageInfo.types[tn];
	}
	return r;
}


Cmg.getAreaEntries=function( node ) {
	var list={};
	if( !node || !(node.cmg_parentAccessLevel & Cmg.P_WRITE) ) return( res );
	var allow=node.cmg_allow;
	if( !allow ) allow={'cmg_Resource>':1, '*cmg_Media!':1};
	for( var tn in allow ) {
		var nodesc=0;
		var onlydesc=0;
		var pointer=2;
		if( tn.substring( 0, 1 )=='*' ) pointer=1;
		else if( tn.substring( 0, 1)=='#' ) pointer=0;
		if( pointer!=2 ) tn=tn.substring(1);
		if( tn.substring( tn.length-1 )=='!' ) nodesc=1;
		else if( tn.substring( tn.length-1 )=='>' ) onlydesc=1;
		if( nodesc || onlydesc ) tn=tn.substring( 0, tn.length-1 );
		if( !nodesc ) {
			var st=Cmg.getSubTypes( tn );
			for( var stn in st ) {
				if( !list[stn] ) {
					var t=st[stn];
					if( t.abstract ) continue;
					list[stn]={'type':stn,'policy':'public','label':(t.label?t.label:stn),'icon':t.icon};
					if( pointer!=2 ) list[stn].pointer=pointer;
				}
			}
		}
		if( !onlydesc && !list[tn] ) {
			var t=Cmg.pageInfo.types[tn];
			if( t && ! t.abstract ) {
				list[tn]={'type':tn,'policy':'public','label':(t.label?t.label:tn),'icon':t.icon};
				if( pointer!=2 ) list[tn].pointer=pointer;
			}
		}
	}
	if( node.cmg_deny ) {
		for( var tn in list ) {
			if( node.cmg_deny[tn] ) delete( list[tn] );
		}
	}
	if( node.cmg_settings ) {
		for( var tn in list ) {
			var entry=list[tn];
			var st=Cmg.getSuperTypes(tn);
			for( stn in st ) {
				if( node.cmg_settings[stn] ) {
					var aentry=node.cmg_settings[stn];
					for( var k in aentry ) entry[k]=aentry[k];
				}
			}
		}
	}
	
	var res=list;
	
	var res2=[];
	for( var k in res ) {
		res2.push( res[k] );
	}
	res2.sort( function( e1, e2 ) {
		if( e1.label>e2.label ) return( 1 );
		else if( e1.label<e2.label ) return( -1 );
		else return( 0 );
	});
	res={};
	for( var i in res2 ) {
		res[res2[i].type]=res2[i];
	}
	return( res );
}

Cmg.acceptEntry=function( area, objectTypeName, asAlias ) {
	
	if( !(area.cmg_parentAccessLevel & Cmg.P_WRITE) ) return( null );
	var objectType=Cmg.pageInfo.types[objectTypeName];
	if( !objectType ) return null;
	
	entries=Cmg.getAreaEntries( area );
	for( var tn in entries ) {
		entry=entries[tn];
		var t=Cmg.pageInfo.types[tn];
		if( objectType.path==t.path || objectType.path.indexOf(t.path+'/')==0 ) {
			if( entry.pointer!=undefined ) {
				if( asAlias!=undefined ) {
					if( entry.pointer && !asAlias ) continue;
					if( !entry.pointer && asAlias ) continue;
				} 
			}
			else if( asAlias!==undefined ) {
				entry.pointer=asAlias;
			}
		} else continue;
		return entry;
	}
	return null;
	/*
	if( entry=entries[objectTypeName] ) {
		if( entry.pointer!=undefined ) {
			if( asAlias!=undefined ) {
				if( entry.pointer && !asAlias ) return( null );
				if( !entry.pointer && asAlias ) return( null );
			} 
		}
		else if( asAlias!==undefined ) {
			entry.pointer=asAlias;
		}
		return entry;
	} else return null;
	*/
}

Cmg.jQueryInit=function() {
	if( Cmg.docReady ) return;
	if( window.jQuery ) {
		$(document).ready(function() {
			Cmg.documentReady();
		});
	} else {
		window.setTimeout('Cmg.jQueryInit()',20);
	}
}

Cmg.jQueryInit();


