var weighValues = [ 500 , 200 , 100 , 50 , 20 , 10 ] ;
function onTemplateLoadedCallback ( app ) {
$ . each ( weighValues , function ( ) {
$ ( "#weights" ) . append ( $ ( Mustache . render ( weightTemplate , { weight : this } ) ) ) ;
} ) ;
$ ( "#weights > .weight" ) . draggable ( { helper : "clone" } ) ;
$ ( "#leftScale" ) . droppable ( {
accept : ".object" ,
drop : function ( event , ui ) {
if ( $ ( ui . draggable ) . hasClass ( "inScale" ) )
return ;
var object = $ ( ui . draggable ) . clone ( ) ;
object . data ( "weight" , $ ( ui . draggable ) . data ( "weight" ) ) ;
object . addClass ( "inScale" ) ;
$ ( "#leftScale" ) . append ( object ) ;
placeObject ( $ ( "#leftScale" ) , object ) ;
refreshScales ( ) ;
object . draggable ( {
stop : function ( event , ui ) {
if ( $ ( ui . helper ) . hasClass ( "onOut" ) ) {
$ ( ui . helper ) . remove ( ) ;
refreshScales ( ) ;
}
}
} ) ;
} ,
out : function ( event , ui ) {
$ ( ui . draggable ) . addClass ( "onOut" ) ;
} ,
over : function ( event , ui ) {
$ ( ui . draggable ) . removeClass ( "onOut" ) ;
}
} ) ;
$ ( "#rightScale" ) . droppable ( {
accept : ".weight.right" ,
drop : function ( event , ui ) {
if ( $ ( ui . draggable ) . hasClass ( "inScale" ) )
return ;
var object = createWeight ( app , $ ( ui . draggable ) . data ( "weight" ) ) ;
$ ( "#rightScale" ) . append ( object ) ;
placeObject ( $ ( "#rightScale" ) , object ) ;
refreshScales ( ) ;
} ,
out : function ( event , ui ) {
$ ( ui . draggable ) . addClass ( "onOut" ) ;
} ,
over : function ( event , ui ) {
$ ( ui . draggable ) . removeClass ( "onOut" ) ;
}
} ) ;
$ ( "#objects button[role=add]" ) . click ( function ( ) {
var object = createObject ( app ) ;
$ ( this ) . before ( object ) ;
} ) ;
}
function addObjectWithId ( app , id ) {
var objects = app . parameters . value ( "Objects" ) ;
app . parameters . value ( "Objects" , objects === undefined ? id : objects + "," + id ) ;
}
function removeObjectWithId ( app , id ) {
var objects = app . parameters . value ( "Objects" ) ;
objects = objects . split ( "," ) ;
for ( var i = 0 ; i < objects . length ; i ++ ) {
if ( id === objects [ i ] ) {
objects . splice ( i , 1 ) ;
break ;
}
}
app . parameters . value ( "Objects" , objects . join ( "," ) ) ;
}
function addWeightWithId ( app , id ) {
var objects = app . parameters . value ( "Weights" ) ;
app . parameters . value ( "Weights" , objects === undefined ? id : objects + "," + id ) ;
}
function removeWeightWithId ( app , id ) {
var objects = app . parameters . value ( "Weights" ) ;
objects = objects . split ( "," ) ;
for ( var i = 0 ; i < objects . length ; i ++ ) {
if ( id === objects [ i ] ) {
objects . splice ( i , 1 ) ;
break ;
}
}
app . parameters . value ( "Weights" , objects . join ( "," ) ) ;
}
function objectForGUID ( app , guid ) {
window . object = guid ;
var objectUi = $ ( Mustache . render ( objectTemplate , window ) ) ;
var weight = getWeightFor ( app . parameters , guid ) ;
if ( ! app . onEdit && ( weight == undefined || $ . trim ( weight ) == "" ) )
weight = weighValues [ Math . floor ( Math . random ( ) * weighValues . length ) ] ;
if ( weight !== undefined ) {
objectUi . data ( "weight" , weight ) ;
objectUi . find ( "input[name=weight]" ) . val ( weight ) ;
}
if ( app . onEdit ) {
objectUi . find ( "input[name=weight]" ) . change ( function ( event ) {
var o = objectUi ;
o . data ( "weight" , $ ( this ) . val ( ) ) ;
setWeightFor ( app . parameters , o . attr ( "id" ) , $ ( this ) . val ( ) ) ;
} ) ;
objectUi . find ( "button[role=remove]" ) . click ( function ( ) {
removeObjectWithId ( app , guid ) ;
objectUi . remove ( ) ;
} ) ;
objectUi . find ( "button[role=duplicate]" ) . click ( function ( ) {
$ ( "#objects button[role=add]" ) . before ( createObject ( app , guid ) ) ;
} ) ;
} else {
objectUi . find ( "input[name=weight]" ) . attr ( "disabled" , "disabled" ) ;
objectUi . draggable ( {
containment : "#scene" ,
scroll : false ,
helper : "clone"
} ) ;
}
return objectUi ;
}
function weightForGUID ( app , guid ) {
var weight = getWeightValueFor ( app . parameters , guid ) ;
window . object = guid ;
window . weight = weight ;
var objectUi = $ ( Mustache . render ( weightTemplate , window ) ) ;
var position = getPositionFor ( app . parameters , guid ) ;
objectUi . css ( "left" , position . left ) ;
objectUi . css ( "top" , position . top ) ;
objectUi . addClass ( "inScale" ) ;
if ( app . onEdit ) {
objectUi . draggable ( {
stop : function ( event , ui ) {
if ( $ ( ui . helper ) . hasClass ( "onOut" ) ) {
removeWeightWithId ( app , $ ( ui . helper ) . attr ( 'id' ) ) ;
$ ( ui . helper ) . remove ( ) ;
refreshScales ( ) ;
} else {
var id = ui . helper . attr ( "id" ) ;
var left = ui . position . left ;
var top = ui . position . top ;
log ( left + "-" + top ) ;
setPositionFor ( app . parameters , id , ui . position ) ;
}
}
} ) ;
} else {
}
return objectUi ;
}
function placeObject ( $container , $object ) {
var width = $object . outerHeight ( ) ;
var height = $object . outerHeight ( ) + 15 ;
var count = $container . children ( ) . size ( ) - 1 ;
var left = width * ( count % 4 ) + 5 ;
var bottom = height * ( Math . floor ( count / 4 ) ) + 12 ;
log ( "Place at [" + left + " , " + bottom + "]" ) ;
$object . css ( "left" , left + "px" ) . css ( "bottom" , bottom + "px" ) ;
}
function createObject ( app , duplicateID ) {
var id = app . utils . guid ( ) ;
addObjectWithId ( app , id ) ;
//TODO Duplication : Recupérer les images du dupliqué
return objectForGUID ( app , id ) ;
}
function createWeight ( app , weight ) {
var id = app . utils . guid ( ) ;
addWeightWithId ( app , id ) ;
setWeightValueFor ( app . parameters , id , weight ) ;
return weightForGUID ( app , id ) ;
}
function getWeightFor ( parameters , id ) {
return parameters . value ( "Object#" + id + "Weight" ) ;
}
function setWeightFor ( parameters , id , weight ) {
parameters . value ( "Object#" + id + "Weight" , weight ) ;
}
function getWeightValueFor ( parameters , id ) {
return parameters . value ( "Weight#" + id + "Weight" ) ;
}
function setWeightValueFor ( parameters , id , weight ) {
parameters . value ( "Weight#" + id + "Weight" , weight ) ;
}
function getPositionFor ( parameters , id ) {
var left = parameters . value ( "Weight#" + id + "left" ) ;
var top = parameters . value ( "Weight#" + id + "top" ) ;
return { left : parseInt ( left ) , top : parseInt ( top ) } ;
}
function setPositionFor ( parameters , id , position ) {
parameters . value ( "Weight#" + id + "left" , position . left ) ;
parameters . value ( "Weight#" + id + "top" , position . top ) ;
}
function reloadApp ( app ) {
$ ( "#leftScale, #rightScale" ) . empty ( ) ;
$ ( "#objects > .object" ) . remove ( ) ;
refreshScales ( ) ;
var objects = app . parameters . value ( "Objects" ) ;
if ( objects !== undefined ) {
objects = objects . split ( "," ) ;
for ( var i = 0 ; i < objects . length ; i ++ ) {
var id = objects [ i ] ;
var object = objectForGUID ( app , id ) ;
$ ( "#objects button[role=add]" ) . before ( object ) ;
}
}
var weights = app . parameters . value ( "Weights" ) ;
if ( weights !== undefined ) {
weights = weights . split ( "," ) ;
for ( var i = 0 ; i < weights . length ; i ++ ) {
var id = weights [ i ] ;
var weight = weightForGUID ( app , id ) ;
$ ( "#rightScale" ) . append ( weight ) ;
placeObject ( $ ( "#rightScale" ) , weight ) ;
}
}
refreshScales ( ) ;
if ( app . onEdit ) {
}
}
function refreshScales ( ) {
var leftWeight = getLeftWeight ( ) ;
var rightWeight = getRightWeight ( ) ;
var dWeight = rightWeight - leftWeight ;
var angle = maxAngle * dWeight / maxWeight ;
angle = angle >= 0 ? Math . min ( maxAngle , angle ) : Math . max ( - maxAngle , angle ) ;
var rad = angle * Math . PI / 180 ;
var w = $ ( "#tray" ) . width ( ) / 2 ;
var dx = w - ( w * Math . cos ( rad ) ) ;
var dy = - ( w * Math . sin ( rad ) ) ;
log ( "Rotate to " + angle ) ;
log ( "Tanslate to [" + dx + " , " + dy + "]" ) ;
var rotate = "rotate(" + angle + "deg)" ;
var leftTranslate = "translate(" + dx + "px, " + dy + "px)" ;
var rightTranslate = "translate(" + ( - dx ) + "px, " + ( - dy ) + "px)" ;
$ ( "#tray" ) . css ( "transform" , rotate ) ;
$ ( "#leftScale" ) . css ( "transform" , leftTranslate ) ;
$ ( "#rightScale" ) . css ( "transform" , rightTranslate ) ;
}
function getWeightForSelector ( selector ) {
var weight = 0 ;
$ ( selector ) . each ( function ( ) {
var temp = $ ( this ) . data ( "weight" ) ;
if ( temp !== undefined )
weight += parseInt ( temp ) ;
} ) ;
return weight ;
}
function getLeftWeight ( ) {
return getWeightForSelector ( "#leftScale > div" ) ;
}
function getRightWeight ( ) {
return getWeightForSelector ( "#rightScale > div" ) ;
}
function reloadCallback ( parameter ) {
if ( parameter === undefined )
reloadApp ( this ) ;
}
var maxAngle ;
var maxWeight ;
$ ( document ) . ready ( function ( ) {
var w = $ ( "#scales" ) . width ( ) ;
var h = $ ( "#scales" ) . height ( ) ;
maxAngle = 17 ; //Math.atan((h/2)/(w/2)) * (180/Math.PI);
maxWeight = 10 ;
log ( w + "-" + h + ":" + maxAngle ) ;
var callbacks = {
onTemplatesLoaded : onTemplateLoadedCallback ,
onEdit : reloadApp ,
onView : reloadApp
} ;
init ( reloadCallback , { toolbar : toolbarTemplate , parameters : parametersTemplate } , callbacks ) ;
} ) ;