// invitation_common.js
// Sep 16, 2008
// @author: Michael Chen
// (C)opyright, Trellist 2008
//

var IS_RSVP = false;
var template = new Array(30); // optional
var def= new Array();
var ud = new Array();
var ep = new Array(); // event profile data
var dataMap = new Array(); // int. is type; 1=var; 0=static text

dataMap["<Bride's Parents' Names>"] = new Array("tbBrideParentNames",1);
dataMap["<Groom's Parents' Names>"] = new Array("tbGroomParentNames",1);
dataMap["<Bride's First Name>"] = new Array("tbBrideFirstName",1);
dataMap["<Bride's Middle Initial>"] = new Array("tbBrideMiddleName",1);
dataMap["<Bride's Last Name>"] = new Array("tbBrideLastName",1);
dataMap["<Groom's First Name>"] = new Array("tbGroomFirstName",1);
dataMap["<Groom's Middle Initial>"] = new Array("tbGroomMiddleName",1);
dataMap["<Groom's Last Name>"] = new Array("tbGroomLastName",1);


dataMap["<Bride's First and Last Name>"] = new Array("tbBrideFirstName",1," ",0,"tbBrideLastName",1);
dataMap["<Groom's First and Last Name>"] = new Array("tbGroomFirstName",1," ",0,"tbGroomLastName",1);

dataMap["<Bride's First and Middle Names>"] = new Array("tbBrideFirstName",1," ",0,"tbBrideMiddleName",1);
dataMap["<Bride's Full Name>"] = new Array("tbBrideFirstName",1," ",0,"tbBrideMiddleName",1," ",0,"tbBrideLastName",1);
dataMap["<Groom's Full Name>"] = new Array("tbGroomFirstName",1," ",0,"tbGroomMiddleName",1," ",0,"tbGroomLastName",1);

dataMap["<Groom's First and Middle Names>"] = new Array("tbGroomFirstName",1," ",0,"tbGroomMiddleName",1);
dataMap["<Name of Venue>"] = dataMap["<Ceremony Location>"] = new Array("tbVenueName",1);
dataMap["<Street Address>"] = new Array("tbVenueAddress",1);
dataMap["<City, State>"] = new Array("tbVenueCity",1,", ",0,"cbVenueState",1);
dataMap["<Time Spelled Out>"] = dataMap["<time>"] = new Array("tbEventTime",1);

dataMap["<Location of Reception>"] = new Array("tbReceptionLocation",1);
dataMap["<Reception Time Spelled Out>"] = new Array("tbReceptionTime",1);
dataMap["<Reception City, State>"] = new Array("tbReceptionCity",1,", ",0,"cbReceptionState",1);
dataMap["<City>"] = new Array("tbReceptionCity",1);
dataMap["<Day Number>"] = new Array("tbWeddingDay",1);

// special cases...call funcs
dataMap["<Day of Week>"] = new Array("getWeekOfDay()",2);
dataMap["<Day of Week>, the <Day Number> of <Month>"] = new Array("getFormalDate()",2);
dataMap["on <Day of Week>, the <Day Number> of <Month>"] = new Array("on ",0,"getFormalDate()",2);
dataMap["<Year Spelled Out>"] = new Array("getFormalYear()",2); 
dataMap["the <Day Number> of <Month>"] = new Array("getFormalDateNoWeekDay('the ')",2); 
dataMap["after the <Day Number> of <Month>"] = new Array("getFormalDateNoWeekDay('after the ')",2); 

dataMap["<Month>, <Day> <Year>"] = dataMap["<Wedding Date>"] = new Array("tbWeddingMonth",1," ",0,"tbWeddingDay",1,", ",0,"tbWeddingYear",1);

dataMap["<Month>"] = new Array("tbWeddingMonth",1);
dataMap["<Day>"] = new Array("tbWeddingDay",1);
dataMap["<Year>"] = new Array("tbWeddingYear",1);
dataMap["<Bride and Groom's Names>"] = dataMap["<Bride's First Name> and <Groom's First Name>"] = new Array("tbBrideFirstName",1," and ",0,"tbGroomFirstName",1);

// RSVP card use
dataMap["<Month> <Day Number>"] = new Array("getShortDate()",2);

