﻿

var currentStageId='';
var placedUnits=new Array();
var theDroppables=new Array();
var dropCount=0; 
var maxwidth=12;
var maxheight=10;
var unitwidth=28;
var unitheight=28;
var xoffset=16*unitwidth/2-maxwidth*unitwidth/2;
var stageItems=new Array();
var shelves=new Array();

var holders=new Array(maxwidth);
for (var i=0;i<holders.length;i++)
{
    holders[i]=new Array(maxheight);
}

var pItem=null;



function clearHolders()
{
    for (var x=0;x<holders.length;x++)
    {
        for (var y=0;y<holders[x].length;y++)
        {
            holders[x][y]=null;
        } 
    }
}




function beforeStartDrag(elem)
{
    if (isElementDraggable(elem.element) && hasShelf(elem.element))
    {
        
        w=elem.element.shelf.width/200;
        h=elem.element.shelf.height/187.5;
        createDroppables(w,h,elem.element);
        return true;
        
   }
   return false;
}

function startDrag(elem)
{
    
}

function endDrag(elem)
{
    clearDroppables();
    updateShelves();
}



function clearDroppables()
{
    for (var i=0;i<theDroppables.length;i++)
     {
        Droppables.remove(theDroppables[i]);
        pb.removeChild(document.getElementById(theDroppables[i]));
     }
     theDroppables=new Array();
}

function isDra(shelf)
{
     return true;
     var starty = 0;
     var stopy = 6-h;//holders[x].length

     if (shelf.positionRule == 1)
        stopy = 1;
     else if (shelf.positionRule == 2)
        starty = 1;
     
     for (var x=0;x<(holders.length-shelf.width/200+1);x++)
     {
        maxy=holders[x].length-1;
        if (allempty)
            maxy=0
        for (var y=starty;y<stopy;y++)//=y+h/1
        {
            
            if (!isAreaGrounded(x,y,shelf.width/200,shelf.toolimage,true))
            {
                return false;
            }
            if (isAreaFree(x,y,shelf.width/200,shelf.height/187.5,shelf.toolimage,true))
            {
                return true;
            }
        }
     }
     return false;
}

function createDroppables(w,h,elem)
{
     clearDroppables();
     pb=document.getElementById("planBox");
     
     allempty=(placedUnits.length==0);
     
     var shelf=elem.shelf;
     
     var starty = 0;
     var stopy = maxheight+1-h;//holders[x].length

     if (shelf.positionRule == 1)
        stopy = 1;
     else if (shelf.positionRule >1)
        starty = 1;
     
     for (var x=0;x<(holders.length-w+1);x++)
     {
        maxy=holders[x].length-1;
        if (allempty)
            maxy=0
        for (var y=starty;y<stopy;y++)//=y+h/1
        {
            var areagrounded=isAreaGrounded(x,y,w,elem,false);
            if (shelf.positionRule<3 && !isAreaGrounded(x,y,w,elem,false))
                break;
            if (!(shelf.positionRule==3 && hasItemBelow(x,y,w,elem,false)))
            {
            if (isAreaFree(x,y,w,h,elem,false))
            {
                nd=document.createElement("div");
                nd.id='holder_' + x + '_' + y;
                nd.style.position='absolute';
                nd.style.width=unitwidth*w + 'px';
                nd.style.height=h/1*unitheight + 'px';
                nd.style.top=14*27-h/1*unitheight-y*unitheight + 'px';
                nd.style.left=xoffset+x*unitwidth + 'px';
                nd.className='dragTarget';
                Element.setOpacity(nd,0.2);
                pb.appendChild(nd);
                Droppables.add(nd.id,{hoverclass:'hoverItem',greedy:true,onDrop: function(element, droppableElement){
                    handleDrop(element,droppableElement);
                }});
                theDroppables[theDroppables.length]=nd.id;
            }
            }
        }
     }
}



function hasShelf(elem)
{
    return (typeof(elem.shelf)!='undefined' && elem.shelf!=null);
}

