
//var xmlString = "";
//var xmlStringToEmbed = "";
var windowList = new Array();
var currentid = "Chart";
var childrenFound = 0;
var lastRenderAs = "";
htmlproceed = true;   // to disable and enable viewHTML button
var isFinancialChart = false;
var isSeries1Reset = false;
var isSeries2Reset = false;

var ChartDesignerWrapper = function() {

    this.vXML = new visifire.ChartDesigner();
    this.updateflag = "stop";		// flag to start  or stop live update
    this.tempflag = 0;					// flag to enable or disable updates buttons
	this.updatetype = 0;	  		// flag to increase  or  decrease datapoints value in series  
    this.y1 = new Array();	
    this.y2 = new Array();
    this.z1 = new Array();
    this.z2 = new Array();
    vWrapperObject = this;
}

ChartDesignerWrapper.prototype.defaultwindow = function() {
    hideWindow();
    var obj1 = document.getElementById('WindowChart');
    obj1.style.visibility = "visible";

    var obj20 = document.getElementById('WindowDraw');
    obj20.style.visibility = "visible";

    checkDownloadType();                                // to check the EMBED XML text box  
    this.drawChart();
}

ChartDesignerWrapper.prototype.drawChart = function() {
    makeDataSeriesElementActive();                      // to disable YValue of Empty data Series
    this.vXML.renderXML();
}

ChartDesignerWrapper.prototype.update = function(pId, pP, pAttr, pVal, pType) {
    /*
    update() is a function to support real Time chart interactivity in chart designer it till take 5 arguments
    Meaning Of the Constructor Parameters  --------------------------------------------------------------

    pId            > Element Id of Input or Select Id of calling control 
    pP             >Path of property/Attribute E.G :for "Enabled" for AxisY Path will be "chart.AxesY[0]"  
    pAttr          > The name of Property/Attribute E.G "Enabled"
    In case of Events the PAttr will contain the Select ID Number i.e in {1 to 5}
    pValue         > Value of Property/Attribute
    pType          > Its a optional argument which specifies whether value is 'num', 'enum', 'color' 
    'str' or 'Event'         
    ----------------------------------------------------------------------------------------------------*/

    var vId = pId;
    var vP = pP;
    var vAttr = pAttr;
    var vVal = trim(pVal);
    var vBrush = null;

    makeDataSeriesElementActive();                                      // to disabled unwanted feilds in data Series
    checkDownloadType();                                                // to check the EMBED XML text box

//    debugger;
    if ((vId == "DataSeries1RenderAs" && (vVal == "CandleStick" || vVal == "Stock")) || (vId == "DataSeries2RenderAs") && (vVal == "CandleStick" || vVal == "Stock"))
        isFinancialChart = true;
    else if ((vId == "DataSeries1RenderAs" && (vVal != "CandleStick" && vVal != "Stock")) || (vId == "DataSeries2RenderAs") && (vVal != "CandleStick" && vVal != "Stock"))
        isFinancialChart = false;

    if (isFinancialChart == true && vAttr == "YValue")
        vAttr = "YValues";

    if (!pType) {
        alert("Error Define the Field Type");                            // For programmer testing to be removed
    }

    /*validations*/

    if (vVal.length > 50)                                           // if any value entered is greater than 20 characters 
    {
        alert("Value out of Range Maximum 30 Characters Permitted");
        return false;
    }

    if (pType == 'enum' || pType == 'color')                              // Types enum and color can't be null
    {
        if (vVal == "" || vVal == null) {
            document.getElementById(pId).focus();
            return false;
        }
    }

    if (pType == 'num')                                                 //If type num is null then we are assuming it as '0'       
    {
        if (vVal == "" || vVal == null) {
            vVal = "0";
        }

        else if (isNaN(vVal) && vAttr != "XValue" && vAttr != "YValues")                                           // WE will not accept non numerals for 'num' types
        {
            alert("Please Enter Numeric value only");
            document.getElementById(pId).value = "";
            document.getElementById(pId).focus();
            return false;
        }

        else if (vAttr == "Angle") {
            if (vVal > 90 || vVal < -90) {
                alert("Angle Value should be in Range of 90 to -90 ");
                document.getElementById(vVal).value = "";
                document.getElementById(pId).focus();
                return false;
            }
        }
        else if (vAttr == "Height" || vAttr == "Width")                 // If Height of Widht of chart goes our of range
        {
            if (Math.abs(vVal) > 10000) {
                alert("Value out of Range. Please enter value less than 10000");
                return false;
            }

        }

        else if (vVal.length > 11 && vAttr != "YValues")                                      // if any value entered is greater than 10 characters 
        {
            alert("Value out of Range, please enter in range of -9999999999 to 9999999999");
            return false;
        }

        else if (Math.abs(vVal) > 9999999999 && vAttr != "YValues")                                      // for data series value setting value range
        {
            alert("Value out of Range. Please enter with in range of -9999999999 to 9999999999");
            return false;
        }

    } // end of if(num)

    if (pType == 'str')                                                  //If type 'str' is null then we are assuming it as '' blank            
    {
        if (vVal == null)
            vVal = '';

        /*If we are updating AxisXLabels then*/
    }

    /*Data Series Validations*/

    if (pId == "DataSeries1RenderAs" || pId == "DataSeries2RenderAs") {
        var flag = dataSeriesCombination(pId);

        if (flag == 0) {
            alert("Wrong Combination of Charts!");
            isSeries1Reset = false;
            isSeries2Reset = false;
            document.getElementById(pId).value = "";
            document.getElementById("form").reset();
            this.vXML.renderXML();
            return false;
        }
    }
    /*Doubt full*/
    // this.doDataSereisValidation(vId, vP, vAttr, vVal); // Not required any more.

    /**Why working with alerts***/
    if (pAttr == 'AxisXLabel' || pAttr == 'XValue') {
        this.checkSecondSeries(pId, pP, pAttr, pVal);
    } // Not required any more.. 


    /*END:Data Series Validations*/

    /*END:validation*/

    if (pType == 'color')                                             // Color should be updated in this Syntax only
    {
        vBrush = '<SolidColorBrush xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" Color=' + "\"" + pVal + "\"" + ' ></SolidColorBrush>';
        vVal = vBrush;
    }

    if (pType == 'Event')                                                // If it Event type then we will call handleEvent
    {
        this.vXML.handleEvents(vId, vP, vAttr, vVal);
    }

    else {
        this.vXML.doRealTimeUpdate(vId, vP, vAttr, vVal);                  // for All other updates other that 'Events' call doRealTimeUpdate
    }

}


