String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }

/**
 * 
 */
function Entity(html,isList,map,prepare) {
	this.html = html;
	this.isList = isList;
	if ( map ) this.map = map;
	if ( prepare ) this.prepare = prepare;
	this.numRows = 1;
}

Entity.prototype.set = function(data,extra){
	this.data = data;
	if ( this.isList ){
		this.numRows = data.length;
	}
	if (typeof(extra) != 'undefined') 
		this.extra = extra; 
}

Entity.prototype.getByIdx = function(idx){
	return this.data[idx];
}

Entity.prototype.getByName=function (n){
}

Entity.prototype.draw = function(data){
	var ret='';
	var numRows; 	
	if ( data ) {
		if ( this.isList ) {
			numRows = data.length;
		} else {
			numRows = 1;			
		}
	} else { 
		data = this.data;
		if ( this.isList ) {
			this.numRows = this.data.length;
		} else {
			this.numRows = 1;			
		}
		numRows = this.numRows;
	}
	for ( var r = 0; r < numRows; r++ ) {
		var row = ( this.isList ? data[r] : data);
		var prepared = this.prepare ? this.prepare(row) : row;
		if ( this.isList && typeof (prepared) == 'undefined') continue;
		var i = 0; 
		if ( this.map ) {
			while ( i <= this.map.length && i <= this.html.length ){
				if ( i < this.html.length ) ret += this.html[i];
				if ( i < this.map.length ) {
					var m = this.map[i];
					switch (typeof(m)) {
						case 'number':
							if ( typeof (prepared[m]) != 'undefined' )
								ret += prepared[m];
							break;
						case 'string':
							ret += eval(m);
							break;
						case 'function': 
							ret += m(prepared);
							break;
						case 'object': // then it must be an array
							if ( m.length > 1){
								if ( m[1] >= 0) {
									if ( typeof(prepared[m[1]]) != 'undefined')
										ret += m[0].draw(prepared[m[1]]) ;	
								} else {
									if ( typeof(prepared)!= 'undefined')
										ret += m[0].draw(prepared) ;
								}
							} else {
								if ( typeof (m[0]) == 'object' )
									ret += m[0].draw();
							}
							break;
						default:
							alert("error");
							break;
					}						
				}
				i++;
			}
		} else { 
			while ( i <= prepared.length && i <= this.html.length ){
				if ( i < this.html.length ) ret += this.html[i];
				if ( i < prepared.length ) {
					if ( typeof(prepared[i]) != 'undefined') 
						ret += prepared[i];
				}
				i++;
			}
		}		
	}
	return ret;
}

function zipCount(){
	this.i = -1;
}
		
zipCount.prototype.draw	= function (){
	this.i++;
	return this.i;	
}
zipCount.prototype.reset=function(){
	this.i = -1;
}

function zipAlt(alts) {
	this.alts = alts;
	this.idx = -1; 
}

zipAlt.prototype.draw=function(){
	this.idx = (this.idx + 1) % this.alts.length; 
	return this.alts[this.idx];
}

zipAlt.prototype.reset = function() {
	this.idx = -1;
}

zipAlt.prototype.set = function (alts) {
	this.alts = alts;
	this.idx = -1;
} 
/**
 * zip's functions 
 */
function zip(b) {
	var ret="";
	var i = 0;
	while ( i <= this.length && i <= b.length ) {
		if ( i < this.length ) ret += this[i];
		if ( i < b.length ) ret += b[i];
		i++;
	}
	return ret;
}

Array.prototype.zip = zip;

function zipMap(b) {
	var ret = '';
	var i = 0;
	var m; 
	while ( i <= this.length && i <= this.map.length ) {
		if ( i < this.length ) ret += this[i];
		if ( i < this.map.length ) {
			m = this.map[i];
			switch ( typeof(m)) {
				case 'undefined':
				break;
				case 'number':
				ret+= b[m];
				break;
				case 'function':
				ret+= m(b);
				break;
				case 'object':
				ret += m.draw(b);
				break;
			} 
		}
		i++;
	}
	return ret;
}

function zipAddMap(map) {
	this.map = map;
	this.zip = zipMap; 
}

Array.prototype.zipAddMap = zipAddMap;
 
function zipList(bl) {
	var ret ="";
	var ls = bl.split(';"');
	for (var i = 0; i < ls.length; i++) {
		var l = ls[i].split('"');
		ret += this.zip(l);		
	}
	return ret;
}
Array.prototype.zipList = zipList;


function zipListJSON(bl) {
	var ret ="";
	for (var i = 0; i < bl.length; i++) {
		ret += this.zip(bl[i]);		
	}
	return ret;
}
Array.prototype.zipListJSON = zipListJSON;

var zipAlt1 = new zipAlt(['bright','']);
var zipCount1 = new zipCount();
var zipCount2 = new zipCount();


function getSize() {
 	var myWidth = 0, myHeight = 0;
 	if( typeof( window.innerWidth ) == 'number' ) {
  	//Non-IE
  		myWidth = window.innerWidth;
  		myHeight = window.innerHeight;
 	} else if( document.documentElement &&
      	( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    	//IE 6+ in 'standards compliant mode'
  		myWidth = document.documentElement.clientWidth;
  		myHeight = document.documentElement.clientHeight;
 	} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    	//IE 4 compatible
  		myWidth = document.body.clientWidth;
  		myHeight = document.body.clientHeight;
 	}
  
 	var a = new Array(2);

 	a[0] = myWidth;
 	a[1] = myHeight;

 	return a;
}

