﻿var No_Renewal_Ord_Msg = "<img src='../lib/images/warning_icon.png' align='absmiddle' /> There are no orders to renew. If you received this message in error, please call our Ticket Office at (816) 471-7344.";
var current_pkg = 0;
var current_selected_perf_list = [];
// var current_selected_perf_list_index = 0;
var current_performance = 0;
var count_selected_groups = 0;
var NFSPkgSummary = null;
var selectedZone = 0;
var currentRadioBtn = null;

function get_pkg_details(iSeasonNo, iPkgNo) 
{
    var req = null;

    handler = function() 
    {
        if (req.readyState == 4) 
        {
            document.body.style.cursor = "default";
            if (req.status == 200) 
            {
                var rslt = JSON.parse(req.responseText);
                try 
                {
                    rslt = rslt.d;
                }
                catch (err) { alert(err); }

                if (rslt.Success) 
                {
                    selectedFlexZoneDescription = "";
                    current_selected_perf_list = [];

                    currentPerfGroupPerfs = [];
                    // currentPerfGroupPerfsIndex = 0;

                    // current_selected_perf_list_index = 0;
                    
                    $("#package_detail_panel_form").html(rslt.FormattedHTML);
                    $("#package_detail_panel_form").fadeIn("slow");

                    NFSPkgSummary = rslt.NFSPkgSummary;
                    if (NFSPkgSummary != null) {
                        // determine if there are boxes already checked
                        try {
                            count_selected_groups = parseInt($('#count_selected_groups').html());
                        }
                        catch (e) { }
                    }

                    try {
                        // rslt.Message only exists when there's only 1 zone
                        if (rslt.Message.length > 0) {
                            var perfzone = rslt.Message.split(",");
                            var tobj = getpackagehandler();
                            tobj.zone = parseInt(perfzone[1]);
                            quantities["pkg" + perfzone[0]] = tobj;
                            selectedFlexZoneDescription = perfzone[2];
                            var selectedRadio = document.getElementById("perfzone" + perfzone[0] + "_" + perfzone[1]);
                            if (selectedRadio)
                                selectedRadio.checked = true;
                        }
                        else {
                            var zone_table = document.getElementById("zone_table");
                            if (zone_table) {
                                var zoneInputs = zone_table.getElementsByTagName("input");
                                if (zoneInputs.length == 1) {
                                    zoneInputs[0].checked = true;
                                    selectedZone = zoneInputs[0].value;
                                }
                            }
                        }
                    }
                    catch (err) { }
                }
                else { $("#package_detail_panel_form").html(""); }
            }
        }
    }

    try {
        req = getreq();

        if (req && iPkgNo != current_pkg ) {
            document.body.style.cursor = "wait";
            req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "GetPackage"), true);
            req.setRequestHeader("Content-Type", "application/json");
            req.onreadystatechange = this.handler;
            var qs = "{pkg_no:" + iPkgNo + "}";
            req.send(qs);
        }
    }
    catch (e) { alert("Error: " + e); }

}

function setPriceTypeQuantity(howmany, iPkgNo, iPriceType, ptindex) {
    var tobj;
    if (quantities["pkg" + iPkgNo] == null)
        tobj = getpackagehandler();
    else
        tobj = quantities["pkg" + iPkgNo];

    for (var x = 0; x <= ptindex; x++) {
        if (tobj.qty[x] == null) {
            tobj.qty[x] = 0;
            tobj.pt[x] = 0;
        }
    }
    tobj.qty[ptindex] = howmany
    tobj.pt[ptindex] = iPriceType

    if (selectedZone > 0)
        tobj.zone = selectedZone; // we only do this when there's only 1 zone to select and [hopefully] it's preselected
    else if (NFSPkgSummary) {
        if (selectedPerfNo == 0) {
            for (var x = (current_selected_perf_list.length - 1); x > -1; x--) {
                selectedPerfNo = current_selected_perf_list[x].PerfNumber;
                if (selectedPerfNo > 0)
                    break;
            }
        }
        tobj.zone = GetZoneIDForPerformance(selectedPerfNo)
    }
    else
        tobj.zone = getZone();

    quantities["pkg" + iPkgNo] = tobj;
    if (!checkPackage(iPkgNo)) {
        var ddl = document.getElementById("p_" + iPkgNo + "pt_" + iPriceType);
        if (ddl)
            ddl.selectedIndex = 0; // will this generate an on-change event?
    }
}

function getZone() {
    var zone_no = 0;
    var zone_table = document.getElementById("zone_table");
    if (zone_table) {
        var zone_radio_buttons = zone_table.getElementsByTagName("input");
        for (var x = 0; x < zone_radio_buttons.length; x++)
            if (zone_radio_buttons[x].checked) {
            zone_no = parseInt(zone_radio_buttons[x].value);
            break;
        }
    }
    return zone_no;
}

