
function initXMLReq() {
	var req = null;
	if (typeof XMLHttpRequest != 'undefined') {
		req = new XMLHttpRequest();
	} else if (typeof ActiveXObject != 'undefined') {
		var XMLObjects = ["MSXML2.XMLHttp", "MSXML3.XMLHttp", "MSXML.XMLHttp", "Microsoft.XMLHttp"];
		for (var i=0; i<XMLObjects.length; i++) {
			try {
				req = new ActiveXObject(XMLObjects[i]);
			} catch (e) {}
		}
	}
	return req;
}


var cookieHandler = {
	create: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=/";
	},
	read: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;
	},
	erase:function(name) {
		cookieHandler.create(name,"",-1);
	}
	
}

function Replicator(pnode,html,itemtagname,itemclassname,nhtml){

	var extrael = null;

	var custom_function = function(){ }
	
	var preDelete = function(){ }
	
	this.setPreDelete = function(f){
	 	preDelete = f;
	}
	
	this.setCustomFunction = function(f){
		custom_function = f;
	}
	
	this.customFunction = function(param){
		return custom_function(param);
	}
	
	var parse_scripts = function(str){
		//parse string and try to find js inside it
		var script = [];
		//now find all the script tags...
		//var stags = /<script type=("|')text\/javascript('|")><\/script>/ig
		var sstart = str.indexOf("<script");
		while(sstart>0){
			var scriptstart = str.indexOf(">",sstart);
			var scriptend = str.indexOf("</script",sstart);
			script[script.length] = {pos:sstart,code:str.substring(scriptstart+1,scriptend)};
			sstart = str.indexOf("<script",scriptend); 
		}
		//find tags with onload attributes
		var olrx = /<[^>]*onload=[^>]*>/gi;
		var ols = str.match(olrx);
		if(ols){
			for(var i = 0;i<ols.length;i++){
				var pos = str.indexOf(ols[i]);
				var id = ols[i].match(/id=["'][^"']*["']/);
				if(id.length == 0){
					continue;
				}
				id = id[0].substring(4,id[0].length-1);
				var onload = ols[i].substr(ols[i].indexOf("onload=")+"onload=".length);
				var schar = onload.substring(0,1);
				var echar = onload.indexOf(schar,1);
				while(onload[echar-1]=="\\"){
					echar = onload.indexOf(schar,echar+1);
				}
				
				onload = onload.substring(1,echar);
				
				//define
				//alert(onload);
				var js = "document.getElementById('"+id+"').onload = function(){ "+onload+" };";
				js+="document.getElementById('"+id+"').onload();";
				script[script.length] = {pos:pos,code:js};
				//execute (since the element should be loaded anyway)							
			}
		}
		//sort the scripts
		script.sort(function(a,b){return a.pos-b.pos;});
		for(var i =0;i<script.length;i++){
			//alert(script[i].code);
			window.eval(script[i].code);
		
		}		
	}
	
	this.append = function(){
		var e = document.createElement(itemtagname);
		e.className = itemclassname;
		if(typeof(nhtml)!='undefined'){
			var l = nhtml.length;
			var ihtml = '';
			for(i=0;i<l;i++){
				if(extrael){
					var ee = document.createElement(extrael);
					ee.innerHTML = nhtml[i];
					e.appendChild(ee);
				}else{
					ihtml += nhtml[i];
				}
			}
			if(!extrael){
				e.innerHTML = ihtml;
			}
		}else{
			if(extrael){
				ee = document.createElement(extrael);
				ee.innerHTML = html;
				e.appendChild(ee);
			}else{
				e.innerHTML = html;
			}
		}
		pnode.appendChild(e);
		if(html){
			parse_scripts(html);
		}		
	}
	
	this.remove = function(p){
		preDelete(p);
		var e = p;
		for(;e.tagName!=itemtagname&&e.className!=itemclassname;e = e.parentNode);
		e.parentNode.removeChild(e);
	}
	
	this.setExtrael = function(value){
		extrael = value;
	}

}

// TDateTimeInput