ChartDesignerWrapper.prototype.viewHTML = function() {
    if (htmlproceed == false) {
        return false; 		  // if html button is disabled then dont proceed
    }

    htmlString = this.vXML.getHTML();
    var winName = 'Window1' + Math.ceil((Math.random((new Date).getMilliseconds)) * 1000).toString();
    var embedHTML = document.getElementById('Embed').checked;

    win = window.open('', winName, 'scrollbars=yes,resizable=yes,width=1024,height=500,location=no,directories=no,status=no,menubar=no,toolbar=no');


    if (embedHTML == false) {
        win.document.body.innerHTML = '<div  style="padding:10px 10px 10px 10px;border:solid 1px gray;border-width:1px 1px 0px 1px;font-family:Lucida Grande,Geneva,Arial,Verdana,sans-serif">'
                            + '<div style="font-size:16px">Instructions:</div>'
                            + '<ol style="font-size:14px">'
                            + '<li>Save the code below in an HTML page</li>'
                            + '<li>Make sure that you have SL.Visifire.Charts.xap and Visifire.js is in the same folder.'
                            + '<br>If required download from <a href="./download_silverlight_charts.php">http://www.visifire.com/download_silverlight_charts.php</a></li>'
                            + '<li>Host the HTML page, “SL.Visifire.Charts.xap” and “Visifire.js” in same folder on a <b>Web Server</b></li>'
                            + '<li>Now you can open the HTML  page in any browser to see the chart</li>'
                            + '<ol>'
                            + '</div>';
    }
    else {
        win.document.body.innerHTML = '<div  style="padding:10px 10px 10px 10px;border:solid 1px gray;border-width:1px 1px 0px 1px;font-family:Lucida Grande,Geneva,Arial,Verdana,sans-serif">'
                            + '<div style="font-size:16px">Instructions:</div>'
                            + '<ol style="font-size:14px">'
                            + '<li>Save the code below in an HTML page</li>'
                            + '<li>Make sure that you have SL.Visifire.Charts.xap and Visifire.js is in the same folder.'
                            + '<br>If required download from <a href="./download_silverlight_charts.php">http://www.visifire.com/download_silverlight_charts.php</a></li>'
                            + '<li>Now you can open the HTML  page in any browser to see the chart</li>'
                            + '<ol>'
                            + '</div>';
    }


    win.document.body.innerHTML += '<div  style="border:solid 1px gray;padding:10px 10px 10px 10px;font-family:Courier,Lucida Grande,Geneva,Arial,Verdana,sans-serif;font-size:12px;">' + colorCoder(htmlString) + '</div>';

}



ChartDesignerWrapper.prototype.viewXML = function() {
    var xmleg = this.vXML.getXML();
    var testRadio = document.getElementsByName("applicationtype");
    var winName = 'Window1' + Math.ceil((Math.random((new Date).getMilliseconds)) * 1000).toString();
    win = window.open('', winName, "scrollbars=yes,resizable=yes,width=1024,height=500,location=no,directories=no,status=no,menubar=no,toolbar=no");

    win.document.body.innerHTML = '<div  style="padding:10px 10px 10px 10px;border:solid 1px gray;border-width:1px 1px 0px 1px;font-family:Lucida Grande,Geneva,Arial,Verdana,sans-serif">'
                                    + '<div style="font-size:16px">Instructions:</div>'
                                    + '<ol style="font-size:14px">'

    if (testRadio[1].checked)                                    // if WPF Radio Button is checked then file name will be replaced
    {
        xmleg = xmleg.replace(/SLVisifire/g, 'WPFVisifire');
        win.document.body.innerHTML = '<div  style="padding:10px 10px 10px 10px;border:solid 1px gray;border-width:1px 1px 0px 1px;font-family:Lucida Grande,Geneva,Arial,Verdana,sans-serif">'
                                    + '<div style="font-size:16px">Instructions:</div>'
                                    + '<ol style="font-size:14px">'
                                    + '<li>Create a new WPF project in Visual Studio</li>'
                                    + '<li>Copy Paste the XAML shown below, in between <b>Grid</b> tag of the "Window1.xaml" file</li>'
                                    + '<li>Add reference to "WPFVisifire.Charts.dll"'
	    							+ '<br>If required download from <a href="http://www.visifire.com/download_silverlight_charts.php">http://www.visifire.com/download_silverlight_charts.php</a></li>'
                                    + '<li>Run the project</li>'
                                    + '<ol>'
                                    + '</div>';
    }

    else {
        win.document.body.innerHTML = '<div  style="padding:10px 10px 10px 10px;border:solid 1px gray;border-width:1px 1px 0px 1px;font-family:Lucida Grande,Geneva,Arial,Verdana,sans-serif">'
                                    + '<div style="font-size:16px">Instructions:</div>'
                                    + '<ol style="font-size:14px">'
                                    + '<li>Copy Paste the XAML shown below in an XML file and name it "Data.xml"</li>'
                                    + '<li>Uncheck the "XAML in HTML" checkbox and click on the "View HTML" button to get the HTML</li>'
                                    + '<li>Host the HTML page, “SL.Visifire.Charts.xap” and “Visifire.js” in same folder on a <b>Web Server</b>'
									+ '<br>If required download from <a href="./download_silverlight_charts.php">http://www.visifire.com/download_silverlight_charts.php</a></li>'
                                    + '<li>Now you can open the HTML page in any browser to see the chart</li>'
                                    + '<ol>'
                                    + '</div>';
    }

    var colorCodedXml = colorCoder(xmleg);
    win.document.body.innerHTML += '<div  style="border:solid 1px gray;padding:10px 10px 10px 10px;font-family:Courier,Lucida Grande,Geneva,Arial,Verdana,sans-serif;font-size:12px;">' + colorCodedXml + '</div>';
}


