var boxescontentid = 'bc';
var updateMethod = 'ajax_update';
var settingsMethod = 'ajax_settings';
var cmdexpand_src = '/img/maximize.gif';
var cmdminimize_src = '/img/minimize.gif';
var cmdclose_src = '/img/close.gif';
var cmdsettings_src = '/img/settings.gif';
var head_left_src = '/img/head_left.jpg';
var head_right_src = '/img/head_right.jpg';

var myportlet = new Array();
var cols = 2; //Number of columns

/* relations between box id and box data (name, controller)*/
var boxasoc = new Array();

//-- for IE6 but not IE7, Moz, Safari, Opera...
try {
document.execCommand('BackgroundImageCache', false, true);
} catch(e) { /* unless it's not IE6... */ }

function startLoading(dest){
	var el = document.getElementById(dest);
 	new Insertion.Top(dest, 'Loading. Please wait...');
}

function showHideBoxSettings(){
	if (!loggedin)
	{
		document.location.href='/users/login';	
		return;
	}
	var image = this;
	var numericId = image.id.replace(/[^0-9]/g,'');
	
	var parentObj = document.getElementById( 'dg_' + numericId );
	
	var settings = document.getElementById('settings_' + numericId);
	if(settings.style.display == 'none'){
		$('settings_' + numericId).show();
	}else{
		$('settings_' + numericId).hide();
	}
}

function updateBoxContent(boxid, source){
	
	new Ajax.Updater(
		'body_' + boxid, 
		source, 
		{
			asynchronous:true, 
			evalScripts:true,
			onCreate : startLoading('body_' + boxid)
			//onComplete : stopLoading
		}
	);
}

function updateSettingsContent(boxid, source){
	
	new Ajax.Updater(
		'settings_' + boxid, 
		source, 
		{
			asynchronous:true, 
			evalScripts:true
			//onComplete : stopLoading
		}
	);
}

function showHideBoxContent(){
	var image = this;
	var numericId = image.id.replace(/[^0-9]/g,'');
	
	if (image.src.indexOf(cmdexpand_src)>=0)
	{
		image.src = cmdminimize_src;	
		boxasoc[numericId]["state"]=2;
	}else{
		image.src = cmdexpand_src;	
		boxasoc[numericId]["state"]=1;
	}
	
	//image.src = image.src.indexOf(cmdexpand_src)>=0?cmdminimize_src:cmdexpand_src;
	
	update();
	Effect.toggle('body_' + numericId,'slide',{duration: 0.1}); return false;	
	
}

function closeBox(){
	var image = this;
	var numericId = image.id.replace(/[^0-9]/g,'');
	//$('dg_' + numericId).hide();
	$('dg_' + numericId).remove();
	boxasoc[numericId]="";
	update();
}


function addBox( boxid, name, controller ){
	
	if (boxasoc[boxid]) 
	{
		alert("Acest modul exista deja");
		return;
	}
	
	boxasoc[boxid] = {aname: name, acontroller: controller, state: 2};
	
	var maindiv = document.createElement('DIV');
	maindiv.className = 'dg';
	maindiv.id = 'dg_' + boxid;

	addBoxHead(maindiv, boxid, name);
	addBoxSettings(maindiv, boxid);
	addBoxContent(maindiv, boxid);

	var obj = document.getElementById('col_1' );
	var els = getElementsByClassName('dg', obj);
	
	if (els[0]) 
	{
		obj.insertBefore(maindiv,els[0]);
	}else{
		obj.appendChild(maindiv);	
	}
	
	updateBoxContent( boxid,'/' + controller + '/' + updateMethod );
	updateSettingsContent( boxid,'/' + controller + '/' + settingsMethod );
	
	update();
	
	Sortable.create("col_1", {dropOnEmpty:true,tag:'div',containment:["col_1","col_2"],constraint:false, ghosting: false, handle: 'head_title', onUpdate: update});
	
}