function isClone(elem)
{
    return (typeof(elem.isclone)!='undefined' && elem.isclone==true);
}

function isElementDraggable(elem)
{
    if (hasShelf(elem) && !isClone(elem))
        return true;
    if (typeof(elem.itemX)!='undefined' && typeof(elem.itemY)!='undefined')
    {
        for (var x=elem.itemX;x<(elem.itemX+elem.itemW);x++)
        {
            for (y=elem.itemY;y<holders[x].length;y++)
            {
                if (holders[x][y]!=null && holders[x][y].id!=elem.id)
                    return false;
                else if (holders[x][y]==null)
                    return true;
            }
        }
    }
    return true;
    
}

function isAreaGrounded(x,y,w,elem,ignoreSame)
{
    if (y<=0)
        return true;
    for (var i=x;i<(x+w);i++)
    {
        if (holders[i][y-1]==null || (!ignoreSame && holders[i][y-1].id==elem.id) || elem.shelf.depth>holders[i][y-1].shelf.depth || elem.shelf.width!=holders[i][y-1].shelf.width)
            return false;
    }
    return true;
}

function hasItemBelow(x,y,w,elem,ignoreSame)
{
    if (y<=0)
        return false;
    for (var i=x;i<(x+w);i++)
    {
        if (holders[i][y-1]!=null)
        {
            if (holders[i][y-1].id==elem.id || holders[i][y-1].shelf.positionRule==3)
            {
            }
            else
                return true;
        }
    }
    return false;
}

function isAreaFree(x,y,w,h,elem,ignoreSame)
{
    if ((x+w)>holders.length || (y+h)>holders[0].length)
        return false;
    for (var i=x;i<(x+w);i++)
    {
        for (var j=y;j<(y+h);j++)
        {
            if (holders[i][j]!=null && (ignoreSame || holders[i][j].id!=elem.id))
                return false;
        }
    }
    return true;
}

function removeFromHolders(id)
{
    for (var x=0;x<holders.length;x++)
    {
        for (var y=0;y<holders.length;y++)
        {
            if (holders[x][y]!=null && holders[x][y].id==id)
            {
                holders[x][y]=null;
            }
        }
    }
}

function handleDrop(element,droppableElement)
{
    //Element.show('UpdateProgress1');
    Element.show('UpdateProgress2');
    clearDroppables();
    
    if (!hasShelf(element))
        return;
    
    var pb=document.getElementById("planBox");
    elemid='';
    
    if (isClone(element))
    {
        elemid=element.id;
        pb.removeChild(element);
        removeFromHolders(element.id);
    }
    else
    {
        elemid=element.id + '_clone_' + dropCount;
    }
    
    var w=element.shelf.width/200;
    var h=element.shelf.height/187.5;
    
    var a=droppableElement.id.split('_');
    var x=a[1]/1;
    var y=a[2]/1;
    createShelf(x,y,w,h,element.shelf,elemid,pb,element);
}