ChartDesignerWrapper.prototype.removeEvent = function() {
    for (i = 1; i <= 5; i++) {
        document.getElementById("EventsElement" + i).value = "";
        document.getElementById("EventsEvent" + i).value = "";
        var eventBttn = document.getElementById("EventButton" + i);
        eventBttn.disabled = true;
        xStyle("color", 'graytext', eventBttn);
        xStyle('cursor', 'text', eventBttn);
        xStyle('fontWeight', 'lighter', eventBttn);
        makeDetachInActive();

    }
    this.vXML.renderXML();

}

ChartDesignerWrapper.prototype.formReset = function() {
    document.getElementById("form").reset();
    window.location.reload();
}

ChartDesignerWrapper.prototype.checkSecondSeries = function(pSeriesElementId, pSeriesElementPath, pSeriesElementAttr, pSeriesElementVal) 
{
	/*Functoin to check if we have 2 data points then changing AxisLabel or Xvalue shall effect both of them and not one of them*/
	/*Updates as on 17 nov : this function is not required as we are managing it from code*/
	var dataPointNum = "";
    var series2Yvalue = "";
    if (pSeriesElementAttr == "AxisXLabel") 
	{
        dataPointNum = pSeriesElementId.substring(10, 11);
        series2Yvalue = document.getElementById("Series2YValue" + dataPointNum).value;
        dataPointNum = dataPointNum - 1;                                               // As in XAML datapoints starts from 0   
        pSeriesElementPath = 'chart.Series[1].DataPoints' + '[' + dataPointNum + ']';

        if (series2Yvalue != "") {
            this.vXML.doRealTimeUpdate(pSeriesElementId, pSeriesElementPath, 'AxisXLabel', pSeriesElementVal);
        }

    }

    else if (pSeriesElementAttr == "XValue")
	{
        dataPointNum = pSeriesElementId.substring(6, 7);
        series2Yvalue = document.getElementById("Series2YValue" + dataPointNum).value;
        dataPointNum = dataPointNum - 1;                                              // As in XAML datapoints starts from 0 
        pSeriesElementPath = 'chart.Series[1].DataPoints' + '[' + dataPointNum + ']';

        if (series2Yvalue != "")
		{
            this.vXML.doRealTimeUpdate(pSeriesElementId, pSeriesElementPath, 'XValue', pSeriesElementVal);
        }
    }

}

ChartDesignerWrapper.prototype.doDataSereisValidation = function(pDataId, pDataPath, pDataAttr, pDataVal) {


    if (pDataAttr == "RenderAs") {
        if (pDataVal == "Pie" || pDataVal == "Doughnut")                          // if we are rendering it as pie or Doughnut 
        {
            var tempId = "";                                               // other wise it will show LegendText will overwrite// pie legends which should be AxisXlabels

            if (pDataId == "DataSeries1RenderAs") {
                tempId = "Series1LegendText";
                document.getElementById(tempId).value = "";
                this.vXML.doRealTimeUpdate(tempId, 'chart.Series[0]', 'LegendText', '');
            }
            else {
                tempId = "Series2LegendText";
                document.getElementById(tempId).value = "";
                this.vXML.doRealTimeUpdate(tempId, 'chart.Series[1]', 'LegendText', '');
            }

        }
        else {
            if (pDataId == "DataSeries1RenderAs") {
                tempId = "Series1LegendText";
                if (document.getElementById(tempId).value == "") {
                    document.getElementById(tempId).value = "Series1";
                    this.vXML.doRealTimeUpdate(tempId, 'chart.Series[0]', 'LegendText', 'Series1');
                }
            }
            else {
                tempId = "Series2LegendText";
                if (document.getElementById(tempId).value == "") {
                    document.getElementById(tempId).value = "Series2";
                    this.vXML.doRealTimeUpdate(tempId, 'chart.Series[1]', 'LegendText', 'Series2');
                }
            }

        }
    }
    /* WE cant use this validation as if we fire (tempId, 'chart.Series[1]', 'LegendText', '')
    then will eventually call eventually call generateXML() and it will generate wrong xml with col and pie
    so it will again halt the chart so its better not to use this one
    */
}

ChartDesignerWrapper.prototype.dolivedataupdate = function() {
    vWrapperObject.tempflag++;

    if (vWrapperObject.tempflag > 1)			// if user clicks for second time then dont proceed
    {
        return false;
    }
    else {
        show('Data'); manipulateColumn();
        vWrapperObject.updateflag = "start";
				vWrapperObject.updatetype = 0;
        vWrapperObject.dolivedataupdateSave();
        vWrapperObject.dolivedataupdateStart();
        document.getElementById("liveupdateimg").src = "images/btn_liveupdatedisable.jpg"; // will replace the live update date with inactiveone
        document.getElementById("stopliveupdateimg").src = "images/btn_stopliveupdate.jpg";
    }

}


ChartDesignerWrapper.prototype.stoplivedataupdate = function() {
    if (vWrapperObject.tempflag < 1)			// if temp flag is less than one than this means button is disabled so dont proceed
    {
        return false;
    }
    else 
		{
        vWrapperObject.updateflag = "stop";
        vWrapperObject.dolivedataupdateStop();
    }
}