function TDateTimeInput(prefix){

	var _instance = this;

	this.month_days = new Array(
	    31,[28,29],31,30,31,30,31,31,30,31,30,31
	    );

	this.clearOptions = function(parent_el){
		ret = parent_el;
	    ch = ret.childNodes;
	    l = ch.length;
	    for(i=l-1;i>-1;i--){
	        ret.removeChild(ch.item(i));
	    }
	    return ret;
	}
	
	this.generateOptions = function(parent_el,start_val,end_val,sel_val){
		ret = parent_el;
	    for(i=start_val;i<=end_val;i++){
	        o = document.createElement('option');
	        o.value = i<10?'0'+i:i;
	        if(o.value==sel_val)
	            o.setAttribute("selected","selected");
	        ot = document.createTextNode(i<10?'0'+i:i);
	        o.appendChild(ot);
	        ret.appendChild(o);
	    }
	    return ret;
	}
	
	this.year_dd = document.getElementById(prefix+'_year');
	this.month_dd = document.getElementById(prefix+'_month');
	this.day_dd = document.getElementById(prefix+'_day');
	
	this.year_dd.onchange = function(){
		id = this.id.substr(0,this.id.lastIndexOf('_'));
	    m = document.getElementById(id+'_month');
	    if(m.value!='02')
	        return true;
	    d = document.getElementById(id+'_day');
	    if(this.value%4==0&&(this.value%100!=0||this.value%400==0)){
	        d = _instance.clearOptions(d);
	        d = _instance.generateOptions(d,1,_instance.month_days[1][1],0);
	    }else{
	        d = _instance.clearOptions(d);
	        d = _instance.generateOptions(d,1,_instance.month_days[1][0],0);
	    }
	}
	
	this.month_dd.onchange = function(){
		id = this.id.substr(0,this.id.lastIndexOf('_'));
	    y = document.getElementById(id+'_year');
	    d = document.getElementById(id+'_day');        
	    if(this.value=='02'&&y.value%4==0&&(y.value%100!=0||y.value%400==0)){
	        d = _instance.clearOptions(d);
	        d = _instance.generateOptions(d,1,_instance.month_days[1][1],0);
	    }else if(this.value=='02'){
	        d = _instance.clearOptions(d);
	        d = _instance.generateOptions(d,1,_instance.month_days[1][0],0);
	    }else{
	        d = _instance.clearOptions(d);
	        d = _instance.generateOptions(d,1,_instance.month_days[this.value-1],0);
	    }
	}
	
	switch(this.month_dd.value){
        case "01":
        case "03":
        case "05":
        case "07":
        case "08":
        case "10":
        case "12":
            return;
        case "02":
            //remove one day
            this.day_dd.removeChild(this.day_dd.lastChild);
            //if not leap year remove another day
            if(this.year_dd.value%4!=0||(this.year_dd.value%100==0&&this.year_dd.value%400!=0))
                this.day_dd.removeChild(this.day_dd.lastChild);
        case "04":
        case "06":
        case "09":
        case "11":
            //remove one day
            this.day_dd.removeChild(this.day_dd.lastChild);
    }
}

function popupMenu(button,menu,pos_elem){
	var offsetx = 0;
	var offsety = 0;
	if(pos_elem){
		offsetx = pos_elem.offsetLeft;
		offsety = pos_elem.offsetTop;
	}
	button.onclick = function(e){
		if(!e) var e = window.event;
		var posx;
		var posy;
		if (e.pageY){
			posy = e.pageY;
			posx = e.pageX;
		}
		else if(e.clientY){
			posy = e.clientY + (document.documentElement?document.documentElement.scrollTop:document.body.scrollTop);
			posx = e.clientX + (document.documentElement?document.documentElement.scrollLeft:document.body.scrollLeft);
		}
		menu.style.top = (posy-10-offsety)+'px';
		menu.style.left = (posx-20-offsetx)+'px'; //offset this to be under the mouse, so that doubleclicking would take user to the default action
		menu.style.display = 'block';
		var f = function(){
			document.body.onclick = function(){
				if(this.tagName.toLowerCase()=='a')
					return true;
				menu.style.display = 'none';
				document.body.onclick = function(){}
			}
		}
		setTimeout(f,100);
		return false;
	}
}

function initPopupMenu(type,pos_elem){
	var ret = new Array();
	if(!type)
		type = 'img'
	var imgs = document.getElementsByTagName(type);
	var l = imgs.length;
	for(var i=0;i<l;i++){
		if(imgs.item(i).className == 'popup_menu'){
			var item = imgs.item(i);
			var tmp = item;
			for(;tmp.className!='item_menu';tmp = tmp.nextSibling);
			ret[ret.length] = new popupMenu(item,tmp,pos_elem);
		}
	}
	return ret;
}