function createShelf(x,y,w,h,shelf,elemid,pb,element)
{
    var nd=document.createElement("div");
    nd.shelf=shelf;
    nd.isclone=true;
    nd.id=elemid;
    nd.style.position='absolute';
    nd.style.width=unitwidth*w + 'px';
    nd.style.height=h/1*unitheight + 'px';
    //if (shelf.id=='E30A94')
    //    nd.style.top=14*27-h/1*unitheight-y*unitheight + 20 + 'px';
    //else
    nd.style.top=14*27-h/1*unitheight-y*unitheight + 'px';
    nd.style.left=xoffset+x*unitwidth + 'px';
    nd.className='dropped-items';
    nd.itemX=x;
    nd.itemY=y;
    nd.itemW=w;
    nd.itemH=h;
    
    var ndimg=document.createElement("img");
    ndimg.style.position='absolute';
    ndimg.style.width=nd.style.width;
    ndimg.style.height=nd.style.height;
    ndimg.id='image'+nd.id;
    if (typeof(element.shelfImage)!='undefined')
        ndimg.setAttribute("src",element.shelfImage.src);
    else
        ndimg.setAttribute("src",element.src);
    nd.appendChild(ndimg);
    nd.shelfImage=ndimg;
    
    /*
    var trashimg=document.createElement("img");
    trashimg.style.position='absolute';
    trashimg.style.left=(unitwidth*w-29) + 'px';//=nd.style.width;
    trashimg.style.top='10px';
    trashimg.style.visibility='hidden';
    trashimg.src='img/_ui/close.gif';
    nd.appendChild(trashimg);
    
    ndimg.onmouseover=function()
    {
        trashimg.style.visibility='visible';
    }
    
    ndimg.onmouseout=function()
    {
        trashimg.style.visibility='hidden';
    }*/
    
   
    
    
    
    if (isClone(element))
    {
        nd.stageItemId=element.stageItemId;
        updateStageItemOnServer(currentStageId,nd.stageItemId,x,y);
    }
    else
    {
        //stageItemId=generateGuid();
        //nd.stageItemId=stageItemId;
        createStageItemOnServer(currentStageId,"",element.shelf.id,x,y,nd);
    }
    
             
    pb.appendChild(nd);
    
    dropCount++;
    
    for (var i=x;i<(x+w);i++)
    {
        for (var j=y;j<(y+h);j++)
        {
             holders[i][j]=nd;
        }
    }
    //alert(nd.id);
    new Draggable(nd.id,{revert:true,ghosting:false,endeffect:function(){},reverteffect:function(element, top_offset, left_offset){clearDroppables();new Effect.MoveBy(element, -top_offset, -left_offset, {duration:0});},onBeforeStart:function(draggable, event){return beforeStartDrag(draggable)},onStart:function(draggable, event){startDrag(draggable)}});
}

function generateGuid()
{
    var result, i, j;
    result = '';
    for(j=0; j<32; j++)
    {
    if( j == 8 || j == 12|| j == 16|| j == 20)
    result = result + '-';
    i = Math.floor(Math.random()*16).toString(16).toUpperCase();
    result = result + i;
    }
    return result
}

var commandQueue=new Array();

function updateStageItemOnServer(stageId,stageItemId,x,y)
{
    disableAllShelves();
    EFGStorage.WebServices.StorageService.UpdateStageItem(stageItemId,x,y,onSucceededWithContext,onFailed,null,null);
//    var cmd=new EFGStorage.Commands.ItemActionCommand();
//    cmd.Action="Update";
//    cmd.ItemId=stageItemId;
//    cmd.XPos=x;
//    cmd.YPos=y;
//    commandQueue[commandQueue.length]=cmd;
//    updateShelves();
}

function createStageItemOnServer(stageId,stageItemId,shelfId,x,y,nd)
{
    disableAllShelves();
    EFGStorage.WebServices.StorageService.CreateStageItem(stageId,shelfId,x,y,onSucceededWithContext,onFailed,nd,null);
//    var cmd=new EFGStorage.Commands.ItemActionCommand();
//    cmd.Action="Create";
//    cmd.ItemId=stageItemId;
//    cmd.Shelf=shelfId;
//    cmd.XPos=x;
//    cmd.YPos=y;
//    commandQueue[commandQueue.length]=cmd;
//    updateShelves();
}

function removeStageItem(element)
{
    Element.show('UpdateProgress2');
    disableAllShelves();
    removeFromHolders(element.id);
    EFGStorage.WebServices.StorageService.DeleteStageItem(currentStageId,element.stageItemId,onSucceededWithContext,onFailed,null,null);
    
//    var cmd=new EFGStorage.Commands.ItemActionCommand();
//    cmd.Action="Delete";
//    cmd.ItemId=stageItemId.stageItemId;
//    commandQueue[commandQueue.length]=cmd;
//    
//    clearDroppables();
//    updateShelves();
    
}