ChartDesignerWrapper.prototype.dolivedataupdateStop = function() {

    var series1renderas = document.getElementById("DataSeries1RenderAs");
    var series2renderas = document.getElementById("DataSeries2RenderAs");

    for (counter = 1; counter <= 7; counter++)                                // As we only have 7 rows  
    {
        var series1y = document.getElementById("Series1YValue" + counter);
        var series1z = document.getElementById("Series1ZValue" + counter);
        var series2y = document.getElementById("Series2YValue" + counter);
        var series2z = document.getElementById("Series2ZValue" + counter);
        var dpcounter = counter - 1;

        if (vWrapperObject.z1[dpcounter] != undefined)       // Zvalue only in case of Bubble
        {
            series1z.value = vWrapperObject.z1[dpcounter];
            var z1path = "chart.Series[0]." + "DataPoints[" + dpcounter + "]";
            this.vXML.doRealTimeUpdate('', z1path, 'ZValue', vWrapperObject.z1[dpcounter]);
        }

        if (vWrapperObject.y1[dpcounter] != undefined)                                  // YValue will decide that tag to be included in DataSeries1 
        {
            series1y.value = vWrapperObject.y1[dpcounter];
            var y1path = "chart.Series[0]." + "DataPoints[" + dpcounter + "]";
            if (series1renderas.value != "CandleStick" && series1renderas.value != "Stock")
                this.vXML.doRealTimeUpdate('', y1path, 'YValue', vWrapperObject.y1[dpcounter]);
            else
                this.vXML.doRealTimeUpdate('', y1path, 'YValues', vWrapperObject.y1[dpcounter]);
//            this.vXML.doRealTimeUpdate('', y1path, 'YValue', vWrapperObject.y1[dpcounter]);
        }

        if (vWrapperObject.z2[dpcounter] != undefined)                        // Zvalue only in case of Bubble
        {
            series2z.value = vWrapperObject.z2[dpcounter];
            var z2path = "chart.Series[1]." + "DataPoints[" + dpcounter + "]";
            this.vXML.doRealTimeUpdate('', z2path, 'ZValue', vWrapperObject.z2[dpcounter]);
        }

        if (vWrapperObject.y2[dpcounter] != undefined) {
            series2y.value = vWrapperObject.y2[dpcounter];
            var y2path = "chart.Series[1]." + "DataPoints[" + dpcounter + "]";
            if (series2renderas.value != "CandleStick" && series2renderas.value != "Stock")
                this.vXML.doRealTimeUpdate('', y2path, 'YValue', vWrapperObject.y2[dpcounter]);
            else
                this.vXML.doRealTimeUpdate('', y2path, 'YValues', vWrapperObject.y2[dpcounter]);
//            this.vXML.doRealTimeUpdate('', y2path, 'YValue', vWrapperObject.y2[dpcounter]);
        }
    } // end of for
    vWrapperObject.tempflag = 0;
    document.getElementById("liveupdateimg").src = "images/btn_liveupdate.jpg";		// will replace the button of stop update with inactive one						
    document.getElementById("stopliveupdateimg").src = "images/btn_stopliveupdatedisable.jpg";
}


ChartDesignerWrapper.prototype.dolivedataupdateStart = function() {

//debugger;
    var series1renderas = document.getElementById("DataSeries1RenderAs");
    var series2renderas = document.getElementById("DataSeries2RenderAs");
    var str = "";
    var temp = 0;

    for (counter = 1; counter <= 7; counter++)                                // As we only have 8 rows  
    {
        var series1y = document.getElementById("Series1YValue" + counter);
        var series1z = document.getElementById("Series1ZValue" + counter);
        var series2y = document.getElementById("Series2YValue" + counter);
        var series2z = document.getElementById("Series2ZValue" + counter);
        var dpcounter = counter - 1;								


        if (series1z.value != "" && series1renderas.value == 'Bubble')       // Zvalue only in case of Bubble
        {
            //vWrapperObject.z1[dpcounter] = series1z.value;
            var z1path = "chart.Series[0]." + "DataPoints[" + dpcounter + "]";
            var newz1 = vWrapperObject.dolivedataupdateAlter(series1renderas.value, series1z.value);	
            this.vXML.doRealTimeUpdate('', z1path, 'ZValue', Math.ceil(newz1));
            series1z.value = Math.ceil(newz1);
        }

        if (series1y.value != "" && series1renderas.value != "")                                  // YValue will decide that tag to be included in DataSeries1 
        {
            //vWrapperObject.y1[dpcounter] = series1y.value;
            var y1path = "chart.Series[0]." + "DataPoints[" + dpcounter + "]";

            var newy1 = vWrapperObject.dolivedataupdateAlter(series1renderas.value, series1y.value);

    		if(series1renderas.value!="CandleStick" && series1renderas.value!="Stock")
    		    this.vXML.doRealTimeUpdate('', y1path, 'YValue', Math.ceil(newy1));
    		else
    		    this.vXML.doRealTimeUpdate('', y1path, 'YValues', newy1);
    		//    		this.vXML.doRealTimeUpdate('', y1path, 'YValues', Math.ceil(newy1));
    		if (series1renderas.value != "CandleStick" && series1renderas.value != "Stock")
    		    series1y.value = Math.ceil(newy1);
            else
                series1y.value = newy1;
        }

        if (series2z.value != "" && series2renderas.value == 'Bubble')                        // Zvalue only in case of Bubble
        {
            //vWrapperObject.z2[dpcounter] = series2z.value;
            var z2path = "chart.Series[1]." + "DataPoints[" + dpcounter + "]";
            var newz2 = vWrapperObject.dolivedataupdateAlter(series2renderas.value, series2z.value);						 
            this.vXML.doRealTimeUpdate('', z2path, 'ZValue', Math.ceil(newz2));
            series2z.value = Math.ceil(newz2);
        }

        if (series2y.value != "" && series2renderas.value != "") {
            //vWrapperObject.y2[dpcounter] = series2y.value;
            var y2path = "chart.Series[1]." + "DataPoints[" + dpcounter + "]";
            var newy2 = vWrapperObject.dolivedataupdateAlter(series2renderas.value, series2y.value);
            if (series2renderas.value != "CandleStick" && series2renderas.value != "Stock")
                this.vXML.doRealTimeUpdate('', y2path, 'YValue', Math.ceil(newy2));
            else
                this.vXML.doRealTimeUpdate('', y2path, 'YValues', newy2);
            //            this.vXML.doRealTimeUpdate('', y2path, 'YValue', Math.ceil(newy2));
            if (series2renderas.value != "CandleStick" && series2renderas.value != "Stock")
                series2y.value = Math.ceil(newy2);
            else
                series2y.value = newy2;
            
        }
    } //end of for//alert("Odd"); 


    if (vWrapperObject.updateflag == "start") {
        setTimeout('vWrapperObject.dolivedataupdateStart()', 1000);
				vWrapperObject.updatetype++;
    } // end of if

    else {
        vWrapperObject.dolivedataupdateStop();
    }
}



