
var CElement = Class.create({
  initialize: function() {;},
  onUpdate:   function() {;},
  onFocus:	  function() {;},
  onBlur:	  function() {;},
  onDelete:   function() {;},
  onDragEnd:  function(e) {

    var c = Element.cumulativeOffset(this.parent);
	var d = Element.getDimensions(this.parent);
	var d_this = Element.getDimensions(this.htmlContainer);
	var c_this = Element.cumulativeOffset(this.htmlContainer);
	
	var x = c_this.left - c.left;
	var y = c_this.top  - c.top ;
	
	var adjust_x = false;
	var adjust_y = false;
	
	if( x < 0 ){
		adjust_x = true;
		this.x = 0;
	}
	
	if(x + d_this.width > d.width){
		adjust_x = true;
		this.x =  d.width - d_this.width;
	}
	
	if( y < 0 ){ 
		adjust_y = true;
		this.y   = 0;
	}
	if(y + d_this.height > d.height){
		adjust_y = true;
		y = d.height - d_this.height;
		this.y = y;
	}
	
	
	if(adjust_x)this.htmlContainer.style.left = this.x + c.left + "px";
	if(adjust_y)this.htmlContainer.style.top  = this.y + c.top  +  "px";


  }
});


var elementArray = new Array();
var autoIncrement = 0;
var selectedElement = null;

function dArray(a){
		var s = "";
		for(i=0;i<a.length;i++)
			s += a[i]+"\n";
		alert(s);
}
function elementOnDragEnd( element,mouseEvent ){
	
	//Get  Array index from container Element
	var index = getIndexFromContainerElement(element.element);
	//Trigger on drag end
	elementArray[index].onDragEnd(mouseEvent);

}
function createContextMenu( parent, elements ){
	var ul = document.createElement("ul");
	ul.id  = parent.id + "_contextMenu";
	Element.addClassName(parent, ul.id);
	
	ul.className = "SimpleContextMenu";
	for(i=0;i<elements.length;i+=2){
		var script = elements[i+1];
		var txt = elements[i];
		
		var li = document.createElement("li");
		var a  = document.createElement("a");
		a.innerHTML = txt;
		//a.href    = "javascript:alert('"+elements[i]+"')";	
		a.href    = "javascript:"+script;
		
		//alert(script);
		//a.onclick = function() { var h = new Function("alert('"+txt+"');"); h();}
		 
		li.appendChild(a);
		ul.appendChild(li);
	}
	document.body.appendChild(ul);
	SimpleContextMenu.attach(ul.id, ul.id);
	return ul;
}
function getIndexFromContainerElement(e){
	for(i=0;i<elementArray.length;i++){
		if( elementArray[i] == null )continue;
		if( elementArray[i].htmlContainer == e )return i;
	}
	return null;
}
function getIndex( e ){

	for(i=0;i<elementArray.length;i++){
		if( elementArray[i] == null )continue;
		if( elementArray[i] == e )return i;
	}
	return null;
}


function unselectAllEntries(){
	var children = $('clist').childElements();
	for(i=0;i<children.length;i++)
		children[i].removeClassName("selected");
}

//Source
//http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256BF8004D72D6
function dp(obj, parent) {
   // Go through all the properties of the passed-in object
   for (var i in obj) {
      // if a parent (2nd parameter) was passed in, then use that to
      // build the message. Message includes i (the object's property name)
      // then the object's property value on a new line
      if (parent) { var msg = parent + "." + i + "\n" + obj[i]; } else { var msg = i + "\n" + obj[i]; }
      // Display the message. If the user clicks "OK", then continue. If they
      // click "CANCEL" then quit this level of recursion
      if (!confirm(msg)) { return; }
      // If this property (i) is an object, then recursively process the object
      if (typeof obj[i] == "object") {
         if (parent) { dp(obj[i], parent + "." + i); } else { dp(obj[i], i); }
      }
   }
}

function hideAllPropertyPages(){

	propertyPages = $$(".ppage");
	for(i=0;i<propertyPages.length;i++)
		propertyPages[i].style.display = "none";

}
function selectEntry(objectIndex){

	
	if( selectedElement == 	elementArray[objectIndex])return;
	
	if( selectedElement != null ){
		//trigger blur event on previous element
		selectedElement.onBlur();
	}
	
	selectedElement = elementArray[objectIndex];
	
	//Highlight selected entry , disable all others
	unselectAllEntries();
	elementArray[objectIndex].htmlContainer.addClassName("selected");

	//Show relevant property page, hide all others
	hideAllPropertyPages();
	$("ppage_"+selectedElement.type).style.display = "block";
	
	//Trigger focus on current element
	selectedElement.onFocus();
	
	displayProperties();
	
}

function test()
{
	var a = "";
	for(i=0;i<elementArray.length;i++){
		if( elementArray[i] == null )
			a += "Element[" + i + "] is null\n";
		else
			a += "Element[" + i + "].validation = " + elementArray[i].validation + "\n";
	}
	alert(a);
}

function selectByValue( selectObject , value ){

	if(selectObject == null || value == "")return;
	for(i=0;i<selectObject.length;i++)
		if( selectObject[i].value == value )selectObject.selectedIndex = i;

}
function coord(e){

	var m = Element.cumulativeOffset(elementArray[e].htmlContainer);
	alert("Left : " + m.left + "\nTop : " + m.top);


}

document.onkeyup = keyHandler;   
function keyHandler(e){
   var id = (window.event) ? event.keyCode : e.keyCode;
   switch(id)
   {
    //delete
	case 46:
		if( selectedElement.type == 'textbox' || selectedElement.type == 'textarea')return;
		deleteEntry(getIndex(selectedElement));
		break;
   }
}

function deleteEntry(index){
	
	hideAllPropertyPages();
	unselectAllEntries();
	elementArray[index].onDelete();
	elementArray[index] = null;
	
	/*
	e.onDelete();
	
	i = getIndex(e.li);
	elementArray[i].onDelete();
	//Set element to null
	
	//Let compact remove it
	//elementArray = elementArray.compact();
	
	//Remove it from DOM
	$('clist').removeChild($(e));
	
	*/
}
//]]>