function processCommandQueue()
{
    var result=EFGStorage.WebServices.StorageService.ProcessItemActionCommands(currentStageId,commandQueue,onSucceededWithContext,onFailed);
    commandQueue=new Array();
}

function onSucceededWithContext(result, userContext, methodName)
{
    switch(methodName)
    {
        case "CreateStageItem":
             clearDroppables();
            userContext.stageItemId=result;
            //updateShelves();
            break;
        case "UpdateStageItem":
             clearDroppables();
            //updateShelves();
            break;
        case "DeleteStageItem":
            clearDroppables();
            updateShelves();
            break;
        case "ProcessItemActionCommands":
            alert('Yes');
            break;
        case "GetShelfStatuses":
            setShelfStatuses(result);
            break;
        case "ClearStage":
            clearStageImages();
            clearHolders();
            updateShelves();
            window.     setTimeout('clear3DScene()',100);
            break;
        
    } 
    //Element.hide('UpdateProgress1');
    Element.hide('UpdateProgress2');
}


function updateShelves()
{
    //EFGStorage.WebServices.StorageService.GetShelfStatuses(currentStageId,onSucceededWithContext,onFailed,null,null);
    
    var checkedShelves=new Array();
    
    for(var imgid in shelves)
    {    
      
        if (typeof(shelves[imgid].id)!='undefined')
        {
            var idd=false;
            if (typeof(checkedShelves[shelves[imgid].positioningKey])=='undefined')
            {
                idd=isDra(shelves[imgid]);
                checkedShelves[shelves[imgid].positioningKey]=idd;
            }
            else
            {
                idd=checkedShelves[shelves[imgid].positioningKey];
            }
            if (!setShelfStatus(shelves[imgid].id,idd))
            {
                //alert(shelves[imgid].id);
            }
        }
        
    }
}

function setShelfStatuses(statusList)
{
    for (var key in statusList)
    {
        if (!setShelfStatus(key,true))//(statusList[key]==true)
        {
         //   alert(key);
        }
    }
}

function onFailed(error)
{
    
}


var appletLoaded=false;

function CallBackFromApplet(value)
{
    if (value=="handleSysEv: START")
    {
        initialize3D();
    }
    else
    {
        try
        {
            var response=value.parseJSON();
            switch (response.commandName)
            {
                case "itemClick":
                {
                    selectItem(response.itemId);
                    break;
                }
                case "uploadFinished":
                {
                    //väntar en stund, eftersom uploadfinished triggas för fort
                    window.setTimeout('showPrintOut(\'' + response.nextUrl + '\')',1500);
                    break;
                }
                case "updateStatus":
                {
                    if (response.status || response.status=='true')
                        Element.show("UpdateProgress3");
                    else
                        Element.hide("UpdateProgress3");
                    
                }
                case "uploadProgress":
                {
                    break;
                }
            }
        }
        catch(e)
        {
            //alert(value);
        }
        //Element.hide('UpdateProgress1');
        Element.hide('UpdateProgress2');
    }
}



function showPrintOut(url)
{
   if (emailPopup!=null)
   {
    emailPopup.location.href=url;
   }
   
    //Popup.open(url);
}

function disableAllShelves()
{
    return;
    for(var imgid in shelves)
    {
        setShelfStatus(shelves[imgid].id,false);
    }
}

function clearStage()
{
    Element.show('UpdateProgress2');
    EFGStorage.WebServices.StorageService.ClearStage(currentStageId,onSucceededWithContext);  
}

function clearStageImages()
{
    var pb=document.getElementById("planBox");
    while (pb.firstChild!=null)
    {
        pb.removeChild(pb.firstChild);
    }
    
}