ChartDesignerWrapper.prototype.dolivedataupdateSave = function() {

    var series1renderas = document.getElementById("DataSeries1RenderAs");
    var series2renderas = document.getElementById("DataSeries2RenderAs");
    var str = "";
    var temp = 0;

//    debugger;
    for (counter = 1; counter <= 7; counter++)                                // As we only have 8 rows  
    {
        var series1y = document.getElementById("Series1YValue" + counter);
        var series1z = document.getElementById("Series1ZValue" + counter);
        var series2y = document.getElementById("Series2YValue" + counter);
        var series2z = document.getElementById("Series2ZValue" + counter);
        var dpcounter = counter - 1;

        if (series1z.value != "")       //Zvalue only in case of Bubble
        {
            vWrapperObject.z1[dpcounter] = series1z.value;
        }

        if (series1y.value != "" && series1renderas.value != "")                                  //YValue will decide that tag to be included in DataSeries1 
        {
            vWrapperObject.y1[dpcounter] = series1y.value;
        }

        if (series2z.value != "")                        // Zvalue only in case of Bubble
        {
            vWrapperObject.z2[dpcounter] = series2z.value;
        }

        if (series2y.value != "" && series2renderas.value != "") {
            vWrapperObject.y2[dpcounter] = series2y.value;
        }
    } //end of for//alert("Odd"); 			
}

ChartDesignerWrapper.prototype.dolivedataupdateAlter = function(seriesrenderas, pDpval) {
//    debugger;
    /*This function to alternately divide and multiply the value so that chart increase and decrease randomly */
    var randomNumber = 0.9 + Math.random() * 1.1;

    if (seriesrenderas == "CandleStick" || seriesrenderas == "Stock") {
//        for (var yValuesIndex = 0; yValuesIndex < 4; yValuesIndex++) {
            var newYValues = new Array(4);

            var open = (20 + (Math.random() * 20));
            var close = (25 + (Math.random() * 20));
            var high = (open > close ? open : close) + 5;
            var low = (open < close ? open : close) - 5;

            newYValues[0] = Math.ceil(open);
            newYValues[1] = Math.ceil(close);
            newYValues[2] = Math.ceil(high);
            newYValues[3] = Math.ceil(low);

            var newVal = newYValues[0] + "," + newYValues[1] + "," + newYValues[2] + "," + newYValues[3];

            pDpval = newVal;
//        }

    }
    else {
        if (vWrapperObject.updatetype % 2 == 0) {
            pDpval = pDpval / randomNumber;
        }
        else {
            pDpval = pDpval * randomNumber;
        }
    }
    return (pDpval);
}

ChartDesignerWrapper.prototype.clearForm = function()
{
    var input = document.getElementsByTagName('input');
    var select = document.getElementsByTagName('select');

    for (i = 0; i < input.length; i++) 
	{
        if ((input[i].value != "Reset") && (input[i].value != "Clear"))
            input[i].value = "";
    }

    for (i = 0; i < select.length; i++)
	{
        select[i].value = "";
    }

    changeLabel();
	this.drawChart();
	// redrawchart with default values
}


/**********************************************************/

function makeEventBttnActive(pEventNumber) {
    var idnumber = pEventNumber;
    var eventelement = "EventsElement" + pEventNumber;
    var event = "EventsEvent" + pEventNumber;
    var eventcallbackfunction = "EventsCallbackFunction" + pEventNumber;
    var eventbutton = "EventButton" + pEventNumber;
    var element = document.getElementById(eventelement).value;
    var eventName = document.getElementById(event).value;
    var callbackFunction = document.getElementById(eventcallbackfunction).value;
    var statement = "";

    if ((element != "") && (eventName != "") && (callbackFunction != "")) {
        document.getElementById(eventbutton).disabled = false;
        //  xStyle("backgroundColor", 'buttonface', eventbutton);
        xStyle("color", 'buttontext', eventbutton);
        //xStyle('border', '2px outset black', eventbutton);
        xStyle('cursor', 'pointer', eventbutton);
        xStyle('fontWeight', 'normal', eventbutton);
    }
    else {
        document.getElementById(eventbutton).disabled = true;
        //xStyle("backgroundColor", 'threedface', eventbutton);
        xStyle("color", 'graytext', eventbutton);
        //xStyle('border', '1px outset gray', eventbutton);
        xStyle('cursor', 'text', eventbutton);
        xStyle('fontWeight', 'lighter', eventbutton);
    }
}

function makeDetachActive() {
    var detachEventBttn = document.getElementById("detachEventBttn");
    detachEventBttn.disabled = false;
    xStyle("color", 'buttontext', detachEventBttn);
    xStyle('cursor', 'pointer', detachEventBttn);
    xStyle('fontWeight', 'normal', detachEventBttn);
}

function makeDetachInActive() {
    var detachEventBttn = document.getElementById("detachEventBttn");
    detachEventBttn.disabled = true;
    xStyle("color", 'graytext', detachEventBttn);
    xStyle('cursor', 'text', detachEventBttn);
    xStyle('fontWeight', 'Lighter', detachEventBttn);
}