dataMap["RSVP <Month>"] = new Array("tbReceptionMonth",1);
dataMap["RSVP <Day>"] = new Array("tbReceptionDay",1);
dataMap["RSVP <Year>"] = new Array("tbReceptionYear",1);
dataMap["<Month> <Day Number>, <Year>"] = new Array("getFullDate()",2);

dataMap["<in the>"] = new Array("tbInThe",1); // 4c only

function submitNav(page,itemId,title) {
	var mainform = document.mainform;
	mainform._nextPage.value = page;
	mainform._nextItemID.value = itemId;
	mainform._nextTitle.value = title;
	
	mainform.submit();
}

function setMyOption(o,val)
{
	for (var x=0;x < o.length; x++) {
		if (o.options[x].value==val) {
			o.selectedIndex = x;
			return;
		}
	}
}

function walkMainForm()
{
	try {
		var mainform = document.mainform;
		for (var i=0;i < mainform.length; i++) {
			var o = mainform[i];
			var name = o.name;
			if (name==undefined || (name.length > 0 && name.charAt(0)=='_'))
				continue;
			
			myVal = ud[name];
			
			if (myVal==null || myVal==undefined || myVal.length==0)
				continue;
				
			if (o.type=='text') {
				checkLine(o,myVal);
			}
			else if (o.type=='select-one')
				setMyOption(o,myVal);			
			else if (o.type=='checkbox' || o.type=='radio') {
				o.checked = o.value==myVal;
			}
			else if (o.type=='hidden') { // hidden user data
				o.value = myVal;
			}			
		}
	}
	catch (exception) {}	
}

function setMainForm() {
	if (inv_myOldOnLoad!=null) {
		inv_myOldOnLoad();
		inv_myOldOnLoad = null;
	}
	
	try {
		callFunc('pageInit()');
		
		walkMainForm();
		cf_magic(); // would trigger font/color dropdown to grow
		walkMainForm();
		
		setDefault();		
			
		callFunc('setTemplate()');
		callFunc('setTemplateEx()');
		callFunc('loadTemplate()');
		callFunc('formInit()');
	}
	catch (exception) {}	
}

function INV_validate()
{
	var rc = callFunc('validateWording()');
	return rc==true || rc==null || rc==undefined;
}

function callFunc(func)
{
	try {
		return eval(func);
	}
	catch (exception) {}
}

function formInit()
{
	callFunc('formInit_motif()');
	callFunc('formInit_template()');
	callFunc('formInit_envelope()');
	callFunc('formInit_page()');
}

function cf_magic()
{
	try {
		var images = document.images;
		for (var i=0;i < images.length; i++) {
			var imgId = images[i].id;
			if (imgId==null || imgId==undefined) continue;
			if (imgId.indexOf('cf_preview') !=0) continue;

			callFunc('updateImage'+ imgId.substr(10)+'()');
		}	
	}
	catch (exception) {}	
}

var INV_noMapping = false;
function INV_getStrValue(val0)
{	
	if (INV_noMapping) 
		return val0;

	var bInit = val0.indexOf('Initial') >=0;
	var myValArray = dataMap[val0];
				
	if (myValArray==null || myValArray==undefined) return val0;

	var rc = "";
	for (var v=0;v < myValArray.length; v++) {
		var e1 = myValArray[v++];
		var t = myValArray[v];
		
		if (t==1) { // var
			var v1 = ep[e1];
			//////////////////// patch
			if (e1=='tbReceptionMonth') v1 = short2LongMonth(v1);
			////////////////////
			if (v1==null) break; // not filled
			rc += v1;
		}
		else if (t==2) { // function
			var v1 = callFunc(e1);
			if (v1==null) 
			  break;

			rc += v1;
		}
		else // static
			rc += e1;
	}
	
	if (bInit && rc.length > 0) rc = rc.charAt(0);
	return v >= myValArray.length ?  rc : val0; // all resolved or leave org str
}