var quantities = [];
function setZone(iPkgNo, iZoneNo) {
    var tobj;
    if (quantities["pkg" + iPkgNo] == null)
        tobj = getpackagehandler();
    else
        tobj = quantities["pkg" + iPkgNo];
    tobj.zone = iZoneNo;
    quantities["pkg" + iPkgNo] = tobj;
    checkPackage(iPkgNo);
}

function getpackagehandler() {
    var tobj = {};
    tobj.qty = [];
    tobj.pt = [];
    tobj.zone = 0;
    return tobj;
}

function checkPackage(iPkgNo) {
    this.setEnable = function(bVal) {
        var btn = document.getElementById("btn_purchase" + pkg_no);
        if (btn)
            btn.disabled = bVal;
    }

    var result = false;
    if (NFSPkgSummary != null) {
        result = validateNFSPackage();
        if (!result) {
            this.setEnable(true);
            return result;
        }
    }

    var pkg_no = iPkgNo;
    tobj = quantities["pkg" + iPkgNo];
    if (tobj != null) {
        if (tobj.zone > 0) {

            var howmany = 0;
            for (var x = 0; x < tobj.qty.length; x++)
                howmany += parseInt(tobj.qty[x]);

            result = (howmany > 0);
            if (howmany > 0)
                this.setEnable(false);
        }
        else
            this.setEnable(false);
    }
    return result;
}

function cancel_select_perf_group(pg_no) {
    close_pg(pg_no);
}

function purchase_subs(iPkgNo) {
    var target = quantities["pkg" + iPkgNo];
    var req = getreq();
    var qty = 0;
    var subs_unseated = true;

    getptlist = function() {
        var retval = "";
        for (var x = 0; x < target.qty.length; x++) {
            qty += parseInt(target.qty[x]);
            if (target.qty[x] > 0)
                for (var y = 0; y < target.qty[x]; y++) {
                if (retval.length > 0) retval += ",";
                retval += target.pt[x];
            }
        }
        return retval;
    }

    this.handler = function() {
    	if (req.readyState == 4) {
    		document.body.style.cursor = "default";
    		if (req.status == 200) {
    			rslt = JSON.parse(req.responseText);
    			try {
    				rslt = rslt.d;
    			}
    			catch (err) { }
    			if (rslt.Success) {
    				location.href = "/cart/index.aspx";
    			}
    			else {
    				if (rslt.ErrorMessage.indexOf("Either @seat_no or @zone_no must be non-zero") > -1)
    					alert("Please select your seating section.");
    				else
    					alert("Sorry, your reservation request was not successful. It might succeed if you select a smaller quantity, or choose a different seating section.");
    				// alert(rslt.ErrorMessage);
    			}

    		}
    		else
    			alert(req.responseText);
    	}
    }

    this.errorMessage = "";

    this.validate = function(bUnseated) {
        var pt = getptlist();
        if (bUnseated)
            return { parent_pkg_no: 0, pricetype: pt, pkg_no: iPkgNo, quantity: qty, zone: target.zone };
        else
            return { pricetype: pt, pkg_no: iPkgNo, quantity: qty, zone: target.zone, requestedseats: "", leavesingleseats: false };
    }


    if (req && NFSPkgSummary != null) {
        var flexObj = { pkg_no: iPkgNo, performances: [] };
        if (validateNFSPackage()) {
            var ptlist = getptlist();

            var current_performance_index = 0;
            for (var x = 0; x < current_selected_perf_list.length ; x++)
                if (current_selected_perf_list[x] != null) {
                var zone_no = current_selected_perf_list[x].ZoneNumber;
                var flexitem = { perf_group_no: current_selected_perf_list[x].GroupNumber, perf_no: current_selected_perf_list[x].PerfNumber, pricetype: ptlist, quantity: qty, zone: zone_no };
                flexObj.performances[current_performance_index++] = flexitem;
            }

            document.body.style.cursor = "wait";
            req.open(HTTP_VERB, (srvr + WEBSERVICE + "AddFlexPackage"), true);
            req.setRequestHeader(CONTENT_TYPE, APP_JSON);
            req.onreadystatechange = this.handler;
            req.send(JSON.serialize(flexObj));
        }
        else
            alert("Flex package validation error: " + this.errorMessage);
    }
    else {
        var sendObj = this.validate(subs_unseated);
        if (req && sendObj) {
            var target_method = subs_unseated ? "AddPackageItem" : "AddPackageItemSeated"
            document.body.style.cursor = "wait";
            req.open(HTTP_VERB, (srvr + WEBSERVICE + target_method), true);
            req.setRequestHeader(CONTENT_TYPE, APP_JSON);
            req.onreadystatechange = this.handler;
            req.send(JSON.serialize(sendObj));
        }
    }
}