function makeDataSeriesElementActive() {
    /*This function is to Disable all YValue of a Series if its RenderAs is blank*/

    var series1renderas = document.getElementById("DataSeries1RenderAs").value;
    var series2renderas = document.getElementById("DataSeries2RenderAs").value;
    var str = "";

    for (counter = 1; counter <= 7; counter++)                                // As we only have 7 rows  
    {

        var axisXlabel = document.getElementById("AxisXLabel" + counter);
        var xvalue = document.getElementById("XValue" + counter);
        var series1y = document.getElementById("Series1YValue" + counter);
        var series1z = document.getElementById("Series1ZValue" + counter);
        var series2y = document.getElementById("Series2YValue" + counter);
        var series2z = document.getElementById("Series2ZValue" + counter);

        if (series1renderas == "") {
            series1y.disabled = true;
            xStyle("border", "solid 1px #CCCCCC", series1y);
            xStyle("color", "#CCCCCC", series1y);

        }
        else {
            series1y.disabled = false;
            xStyle("border", "solid 1px #999999", series1y);
            xStyle("color", "#000000", series1y);
        }

        if (series2renderas == "") {
            series2y.disabled = true;
            xStyle("border", "solid 1px #CCCCCC", series2y);
            xStyle("color", "#CCCCCC", series2y);
        }
        else {
            series2y.disabled = false;
            xStyle("border", "solid 1px #999999", series2y);
            xStyle("color", "#000000", series2y);
        }

        /*if(series1y.value == "" && series2y.value == "")
        {
        axisXlabel.disabled = true;
        //axisXlabel.value = "";
        xvalue.disabled = true;
        //xvalue.disabled  = "";
        }
        else
        {
        axisXlabel.disabled = false;
        xvalue.disabled = false;
        }
        */
    } // end of for 

}


function dataSeriesCombination(pDataSeriesId) {
    var compatibleTypes = ["Column", "Line", "Area", "StackedColumn", "StackedArea", "Point", "Bubble"];
    var uncompatibleTypes = ["Bar", "StackedBar", "Pie", "Doughnut, StreamLineFunnel, SectionFunnel"];
    var counter1 = 0;
    var counter2 = 0;
    var currcompatible = "compatible";
    var othercompatible = "compatible";
    var currentSeries = "";
    var otherSeries = "";
    var currentRenderAs = "";
    var otherRenderAs = "";
    var compatible = ""

    if (pDataSeriesId == "DataSeries1RenderAs") {
        currentSeries = document.getElementById("DataSeries1RenderAs");
        otherSeries = document.getElementById("DataSeries2RenderAs");
    }
    else {
        currentSeries = document.getElementById("DataSeries2RenderAs");
        otherSeries = document.getElementById("DataSeries1RenderAs");
    }

    currentRenderAs = currentSeries.value;
    otherRenderAs = otherSeries.value;

    if (otherRenderAs == "" || currentRenderAs == "") {
        compatible = 1;
        return (compatible);
    }

    for (counter1 = 0; counter1 < compatibleTypes.length; counter1++) {
        if (otherRenderAs == compatibleTypes[counter1]) {
            othercompatible = 'compatible';
            break;
        }
        
        else if (otherRenderAs == "Pie" || otherRenderAs == "Doughnut") {
            othercompatible = 'pieType';
            break;
        }

        else if (otherRenderAs == "SectionFunnel" || otherRenderAs == "StreamLineFunnel") {
            othercompatible = 'sectionFunnelType';
            break;
        }

        else if (otherRenderAs == "Bar" || otherRenderAs == "StackedBar") {
            othercompatible = 'barType';
            break;
        }

    }


    for (counter1 = 0; counter1 < compatibleTypes.length; counter1++) {
        if (currentRenderAs == compatibleTypes[counter1]) {
            currcompatible = 'compatible';
            break;
        }

        else if (currentRenderAs == "Pie" || currentRenderAs == "Doughnut") {
            currcompatible = 'pieType';
            break;
        }

        else if (otherRenderAs == "SectionFunnel" || otherRenderAs == "StreamLineFunnel") {
            currcompatible = 'sectionFunnelType';
            break;
        }
        
        else if (currentRenderAs == "Bar" || currentRenderAs == "StackedBar") {
            currcompatible = 'barType';
            break;
        }

    }


    if ('compatible' == othercompatible && 'compatible' != currcompatible) {
        compatible = 0;
    }

    else if ("pieType" == othercompatible) {
        compatible = 0;
    }

    else if ("sectionFunnelType" == othercompatible) {
        compatible = 0;
    }

    else if ('barType' == othercompatible) {
    if ('barType' != currcompatible) {
        compatible = 0;
    }
    else
        compatible = 1;
    }

    else {
        compatible = 1;
    }

    return (compatible);


} // end of data combination


function MM_openBrWindow(theURL, winName, features) {
    window.open(theURL, winName, features);
    return false;
}
/*General function used to Chart Designer To be Refactored*/

function hideWindow() {
    var obj;

    var mainDiv = document.getElementById('windows');
    var div = mainDiv.getElementsByTagName('div');                 // vDiv now will contain all property divs
    var counter = 0;

    for (counter = 0; counter <= div.length - 1; counter++) {
        var obj = div[counter];
        obj.style.visibility = "hidden";
    }

    var zValue1 = document.getElementsByName('zvalue1');
    var zValue2 = document.getElementsByName('zvalue2');

    for (i = 0; i < zValue1.length; i++) {
        zValue1[i].style.visibility = "hidden";
        zValue1[i].style.display = "none";
    }

    for (i = 0; i < zValue2.length; i++) {
        zValue2[i].style.visibility = "hidden";
        zValue2[i].style.display = "none";
    }
}


function show(id) {
    /*Function will hide all divs and show the selected div only*/

    hideWindow();

    var obj = document.getElementById("Window" + id);
    obj.style.visibility = "visible";
    document.getElementById("Window" + currentid).style.visibility = "hidden";
    document.getElementById("Window" + id).style.visibility = "visible";
    document.getElementById(currentid).className = "buttonoff";
    document.getElementById(id).className = "buttonon";
    currentid = id;
}