function setShelfStatus(shelfId,status)
{
    status=true;
    // return;
    //alert('setShelfStatus' + shelfId);
    for(var imgid in shelves)
    {
        if (shelves[imgid].id==shelfId)
        {
            var img=document.getElementById(imgid);
            if (img)
            {
                if (status)
                {
                    new Draggable(imgid,{revert:true,reverteffect:function(element, top_offset, left_offset){clearDroppables();new Effect.MoveBy(element, -top_offset, -left_offset, {duration:0});},ghosting:true,onBeforeStart:function(draggable, event){return beforeStartDrag(draggable)},onEnd:function(draggable, event){endDrag(draggable)},onStart:function(draggable, event){startDrag(draggable)}});
                    document.getElementById(imgid).className='';
                }
                else
                {
                   // if (imgid=='E30A22')
                    Draggables.unregister(document.getElementById(imgid));
                    document.getElementById(imgid).className='disabledImage';
                }
            }
            else
            {
                //alert('Hittade inte imgid:' + imgid);
            }
            
            return true;
        }
        
    }
   
    return false;
}

function TestFunction()
{
    //EFGStorage.WebServices.StorageService.GetFullStage('88898D64-4975-4783-BB9F-0B343E908C99',xa);  
}

function executeCommands(commandString)
{
    sendCommandsToApplet(commandString);
}


function sendCommandsToApplet(commandString)
{
    //if (!(curPage.id=='page_config'))
    //{
   //     alert(invalidContextForCommandText);
   //     return;
   // }
    commandArray=commandString.parseJSON();
    var jsonArray= {"commands": commandArray};
    try
    {
        document.EFGStorage.send('commandPort', jsonArray.toJSONString());
    }
    catch(e)
    {
    }
}


function parseCommandArrayResponse(result, userContext, methodName)
{
    
    try
    {
        sendCommandsToApplet(result.toJSONString());
    }
    catch(e)
    {
        //alert('' + 'error\n' + result);
    }
}

function initialize3D()
{
  EFGStorage.WebServices.StorageService.GetFullStage(currentStageId,parseCommandArrayResponse);  
}



function refresh3DScene()
{
    clear3DScene();
    initialize3D();
}

function clear3DScene()
{
    var commandArray= {"commands": [
            {
            "commandName": "clearStageCommand"
            }
        ]
    };
    sendCommandsToApplet(commandArray.toJSONString());
}


var curPage=null;

var applet=null;

function showPage(pageId)
{
    if (curPage!=null)
    {
        hideDiv(curPage);
        //curPage.style.display='none';
    }
    curPage=document.getElementById(pageId);
    if (curPage!=null)
    {
        showDiv(curPage);
        //curPage.style.height='500px';
    }
    if (pageId=='page_config')
    {
        if (!appletLoaded)
            loadApplet();
        else if (document.all)
            refresh3DScene();
        selectItem('');    
    }

}

function hideDiv(elem)
{
    elem.style.display='none';
}

function showDiv(elem)
{
    elem.style.display='block';  
}

function putParam(array,name, value) {
    array[array.length] = name;
    array[array.length] = value;
}