function buildSelectedPerfs() {
    var newHTML = "<table cellspacing='0' width='100%' id='perf_list_table'>";
    for (var x = 0; x < current_selected_perf_list.length; x++) {
        if (current_selected_perf_list[x] != null) {
            newHTML += "<tr><td style='width: 100%'>";
            newHTML += current_selected_perf_list[x].Title;
            newHTML += "&nbsp;&ndash;&nbsp;<span class='action' onclick='remove_perf_item(" + x + ")'>Remove</span>";
            newHTML += "</td></tr>";
        }
    }
    newHTML += "</table>";
    $('#selected_performances').html(newHTML);
}

function remove_perf_item(iIndexId) {
    // alert( "remove_perf_item " + iIndexId );
    var item = current_selected_perf_list[iIndexId];
    $('#splink' + current_pkg + '_' + item.GroupNumber).show();
    current_selected_perf_list[iIndexId] = null;
    var ui_item = $g('pg' + item.GroupNumber + 'p' + item.PerfNumber);
    if (ui_item) {
    	ui_item.checked = false;
    	RecordFlexItem(item.PerfNumber, item.GroupNumber, 0, 0, 0);
    }
    buildSelectedPerfs();
}

var selectedPerfDescription = null;
var selectedPerfNo = 0


function select_perf_group(oChkbx, pkg_no, pg_no, pkg_min, pkg_max) {
    current_pkg = pkg_no;
    if (oChkbx.checked) {
        if (count_selected_groups < pkg_max) {
            count_selected_groups++;
            $('#splink' + pkg_no + "_" + pg_no).show(); 		// Show the "Select Performance" link
        }
        else {
            // too many selected: display error message and uncheck box
            oChkbx.checked = false;
            alert("Please deselect another package group, then try making this selection again.");
        }
    }
    else {
        // user unchecked current box
        count_selected_groups--;
        $('#splink' + pkg_no + "_" + pg_no).hide();
        for (var x = 0; x < current_selected_perf_list.length; x++) {
            if (current_selected_perf_list[x] != null && current_selected_perf_list[x].GroupNumber == pg_no) {
                current_selected_perf_list[x] = null;
                break;
            }
        }
        buildSelectedPerfs();
    }
    // alert( "pkg_no, pg_no, pkg_min, pkg_max = " + pkg_no + ", " + pg_no + ", " + pkg_min + ", " + pkg_max );
}


var last_pkg_no = 0;
var targetrect;
var splinkxy;

function select_performances_for_perf_group(pkg_no, pg_no) {
    last_pkg_no = pkg_no;
    splinkxy = getxy("splink" + pkg_no + "_" + pg_no);
    var divToShow = document.getElementById("pgdetail" + pg_no);
    if (divToShow) {
        divToShow.style.left = "" + (splinkxy.x + 40) + "px";
        divToShow.style.top = "" + (splinkxy.y - 125) + "px";
        targetrect = { left: (splinkxy.x + 40), top: (splinkxy.y - 125), width: 300, height: 250 };
        var zoom_rect = document.getElementById("zoom_rect");

        if (zoom_rect)
            animate.open(divToShow, function() { divToShow.style.display = "block"; $("select.ie6select").hide(); }, null, splinkxy, targetrect);
        else
        	divToShow.style.display = "block";

        if (currentPerfGroupPerfs.length == 0) {
        	var item = null;
        	for (var x = 0; x < current_selected_perf_list.length; x++) {
        		if (current_selected_perf_list[x] && current_selected_perf_list[x].GroupNumber == pg_no && current_selected_perf_list[x].PerfNumber > 0) {
        			item = { "perf_no": current_selected_perf_list[x].PerfNumber, desc: current_selected_perf_list[x].Title };
        			currentPerfGroupPerfs.push(item);
        		}
        	}
        }
    }
    // alert("display perfrmances for group #" + pg_no );
}

var currentPerfGroupPerfs = [];
// var currentPerfGroupPerfsIndex = 0;
function selectPerformanceInGroup(iGroupNo, iPerfNo, iSelected, sDescription) {
    var perf_no = iPerfNo;
    try {
        perf_no = parseInt(iPerfNo);
    }
    catch (e) { }
    if (iSelected) {
        if (perf_no > 0) {
            var current_perf_group = getGroupInfo(iGroupNo);
            var current_perf_count_for_group = countPerformancesInPerfGroup(iGroupNo);
            if (current_perf_count_for_group > 0) {
                if (current_perf_group.num_perf_max == 1) {
                    // this perf group only wants one performance at a time, so remove anything else
                    currentPerfGroupPerfs = [];
                    // currentPerfGroupPerfsIndex = 0;
                }
            }
            var item = {}
            item.perf_no = perf_no;
            item.desc = sDescription;
            currentPerfGroupPerfs.push(item);
       }
       RecordFlexItem(perf_no, iGroupNo, 0, 1, 0); 
    }
    else {
    	for (var x = 0; x < currentPerfGroupPerfs.length; x++) { // currentPerfGroupPerfsIndex
			if (currentPerfGroupPerfs[x].perf_no == perf_no) {
				currentPerfGroupPerfs[x].perf_no = 0;
				break;
			}
       }
       RecordFlexItem(perf_no, iGroupNo, 0, 0, 0); 

    }
    
   }