function addBoxHead(parentObj, boxid, name){
	
	var div = document.createElement('DIV');
	div.className='head';
	
	var image = document.createElement('IMG');
	image.src = head_left_src;
	image.align='left';
	div.appendChild(image);
	
	var image = document.createElement('IMG');
	image.src = head_right_src;
	image.align='right';
	div.appendChild(image);	
	
	var textSpan = document.createElement('SPAN');
	textSpan.id = 'head_title_' + boxid;
	textSpan.className = 'head_title';
	new Insertion.Top(textSpan, name.replace("+"," "));
	div.appendChild(textSpan);
	
	
	var image = document.createElement('IMG');
	image.id = 'cmdsettings_' + boxid;
	image.src = cmdsettings_src;
	image.style.cursor = 'pointer';
	image.onmousedown = showHideBoxSettings;	
	div.appendChild(image);	
	
	var image = document.createElement('IMG');
	image.id = 'cmdexpand_' + boxid;
	image.src = (boxasoc[boxid]["state"]==2)?cmdminimize_src:cmdexpand_src;
	image.style.cursor = 'pointer';
	image.onmousedown = showHideBoxContent;	
	div.appendChild(image);
	
	var image = document.createElement('IMG');
	image.id = 'cmdclose_' + boxid;
	image.src = cmdclose_src;
	image.style.cursor = 'pointer';
	image.onmousedown = closeBox;	
	div.appendChild(image);			
	
	
	
	parentObj.appendChild(div);	
}

function addBoxContent( parentObj, boxid ){
	
	var div = document.createElement('DIV');
	div.className='body';
	div.id='body_' + boxid;
	display = (boxasoc[boxid]["state"]==2)?'block':'none';
	div.style.display = display;
	//div.innerHTML = 'body text';
	parentObj.appendChild(div);
	
}

function addBoxSettings( parentObj, boxid ){
	
	var div = document.createElement('DIV');
	div.className='settingsbox';
	div.id='settings_' + boxid;
	div.style.display = 'none';
	parentObj.appendChild(div);
	
}

function createBox( column, boxid, name, controller, state ){
		
	boxasoc[boxid] = {aname: name, acontroller: controller, state: state};
	
	var maindiv = document.createElement('DIV');
	maindiv.className = 'dg';
	maindiv.id = 'dg_' + boxid;

	addBoxHead(maindiv, boxid, name);
	addBoxSettings(maindiv, boxid);
	addBoxContent(maindiv, boxid);

	var obj = document.getElementById( column );
	obj.appendChild(maindiv);
	
	/*Update content of boxid*/
	updateBoxContent( boxid,'/' + controller + '/' + updateMethod );
	updateSettingsContent( boxid,'/' + controller + '/' + settingsMethod );
	
}

function createColumns(){
	var boxcontent = document.getElementById(boxescontentid);
	// Create left column	
	var leftcol = document.createElement('DIV');
	leftcol.className = 'container container_left';
	leftcol.id = 'col_1';
	// Create right column
	var rightcol = document.createElement('DIV');
	rightcol.className = 'container';
	rightcol.id = 'col_2';
	
	boxcontent.appendChild(leftcol);
	boxcontent.appendChild(rightcol);
}

/*
function showObject(obj, level) {
   var l = '';
   var tmp = '';
   for(var a = 0; a < level; a++)
	   l += '[_]';
   for(var a in obj) {
	   var type = typeof(obj[a]);
	   if(type == 'object')
		   tmp += showObject(obj[a], (level + 1));
	   else
		   tmp += l + ' key: ' + a + ' = value: ' +
		   obj[a] + ' < ' + type + '\n';
   }
   return tmp;
}
*/

