var debugShowRequest = false;
var debugMode        = false;
var debugModeAdd     = false;
var gbl_runcache     = false;
var gbl_doflash      = true;

var gbl_cache = new Array();
var gbl_hash;
var gbl_timed = new Array(0,0,0,0);

function moduleController(module, action)
{
    var arg = moduleController.arguments;
    
    var q = '';
    var h = module + action;
    for(var k,k=2; k<arg.length; k += 2) {
        q += arg[k] + '=' + arg[k+1] + '&';
        h += arg[k] + arg[k+1];
    }
    if(debugMode == true) {
        var rqr = document.getElementById('report_request');
        rqr.innerHTML = '/index.php?module='+module+'&action='+action+'&'+q;
    }
    gbl_hash = hex_md5(h);
    if(typeof(gbl_cache[gbl_hash]) == 'undefined' || gbl_runcache == false) {
        new Ajax.Request( '/index.php',
                         {
	  	    			    method: 'get', 
		  	    		    parameters: 'module=' 
		  		    	              + module + '&action=' 
		  			                  + action + '&' + q,
			  		        onFailure: requestError,
    					    onException: requestError,
	    				    onSuccess: requestComplete,
	    				    encoding: 'ISO-8859-1',
	    				    evalScripts: true
		    		      });
	}
	else {
    	requestComplete(null, null, 1);
	}
}

function formGetSubmit(module, action, frm)
{
    if(!document.getElementById(frm)) {
        debugReport('formGetSubmit :: element ' + frm + ' not found !!');
        return false;
    }

    var q = Form.serialize(document.getElementById(frm));
    new Ajax.Request( '/index.php',
                      {
	    			    method: 'get', 
	  	    		    parameters: 'module=' 
	  		    	              + module + '&action=' 
	  			                  + action + '&' + q,
		  		        onFailure: requestError,
    				    onException: requestError,
	   				    onSuccess: requestComplete,
	    				encoding: 'ISO-8859-1',
	   				    evalScripts: true
	    		      });
    if(debugMode == true) {
        var rqr = document.getElementById('report_request');
        rqr.innerHTML = '/index.php?module='+module+'&action='+action+'&'+q;
    }
}

function timedAction(module, action, offset)
{
    gbl_timed[0] = module;
    gbl_timed[1] = action;
    gbl_timed[2] = timedAction.arguments;
    
    if(gbl_timed[3] > 0) {
        clearTimeout(gbl_timed[3]);
    }
    gbl_timed[3] = setTimeout('runTimedAction()', offset); 
}

function runTimedAction()
{
    var q = '';
    for(var k,k=3; k<gbl_timed[2].length; k += 1) {
        q += '\'' + gbl_timed[2][k] + '\',';
    }
    q = q.substr(0,(q.length-1) );

    eval('moduleController(\'' + gbl_timed[0] + '\', \'' + gbl_timed[1] + '\', ' + q + ')');
}

function requestComplete(xmlObj, reqObj, cache)
{
    var m = new Array();
    if(cache==1) {    
        m = gbl_cache[gbl_hash].split('</block>');
    }
    else {
        if(debugShowRequest == true) {
            alert(xmlObj.responseText);
        }
        gbl_cache[gbl_hash] = 'CACHE:' + xmlObj.responseText;
        m = xmlObj.responseText.split('</block>');
    }
    
    if(debugMode == true && debugModeAdd == false) {
        //reportToArea('', false);
    }
    
    var c,id,task,cachetag;
    for(c=0; c<(m.length-1); c++) {
        
        m[c] = m[c].replace('<block>', '');
        id = getXMLtag('ident', m, c);
        task = getXMLtag('task', m, c);
      
        doBlock(task, id, m[c]);
        if(debugMode == true) {
            reportToArea(task + '||' + id + '||' + m[c] + '\n', true);
        }
    }
    if(gbl_doflash == true) {
        replaceFlash();
    }
}

function requestError(xmlObj, reqObj)
{
    alert(reqObj);
}

function cacheClear()
{
    gbl_cache = new Array();
}

function inArray(n, h) 
{
  for(c in h) {
      if(h[c] == n) {
          return true;
      }
  }
  return false;
}

function trim(string) {
    var remove = ' \t\r\n';
    var r = '';
    var s = 0;
    var e = string.length - 1;

    while(s <= e && remove.indexOf(string.charAt(s)) != -1) {
        s++;
    }
    while(e >= s && remove.indexOf(string.charAt(e)) != -1) {
        e--;
    }
    for(i=s; i <= e; i++) {
        r += string.charAt(i);
    }
    return r;
}

function modifyData(data) 
{
    return trim(data);
}

function getXMLtag(tag, data, elm) 
{
    var r = new RegExp('<' + tag + '>(.*)</' + tag + '>','i');
    var t = data[elm].match(r);
    
    if(typeof(t[1]) == 'undefined') {
        debugReport('getXMLtag :: tag not found !!');
        return false;
    }
    
    data[elm] = data[elm].replace('<' + tag + '>' + t[1] + '</' + tag + '>', '');
    return t[1];
}