function save_form(formid,sname,svalue){
	var f = document.getElementById(formid);
	if(typeof(editAreaLoader)!='undefined'){
		for(area_id in editAreas){
			editAreaLoader.toggle_off(area_id);
		}
	}
	if(f){
		if((typeof(f.onsubmit) == 'function' && f.onsubmit())||typeof(f.onsubmit) != 'function'){
			var s = document.createElement('input');
			s.setAttribute('type','hidden');
			s.setAttribute('name',sname?sname:'save');
			s.setAttribute('value',svalue?svalue:'1');
			f.appendChild(s);
			f.submit();
		}
	}else{
		f = document.forms[0];
		if((typeof(f.onsubmit) == 'function' && f.onsubmit())||typeof(f.onsubmit) != 'function'){
			var s = document.createElement('input');
			s.setAttribute('type','hidden');
			s.setAttribute('name',sname?sname:'save');
			s.setAttribute('value',svalue?svalue:'1');
			f.appendChild(s);
			f.submit();
		}
	}
}

function cancel_form(formid){
	var f = document.getElementById(formid);
	if(!f)
		f = document.forms[0];
	if(typeof(f.confirm)!='undefined'){
		history.back();
		return;
	}
	if(confirm("Do you wish to discard all changes"))
		history.back();
}
	
	
function WindowOnload(){

	var functions = new Array();
	var executed = false;
	
	this.addMethod = function (f){
		if(!executed)
			functions[functions.length] = f;
		else
			f();
	}
	
	this.executeMethods = function(){
		for(i =0;i<functions.length;i++){
			functions[i]();
		}
		executed = true;
	}
	
}

var wOnload = new WindowOnload();

window.onload = wOnload.executeMethods;

function toggle(id){
	var cont = document.getElementById(id);
	if(!cont)
		return;
	if(cont.style.display == 'block')
		cont.style.display = 'none';
	else
		cont.style.display = 'block';
}
function menuNavigate(action,sel){
	document.location= action + "&firm=" + sel;
}



function tablerow_dnd(table,draghandle_tag){

    this.table = table;
 
    var drop_callback = function(){};
    
    this.setDropCallback = function(f){
    	drop_callback = f;
    }
    
    var dragging = false;
    
    var inst = this;
    var old_bg = '';
    
    this.tr = null;
    
    this.init = function(){
        var trs = table.getElementsByTagName('tr');
        var l = trs.length;
        var itemcnt = 0;
        for(var i=0;i<l;i++){
            if(trs.item(i).className !='nodrag'){
            	itemcnt++;
            	var dh = trs.item(i).getElementsByTagName(draghandle_tag);
            	var dhl = dh.length;
            	for(var j=0;j<dhl;j++){
            		if(dh.item(j).className == 'draghandle'){
            			dh.item(j).onclick = start_drag;
            		}
            	}
            }
        }
        if(itemcnt == 1){
        for(var i=0;i<l;i++){
            if(trs.item(i).className !='nodrag'){
            	itemcnt++;
            	var dh = trs.item(i).getElementsByTagName(draghandle_tag);
            	var dhl = dh.length;
            	for(var j=0;j<dhl;j++){
            		if(dh.item(j).className == 'draghandle'){
            			dh.item(j).onclick = function(){};
            		}
            	}
            }
        }	
        }
    }
    
    var start_drag = function(e){
    	if(dragging){
    		drop();
    		return;
    	}
        inst.tr = this;
		for(;inst.tr.tagName.toLowerCase()!='tr';inst.tr = inst.tr.parentNode);
		old_bg = inst.tr.style.backgroundColor;
		inst.tr.style.backgroundColor = 'green';
		
		var trs = table.getElementsByTagName('tr');
        var l = trs.length;
        for(var i=0;i<l;i++){
        	if(trs.item(i).id != inst.tr.id)
            	trs.item(i).onmouseover = set_active;            
        }
		
		var dh = inst.tr.parentNode.getElementsByTagName(draghandle_tag);
        var dhl = dh.length;
        for(var i=0;i<dhl;i++){
        	if(dh.item(i).className=='draghandle'){
        		dh.item(i).onclick = function(){};
        	}
        }
        dragging = true;
    }
    
    
    var active = null;
    
    var set_active = function(){
        active = this;
        var tr = inst.tr;
        tr.parentNode.removeChild(tr);
        for(;active.tagName.toLowerCase()!='tr';active = active.parentNode);
        if(active.className=='nodrag'){
            if(active.nextSibling){
                active.parentNode.insertBefore(tr,active.nextSibling);
            }else{
                active.parentNode.appendChild(tr);
            }
        }else{
        	active.parentNode.insertBefore(tr,active);
        }
        document.body.onclick = drop;
    }
    
    this.dropExt = function(){
    	return drop();
	}
	    
    var drop = function(){
    	if(!dragging)
    		return;
        var tr = inst.tr;
        var cid = tr.id.substr(tr.id.lastIndexOf('_')+1);
        var tgtid = -1;
        var tgt = active;
        if((tgt == null&&this.tagName.toLowerCase()!='tr')||tgt==tr){
       	}else{
            for(;tgt.tagName.toLowerCase()!='tr';tgt = tgt.parentNode);
            if(tgt.className=='nodrag'){
                if(tgt.nextSibling){
                    tgtid = tgt.nextSibling.nextSibling.id.substr(tgt.nextSibling.id.lastIndexOf('_')+1);
                }
            }else{
            	tgtid = tgt.id.substr(tgt.id.lastIndexOf('_')+1);
            }
        }
        tr.style.backgroundColor = old_bg;
        var trs = table.getElementsByTagName('tr');
        var l = trs.length;
        for(var i=0;i<l;i++){
            trs.item(i).onmouseover = function(){};            
        }
        active = null;
        var dh = tr.parentNode.getElementsByTagName(draghandle_tag);
        var dhl = dh.length;
        for(var i=0;i<dhl;i++){
        	if(dh.item(i).className=='draghandle'){
        		dh.item(i).onclick = start_drag;
        	}
        }
        if(typeof(drop_callback)=='function'){
        	drop_callback(cid,tgtid);
        }
        document.body.onclick = function(){}
		dragging = false;
    }
    
} 

