//////////////////////////////
//This file is part of the projectLK
//////////////////////////////
//name: functions.js
//last modified/version: 31.05.2009
//core
//description: global functions for all themes.
//Author: David Glenck
//Licence: GNU General Public Licence (see licence.txt in Mainfolder)
//////////////////////////////

//////////
//CONTENT:
//  Global
//  GUI
//  Database
//  Check String
//  Utility
//////////

//////////
// GLOBAL
//////////
var time;
var maxlevel=7;

//Initialization onLoad
function init() {
  if(here.keyword=='query') { qe.start(); }
  try{
    initialize_gui();
  } catch (err) { errg(err); }
}

//////////
// GUI INTERACTION
//////////
//Sends an errorstring to the gui or alerts.
function errg(out) {
  if(typeof(gui_error)=='function') { gui_error(out); }
  else { alert(out); }
}

function reqerr(info) {
  if(typeof(gui_request_error)=='function') { gui_request_error(info); }
  else { errg(info['errnum']+': '+info['errname']); }
}

function ajaxcatch(num) {
  if(typeof(gui_ajaxcatch)=='function') { gui_ajaxcatch(num); }
}

//////////
// DATABASE
//////////

//request variable to store request before sending
var rvar= { 
  create: function(storename) {  //(storename, functionname, params, actions)
    delete(this[storename]);
    this[storename]= {
      sendreq: sendreq, addparams: addparams
    }
    if(arguments[1]) { this[storename].funct=arguments[1]; }
    if(typeof(arguments[2])=='object') { this[storename].params=Object.clone(arguments[2]); }
    else { this[storename].params=arguments[2]; }
    if(arguments[3]) { this[storename].action=arguments[3]; }
  }
};

//Adds parameters to a request variable
function addparams(params) {
  //Get params of array
  if(typeof(params)=='string') {
    params=params.toQueryParams();
  }   
  if(!this.params) { this.params=new Object }
  for(names in params) {
    this.params[names]=params[names];
  }
}

//Sends request from a request variable
function sendreq() {
  if(arguments.length==1) {
    this.addparams(arguments[0]);
  }
  req(this.funct,this.params,this.action);
  return false;
}

//Requests information from DB
function req(functionname,params,action) {
  try {
    ajaxcatch(0);
    if(typeof(params)=='string') {
      params=params.toQueryParams();
    }
    params.req=1; //Add req=1 to parameters
    params.response=1; //Add respopnse=1 to parameters
    //check if a ante-function is defined and execute
    if(typeof(action)=='object') {
      eval(action[0]);
    }
  }catch(err) {
    errg('Error: '+la.err_api+err);
  }
  try {
    new Ajax.Request(
      functionname+'.php', {
        parameters: params,
        onUninitialized: function() { ajaxcatch(1); },
        onLoading: function() { ajaxcatch(3); },
        onLoaded: function() { ajaxcatch(4); },
        onInteractive: function() { ajaxcatch(5); },
        onComplete: function() { ajaxcatch(6); },
        onSuccess: function(transport){
          ajaxcatch(7);
          var info = transport.responseText.evalJSON(true);
          if(info['errnum']!=0) { reqerr(info) }
          else {
            if(typeof(action)=='object') {
              eval(action[1]); 
            } else {
              eval(action); 
            }
          }	
          ajaxcatch(8);
        }
      } 
    );
  }catch(err) {
    errg('Error: '+l_errors.api+err);
  }
  return false;
}

//////////
// CHECK STRING
//////////

//validates the syntax of an entry
//returns an error id:
  // 1: opening and closing brackets not equal
  // 2: brackets in brackets
function validstr(str) {
  err=false;
  //check round brackets ( )
  br_open=str.match(/\(/g);
  br_close=str.match(/\)/g);
  br_pair=str.match(/\([^\(\)]*\)/g);
  if(br_open!=null && br_close!=null && br_pair!=null) {
    //else if(br_open!=null) { err=2; }
    if(br_open.length!=br_close.length) { err=1; }
    else if(br_open.length!=br_pair.length) { err=2; }
  } else if(br_open!=null || br_close!=null || br_pair!=null) { err=3; }
  //check squared bracket [ ]
  br_open=str.match(/\[/g);
  br_close=str.match(/\]/g);
  br_pair=str.match(/\[[^\[\]]*\]/g);
  if(br_open!=null && br_close!=null && br_pair!=null) {
    //else if(br_open!=null) { err=4; }
    if(br_open.length!=br_close.length) { err=4; }
    else if(br_open.length!=br_pair.length) { err=5; }
  } else if(br_open!=null || br_close!=null || br_pair!=null) { err=6; }
  return err; 
}