// 'Mr. <Groom's Full Name>' --> Array('Mr. ',0,'<Groom's Full Name>',1)
function utilGetParts(str)
{
	var def = dataMap[str];
	if (def!=null && def!=undefined)
		return def;
	
	var len = str.length,x,c=0,idx=0;
	var rc = new Array();
	for(;;) {
		var x = str.indexOf("<",c);
		if (x < 0) 
			break;
		
		rc[idx++] = str.substr(c,x-c); // static
		rc[idx++] = 0;
		c = x++;
		x = str.indexOf(">",x);
		if (x < 0)
			break;

		x++; // pass '>'
		rc[idx++] = str.substr(c,x-c); // static
		rc[idx++] = 1;
		c = x;		
	}
	
	if (c < len) {
		rc[idx++] = str.substr(c);
		rc[idx++] = 0;
	}
		
	return rc;
}

function getWordingVal(val)
{
	return checkLine(null,val);
}

function setDefault()
{
	try {
		while(true)
		{
			var exp = def.pop();
			if (exp==null || exp==undefined) break;
			
			var list = exp.split("=");
			var o = document.getElementById(list[0]);
								
			if (o==null || o==undefined)// || o.value.length > 0) 
				continue;

			var val = INV_getStrValue(list[1]);		
			
			if (o.type=='text'||o.type=='textarea'|| o.type=='hidden') {
				if (o.value.length==0 || o.value==list[1]) {
					if (o.size!=null && o.size=='1') { // 1 char init etc.
						o.value = val!=list[1] ? val.substr(0,1) : '';
					}
					else
						o.value = val; 
					o.style.color = "";
				}
			}
			else if (o.type=='select-one') {
				if (val=='<Month>' && ep['tbWeddingMonth']!=undefined) 
					val = ep['tbWeddingMonth'];
	
				if (val=='<Day>' && ep['tbWeddingDay']!=undefined) 
					val = ep['tbWeddingDay'];
					
				if (val=='<Year>' && ep['tbWeddingYear']!=undefined) 
					val = ep['tbWeddingYear'];
					
				if (o.selectedIndex==0) setMyOption(o,val);
			}
			else if (o.type=='checkbox' || o.type=='radio') {
				if (o.type=='radio') {
					var rg = document.mainform[o.name];
					for (var r=0; r < rg.length && !rg[r].checked; r++) {}
					if (r < rg.length) continue;
				}
				
				if (!o.checked) o.checked = (o.value==val);
			}			
		}
	}
	catch(exception) {}
}

function getShortDate()
{
	var m,d;
	
	if (IS_RSVP) {
		m = ep['tbReceptionMonth'];d = ep['tbReceptionDay'];
	}
	else {
		m = ep['tbWeddingMonth'];d = ep['tbWeddingDay'];
	}	
	
	return m!=null && d!=null ? (m+" "+getDayNo(d)) : "";
}

function getFullDate()
{
	var m,d,y;
	
	if (IS_RSVP) {
		 m = ep['tbReceptionMonth'];d = ep['tbReceptionDay'];y = ep['tbReceptionYear'];
	}
	else {
		m = ep['tbWeddingMonth'];d = ep['tbWeddingDay'];y = ep['tbWeddingYear'];
	}
	
	return m!=null && d!=null && y!=null ? (m+" "+d+", "+y) : "";
}

//toFormalDate()
function getFormalDate()
{
	var y = IS_RSVP ? ep['tbReceptionYear'] : ep['tbWeddingYear'];
	if (y==null || y==undefined) return null;
	var m = IS_RSVP ? ep['tbReceptionMonth'] : ep['tbWeddingMonth'];
	if (m==null || m==undefined) return null;
	var d = IS_RSVP ? ep['tbReceptionDay'] : ep['tbWeddingDay'];
	if (d==null || d==undefined) return null;
	
	return _toFormalDate(y, m, d);
}

function getWeekOfDay()
{
	var d = getFormalDate();
	if (d==null) return null;
	return d.split(',')[0];
}

function getRsvpDateString()
{
	var d = ep['tbReceptionDay'];
	if (d==null || d==undefined) return null;
	
	return _getDayString(d);
}

function getFormalDateNoWeekDay(prefix)
{
	var val = getFormalDate();
	if (val==null) return null;
	return prefix+val;
}

function getFormalYear()
{
	var y = ep['tbWeddingYear'];
	if (y==null || y==undefined) return null;
	
	return _toFormalYear(y);
}

function cnt(w){
  var a=w.value;
  a=a.split('\n');
  if (a.length > card_quantity) {
      a = a.slice(0, card_quantity);a = a.join("\n");a=a.substring(0,a.length-1);w.value=a;
  }
}