var ie6imagefix = function (){

	
	var links = document.getElementById('toolbar').getElementsByTagName('a');
	var l = links.length;
	for(var i = 0;i<l;i++){
		if(links.item(i).style.backgroundImage.match(/\.png/)){
		 	links.item(i).style.backgroundImage = links.item(i).style.backgroundImage.replace(/\.png/,".gif");
		
		}
	}
}

var eqColListenerFunc = null;
var eqColColumns = null;

var makeEqColumns = function(left,right,mid){
	var lcol = document.getElementById(left);
	var rcol = document.getElementById(right);
	var mcol = document.getElementById(mid);
	eqColColumns = {
		'lcol':lcol,
		'rcol':rcol,
		'mcol':mcol
	}
	var mch = mcol.offsetHeight;
	var cheight = Math.max(lcol.offsetHeight,rcol.offsetHeight);
	if(cheight>mch){
		mcol.style.height = cheight+'px';
		eqColListenerFunc = function(){
			var mc = eqColColumns.mcol;
			if(mc.offsetHeight < mc.scrollHeight){
				mc.style.height = mc.scrollHeight+'px';
			}
		}
		window.setInterval('eqColListenerFunc()',1000);
	}
	
}

var asyncRequest = function() {
    function handleReadyState(o, callback) {
        var poll = window.setInterval(function() {
            if(o && o.readyState == 4) {
                window.clearInterval(poll);
                if ( callback ){
                    callback(o);
                }
            }
        },
        10);
    }
    function getReq(){
    	var http;
	    try {
	        http = new XMLHttpRequest();
	    }
	    catch(e) {
	        var msxml = ["MSXML2.XMLHttp", "MSXML3.XMLHttp", "MSXML.XMLHttp", "Microsoft.XMLHttp"];
	        for ( var i=0, len = msxml.length; i < len; ++i ) {
	            try {
	                http = new ActiveXObject(msxml[i]);
	                break;
	            }
	            catch(e) {}
	        }
	    }
    	return http;
    }
    var reqs = [];
    function getAvailReq(){
    	var i = 0;
    	var l = reqs.length;
    	for(;i<l;i++){
    		if(reqs[i] && reqs[i].readyState == 4)
    			return reqs[i];
		}
		reqs[l] = getReq();
		return reqs[l];
	}
    return function(method, uri, callback, postData) {
    	var http = getAvailReq();
    	if(method=='get'){
    		if(uri.indexOf('?')==-1){
    			uri+='?___rand=' + Math.random();
    		}else{
    			uri+='&___rand=' + Math.random();
    		}
    	}
        http.open(method, uri, true);
        if(postData){
        	http.setRequestHeader('content-type','application/x-www-form-urlencoded');
        }
        handleReadyState(http, callback);
        http.send(postData || null);
        return http;
    };
}();