//finds the position of an error in syntax of an entry
function errorpos(str) {
  i=0; maxl=str.length;
  br=0; sbr=0; 
  err=-1;
  while(i<maxl) {
    if(str[i]=='(') { br++; }
    if(br>1) { err=i; }
    if(str[i]==')') { br--; }
    if(br<0) { err=i; }
    if(str[i]=='[') { sbr++; }
    if(sbr>1) { err=i; }
    if(str[i]==']') { sbr--; }
    if(sbr<0) { err=i; }
    if(err!=-1) { break; }
    i++;
  }
  return err;
}

//////////
// UTILITY
//////////

//creates the path like the php function
function path() {
  var level=maxlevel;
  var change=0;
  if(typeof(arguments[0])=='object') { change=arguments[0]; }
  else if(arguments[0]!=null) { level=arguments[0]; }
  if(typeof(arguments[1])=='object') { change=arguments[1]; }

  tpath=new Array(maxlevel);
  if(here.username!=null && level>=1) { tpath[0]=here.username+'/'; }
  if(here.registername!=null && level>=2) { tpath[1]=here.registername+'/'; }
  if(here.groupid!=null && level>=3) { tpath[2]=here.groupid+'/'; }
  if(here.saveid!=null && level>=4) { tpath[3]='save/'+here.saveid+'/'; }
  if(here.tagid!=null && level>=5) { tpath[4]='tags/'+here.tagid+'/'; }
  if(here.searchid!=null && level>=6) { tpath[5]='search/'+here.searchid+'/'; }
  if(here.keyoption!=null && level>=7) { tpath[6]=here.keyoption+'/'; }
  if(change!=0) { 
    for(id in change) {
      tpath[id-1]=change[id];
    }
  }
  return URL+tpath.join('');
}

//Creates an Object to save parameters for a form
/*params.input[].name
                .label  : name
                .id     : (the same as name)
                .type   : text
                .value  : ""
                .needed : true;
  params.select[].name
                 .label : name
                 .id  : (the same as name)
                 .option[].value 
                          .text
*/
function formparam(title) { //submittext,canceltext
  this.title=title;
  this.submittext=arguments[1]?arguments[1]:'create'; 
  this.canceltext=arguments[2]?arguments[2]:'cancel'; 
  this.input=new Object;
  this.select=new Object;  
  this.addinput= function(vname) { //vname, label, value, needed
    this.input[vname]=new Object;
    this.input[vname].name=vname;
    this.input[vname].label=arguments[1]?arguments[1]:'name'; 
    this.input[vname].id=vname;
    this.input[vname].type='text';
    this.input[vname].value=arguments[2]?arguments[2]:'';
    this.input[vname].needed=arguments[2]==0?0:1;
  }
  this.addselect= function(vname) { //vname, label
    this.select[vname]=new Object;
    this.select[vname].name=vname;
    this.select[vname].label=arguments[1]?arguments[1]:'name'; 
    this.select[vname].id=vname;
    this.select[vname].selected=0;
    this.select[vname].option=new Object;
    this.select[vname].addoption= function(value) { //value: {value: text,value: text}
      for(val in value) { this.option[val]=value[val]; }
    }
  }
  this.show= function() {
    tdiv=document.createElement('<div>');
    Element.extend(tdiv);
    tdiv.writeAttribute('id','popup2');
    document.body.appendChild(tdiv);
  }
} 

//Remove multiple elements
function relement(id,prefix,suffix) {
  try{
    if(!prefix) { prefix=''; }
    if(!suffix) { suffix=''; }
    if(typeof(id)!='object') { id=Array(id.toString()); } //get only the values
    len=id.length;
    var pids;
    for(i=0;i<len;i++) {
      var pids=$(prefix+id[i]+suffix);
      if(pids) { pids.parentNode.removeChild(pids); }
    }
  } catch(err) {msg(err)}
}

//Gets position on screen of an object
function getposition(obj) {
  var rleft = rtop = 0;
  do{
    rleft += obj.offsetLeft;
    rtop += obj.offsetTop;
  } while ( obj=obj.offsetParent )
  return [rleft, rtop];
}

//Gets value of the first child of a tag
function getval(tagname,pnode,id) {
  var lresponse;
  if(pnode.getElementsByTagName(tagname)[id].firstChild==null) { lresponse=null; }
  else { lresponse= pnode.getElementsByTagName(tagname)[id].firstChild.nodeValue; }
  return lresponse;
}

//Trims whitespaces left and right
function trim(string) {
  while(string[0]==' ') { string=string.substr(1); }
  lim=0;
  while(string[string.length-1]==' ') { 
    string=string.substr(0,string.length-1); 
    lim++;
    if(lim>100) { break; }
  }
  return string;
}





