/*CanvasManager
Author: Brad Washburn
Owner: Aeshen
Purpose: Allow loading and unloading of xaml files into existing xaml files.
Find documentation and updates at http://www.aeshen.com/CanvasManager/
version: 1.1
Last Modified: 10/26/2007
Usage Rights: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
var CM_elementCount = null;
var CM_itemCount = null;

function CanvasManager(ID, Canvas)
{   //alert("canvasManager")
 ////Properties/////////////////////
    this.Control = document.getElementById(ID);
    this.Holder = this.Control.content.findName(Canvas);
    this.InitArray = new Array();
    this.elementArray = new Array();
    if(CM_elementCount == null){   CM_elementCount = 0;}
    if(CM_itemCount == null){   CM_itemCount = 0;}
    this.ProgressFunc = null;
    this.CompleteFunc = null;
 
    
/////////////////////////////////////////////////////////////////////////////////////////
//Public Methods/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

    this.loadXaml = function(XAML, Depth, Initilize)
    {   
           var downloader = this.Control.createObject("downloader");
           var oc = preserveScope(this, this.onCompleted);
           var op = preserveScope(this, this.onProgress);
           var myID = CM_elementCount;
           downloader.addEventListener("completed", oc);
           downloader.addEventListener("downloadProgressChanged", op);  
           this.InitArray.push({id: myID, uri: XAML, depth: Depth, initilize: Initilize});
           CM_elementCount++;
           downloader.open("GET", XAML);
           downloader.send();
           return myID;
    }
    
    this.unloadXaml = function(Depth)
    {   
       
        if(typeof(Depth) == "string")//Search for x:Name
        {
            for(var i=0; i< this.elementArray.length; i++)
            {
               if(this.elementArray[i].name == Depth)
               {
                    var myName = this.Control.content.findnName(this.elementArray[i].name);
                    this.Holder.children.remove(myName);
                    this.elementArray.splice(i, 1);
                    break;
               } 
            }
        }
        else if(typeof(Depth) == "number")//Search for ID
        {   
            for(var i=0; i< this.elementArray.length; i++)
            {   
                if(this.elementArray[i].id == Depth)
                {   
                    var myName = this.Control.content.findName(this.elementArray[i].name);
                    this.Holder.children.remove(myName);
                    this.elementArray.splice(i, 1);
                    break;
                }
            }
        }
        else
        {
            for(var i=0; i< this.elementArray.length; i++)
            {      
                    var myName = this.Control.content.findName(this.elementArray[i].name);
                    this.Holder.children.remove(myName);
            }
            this.elementArray.splice(0, this.elementArray.length);
        }
    }
    //Preloader Functions////////////////////////////////////////////////////////////////
    this.DownloadProgressChanged = function(func, scope)
    {
            if(scope)
            {
                this.ProgressFunc = preserveScope(scope, func);
            }
            else
            {
                this.ProgressFunc = preserveScope(this, func);
            }
    }
    
    this.Completed = function(func, scope)
    {
        if(scope)
            {
                this.CompleteFunc = preserveScope(scope, func);
            }
            else
            {
                this.CompleteFunc = preserveScope(this, func);
            }
    }
    
    this.clearDownloadProgressChanged = function()
    {
        this.ProgressFunc = null;
    }
    
    this.clearCompleted = function()
    {
        this.CompleteFunc = null;
    }
    
    //Query Functions/////////////////////////////////////////////////////////////////
    this.idToName = function(key)//Returns x:Name of of id element
    {
        for(var i=0; i< this.elementArray.length; i++)
        {
            if(this.elementArray[i].id == key)
            {
                return this.elementArray[i].name;
            }
        }
    }
    
    this.uriToName = function(key)//Returns Array of x:Names of elements with same uri
    {
        var tempArray = new Array();
        for(var i=0; i< this.elementArray.length; i++)
        {
            if(this.elementArray[i].uri == key)
            {
                tempArray.push(this.elementArray[i].name);
            }
        }
        return tempArray;
    }
    
    this.uriToId = function(key)//Returns Array of ids of elements with same uri
    {
        var tempArray = new Array();
        for(var i=0; i< this.elementArray.length; i++)
        {
            
            if(this.elementArray[i].uri == key)
            {
                tempArray.push(this.elementArray[i].id);
            }
        }
        
        return tempArray;
    }
    
    this.uriToObject = function(key)//Returns Array of Objects of elements with same uri
    {
        var tempArray = new Array();
        for(var i=0; i< this.elementArray.length; i++)
        {
            if(this.elementArray[i].uri == key)
            {
                tempArray.push(this.elementArray[i]);
            }
        }
        return tempArray;
    }
    
    this.idToObject = function(key)//Returns Object of of id element
    {
        for(var i=0; i< this.elementArray.length; i++)
        {
            if(this.elementArray[i].id == key)
            {
                return this.elementArray[i];
            }
        }
    }
    
    this.nameToObject = function(key)//Returns Object of of x:Name element
    {
        for(var i=0; i< this.elementArray.length; i++)
        {
            if(this.elementArray[i].name == key)
            {
                return this.elementArray[i];
            }
        }
    }
    
    
////////////////////////////////////////////////////////////////////////////////////////
//Private Methods///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
    this.onProgress = function(sender, eventArgs)
    {
        if(this.ProgressFunc != null)
        {
            this.ProgressFunc(sender, eventArgs);
        }
    }
    
    this.onCompleted = function(sender, eventArgs)
    {  
        if(this.CompleteFunc != null)
        {   
            this.CompleteFunc(sender, eventArgs);
        }
        //Create Variables//////////////////////////////////////////////////////
        var zipped = false;
        var file = true;
        var myInit = this.getInit(sender.uri);//Get initialization parameters etc.
        var myResponse = null;
        
        if(sender.uri.substr(sender.uri.length-3).toLowerCase() == "zip")//Check to see if a package was downloaded
        {
            zipped = true;
        }
        if(zipped)//Seperate XAML file from other files in package
        {
            for(var i=0; i< myInit.initilize.Invoice.length; i++)
            {   
                if(typeof(myInit.initilize.Invoice[i]) == "string")
                {
                    if(myInit.initilize.Invoice[i].substr(myInit.initilize.Invoice[i].length-4).toLowerCase() == "xaml"){
                        myResponse = sender.getResponseText(myInit.initilize.Invoice[i]);
                    }
                }
            }
        }   
        else{
            myResponse = sender.getResponseText("");
        }
        var newInit = this.formXAML(myResponse, myInit, zipped);//newInit returns locations of embedded media (jpg, png, gif, wmv, mp3, & fonts)
        var myObj = {id: newInit[2], name: newInit[1], control: this.Control, uri: sender.uri};
        if(zipped)
        {
            for(var i=0; i< newInit[0].length; i++)
            {
                if(typeof(newInit[0][i]) == "string")
                {  
                    if(newInit[0][i].substr(newInit[0][i].length-3).toLowerCase() == ("jpg" || "png" || "gif"))
                    {
                        var tempArray = newInit[0][i].split(",");
                        newInit[0][i] = tempArray[tempArray.length-1];//Guards against init variables being pointers to arrays outside of the canvasManager;
                        for(var j=0; j<tempArray.length-1; j++)
                        {
                            var myHolder = this.Control.content.findName(tempArray[j]);
                            myHolder.setSource(sender, tempArray[tempArray.length-1]);
                        }
                    }
                    else if(newInit[0][i].substr(newInit[0][i].length-3).toLowerCase() == ("wmv" || "mp3"))
                    {   
                     var tempArray = newInit[0][i].split(",");
                     newInit[0][i] = tempArray[tempArray.length-1];//Guards against init variables being pointers to arrays outside of the canvasManager;
                        for(var j=0; j<tempArray.length-1; j++)
                        {
                            var myHolder = this.Control.content.findName(tempArray[j]);
                           myHolder.setSource(sender, tempArray[tempArray.length-1]);
                        }
                    }
                    else if(typeof(newInit[0][i]) == "string" && newInit[0][i].substr(newInit[0][i].length-4).toLowerCase() != "xaml")
                    {   
                        var tempArray = newInit[0][i].split(",");
                        newInit[0][i] = tempArray[tempArray.length-1];//Guards against init variables being pointers to arrays outside of the canvasManager;
                        var myFont = tempArray[tempArray.length-1]
                        for(var j=0; j<tempArray.length-1; j++)
                        {   
                            var myHolder = this.Control.content.findName(tempArray[j]);
                            myHolder.setFontSource(sender);
                            myHolder.fontFamily = myFont;   
                        }
                    }
                }
                else if(typeof(newInit[0][i]) == "object")
                {
                    if(file)
                    {
                        file = false;
                        eval(sender.getResponseText(newInit[0][i].file));
                        myObj.params = newInit[0][i].params;
                        myObj.init = eval(newInit[0][i].init);
                        myObj.init();
                    }
                }
            }
        }
        
        if(file)
        {
            if(myInit.initilize.File != undefined)
            {
                file = false;
                myObj.params = myInit.initilize.File.params;
                        myObj.init = eval(myInit.initilize.File.init);
                        myObj.init();
            }
            
        }
        this.elementArray.push(myObj);        
    }
    
    this.formXAML= function(myResponse, init, zipped)
    {
        var myXname = "";   
        //Check to See if Canvas tag has an x:Name and set it if not////////
        var pacman = myResponse.indexOf(">")
        var identity = myResponse.indexOf("x:Name");
        if(pacman < identity || identity == -1)
        {
             myResponse = myResponse.substr(0, pacman) +' x:Name="element" '+myResponse.substr(pacman);
             myXname = "element_CM" + init.id;
        }
        else{
            if(myResponse.indexOf('"', identity)< myResponse.indexOf("'", identity) || myResponse.indexOf("'", identity) == -1)
            {
                var quoteOpen = myResponse.indexOf('"', identity)+1;
                var quoteClose = myResponse.indexOf('"', quoteOpen);
                myXname = myResponse.substring(quoteOpen, quoteClose)+"_CM"+ init.id;
            }
            else{
                var quoteOpen = myResponse.indexOf("'", identity)+1;
                var quoteClose = myResponse.indexOf("'", quoteOpen);
                myXname = myResponse.substring(quoteOpen, quoteClose)+"_CM"+ init.id;
            }            
            
        }
        //Create MediaArray to Return///////////////////////////////////////
        var mediaArray = new Array()
            mediaArray[0] = null;
            mediaArray[1] = myXname;
            mediaArray[2] = init.id;
            
        //Add transform element/////////////////////////////////////////////
        var splitLocation = myResponse.indexOf(">")+1;
        var s1 = myResponse.substr(0, splitLocation);      
        var s2 = this.createTransform(init.initilize);
        var s3 = myResponse.substr(splitLocation);
        var st = s1 + s2 + s3;
        //Add Inserts///////////////////////////////////////////////////////
        var insertedXAML = this.addInsert(init.initilize.Insert, st)
        
        //Add Unique ID/////////////////////////////////////////////////////   
        var infusedXAML = this.infuseID(init.id, insertedXAML);
        
        //Strip Media Sources///////////////////////////////////////////////
        if(zipped)
        {   
            var cleanedArray = this.stripMedia(infusedXAML, init.initilize.Invoice);
            infusedXAML = cleanedArray[0];
            mediaArray[0] = cleanedArray[1];
        }
            //alert(infusedXAML);
        //convert string to XAML///////////////////////////////    
        var xamlFragment = this.Control.content.createFromXaml(infusedXAML);
     
        //Set Non-transform initialization params///////////////////////////
        for (var propName in init.initilize) {
            var myPropName = this.setupPropName(propName);
            if(myPropName) xamlFragment[myPropName] = init.initilize[propName];
        }
        xamlFragment["Canvas.ZIndex"] = init.depth;
        
        //Set Text//////////////////////////////////////////////////////////
        var textArray = init.initilize.Text;
       if(textArray)
       {
            for(var i = 0; i< textArray.length; i++)
            {
                var txtBlock = xamlFragment.findName(textArray[i].name+"_CM"+init.id);
                txtBlock.text = textArray[i].value;
            }
       }
    
        //Add to Silverlight Object///////////////////////////////////////    
        this.Holder.children.add(xamlFragment);

        //Return mediaArray if from zipped package///////////////////////
        return mediaArray;  
    }
    
    this.getInit = function(key)
    {   //alert("before: " + this.InitArray.length)
        for(var i= 0; i< this.InitArray.length; i++)
        {   
            if(this.InitArray[i].uri == key)
            {
                var myInit = this.InitArray[i];
                this.InitArray.splice(i, 1);
                //alert("after: " + this.InitArray.length)
                return myInit;
            }
        }
        return false;
    }    

    this.addInsert = function(inserts, XAML)
    {
        var myXAML = XAML;
        if(inserts)
        {
            for(var i=0; i< inserts.length; i++)
            {   
                while(myXAML.indexOf(inserts[i].target) != -1)
                {
                    var start = myXAML.indexOf(inserts[i].target);
                    var end = inserts[i].target.length + start;
                   
                    if(start)
                    {
                      myXAML = myXAML.substr(0, start) + inserts[i].value + myXAML.substr(end);
                    }
                }
            }
            return myXAML;
        }
        else{return XAML;}
    }

    this.infuseID = function(ID, XAML)
    {
        var myXAML = XAML;
        var seachStringArray = ['x:Name="', 'TargetName="', "x:Name='", "TargetName='"]
    
        for(var i=0; i< seachStringArray.length; i++)
        {
            var nameArray = myXAML.split(seachStringArray[i]);
            for(var j=1; j< nameArray.length; j++){
                var quoteSpot = null;
                if(i < 2){quoteSpot = nameArray[j].indexOf('"');}
                else{quoteSpot = nameArray[j].indexOf("'");}
                nameArray[j] = seachStringArray[i] + nameArray[j].substr(0, quoteSpot) + "_CM" + ID + nameArray[j].substr(quoteSpot);
            }
            var myXAML = nameArray.join("");
        }
        return myXAML
    }

    this.stripMedia = function(XAML, Invoice)
    {   
        var myInvoice = Invoice;
        var myXAML = XAML;
        for(var i=0; i< myInvoice.length; i++)
        {
            if(typeof(myInvoice[i]) == "string")
            {   
                if(myInvoice[i].substr(myInvoice[i].length-3).toLowerCase() == ("jpg" || "png" || "gif"))
                {   
                    while(myXAML.indexOf(myInvoice[i])!= -1)
                    {   
                        var myName = "";
                        var beginning = myXAML.substr(0, myXAML.indexOf(myInvoice[i]));
                        beginning = beginning.substr(0, beginning.indexOf("Source"));
                        var ending = myXAML.substr(myXAML.indexOf(myInvoice[i]));
                        ending = ending.substr(ending.indexOf('"')+1);
                        
                        if(beginning.lastIndexOf("x:Name") > beginning.lastIndexOf("<"))
                        {   
                            var myName = this.retrieveName(beginning.substr(beginning.lastIndexOf("<")));
                            myXAML = beginning + ending;
                            myInvoice[i] = myName +","+myInvoice[i];
                        }
                        else if(ending.lastIndexOf("x:Name") < beginning.lastIndexOf(">"))
                        {   
                            var myName = this.retrieveName(ending);
                            myXAML = beginning + ending;
                            myInvoice[i] = myName +","+myInvoice[i];
                        }
                        else{   
                        myXAML = beginning +'x:Name="CM_pic'+ CM_itemCount+'"'+ending;
                        myInvoice[i] = "CM_pic"+CM_itemCount+","+myInvoice[i];
                        CM_itemCount++;
                        }
                    }
                }
                else if(myInvoice[i].substr(myInvoice[i].length-3).toLowerCase() == ("wmv" || "mp3"))
                {
                    while(myXAML.indexOf(myInvoice[i])!= -1)
                    {   
                        var myName = "";
                        var beginning = myXAML.substr(0, myXAML.indexOf(myInvoice[i]));
                        beginning = beginning.substr(0, beginning.indexOf("Source"));
                        var ending = myXAML.substr(myXAML.indexOf(myInvoice[i]));
                        ending = ending.substr(ending.indexOf('"')+1);
                        if(beginning.lastIndexOf("x:Name") > beginning.lastIndexOf("<"))
                        {   
                            var myName = this.retrieveName(beginning.substr(beginning.lastIndexOf("<")));
                            myXAML = beginning + ending;
                            myInvoice[i] = myName +","+myInvoice[i];
                        }
                        else if(ending.lastIndexOf("x:Name") < beginning.lastIndexOf(">"))
                        {
                            var myName = this.retrieveName(ending);
                            myXAML = beginning + ending;
                            myInvoice[i] = myName +","+myInvoice[i];
                        }
                        else{
                            myXAML = beginning +'x:Name="CM_med'+ CM_itemCount+'"'+ending;
                            myInvoice[i] = "CM_med"+CM_itemCount+","+myInvoice[i];
                            CM_itemCount++;
                        }
                    }
                }   
                else if(typeof(myInvoice[i]) == "string"  && myInvoice[i].substr(myInvoice[i].length-4).toLowerCase() != "xaml")
                {   
                    var myFont = myInvoice[i];
                    while(myXAML.indexOf(myFont)!= -1)
                    {   
                        var myName = "";
                        var beginning = myXAML.substr(0, myXAML.indexOf(myFont));
                        beginning = beginning.substr(0, beginning.indexOf("FontFamily"));
                        var ending = myXAML.substr(myXAML.indexOf(myFont));
                        ending = ending.substr(ending.indexOf('"')+1);
                        if(beginning.lastIndexOf("x:Name") > beginning.lastIndexOf("<"))
                        {   
                            var myName = this.retrieveName(beginning.substr(beginning.lastIndexOf("<")));
                            myXAML = beginning + ending;
                            myInvoice[i] = myName +","+myInvoice[i];
                        }
                        else if(ending.lastIndexOf("x:Name") < beginning.lastIndexOf(">"))
                        {
                            var myName = this.retrieveName(ending);
                            myXAML = beginning + ending;
                            myInvoice[i] = myName +","+myInvoice[i];
                        }
                        else{
                            myXAML = beginning +'x:Name="CM_txt'+ CM_itemCount+'"'+ending;
                            myInvoice[i] = "CM_txt"+CM_itemCount+","+myInvoice[i];
                            CM_itemCount++;
                        }
                    }
                }
            }
        }
        //alert(myInvoice)
        var returnArray = new Array(myXAML, myInvoice);
        return returnArray;
    }

    this.retrieveName = function(snippet)
    {   
        if(snippet.indexOf("x:Name") > -1)
        {   
            var theX = snippet.indexOf("x:Name");
            var theName = snippet.substr(snippet.indexOf('"', theX)+1);
            theName = theName.substr(0, theName.indexOf('"'));
            return theName;
        }
        else{ return false }
    }

    this.setupPropName = function(myProp)
    {   
        var theProp = "";
        switch(myProp.toString()) {
            case "Left":
                theProp = "Canvas.Left";
                break;
            case "Top":
                theProp = "Canvas.Top";
                break;
            case "Height":
                theProp = "Height";
                break;
            case "Width":
                theProp = "Width";
                break;
            case "Opacity":
                theProp = "Opacity";
                break;
            case "Visibility":
                theProp = "Visibility";
                break;
            default:
                theProp = false;
        }
        return theProp;
    }
//////////////////////////////////////////////////////////////////////////////////////////////////////
//Private Transformation Methods//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
    this.createTransform = function(myPropObject)
    {
        var returnString = '\n'+'<Canvas.RenderTransform>'+'\n'+'\t'+'<TransformGroup>'+'\n';
        var orderString = "";
        //scale
        var scaleX = 1;
        var scaleY = 1;
        var sCenterX = 0;
        var sCenterY = 0;
        //skew
        var angleX = 0;
        var angleY = 0;
        var kCenterX = 0;
        var kCenterY = 0;
        //rotate
        var angle = 0;
        var rCenterX = 0;
        var rCenterY = 0;
        //translate
        var x = 0;
        var y = 0;
    
        for(var propName in myPropObject){
            switch(propName.toString()){
                case "ScaleTransform":
                   var PO = myPropObject[propName];
                    scaleX = PO.ScaleX;
                    scaleY = PO.ScaleY;
                    sCenterX = PO.CenterX;
                    sCenterY = PO.CenterY;
                    if(orderString.length < 4 && orderString.indexOf("s") == -1) orderString += "s";
                    break;
                case "SkewTransform":
                    var PO = myPropObject[propName];
                    angleX = PO.AngleX;
                    angleY = PO.AngleY;
                    kCenterX = PO.CenterX;
                    kCenterY = PO.CenterY;
                    if(orderString.length < 4 && orderString.indexOf("k") == -1) orderString += "k";
                    break;
                case "RotateTransform":
                    var PO = myPropObject[propName];
                    angle = PO.Angle;
                    rCenterX = PO.CenterX;
                    rCenterY = PO.CenterY;
                    if(orderString.length < 4 && orderString.indexOf("r") == -1) orderString += "r";
                    break;
                case "TranslateTransform":
                    var PO = myPropObject[propName];
                    x = PO.X;
                    y = PO.Y;
                    if(orderString.length < 4 && orderString.indexOf("t") == -1) orderString += "t";
                    break;
                case "ScaleX":
                    var PO = myPropObject[propName];
                    scaleX = PO;
                    if(orderString.length < 4 && orderString.indexOf("s") == -1) orderString += "s";
                    break;
                case "ScaleY":
                    var PO = myPropObject[propName];
                    scaleY = PO;
                    if(orderString.length < 4 && orderString.indexOf("s") == -1) orderString += "s";
                    break;
                case "Scale":
                    var PO = myPropObject[propName];
                    scaleX = PO;
                    scaleY = PO;
                    if(orderString.length < 4 && orderString.indexOf("s") == -1) orderString += "s";
                    break;
                case "SkewX":
                    var PO = myPropObject[propName];
                    skewX = PO;
                    if(orderString.length < 4 && orderString.indexOf("k") == -1) orderString += "k";
                    break;
                case "SkewY":
                    var PO = myPropObject[propName];
                    skewY = PO;
                    if(orderString.length < 4 && orderString.indexOf("k") == -1) orderString += "k";
                    break;
                case "Angle":
                    var PO = myPropObject[propName];
                    angle = PO;
                    if(orderString.length < 4 && orderString.indexOf("r") == -1) orderString += "r";
                    break;
                case "X":
                    var PO = myPropObject[propName];
                    x = PO;
                    if(orderString.length < 4 && orderString.indexOf("t") == -1) orderString += "t";
                    break;
                case "Y":
                    var PO = myPropObject[propName];
                    y = PO;
                    if(orderString.length < 4 && orderString.indexOf("t") == -1) orderString += "t";
                    break;
                default:
                    break;
            }    
        }
        if(orderString.length < 4){
            if(orderString.indexOf("s") == -1) orderString += "s";
            if(orderString.indexOf("k") == -1) orderString += "k";
            if(orderString.indexOf("r") == -1) orderString += "r";
            if(orderString.indexOf("t") == -1) orderString += "t";
        }
    
        switch(orderString.charAt(0)){
            case "s":
                returnString += this.createScale(scaleX, scaleY, sCenterX, sCenterY);
                break;
            case "k":
                returnString += this.createSkew(angleX, angleY, kCenterX, kCenterY);
                break;
            case "r":
                returnString += this.createRotation(angle, rCenterX, rCenterY);
                break;
            case "t":
                returnString += this.createTranslation(x, y);
                break;
        }
        switch(orderString.charAt(1)){
            case "s":
               returnString += this.createScale(scaleX, scaleY, sCenterX, sCenterY);
               break;
            case "k":
                returnString += this.createSkew(angleX, angleY, kCenterX, kCenterY);
                break;
            case "r":
                returnString += this.createRotation(angle, rCenterX, rCenterY);
                break;
            case "t":
                returnString += this.createTranslation(x, y);
                break;
        } 
        switch(orderString.charAt(2)){
            case "s":
                returnString += this.createScale(scaleX, scaleY, sCenterX, sCenterY);
                break;
            case "k":
                returnString += this.createSkew(angleX, angleY, kCenterX, kCenterY);
                break;
            case "r":
                returnString += this.createRotation(angle, rCenterX, rCenterY);
                break;
            case "t":
                returnString += this.createTranslation(x, y);
                break;
        } 
        switch(orderString.charAt(3)){
            case "s":
                returnString += this.createScale(scaleX, scaleY, sCenterX, sCenterY);
                break;
            case "k":
                returnString += this.createSkew(angleX, angleY, kCenterX, kCenterY);
                break;
            case "r":
                returnString += this.createRotation(angle, rCenterX, rCenterY);
                break;
            case "t":
                returnString += this.createTranslation(x, y);
                break;
        }
        returnString += '\t'+'</TransformGroup>'+'\n'+'</Canvas.RenderTransform>'+'\n'; 
     
        return returnString;
    }

    this.createScale = function(x, y, cx, cy)
    {
        var myString =  '\t'+'\t'+'<ScaleTransform x:Name="Scale" CenterX="' + cx + '" CenterY="' + cy + '" ScaleX="' + x + '" ScaleY="' + y + '" />'+'\n';
        return myString;
    }

    this.createSkew = function(x, y, cx, cy)
    {
        var myString =  '\t'+'\t'+'<SkewTransform x:Name="Skew" AngleX="' + x + '" AngleY="' + y + '" CenterX="' + cx + '" CenterY="' + cy + '" />'+'\n';
        return myString;
    }

    this.createRotation = function(a, cx, cy)
    {
       var myString =  '\t'+'\t'+'<RotateTransform x:Name="Rotate" Angle="' + a + '" CenterX="' + cx + '" CenterY="' + cy + '" />'+'\n';
       return myString;
    }

    this.createTranslation = function(x, y)
    {
        var myString =  '\t'+'\t'+'<TranslateTransform x:Name="Translate" X="' + x + '" Y="' + y + '" />'+'\n';
        return myString;
    }
    
////Initialize/////////////////////
 if(this.Holder.toString() != "Canvas")
    {
        return false;
    }
 else{ return true;}    
    
    
}//End Class

//Global Functions

function preserveScope(target, callback, arguments)
{   
	var func = function() {
		callback.apply(target, arguments);
	}
	return func;
} 
    
function getID(name)
{   
    var start = name.lastIndexOf("_CM")+1;
    var myID = name.substr(start);
    return myID
}