function colorCoder(str) {

    // Turn < and > into &LT; and &GT; (case matters)
    str = str.replace(/\<([^!])/g, '&LT;$1');
    str = str.replace(/([^-])\>/g, '$1&GT;');
    // Handle attribute="value" - make the attribute red and value blue
    str = str.replace(/([a-zA-Z0-9:]+)\=\"([^"]*)"/g, '<font color="red">$1</font><font color="blue">="$2"</font>');
    // Color tag openers and closers brown                
    str = str.replace(/\&LT\;([a-zA-Z0-9:.]+)/g, '&LT;<font color="brown">$1</font>');
    str = str.replace(/\&LT\;\/([a-zA-Z0-9:.]+)/g, '&LT;/<font color="brown">$1</font>');
    // Comments are green
    str = str.replace(/\<\!--/g, '<font color="green">&lt;!--');
    str = str.replace(/--\>/g, '--&gt;</font>');
    // The < and > characters are black
    str = str.replace(/\&LT\;/g, '<font color="black">&lt;</font>');
    str = str.replace(/\/\&GT\;/g, '<font color="black">/&gt;</font>');
    str = str.replace(/\&GT\;/g, '<font color="black">&gt;</font>');
    // Turn hard tabs into four spaces
    str = str.replace(/\t/g, '&nbsp;&nbsp;&nbsp;&nbsp;');
    str = str.replace(/\n/g, '<br/>');
    return str;
}

function xmlEncode(string) {

    /*This will Parse the input entered by user to suit XML format*/
    string = string.replace(/^[\s]+/, '').replace(/[\s]+$/, '').replace(/[\s]{2,}/, ' ');
    return string.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('\'', '&apos;').replace('"', '&quot;');

}



function trim(str) {
    /*Downloaded Function*/

    if (!str || typeof str != 'string')
        return '';

    return str.replace(/^[\s]+/, '').replace(/[\s]+$/, '').replace(/[\s]{2,}/, ' ');
}

function formatString4InLineFunction(str) {
    /*modified by saurabh*/
    var newString = '';
    strArray = str.split('\n');
    var trimedStr = '';

    for (var j = 0; j < strArray.length; j++) {
        trimedStr = trim(strArray[j])

        if (trimedStr.substring(0, 2) == '//') {
            trimedStr = "/* " + trimedStr.substring(2, trimedStr.length) + "*/";
        }
        newString += ' ' + trimedStr;
    }

    return newString;
}



function onMouseMove(e) {
    var position;
    position = "Mouse Position: ";
    position += " X  = " + e.MouseX;
    position += " Y = " + e.MouseY;
    alert(position);
}


function manipulateColumn() {
    /*Function will hide ZValue Coloum in Html if chart is not redered as Bubble 
    It will show ZValue only if Chart is Renders as Bubble  */

    var renderAs1 = document.getElementById('DataSeries1RenderAs').value;
    var renderAs2 = document.getElementById('DataSeries2RenderAs').value;

    var obj1 = document.getElementsByName('zvalue1');
    var obj2 = document.getElementsByName('zvalue2');

    if (renderAs1 == 'Bubble') {
        for (i = 0; i < obj1.length; i++) {
            xStyle("visibility", 'visible', obj1[i]);
            xStyle("display", 'inline', obj1[i]);
            // obj1[i].style.visibility = "visible";
            //obj1[i].style.display = "inline";
        }
    }
    else {
        for (i = 0; i < obj1.length; i++) {
            xStyle("visibility", 'hidden', obj1[i]);
            xStyle("display", 'none', obj1[i]);

            //obj1[i].style.visibility = "hidden";
            //obj1[i].style.display = "none";
        }
    }

    if (renderAs2 == 'Bubble') {
        for (i = 0; i < obj2.length; i++) {
            xStyle("visibility", 'visible', obj2[i]);
            xStyle("display", 'inline', obj2[i]);
            //obj2[i].style.visibility = "visible";
            //obj2[i].style.display = "inline";
        }
    }
    else {
        for (i = 0; i < obj2.length; i++) {
            xStyle("visibility", 'hidden', obj2[i]);
            xStyle("display", 'none', obj2[i]);
            // obj2[i].style.visibility = "hidden";
            // obj2[i].style.display = "none";
        }
    }
}


function changeLabel() {

    if (document.getElementById('DataSeries1RenderAs').value != "Bubble") {
        document.getElementById('s1').innerHTML = "YValue(s)";
        document.getElementById('s2').innerHTML = "YValue(s)";
        document.getElementById('s1').colspan = "2";
        document.getElementById('s2').colspan = "2";
        document.getElementById('s1z').innerHTML = "";
    }
    else
    {
        document.getElementById('s1').colspan = "1";
        document.getElementById('s2').colspan = "1";
        document.getElementById('s1z').innerHTML = "ZValue";
    }

    if (document.getElementById('DataSeries1RenderAs').value == "CandleStick" || document.getElementById('DataSeries1RenderAs').value == "Stock") {
        if (isSeries1Reset == false) {
            document.getElementById("Series1YValue1").value = "10,20,40,5";
            document.getElementById("Series1YValue2").value = "20,10,40,8";
            document.getElementById("Series1YValue3").value = "15,25,45,10";
            document.getElementById("Series1YValue4").value = "22,42,50,15";
            document.getElementById("Series1YValue5").value = "30,20,40,10";
            isSeries1Reset = true;
        }
    }
    else if(document.getElementById('DataSeries1RenderAs').value != "CandleStick" && document.getElementById('DataSeries1RenderAs').value != "Stock"){
        if (isSeries1Reset == true) {
            document.getElementById("Series1YValue1").value = "351139";
            document.getElementById("Series1YValue2").value = "345254";
            document.getElementById("Series1YValue3").value = "318845";
            document.getElementById("Series1YValue4").value = "274316";
            document.getElementById("Series1YValue5").value = "207349";
            isSeries1Reset = false;
        }
    }
    
    if (document.getElementById('DataSeries2RenderAs').value != "Bubble") {
        document.getElementById('s1').innerHTML = "YValue(s)";
        document.getElementById('s2').innerHTML = "YValue(s)";
        document.getElementById('s1').colspan = "2";
        document.getElementById('s2').colspan = "2";
        document.getElementById('s2z').innerHTML = "";
    }
    else {
        document.getElementById('s1').colspan = "1";
        document.getElementById('s2').colspan = "1";
        document.getElementById('s2z').innerHTML = "ZValue";
    }
    
    if (document.getElementById('DataSeries2RenderAs').value == "CandleStick" || document.getElementById('DataSeries2RenderAs').value == "Stock") {
        if (isSeries2Reset == false) {
            document.getElementById("Series2YValue1").value = "20,10,40,8";
            document.getElementById("Series2YValue2").value = "30,40,50,28";
            document.getElementById("Series2YValue3").value = "25,35,45,20";
            document.getElementById("Series2YValue4").value = "28,42,48,15";
            document.getElementById("Series2YValue5").value = "40,20,50,18";
            isSeries2Reset = true;
        }
    }
    else if (document.getElementById('DataSeries2RenderAs').value != "CandleStick" && document.getElementById('DataSeries2RenderAs').value != "Stock") {
        if (isSeries2Reset == true) {
            document.getElementById("Series2YValue1").value = "0";
            document.getElementById("Series2YValue2").value = "0";
            document.getElementById("Series2YValue3").value = "0";
            document.getElementById("Series2YValue4").value = "0";
            document.getElementById("Series2YValue5").value = "0";
            isSeries2Reset = false;
        }
    }
}