function checkLine(line,val) {

	var bInit = val.indexOf('Initial') >=0;

	val = val.trim();
	
	if (val==null || val==undefined) val = "";
	if (val.indexOf("<") >= 0 && val.indexOf(">") > 0) {
		var str = dataMap[val];
		
		if (str!=null && str!= undefined) { // direct match
			val = INV_getStrValue(val);
			if (bInit && val.length > 0) val = val.charAt(0);
		}
		else { // partial
		
			var x1 = val.indexOf('<'),x2=0;
			if (x1 >=0) x2 = val.indexOf('<',x1);
			if (x2 > 0) { // ex. '<Month> <Day Number>'
				x2 = val.lastIndexOf('>');
				var valx = val.substring(x1,x2+1);
				str = dataMap[valx];
				if (str!=null && str!= undefined) {
					val = val.substring(0,x1) + checkLine(line,valx);		
				}
				else
					x2 = 0;
			}
			
			if (x2 == 0) {
				var parts = utilGetParts(val);
							
				var str = "";
				for(var p=0;p < parts.length; p++) {
					var val1 = parts[p++];
					var t = parts[p];
					
					str += t==0 ? val1 : INV_getStrValue(val1);
				}
				val = str;	
			}
		}
	}
	
	
	if (line!=null) {
	    line.value = val;
	    line.style.color = (val.indexOf("<") >= 0 && val.indexOf(">") > 0) ? "red" : "";
    }
    
    return val;
}

function onPalColorChange(clr)
{
	callFunc("onPalColorChange_top('"+clr+"')");
	callFunc("onPalColorChange_body('"+clr+"')");
	
	var vals = clr.split("-");
	var ac_div = document.getElementById('ac_div'); // alternative live color
	if (ac_div!=null)
		ac_div.style.display = vals.length > 1 ? 'block' : 'none';
	
	var mc_div = document.getElementById('mc_div'); // motif color
	if (mc_div!=null) {
		mc_div.style.display = vals.length > 1 ? 'block' : 'none';
		var mcSelect = document.getElementById('motifColor');
		if (mcSelect!=null && vals.length > 1) { // 2-color
			var opt1 = mcSelect.options[1];
			opt1.value = opt1.text = vals[1];
		}
	}
}

function onPalFontChange(ft)
{
	callFunc("onPalFontChange_top('"+ft+"')");
	callFunc("onPalFontChange_body('"+ft+"')");
	
	var cf_div = document.getElementById('cf_div'); // combo line font
	if (cf_div!=null) 
		cf_div.style.display = isComboFont(ft) ? 'block' : 'none';
}

function isComboFont(ft)
{
	var ft = ft.toLowerCase();
	var idx = ft.indexOf("combo");
	if (idx >=0) return true;
	
	idx = ft.indexOf("contemporary");
	return idx >=0;
}

function onFontChange_x(ft,prefix,val1)
{
	var cb = isComboFont(ft);
	
	for(var i=1;;i++) {
		var select = document.getElementById(prefix+i);				
		if (select==null || select==undefined) break;

		var options = select.options;
		options.length = cb ? 2 : 1;
		
		if (cb)
			options[1] = new Option(val1, "Line "+i, false, false);
	}	
}


function onPalChange_x(val,prefix,val1)
{
	var vals = val.split("-");
	
	for(var i=1;;i++) {
		var select = document.getElementById(prefix+i);				
		if (select==null || select==undefined) break;

		var options = select.options;
		options.length = vals.length;
		if (val1==null) options[0].text = vals[0];
		
		if (vals.length > 1)
			options[1] = new Option(val1!=null ? val1 : vals[1], "Line "+i, false, false);
	}	
}

function validEnvelopeAddress()
{
	var valid = true;
	var state = document.getElementById('eaState');
	if (state==null) return true; // dont have/care

	valid = state.selectedIndex !=0;
	var flds = new Array('eaStreet','eaCity','eaZip');
	for(var i=0;i < flds.length; i++) {
		var fld = document.getElementById(flds[i]);
		if (fld!=null && fld.value.length==0) {
			valid = false;
			break;
		}
	}
	
	return valid;
}

////////////////////////////////

////////////////////////////////
var inv_myOldOnLoad = window.onload;
window.onload = setMainForm;