function loadApplet()
{
    var html = '<applet id="EFGStorageApplet" width="600" height="480" name="EFGStorage" code="WireFusion_Player.class" codebase="." mayscript>'
               + '<param name="info" value="Created with WireFusion - http://www.demicron.com/wirefusion">'
               + '<param name="archive" value="java_applets/wf-player/startup6.jar,java_applets/wf-player/core6.jar,java_applets/wf-player/3D_Scene-4.0.jar,java_applets/wf-player/4241679-json.jar,java_applets/EFGStorage/classes.jar">'
               + '<param name="license" value="Registered version">'
               + '<param name="version" value="4.1.20">'
               + '<param name="resourcefolder" value="java_applets/EFGStorage/">'
               + '<param name="preloadfile" value="preload.jar">'
               + '<param name="regid" value="466-21">'
               + '<param name="legacy-lifecycle" value="true">'
               + 'You need Java(tm) to view this presentation. <a href="http://www.java.com">Download Java</a></applet>'
    
     var html2 = '<applet id="EFGStorageApplet" width="600" height="480" name="EFGStorage" code="WireFusion_Player.class" codebase="." mayscript>'
               + '<param name="info" value="Created with WireFusion - http://www.demicron.com/wirefusion">'
               + '<param name="archive" value="applet/efgstorage.jar">'
               + '<param name="license" value="Registered version">'
               + '<param name="version" value="4.1.20">'
               + '<param name="regid" value="466-21">'
               + 'You need Java(tm) to view this presentation. <a href="http://www.java.com">Download Java</a></applet>'
    
     var html3 = '<applet id="EFGStorageApplet" width="600" height="480" name="EFGStorage" code="WireFusion_Player.class" codebase="wplayer/" mayscript>'
               + '<param name="info" value="Created with WireFusion - http://www.demicron.com/wirefusion">'
               + '<param name="license" value="Registered version">'
               + '<param name="version" value="4.1.20">'
               + '<param name="regid" value="466-21">'
               + 'You need Java(tm) to view this presentation. <a href="http://www.java.com">Download Java</a></applet>'
 
    
    //html = '<iframe src="Applet.aspx' width="450" height=450
    
    document.getElementById("applet").innerHTML=html;
    //document.getElementById("applet").innerHTML='<iframe src="EFGStorage.html" width="600" height="600"></iframe>';
    appletLoaded=true;   
}



/*function updateItemOnStage(itemAsJson)
{
    var item=Sys.Serialization.JavaScriptSerializer.deserialize(itemAsJson);
    var commandArray= {"commands": [
            {
            "commandName": "loadObject", 
            "itemId": item.Id,
            "xPos": (item.Xpos*200+item.ShelfConfiguration.Shelf.Width/2)/5,  
            "yPos": (item.Ypos*375+item.ShelfConfiguration.Shelf.Height/2)/5,  
            "modelName": item.ShelfConfiguration.ModelName
            },
            {
            "commandName": "changeMaterial", 
            "itemId": item.Id,
            "materialDescriptor": (item.FrontMaterial==null) ? null : item.FrontMaterial,
            "nodeNamePattern": getNodeNamePattern('front')
            },
            {
            "commandName": "changeMaterial", 
            "itemId": item.Id,
            "materialDescriptor": (item.BackMaterial==null) ? null : item.BackMaterial,
            "nodeNamePattern": getNodeNamePattern('back')
            },
            {
            "commandName": "changeMaterial", 
            "itemId": item.Id,
            "materialDescriptor": (item.FrameMaterial==null) ? null : item.FrameMaterial,
            "nodeNamePattern": getNodeNamePattern('frame')
            }
        ]
    };
    document.EFGStorage.send('commandPort', Sys.Serialization.JavaScriptSerializer.serialize(commandArray))
}*/






function reloadShelfConfiguration(stageItemId)
{
   initialize3D();
   //EFGStorage.WebServices.StorageService.GetStageItem('88898D64-4975-4783-BB9F-0B343E908C99',xs); 
}

function getNodeNamePattern(nodeString)
{
    var p='';
    switch (nodeString)
    {
        case "frame":
            p='(bottomside|topside|side\\d|shelf|shelf\\d)';
            break;
        case "front":
            p='(frontside|boor|jalusi|doorframe|doorframe\\d|door|door\\d|deaver|drawer\\d|drawer)';
            break;
        case "back":
            p='(backside)';
            break;
       case "plinth":
            p='(backside|frontside|side1|side2|topside1|topside2|foot)';
            break;
        
    }
    return p;
}

function changeShelfMaterial(stageItemId,materialDescriptor,nodeString)
{
    
    var commandArray= {"commands": [
            {
            "commandName": "changeMaterial", 
            "itemId": stageItemId,
            "materialDescriptor": Sys.Serialization.JavaScriptSerializer.deserialize(materialDescriptor),
            "nodeNamePattern": getNodeNamePattern(nodeString)
            }
        ]
    };
    sendCommandsToApplet(commandArray.toJSONString());
}

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