function doBlock(task, elmId, data)  
{

    /* trim and strip data: use ONLY on small blocks */
    switch(task) {
        case 'create':
        case 'class':
        case 'redirect':
            data = modifyData(data); 
            break;
    }
  
    switch(task) {
        case 'clearcache':
            cacheClear();
            break;
        case 'redirect':
            doRedirect(elmId, data);
            break;
        case 'create':
            createBox(elmId, data);
            break;
        case 'remove':
            removeBox(elmId);
            break;
        case 'html':
            replaceHtmlBox(elmId, data, true, 'content');
            break;
        case 'htmladd':
            addHtmlBox(elmId, data);
            break;
        case 'htmladdbegin':
            addHtmlBeginBox(elmId, data);
            break;
        case 'disable':
            setBoxDisable(elmId);
            break;
        case 'inline':
            setBoxInline(elmId);
            break;
            
        case 'activate':
            setBoxActivate(elmId);
            break;
        case 'deactivate':
            setBoxDeactivate(elmId);
            break;
            
        case 'class':
            setBoxClassName(elmId, data);
            break;
        case 'disableform':
            setFormDisable(elmId);
            break;
        case 'enableform':
            setFormEnable(elmId);
            break;
    }
}

function setBoxInline(boxId)
{
    if(!document.getElementById(boxId)) {
        debugReport('setBoxInline :: element ' + boxId + ' not found !!');
        return false;
    }
    
    new Element.show(boxId);
    return true;
}

function setBoxActivate(boxId)
{
    if(!document.getElementById(boxId)) {
        debugReport('setBoxInline :: element ' + boxId + ' not found !!');
        return false;
    } 
    var elm = document.getElementById(boxId);
    elm.style.zIndex = 5;    
    return true;
}

function setBoxDeactivate(boxId)
{
    if(!document.getElementById(boxId)) {
        debugReport('setBoxInline :: element ' + boxId + ' not found !!');
        return false;
    }
    var elm = document.getElementById(boxId);

    elm.style.zIndex = 3;
    return true;
}

function setBoxDisable(boxId)
{
    if(!document.getElementById(boxId)) {
        debugReport('setBoxDisable :: element ' + boxId + ' not found !!');
        return false;
    }
    
    new Element.hide(boxId);
    return true;
}

function setBoxClassName(boxId, data)
{
    if(!document.getElementById(boxId)) {
        debugReport('setBoxClassName :: element ' + boxId + ' not found !!');
        return false;
    }
    
    var elm = document.getElementById(boxId);
    elm.className = data;
    
    return true;
}

function setFormDisable(frmId)
{
    if(!document.getElementById(frmId)) {
        debugReport('setFormDisable :: element ' + frmId + ' not found !!');
        return false;
    }
    
    new Form.disable(frmId);
    return true;
}

function setFormEnable(frmId)
{
    if(!document.getElementById(frmId)) {
        debugReport('setFormEnable :: element ' + frmId + ' not found !!');
        return false;
    }
    
    new Form.enable(frmId);
    return true;
}

function addHtmlBeginBox(id, html)
{
    if(document.getElementById(id)) {
        var elm = document.getElementById(id);
        html = html + elm.innerHTML;
        
        new Element.update(id, html);
        return true;
    }
    debugReport('addHtmlBeginBox :: element ' + id + ' not found !!');
    return false;
}

function addHtmlBox(id, html)
{
    if(document.getElementById(id)) {
        var elm = document.getElementById(id);
        html = elm.innerHTML + html;
        new Element.update(id, html);
        return true;
    }
    debugReport('addHtmlBox :: element ' + id + ' not found !!');
    return false;
}

function replaceHtmlBox(id, html, create, createUnder) 
{

    if(document.getElementById(id)) {
        new Element.update(id, html);
        return true;
    }
    if(create == false) {
        return false;
    }
    if(!document.getElementById(createUnder)) {
        debugReport('replaceHtmlBox :: under element ' + createUnder + ' not found !!');
        return false;
    }
   
    var newNode = document.createElement('div');
    newNode.setAttribute('id', id);
    newNode.innerHTML = html;
    
    var ct = document.getElementById(createUnder);
    ct.appendChild(newNode);
    
    return true;
}

function removeBox(id)
{
    if(!document.getElementById(id)) {
        debugReport('removeBox :: element ' + id + ' not found !!');
        return false;
    }
    
}

function createBox(id, createUnder)
{
    var cf = false;
    if(document.getElementById(id)) {
        var elm = document.getElementById(id);
    }
    else {
        cf = true;
        var elm = document.createElement('div');
        elm.setAttribute('id', id);
    }
    elm.innerHTML = '';
    elm.style.display = 'inline';
    
    if(cf == true) {
        if(!document.getElementById(createUnder)) {
            debugReport('createBox :: under element ' + createUnder + ' not found !!');
            return false;
        }
        var ct = document.getElementById(createUnder);
        ct.appendChild(elm);
    }
}

function doRedirect(type, href)
{
    if(type == 'javascript') {
        eval(href);
    }
    else if(type == 'html') {
        window.location = href;
    }
}

function debugReport(msg)
{
   if(debugMode == true) {
       alert(msg);
   }
}

function reportToArea(msg, add) 
{
    /*var rpt = document.getElementById('report');
    if(add == true) {
        rpt.value += msg + '\n';
    }
    else {
        rpt.value = msg;
    }*/
}