var flexPendingCount = 0;
var flexPendingCurrentPG = 0;
function RecordFlexItem(perf_no, perf_group_no, pricetype, quantity, zone ) {

   	var req = getreq();
   	this.handler = function() {
   		if (req.readyState == 4) {
   			if (flexPendingCount > 0)
   				flexPendingCount--;
   			if (flexPendingCount == 0) {
   				setTransparency('btn_select_pg' + flexPendingCurrentPG, 100);
   				evaluateCurrentPackageGroup(flexPendingCurrentPG);
   				flexPendingCurrentPG = 0;
   			}
   		}
   	}

   	if (req) {
   		req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "RecordFlexItem"), true);
   		req.setRequestHeader("Content-Type", "application/json");
   		req.onreadystatechange = this.handler;
   		var qs = { "currentPackageNo": current_pkg, "item": { "perf_group_no": perf_group_no, "perf_no": perf_no, "pricetype": pricetype, "quantity": quantity, "zone": zone} };
   		req.send(JSON.serialize(qs));
   		flexPendingCount++;
   		if (flexPendingCount == 1)
   		{
   			setTransparency('btn_select_pg' + perf_group_no, 20);
   			flexPendingCurrentPG = perf_group_no;
   		}
   	}

}

function getGroupInfo(iGroupNo) {
    for (var x = 0; x < NFSPkgSummary.Groups.length; x++) {
        if (NFSPkgSummary.Groups[x].perf_group_no == iGroupNo)
            return NFSPkgSummary.Groups[x];
    }
    return null;
}

function evaluateCurrentPackageGroup(iGroupNo) {
    if (NFSPkgSummary != null) {
        for (var x = 0; x < NFSPkgSummary.Groups.length; x++) {
            if (NFSPkgSummary.Groups[x].perf_group_no == iGroupNo) {

            	var perf_count = countPerformancesInPerfGroup(iGroupNo);
                var btn = document.getElementById("btn_select_pg" + iGroupNo);

                if (btn && perf_count >= NFSPkgSummary.Groups[x].num_perf_min && perf_count <= NFSPkgSummary.Groups[x].num_perf_max) {
                	btn.disabled = false;
                	GetFlexPricingGrid(perf_count);
                }
                else if (btn) {
	               btn.disabled = true;
		            $('#flex_pkg_pricing').slideUp();
                }

                break;
            }
        }
    }
}

function append_selected_perf_group(iGroupNo, sAltDescription, iAltPerfNo) {
    for (var x = 0; x < NFSPkgSummary.Groups.length; x++) {
        if (NFSPkgSummary.Groups[x].perf_group_no == iGroupNo) {
        	for (var y = 0; y < currentPerfGroupPerfs.length ; y++) { // was currentPerfGroupPerfsIndex
        		if (currentPerfGroupPerfs[y] && currentPerfGroupPerfs[y].perf_no > 0) {
        			var OK2Add = true;
        			for (var z = 0; z < current_selected_perf_list.length ; z++)
        				if (current_selected_perf_list[z] && current_selected_perf_list[z].PerfNumber == currentPerfGroupPerfs[y].perf_no)
        					OK2Add = false;
        				if (OK2Add) {
        					var selectedObj = {};
        					/*
        					var menu = document.getElementById("ddl_perf_group" + iGroupNo);
        					if (menu)
        					{
        					if (menu.options)
        					selectedObj.Title = menu.options[menu.selectedIndex].text;
        					else
        					selectedObj.Title = selectedPerfDescription;
        					selectedObj.PerfNumber = selectedPerfNo;
        					}
        					else
        					{
        					selectedObj.Title = sAltDescription;
        					selectedObj.PerfNumber = iAltPerfNo;
        					}
        					*/

        					selectedObj.Title = currentPerfGroupPerfs[y].desc;
        					selectedObj.PerfNumber = currentPerfGroupPerfs[y].perf_no;
        					selectedObj.GroupNumber = iGroupNo;
        					selectedObj.ZoneNumber = GetZoneIDForPerformance(selectedObj.PerfNumber);
        					current_selected_perf_list.push(selectedObj);
        				}
                }
            }

            $('#splink' + current_pkg + '_' + iGroupNo).hide(); // hides the "Select Performance" text
            buildSelectedPerfs(); 							// displays the currently selected performances
            break;
        }
    }
    
	// for (var y=0; y<current_selected_perf_list_index; y++)
	//	RecordFlexItem(current_selected_perf_list[y].PerfNumber, current_selected_perf_list[y].GroupNumber, current_selected_perf_list_index == 2 ? "16":"14", 1, 0);   
    currentPerfGroupPerfs = [];
    // currentPerfGroupPerfsIndex = 0;
}