function portlet(id, name, column, status, position, controller) {
    this.position = parseInt(position);
    this.column = parseInt(column);
    this.id = parseInt(id);
    this.name = name;
    this.controller = controller;
    this.status = parseInt(status);
}
/*
function tmpportlet(position, column, id, name, controller, status) {
    this.position = parseInt(position);
    this.column = parseInt(column);
    this.id = parseInt(id);
    this.name = name;
    this.controller = controller;
    this.status = parseInt(status);
}
*/
function sortByPosition(a, b) {
    var x = a.position;
    var y = b.position;
    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

/*
function createBoxesFromCookies(){

	var text=Get_Cookie('settings');
	
	if (window.ActiveXObject)
	{
	
		var doc=new ActiveXObject("Microsoft.XMLDOM");
		doc.async="false";
		doc.loadXML(text);
	
	}else{
	
		var parser = new DOMParser();
		var doc=parser.parseFromString(text,"text/xml");
	
	}
	
	var x=doc.documentElement;
	
	var items = doc.getElementsByTagName("module");
	
	for (var i = 0 ; i < items.length ; i++) {
		
		var item = items[i];
		var position = item.getElementsByTagName("position")[0].firstChild.nodeValue;
		var column = item.getElementsByTagName("column")[0].firstChild.nodeValue;
		var id = item.getElementsByTagName("id")[0].firstChild.nodeValue;
		var name = item.getElementsByTagName("name")[0].firstChild.nodeValue;
		var controller = item.getElementsByTagName("controller")[0].firstChild.nodeValue;
		var status = item.getElementsByTagName("status")[0].firstChild.nodeValue;			
		
		myportlet[i] = new portlet( position,column,id,name,controller,status );
		boxasoc[id] = {aname: name, acontroller: controller};
	
	}
	
	myportlet.sort(sortByPosition);
	
	for (i=0; i < myportlet.length; i++) {
		
		createBox( 'col_' + myportlet[i]['column'], myportlet[i]['id'], myportlet[i]['name'], myportlet[i]['controller'], myportlet[i]['status'] );
		
	}
		
}
*/

function createBoxesFromCookies(){

	var text=Get_Cookie('settings');
	if (text)
	{
	
		var modules_temp = new Array();
		var modules = new Array();
		
		var tmp_str;
		
		modules_temp = text.split("::");
		for (var index = 0; index < modules_temp.length; ++index) {
			tmp_str = modules_temp[index];
			modules[index] = tmp_str.split(",");
		}
		
		//alert(modules[0][1]);
			
		
		for (var i = 0 ; i < modules.length ; i++) {
			
			var id = modules[i][0];
			var name = modules[i][1];
			var column = modules[i][2];
			var status = modules[i][3];
			var position = modules[i][4];
			var controller = modules[i][5];
			
			myportlet[i] = new portlet( id,name,column,status,position,controller );
		}
		myportlet.sort(sortByPosition);
		
		for (i=0; i < myportlet.length; i++) {
			
			createBox( 'col_' + myportlet[i]['column'], myportlet[i]['id'], myportlet[i]['name'], myportlet[i]['controller'], myportlet[i]['status'] );
			
		}
	}
		
}
function update(){

	var tmpmyportlet = new Array();
	
	for(var col = 1; col <= cols; col++ ){
		
		column = document.getElementById('col_' + col);
		var els = getElementsByClassName('dg', column);
		
		for(var i=0,j=els.length; i<j; i++){
			
			var numericId = els[i].id.replace(/[^0-9]/g,'');
			var columnid = column.id.replace(/[^0-9]/g,'');
			//alert(boxasoc[numericId]['state']);
			p = new portlet(numericId, boxasoc[numericId]['aname'], columnid, boxasoc[numericId]['state'], i, boxasoc[numericId]['acontroller']);
			tmpmyportlet.push(p);
			
		}
	}	

	myportlet = new Array();
	myportlet = tmpmyportlet;
	
	//alert(myportlet[0]['id']);
	
	saveArrayToCookie();

}

function initDragableBoxes(){
	createColumns();
	createBoxesFromCookies();

	Sortable.create("col_1", {dropOnEmpty:true,tag:'div',containment:["col_1","col_2"],constraint:false, ghosting: false, handle: 'head_title', onUpdate: update});
	Sortable.create("col_2", {dropOnEmpty:true,tag:'div',containment:["col_1","col_2"],constraint:false, ghosting: false, handle: 'head_title', onUpdate: update});	

}

function saveArrayToCookie(){
	var tmp_cookie;
	tmp_cookie = "";
	for(var i=0,j=myportlet.length; i<j; i++){
		
		tmp_cookie = tmp_cookie + myportlet[i]['id'] + ",";
		tmp_cookie = tmp_cookie + myportlet[i]['name'] + ",";
		tmp_cookie = tmp_cookie + myportlet[i]['column'] + ",";
		tmp_cookie = tmp_cookie + myportlet[i]['status'] + ",";
		tmp_cookie = tmp_cookie + myportlet[i]['position'] + ",";
		tmp_cookie = tmp_cookie + myportlet[i]['controller'];
		if(i<j-1){  tmp_cookie = tmp_cookie + "::"; }

	}
	//alert(tmp_cookie);
	Set_Cookie('settings', tmp_cookie, '10','/')

}

/*
function saveArrayToCookie(){
	var xmlfile = "<modules>";
	for(var i=0,j=myportlet.length; i<j; i++){
		xmlfile = xmlfile + "<module>";
		xmlfile = xmlfile + "<id>" + myportlet[i]['id'] + "</id>";
		xmlfile = xmlfile + "<name>" + myportlet[i]['name'] + "</name>";
		xmlfile = xmlfile + "<column>" + myportlet[i]['column'] + "</column>";
		xmlfile = xmlfile + "<status>" + myportlet[i]['status'] + "</status>";
		xmlfile = xmlfile + "<position>" + myportlet[i]['position'] + "</position>";
		xmlfile = xmlfile + "<controller>" + myportlet[i]['controller'] + "</controller>";
		xmlfile = xmlfile + "</module>";
	}
	var xmlfile = xmlfile + "</modules>";
	Set_Cookie('settings', xmlfile, '10')
}
*/
/*Helper functions*/

function getElementsByClassName(classname, node) {
	if(!node) node = document.getElementsByTagName("body")[0];
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = node.getElementsByTagName("*");
	for(var i=0,j=els.length; i<j; i++)
	if(re.test(els[i].className))a.push(els[i]);
	return a;
}

/*
These cookie functions are downloaded from 
http://www.mach5.com/support/analyzer/manual/html/General/CookiesJavaScript.htm
*/
function Get_Cookie(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 Set_Cookie(name,value,expires,path,domain,secure) { 
	
	expires = expires * 60*60*24*1000;
	var today = new Date();
	var expires_date = new Date( today.getTime() + (expires) );
    
    var cookieString = name + "=" +escape(value) + 
       ( (expires) ? ";expires=" + expires_date.toGMTString() : "") + 
       ( (path) ? ";path=" + path : "") + 
       ( (domain) ? ";domain=" + domain : "") + 
       ( (secure) ? ";secure" : ""); 
    document.cookie = cookieString; 
}

/*
	Settings functions 
*/
function saveSettings(boxid, controller, form){
	//alert(document.getElementById(form));
	new Ajax.Request('/' + controller + '/' + settingsMethod + '/', {
	 parameters: $(form).serialize(true), asynchronous: false
	 });
	
	/*
	new Ajax.Updater('xxx','/' + controller + '/' + settingsMethod + '/', { 
	 parameters: $(form).serialize(true), onComplete:UpdateBody(boxid,'/' + controller + '/' + updateMethod)});
	*/

	setTimeout(function(){updateBoxContent( boxid, '/' + controller + '/' + updateMethod )}, 10);
	
	var settings = document.getElementById('settings_' + boxid);
	
	if(settings.style.display == 'none'){
		$('settings_' + boxid).show();
	}else{
		$('settings_' + boxid).hide();
	}
	
}


window.onload = initDragableBoxes;