function isNumeric(sText) {
    var ValidChars = "-0123456789.";
    var IsNumber = true;
    var Char;

    for (i = 0; i < sText.length && IsNumber == true; i++) {
        Char = sText.charAt(i);
        if (ValidChars.indexOf(Char) == -1) {
            IsNumber = false;
        }
    }

    return IsNumber;
}

function check(id) {
    if (!isNumeric(document.getElementById(id).value)) {
        alert('Please enter only numerals');

        /*saurabh Changes*/
        document.getElementById(id).value = "";

        document.getElementById(id).focus();
        return false;
    }
}




function xStyle(sProp, sVal) {
    /*Function support dynamic change of styles of html elements*/
    var i, e;
    for (i = 2; i < arguments.length; ++i) {
        e = xGetElementById(arguments[i]);
        if (e.style) {
            try { e.style[sProp] = sVal; }
            catch (err) { e.style[sProp] = ''; } // ???
        }
    }
}

function xGetElementById(e) {
    /*Function fetch by id html elements*/
    if (typeof (e) == 'string') {
        if (document.getElementById) e = document.getElementById(e);
        else if (document.all) e = document.all[e];
        else e = null;
    }
    return e;
}

function checkDownloadType() {
    var testRadio = document.getElementsByName("applicationtype");

    if (testRadio[1].checked) {
        document.getElementById("Embed").disabled = true;
        document.getElementById("viewhtmlimg").src = "images/btn_viewhtmldisable.jpg";
        htmlproceed = false;
    }
    else {
        document.getElementById("Embed").disabled = false;
        document.getElementById("viewhtmlimg").src = "images/btn_viewhtml.gif";
        htmlproceed = true;
    }
}

/*Depreciated Function to relooked*/

function singleSeries() {
    if ((document.getElementById('DataSeries1RenderAs').value == "Pie") || (document.getElementById('DataSeries1RenderAs').value == "Doughnut")) {
        document.getElementById('Series2YValue1').value = "";
    }
}


function trimString(sString) {
    if (sString == null)
        return '';

    while (sString.substring(0, 1) == ' ') {
        sString = sString.substring(1, sString.length);
    }

    while (sString.substring(sString.length - 1, sString.length) == ' ') {
        sString = sString.substring(0, sString.length - 1);
    }

    return sString;
}

function emptyXValue() {
    document.getElementById('TrendLineXValue').value = "";
}

function emptyYValue() {
    document.getElementById('TrendLineYValue').value = "";
}

function xWidth(e, w) {
    if (!(e = xGetElementById(e))) return 0;
    if (xNum(w)) {
        if (w < 0) w = 0;
        else w = Math.round(w);
    }
    else w = -1;
    var css = xDef(e.style);
    if (e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {
        w = xClientWidth();
    }
    else if (css && xDef(e.offsetWidth) && xStr(e.style.width)) {
        if (w >= 0) {
            var pl = 0, pr = 0, bl = 0, br = 0;
            if (document.compatMode == 'CSS1Compat') {
                var gcs = xGetComputedStyle;
                pl = gcs(e, 'padding-left', 1);
                if (pl !== null) {
                    pr = gcs(e, 'padding-right', 1);
                    bl = gcs(e, 'border-left-width', 1);
                    br = gcs(e, 'border-right-width', 1);
                }
                // Should we try this as a last resort?
                // At this point getComputedStyle and currentStyle do not exist.
                else if (xDef(e.offsetWidth, e.style.width)) {
                    e.style.width = w + 'px';
                    pl = e.offsetWidth - w;
                }
            }
            w -= (pl + pr + bl + br);
            if (isNaN(w) || w < 0) return;
            else e.style.width = w + 'px';
        }
        w = e.offsetWidth;
    }
    else if (css && xDef(e.style.pixelWidth)) {
        if (w >= 0) e.style.pixelWidth = w;
        w = e.style.pixelWidth;
    }
    return w;
}

function xNum() {
    for (var i = 0; i < arguments.length; ++i) { if (isNaN(arguments[i]) || typeof (arguments[i]) != 'number') return false; }
    return true;
}
function xDef() {
    for (var i = 0; i < arguments.length; ++i) { if (typeof (arguments[i]) == 'undefined') return false; }
    return true;
}
function xStr(s) {
    for (var i = 0; i < arguments.length; ++i) { if (typeof (arguments[i]) != 'string') return false; }
    return true;
}

function xGetComputedStyle(e, p, i) {
    if (!(e = xGetElementById(e))) return null;
    var s, v = 'undefined', dv = document.defaultView;
    if (dv && dv.getComputedStyle) {
        s = dv.getComputedStyle(e, '');
        if (s) v = s.getPropertyValue(p);
    }
    else if (e.currentStyle) {
        v = e.currentStyle[xCamelize(p)];
    }
    else return null;
    return i ? (parseInt(v) || 0) : v;
}