function set_zone(iZone_no, sZoneDesc) {
	for (var x = 0; x < current_selected_perf_list.length; x++)
		if ( current_selected_perf_list[x] )
			current_selected_perf_list[x].ZoneNumber = iZone_no;
		
}

function GetFlexPricingGrid(perf_count) {
	var req = getreq();
	this.handler = function() {
		if (req.readyState == 4) {
			document.body.style.cursor = "default";
			if (req.status == 200) {
				var rslt = JSON.parse(req.responseText);
				try {
					rslt = rslt.d;
				}
				catch (Error) { /* ignore */ }

				if (rslt.Success) {
					// $('#flex_pkg_pricing').hide();
					$('#flex_pkg_pricing').html(rslt.FormattedHTML);
					$('#flex_pkg_pricing').show("slow");

					if (req.perf_count && req.perf_count == 3) {
						$('tr#pt14').show();
						$('tr#pt16').hide();
					} else if (req.perf_count && req.perf_count == 2) {
						$('tr#pt14').hide();
						$('tr#pt16').show();
					}
					//else
					// alert("GetFlexPricingGrid: perf_count"+req.perf_count);
				}
				else {
					alert(rslt.ErrorMessage);
				}
			}
			else {
				alert(req.responseText);
			}
		}
	}

	this.validate = function() {
		var retval = { pkg_no: current_pkg };
		return retval; // if no problems, otherwise return null and display alert!
	}

	var sendObj = this.validate();

	if (req && sendObj) {
		req.open("POST", (srvr + WEBSERVICE + "GetFlexPricingGrid"), true);
		req.setRequestHeader(CONTENT_TYPE, APP_JSON);
		req.onreadystatechange = this.handler;
		document.body.style.cursor = "wait";
		req.send(JSON.serialize(sendObj));
		req.perf_count = perf_count;
	}
}

function submit_pg(iGroupNo) {
    // have the animation vanishing point seem to go to the selected performances box;
    splinkxy = getxy("selected_performances");
    var perf_list_table = document.getElementById("perf_list_table"); // dynamic table containing selected performances
    var rowcount = 0;
    if (perf_list_table)
        rowcount = perf_list_table.rows.length;
    splinkxy.x += 120;
    splinkxy.y += 10 + (rowcount * 18);
    close_pg(iGroupNo);
    // alert("submit performance group");
    append_selected_perf_group(iGroupNo);
    var perf_count = 0;
    for (var x = 0; x < current_selected_perf_list.length; x++)
    	if (current_selected_perf_list[x] && current_selected_perf_list[x].PerfNumber > 0)
		   	perf_count++;
    GetFlexPricingGrid(perf_count);
	// else alert('unexpected count of performances!');
	$('tr#pt7').hide();
	$('h4.nfs').slideDown("normal", function() { $('table#tbl_pricing').slideDown(); });
}

var selectedFlexZoneDescription = "";

function selectFlexZone(sZoneDesc) {
    selectedFlexZoneDescription = sZoneDesc;
    for (var x = 0; x < current_selected_perf_list.length; x++) {
        if (current_selected_perf_list[x]) {
            current_selected_perf_list[x].ZoneNumber = GetZoneIDForPerformance(current_selected_perf_list[x].PerfNumber);
        }
    }
}

function GetZoneIDForPerformance(iPerfNo) {
    if (selectedFlexZoneDescription == "")
        return 0;

    var pzi = null;
    try {
        pzi = NFSPkgSummary.ZonesForNFSPackage.NFSPackageZoneItems;
    }
    catch (er) { }
    if (pzi != null) {
        for (var x = 0; x < pzi.length; x++)
            if (pzi[x].perf_no == iPerfNo && pzi[x].zone_desc == selectedFlexZoneDescription) {
            return pzi[x].zone_no;
        }
    }
    return 0;
}

function countPerformancesInPerfGroup(iGroupNo) {
    var perf_count = 0;
    var y;
    for (y = 0; y < currentPerfGroupPerfs.length; y++) {
    	if ( currentPerfGroupPerfs[y] && currentPerfGroupPerfs[y].perf_no > 0)
            perf_count++;
          }
    if (currentPerfGroupPerfs.length == 0) {
    	for (y = 0; y < current_selected_perf_list.length; y++) {
    		if (current_selected_perf_list[y] && current_selected_perf_list[y].GroupNumber == iGroupNo && current_selected_perf_list[y].PerfNumber > 0)
    			perf_count++;
    	}
	}
    
    return perf_count;
}