function setSize() {
	var a = getSize();
	document.post_form.winWidth.value = a[0];
	document.post_form.winHeight.value = a[1];	
	document.post_form.browser.value = getBrowser();
}

function getBrowser() {
	var browserName=navigator.appName;
	if(browserName == "Microsoft Internet Explorer"){
		return "IE";
	}else{
		return "MOZ";
	}	
}  

var dragPaneItem = new Entity(dragPaneItem, true, [[new zipAlt()],[zipCount1],0]);
var dragPane = new Entity(dragPane, false, [0,0,1,0,2,4,0,1,3,1,
	function (b) { 
		zipCount1.reset();
		zipCount1.draw();
		dragPaneItem.map[0][0].set(b[5]);
		dragPaneItem.set(b[6]);		
		return dragPaneItem.draw(); 
	}]);

function checkResponseText(responseText) {
	if (! responseText || responseText == '' ) return true;
	try {
		return responseText.evalJSON();
	} catch ( e ){
		var idx = responseText.indexOf('Error!');
	    if (idx == 0 ) {
			alert(responseText);
		} else {
			document.getElementById('error').innerHTML = responseText;
		}
		return false; 
	}
}

/**
 * start = must be Mon-Fri 
 * return weekday, after number of business days
 */
function addDays(start, numBusinessDays) {
	
	var numWeeks = Math.floor(numBusinessDays/5);
	var rest = numBusinessDays % 5;
	var dow = start.getDay();
	if ( dow + rest > 5 ) numWeeks++;
	var numDays = numBusinessDays + 2*numWeeks; 
	return legitimateDate(start.getFullYear(), start.getMonth(), start.getDate() + numDays); 	
}

/**
 * return next day, not weekend
 * Sun..Thu => + 1
 * Fri => +3
 * Sat => +2
 */
function nextDay(d) {
	var offset = 1;
	var d1=d.getDay();
	if  (d1 == 5 ) {
		offset = 3;
	} else if (d1==6) {
		offset = 2;
	}
	return legitimateDate(d.getFullYear(), d.getMonth(), d.getDate() + offset);
}

/* Sun */
function firstDayOfWeek(d) {
	return legitimateDate(d.getFullYear(), d.getMonth(), d.getDate() - d.getDay());
}

function legitimateDate(y,m,d) {	
	var dim = daysInMonth(m,y); 
	if ( d >  0 ) {
		if ( d <= dim )  return new Date(y,m,d);
		if ( m == 11 ) return legitimateDate(y+1,0, d-31);
		return legitimateDate(y,m+1, d - dim);
	}
	if ( m == 0 ) return legitimateDate(y-1,11,d+31);
	dim  = daysInMonth(m-1,y);	
	return legitimateDate(y,m-1, d + dim);
}

/* Sat */
function lastDayOfWeek (d) {
	return legitimateDate(d.getFullYear(),d.getMonth(), d.getDate() + (6 - d.getDay()));
} 

function firstDayOfMonth(d) {
	return new Date(d.getFullYear(), d.getMonth(), 1); 
}

function daysInMonth(month,year) {
	var m = [31,28,31,30,31,30,31,31,30,31,30,31];
	if (month != 1) return m[month];
	if (year%4 != 0) return m[1];
	if (year%100 == 0 && year%400 != 0) return m[1];
	return m[1] + 1;
} 

function lastDayOfMonth(d) {
	return new Date(d.getFullYear(), d.getMonth(), daysInMonth(d.getMonth(),d.getFullYear()));
}

function toMDY(d) {
	var m = d.getMonth()+1;
	if ( m < 10 ) {
		m = '0' + m;
	} else {
		m = '' + m;
	}
	var days = d.getDate();
	if ( days < 10) {
		days = '0' + days;
	} else {
		days = '' + days;
	}	
	return m + '/' + days + '/' + d.getFullYear(); 
}

//changes by Ashish start
//to return the date 1 day ahead of what sent to it (in format MDY)
function toMDY2(d) {
	var m = d.getMonth()+1;
	if ( m < 10 ) {
		m = '0' + m;
	} else {
		m = '' + m;
	}
	var days = d.getDate();
	if ( days < 10) {
		days = '0' + days;
	} else {
		days = '' + days;
	}	
	return m + '/' + days + '/' + d.getFullYear() + '.002739'; 
	
	return d;
}

function fusionSpecial(s) {
	var ret = s; 
	ret = ret.replace(/%/g,'%25');
	ret = ret.replace(/&/g,'%26');
	ret = ret.replace(/</g,'&lt;');
	ret = ret.replace(/>/g,'&gt;');
	ret = ret.replace(/'/g,'%26apos;');
	return ret;
}	
	
function myParseInt(s){
	var n = parseInt(s);
	if ( isNaN(n) ) {
		throw "Not a number";
	} else {
		return n;
	}
}


function myCatch(e) {
	if ( typeof(e) == 'string') { // exception by me 
		alert('Error! ' + e);
	} else { // exception by system - some error I overlook? 
		alert('Exception! '+ e.name + ' ' + e.message);
	}
}

function debugStr(s) {
	var ret = s; 
	ret = ret.replace(/</g,'&lt;');
	ret = ret.replace(/>/g,'&gt;');
	return ret;
}	

function checkInt(n) {
	if ( ! n ) {
		return false;
	}
	var i = parseInt(n);
	var f = parseFloat(n);
	if ( isNaN(i)  || isNaN(f) || i < 0 || i != f ) {
		return false;
	}
	return true;
}