var JSONEncoder = {

		encode:function(){
			var	self = arguments.length ? arguments[0] : this,
				result, tmp;
			if(self === null)
				result = "null";
			else if(self !== undefined && (tmp = this.$[typeof self](self))) {
				switch(tmp){
					case	Array:
						result = [];
						for(var	i = 0, j = 0, k = self.length; j < k; j++) {
							if(self[j] !== undefined && (tmp = JSONEncoder.encode(self[j])))
								result[i++] = tmp;
						};
						result = "[".concat(result.join(","), "]");
						break;
					case	Boolean:
						result = String(self);
						break;
					case	Date:
						result = '"'.concat(self.getFullYear(), '-', this.d(self.getMonth() + 1), '-', this.d(self.getDate()), 'T', this.d(self.getHours()), ':', this.d(self.getMinutes()), ':', this.d(self.getSeconds()), '"');
						break;
					case	Function:
						break;
					case	Number:
						result = isFinite(self) ? String(self) : "null";
						break;
					case	String:
						result = '"'.concat(self.replace(this.rs, this.s).replace(this.ru, this.u), '"');
						break;
					default:
						var	i = 0, key;
						result = [];
						for(key in self) {
							if(self[key] !== undefined && (tmp = JSONEncoder.encode(self[key])))
								result[i++] = '"'.concat(key.replace(this.rs, this.s).replace(this.ru, this.u), '":', tmp);
						};
						result = "{".concat(result.join(","), "}");
						break;
				}
			};
			return result;
		},
		
		c:{"\b":"b","\t":"t","\n":"n","\f":"f","\r":"r",'"':'"',"\\":"\\","/":"/"},
		d:function(n){return n<10?"0".concat(n):n},
		e:function(c,f,e){
			e=eval;
			delete eval;
			if(typeof eval==="undefined")
				eval=e;
			f=eval(""+c);
			eval=e;
			return f
		},
		i:function(e,p,l){return 1*e.substr(p,l)},
		p:["","000","00","0",""],
		rc:null,
		rd:/^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/,
		rs:/(\x5c|\x2F|\x22|[\x0c-\x0d]|[\x08-\x0a])/g,
		rt:/^([0-9]+|[0-9]+[,\.][0-9]{1,3})$/,
		ru:/([\x00-\x07]|\x0b|[\x0e-\x1f])/g,
		s:function(i,d){ 
			return "\\".concat(JSONEncoder.c[d])
		},
		u:function(i,d){
			var	n=d.charCodeAt(0).toString(16);
			return "\\u".concat(p[n.length],n)
		},
		v:function(k,v){return $[typeof result](result)!==Function&&(v.hasOwnProperty?v.hasOwnProperty(k):v.constructor.prototype[k]!==v[k])},
		$: {
			"boolean":function(){return Boolean},
			"function":function(){return Function},
			"number":function(){return Number},
			"object":function(o){return o instanceof o.constructor?o.constructor:null},
			"string":function(){return String},
			"undefined":function(){return null}
		},
		$$:function(m){
			function $(c,t){t=c[m];delete c[m];try{e(c)}catch(z){c[m]=t;return 1}};
			return this.$(Array)&&this.$(Object)
		},
		init:function(){
			try{this.rc=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}
			catch(z){this.rc=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/}
		}

}

JSONEncoder.init();

var repositionBanner = function (banner, cont){
	if(banner.innerHTML == '') //no need to move around empty divs
		return;
	var ptags = cont.getElementsByTagName('p');
	var divtags = cont.getElementsByTagName('div');
	var tl = 0;
	var ptl = ptags.length;
	if(divtags.length>ptl){
		ptags = divtags;
		ptl = divtags.length;
	}
	if(ptl==0||ptl==1){
		var brs = cont.getElementsByTagName('br');
		if(brs.length == 0)
			return false;
		var b = banner.parentNode.removeChild(banner);
		var i = Math.floor(brs.length/2);
		brs.item(i).parentNode.insertBefore(b,brs.item(i));
		return;
	}
	var lens = [];
	lens[-1] = 0;
	var b = banner.parentNode.removeChild(banner);	
	for(var i =0;i<ptl;i++){
		tl+=ptags.item(i).innerHTML.length;
		lens[i] = tl; 
	}
	var midl = tl;
	var t = 0;
	for(var i =0; i<ptl; i++){
		if(Math.abs(tl/2 - lens[i-1])<midl){
			midl = Math.abs(tl/2 - lens[i-1]);
			t = i;
		}
	}
	ptags.item(t).parentNode.insertBefore(b,ptags.item(t));
}