function close_pg(pg_no) {
    var divToShow = document.getElementById("pgdetail" + pg_no);
    if (divToShow) {
        $("select.ie6select").show();
        divToShow.style.display = "none";
        var zoom_rect = document.getElementById("zoom_rect");
        if (zoom_rect)
            animate.close(divToShow, null, null, splinkxy, targetrect);
    }
}

function validateNFSPackage() {
    if (count_selected_groups < NFSPkgSummary.num_perf_min || count_selected_groups > NFSPkgSummary.num_perf_max) {
        alert("Insufficient number of Performance Groups selected.");
        return false;
    }
    else {
        // for ( var y = 0; y < current_selected_perf_list.length; y++ )
        // 	if ( current_selected_perf_list[y] != null )
        // 		current_selected_perf_list[y].zone = zone_no;

        for (var x = 0; x < NFSPkgSummary.Groups.length; x++) {
            var curr_perf_group = NFSPkgSummary.Groups[x];

            var curr_perf_group_perf_count = 0;

            for (var y = 0; y < current_selected_perf_list.length ; y++) {
                if (current_selected_perf_list[y] != null && current_selected_perf_list[y].GroupNumber == curr_perf_group.perf_group_no) {
                    curr_perf_group_perf_count++;
                }
            }

            if (curr_perf_group_perf_count == 0 && curr_perf_group.num_perf_min > 0 && curr_perf_group.SinglePerfNumber > 0) {
                var selectedObj = {};
                selectedObj.PerfNumber = curr_perf_group.SinglePerfNumber;
                selectedObj.GroupNumber = curr_perf_group.perf_group_no;
                selectedObj.ZoneNumber = GetZoneIDForPerformance(selectedObj.PerfNumber);
                current_selected_perf_list.push(selectedObj);
                // current_selected_perf_list_index++;
                curr_perf_group_perf_count++;
            }

            if (curr_perf_group_perf_count < curr_perf_group.num_perf_min || curr_perf_group_perf_count > curr_perf_group.num_perf_max) {
                alert("Performance Group #" + curr_perf_group.perf_group_no + " requires a minimum of " + curr_perf_group.num_perf_min + " and a maximum of " + curr_perf_group.num_perf_max + ". You've selected " + curr_perf_group_perf_count + ".");
                return false;
            }
        }
    }
    return true;
}

/* ---------------------------------------------------------------------------------------------------------------------------------------------- */

var existing_order_no = 0;
function select_order_to_renew( i ) 
{
    existing_order_no = i;
}

function load_existing_order() 
{
    var req = getreq();

    handler = function() {
        if (req.readyState == 4) {
            if (req.status == 200) {
                var rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (err) { alert(err); }
                var msg = "";
                if (rslt.Success) {
                    msg += "<i>Redirecting to cart...</i>";
                    window.location.href = "../cart/index.aspx";
                }
                $("#renewal_msg").html(msg);
                $("#renewal_msg").slideDown("slow");
            }
        }
    }
    
    req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "LoadExistingOrder"), true);
    req.setRequestHeader("Content-Type", "application/json");
    req.onreadystatechange = this.handler;
    var qs = "{order_no:" + existing_order_no + "}";
    req.send(qs);
}

function get_existing_orders() 
{   
    var req = getreq();

    handler = function() {
    	if (req.readyState == 4) {
    		$("#renewal_msg").hide();
    		if (req.status == 200) {
    			var rslt = JSON.parse(req.responseText);
    			try {
    				rslt = rslt.d;
    			}
    			catch (err) { alert(err); }
    			var msg = "";
    			if (rslt.Success) {
    				var order_count = 0;
    				try {
    					order_count = parseInt(rslt.Message);
    				}
    				catch (err) { }

    				if (order_count == 1) {
    					msg += "<i>Redirecting to cart...</i>";
    					window.location.href = "../cart/index.aspx";
    				}
    				else if (order_count > 1)
    					msg += rslt.FormattedHTML;
    				else
    					msg += No_Renewal_Ord_Msg;
    			}
    			else {
    				if (rslt.Message == "Existing Order") {
    					msg = "Redirecting to your cart.";
    					location.href = "/cart/index.aspx";
    				}
    				else
    					msg += "<img src='../lib/images/warning_icon.png' align='absmiddle' />  " + rslt.ErrorMessage;
    			}

    			$("#renewal_msg").html(msg);
    			$("#renewal_msg").slideDown("slow");
    		}
    	}
    }
    
    req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "GetExistingOrderInfo"), true);
    req.setRequestHeader("Content-Type", "application/json");
    req.onreadystatechange = this.handler;
    req.send("");
    $("#renewal_msg").html("<img src='" + srvr + ROOT + "/lib/images/wait_spinner24x24.gif' align='absmiddle' /> <i>Please wait while we load your order...</i>");
    $("#renewal_msg").slideDown("slow");
}

function login_order() {

    var req = getreq();
    handler = function() {
    	if (req.readyState == 4) {
    		$('#btn_ologin').show();
    		$('#ologin_wait').fadeOut("slow");
    		if (req.status == 200) {
    			var rslt = JSON.parse(req.responseText);
    			try {
    				rslt = rslt.d;
    			}
    			catch (err) { alert(err); }

    			if (rslt.Success && rslt.ErrorMessage.length == 0) {
    				$("#renewal_login_options").slideUp('slow');
    				$('#ologin_wait').html("<i>Login Successful!</i>");
    				createCookie("KcoperaUser", rslt.AccountInfo.NameFirst + " " + rslt.AccountInfo.NameLast, 0);
    				customer_status();
    				if (rslt.UpgradeLoginPolicyRequires) {
    					document.getElementById("tbx_new_email").value = rslt.AccountInfo.Email;
    					toggle_update_login();
    				}
    				else
    					get_existing_orders();
    			}
    			else {
    				$("#renewal_msg").html("<img src='../lib/images/warning_icon.png' align='absmiddle' /> " + rslt.ErrorMessage);
    				$("#renewal_msg").slideDown("slow");
    			}
    		}
    	}
    }

    form_validate = function() 
    {
        var errmsg = "";
        var retval = {};
        var order_no = document.getElementById('tbx_order_no').value;
        if (order_no.length == 0)
            errmsg += "Order Number required.\n"
        else
            retval.order_no = order_no;

        var customer_no = document.getElementById('tbx_cust_no').value; ;
        if (customer_no.length == 0)
            errmsg += "Subscriber Account Number required."
        else
            retval.customer_no = customer_no;

        if (errmsg.length == 0)
            return retval;
        else {
            alert(errmsg);
        }
    }

    var sendObj = form_validate();

    if (sendObj) 
    {
        req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "LoginWithOrderNo"), true);
        req.setRequestHeader(CONTENT_TYPE, APP_JSON);
        req.onreadystatechange = this.handler;
        req.send(JSON.serialize(sendObj));
        $('#renewal_msg').html("");
        $('#btn_ologin').hide();
        $('#ologin_wait').html("<img src='" + srvr + ROOT + "/lib/images/wait_spinner24x24.gif' align='absmiddle' /> <i>Logging In...</i>");
        
    }    

}

/* ---------------------------------------------------------------------------------------------------------------------------------------------- */

function login_email() 
{
    var req = getreq();
    handler = function() {
        if (req.readyState == 4) {
            $('#btn_elogin').show();
            $('#elogin_wait').fadeOut("slow");
            if (req.status == 200) {
                var rslt = JSON.parse(req.responseText);
                try {
                    rslt = rslt.d;
                }
                catch (err) { alert(err); }

                if (rslt.Success && rslt.ErrorMessage.length == 0) {
                    $("#renewal_login_options").slideUp('slow');
                    $('#elogin_wait').html("<i>Login Successful!</i>");
                    createCookie("KcoperaUser", rslt.AccountInfo.NameFirst + " " + rslt.AccountInfo.NameLast, 0);
                    customer_status();
                    if (rslt.LoginInfo.Status == "T") {
                        document.getElementById("tbx_new_email").value = rslt.AccountInfo.Email;
                        toggle_update_login();
                    } else 
                        get_existing_orders();
                }
                else {
                    $("#renewal_msg").html(rslt.ErrorMessage);
                    $("#renewal_msg").slideDown('slow');
                }
            }
        }
    }

    form_validate = function() {
        var errmsg = "";
        var retval = {};
        var email = document.getElementById('tbx_renewal_email').value;
        if (email.length == 0)
            errmsg += "Email Address required.\r\n"
        else if (!email_validation(document.getElementById('tbx_renewal_email').value))
            errmsg += "Email Address format is incorrect.\r\n"
        else
            retval.email = email;

        var password = document.getElementById('tbx_renewal_pass').value; ;
        if (password.length == 0)
            errmsg += "Password required."
        else
            retval.pass = password;

        if (errmsg.length == 0)
            return retval;
        else {
            alert(errmsg);
        }
    }

    var sendObj = form_validate();

    if (sendObj) {
        req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "LoginWithEmail"), true);
        req.setRequestHeader(CONTENT_TYPE, APP_JSON);
        req.onreadystatechange = this.handler;
        req.send(JSON.serialize(sendObj));
        $("#renewal_msg").html("");
        $('#btn_elogin').hide();
        $('#elogin_wait').html("<img src='" + srvr + ROOT + "/lib/images/wait_spinner24x24.gif' align='absmiddle' /> <i>Logging In...</i>");
    }    
}

var update_login_visible = false;
function toggle_update_login(oCallback) 
{
    panel_holder_height = 300;
    var loc = getxy(document.getElementById("opening"));
    var update_login_panel_holder = document.getElementById("update_login_panel_holder");
    if (update_login_visible)
        animate.close("update_login_panel_holder", function() { $("#update_login_panel_holder").hide(); update_login_visible = false; if (oCallback) { oCallback(); } }, null, panel_holder_mousepos, panel_holder_zoomrect);
    else {
        if (update_login_panel_holder) 
        {
            $("#update_login_panel_holder").css("left", "" + (loc.x + 130) + "px");
            $("#update_login_panel_holder").css("top", "" + (loc.y + 100) + "px");
            panel_holder_zoomrect = { left: (loc.x + 130), top: (loc.y + 100), width: panel_holder_width, height: panel_holder_height };
            panel_holder_mousepos = { x: (loc.x + 130), y: (loc.y + 100) };
            animate.open("update_login_panel_holder", function() { $("#update_login_panel_holder").show(); update_login_visible = true; }, null, panel_holder_mousepos, panel_holder_zoomrect);
        }
    }
}

function do_update_login() 
{

    var req = getreq();
    handler = function() {
    	if (req.readyState == 4) {
    		if (req.status == 200) {
    			$('#btn_update_login').show();
    			var rslt = JSON.parse(req.responseText);
    			try {
    				rslt = rslt.d;
    			}
    			catch (err) { alert(err); }
    			if (rslt.Success) {

    				toggle_update_login();
    				get_existing_orders();
    			} else {
    				$("#sp_update_login").html("");
    				alert(rslt.ErrorMessage);
    			}
    		}
    	}
    }

    form_validate = function() {
        var retval = {};
        var errmsg = "";

        retval.login = document.getElementById('tbx_new_email').value;
        if (retval.login.length == 0)
            errmsg += "New Login required.";

        if (!email_validation(retval.login.trim()))
            errmsg += "Email format is incorrect.\r\n";

        retval.password = document.getElementById('tbx_new_password').value;
        if (retval.password.length == 0)
            errmsg += "New Password required.";

        retval.email = retval.login;

        if (errmsg.length > 0)
            alert(errmsg);
        else
            return retval;
    }

    var sendObj = form_validate();

    if (sendObj) {
        req.open(HTTP_VERB, (srvr + ROOT + WEBSERVICE + "UpdateLogin"), true);
        req.setRequestHeader(CONTENT_TYPE, APP_JSON);
        req.onreadystatechange = this.handler;
        req.send(JSON.serialize(sendObj));
        $('#btn_update_login').hide();
        $("#sp_update_login").html("<img src='" + srvr + ROOT + "/lib/images/wait_spinner24x24.gif' align='absmiddle' /> <i>Updating login credentials...</i>");
    }
}

function no_update_login() {
    toggle_update_login();
    try {
        $("#renewal_msg").html("<img src='" + srvr + ROOT + "/lib/images/wait_spinner24x24.gif' align='absmiddle' /> <i>Please wait while we load your order...</i>");
        get_existing_orders();
    } catch (e) { }    
}

function toggle_seatmap( iFacility_no ) {
    panel_holder_width = 400;    
    panel_holder_height = 500;
    var ww = getwindowsize();
    var notification_panel_holder = document.getElementById("notification_panel_holder");
    
    if (notification_visible)
        animate.close("notification_panel_holder", function() { $("#notification_panel_holder").hide(); notification_visible = false; }, null, panel_holder_mousepos, panel_holder_zoomrect);
    else {
        if (notification_panel_holder) {
            $("#sp_close").click(function() { toggle_seatmap(); });
            $("#notification_panel_form").html("<img src='../lib/images/seatmaps/V" + iFacility_no + ".gif' />");
            $("#notification_panel_label").html("Seating Chart");
            $("#notification_panel_holder").css("left", "" + (ww.x / 2) + "px");
            $("#notification_panel_holder").css("top", "" + (ww.y / 2) + "px");
            panel_holder_zoomrect = { left: (ww.x / 2), top: (ww.y / 2), width: panel_holder_width, height: panel_holder_height };
            panel_holder_mousepos = { x: (ww.x / 2), y: (ww.y / 2) };
            animate.open("notification_panel_holder", function() { $("#notification_panel_holder").show(); notification_visible = true; }, null, panel_holder_mousepos, panel_holder_zoomrect);
        }
    }
}