// ##################################### Djingle SDK ########################
// # ----| Copyright (C) Djingle 2008 - info@djngle.com
// ##########################################################################
function DJPLUGIN_(objJSExt) {
   var obj = document.getElementById(objJSExt);
  
   this.objJSExt = obj;
   var self = this;
   var m_bFirstRequire = true;
   self.m_arEvents = new Object();
   self.getosname = function() {
      return this.objJSExt.sendCmd( "osname" );
      }
   self.require = function( strLibrary ) {
      
      var strCmd;
      var strVal;
      var arParams;
     
      strCmd = "Require " + strLibrary;
     
      strVal = this.objJSExt.sendCmd( strCmd );
    
      arParams = strVal.split( " " );
      if ( arParams[ 0 ] != "Ok" ) {
       
         return false;
         }
      return true;
      }
   self.createObject = function( strObjName ) {
      var strCmd;
      var strVal;
      var arParams;
      strVal = this.objJSExt.sendCmd( "CreateObject " + strObjName );
      arParams = strVal.split( " " );
      if ( arParams[ 0 ] != "Ok" ) {
       
         return "";
         }
      return arParams[ 1 ];
      }
   self.invoke = function( strObjId, strMethod, strParams ) {
      var strCmd = "InvokeMethod " + strObjId + " " + strMethod;
      if ( typeof(strParams) != "undefined" ) {
         strCmd += " " + strParams;
         }
      return this.objJSExt.sendCmd( strCmd );
      }
   self.registerEvents = function( objNotify ) {
      var strId = objNotify.getId();
      self.m_arEvents[ strId ] = objNotify;
      }
   self.unregisterEvents = function( objNotify ) {
      var strId = objNotify.getId();
      delete self.m_arEvents[ strId ];
      }
   self.processEvent = function( strId, strEvent ) {
      var objNotify = self.m_arEvents[ strId ];
      if ( typeof(objNotify) == 'undefined' ) {
     
         return;
         }
      objNotify.onEvent( strEvent );
      }
   }
//***************************************************************************//
//socketModule//
//***************************************************************************//
var AsyncLineSocket = function(DJPLUGIN) {
   var self = this;
   this.DJPLUGIN = DJPLUGIN;
  
   self.connect = function( strAddress, nPort ) {
      var strAddr = strAddress + " " + nPort;
    
      var strVal = this.DJPLUGIN.invoke( self.m_strObjId, "Connect", strAddr );
    
      arParams = strVal.split( " " );
      
      }
   self.sendLine = function( strLine ) {
      var strVal = this.DJPLUGIN.invoke( self.m_strObjId, "SendLine", strLine );
      return strVal;
      }
   self.isClientInstalled = function() {
      var strVal = this.DJPLUGIN.invoke( self.m_strObjId, "isClientInstalled");
      return strVal;
      }
   self.stopClient = function() {
      var strVal = this.DJPLUGIN.invoke( self.m_strObjId, "stopClient");
      return strVal;
      }
   self.startClient = function() {
      var strVal = this.DJPLUGIN.invoke( self.m_strObjId, "startClient");
    
      return strVal;
      }
   self.close = function() {
      strRes = this.DJPLUGIN.invoke( self.m_strObjId, "Close" );
      strRes = this.DJPLUGIN.invoke( self.m_strObjId, "Dispose" );
      this.DJPLUGIN.unregisterEvents( self );
      }
   self.onEvent = function( strData ) {
      
      var arData = strData.split( " " );
      var strEventDesc = arData[ 0 ];
      switch ( strEventDesc ) {
         case "ConnectError" : {
            self.onConnectError();
            break;
            }
         case "Connected" : {
            self.onConnected();
           
            break;
            }
         case "Close" : {
            var strReason = strData.substring( strEventDesc.length + 1 );
            
            self.onClose( strReason );
            break;
            }
         case "OnLine" : {
            var strLine = strData.substring( strEventDesc.length + 1 );
            
            self.retVAlue = strLine;
            self.onLine( strLine );
            break;
            }
         }
      }
   self.getId = function() {
      return self.m_strObjId;
      }
   self.init = function() {
      if ( !this.DJPLUGIN.require( "sockets" ) ) {
         
         return false;
         }
      self.m_strObjId = this.DJPLUGIN.createObject( "sockets.ClientSocket" );
      if ( self.m_strObjId == "" ) {
         return false;
         }
     
      }
   self.onConnected = function() {
      }
   self.onConnectError = function() {
      }
   self.onLine = function( strLine ) {
      }
   self.onClose = function( strReaon ) {
      }
   self.m_strObjId = "";
   self.init();
   }
//***************************************************************************//
//DjComModule class//
//***************************************************************************//
var DjComModule = function(DJPLUGIN) {
   var self = this;
   /////////////////const string to send ///////////////
   var ID_Connect = "CO";
   var ID_GetServiceList = "SL";
   var ID_AddService = "AS";
   var ID_DeleteService = "RS";
   var ID_UpdateService = "US";
   var ID_GetContentList = "CL";
   var ID_GetPendingList = "PL";
   var ID_GetContent = "GC";
   var ID_DownloadContent = "DL";
   var ID_AddContent = "AC";
   var ID_GetDlParams = "GD";
   var ID_UpdateDlParams = "UD";
   var ID_PauseDownload = "PD";
   var ID_DeleteContent = "RC";
   var ID_DisablePending = "DP";
   var ID_GetPreference = "GR";
   var ID_SetPreference = "SR";
   var ID_OpenInterface = "OI";
   var ID_GetLastError = "ER";
   var ID_GetProperty = "GP";
   var ID_SetProperty = "SP";
   var ID_GetDlStatsJS = "DS";
   //////////////////////////////////
   this.instance_id = "";
   //////////////////////////////////
   /////////// init attribute/////////////////
   /* plugin try to connect to client using port range 9710..9810 */
   this.port = 9710;
   /* embedded plugin object */
   this.DJPLUGIN = DJPLUGIN;
   /* socket adress */
   this.url = "127.0.0.1";
   /////////////////////////////////
   ////////////////////isClientINstalled///////////////////////////
   /*test if djingle clinet app is installed in current computer */
   /* return "true" if client founded else "false"*/
   self.isClientInstalled = function() {
      /* initialize socket object */
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      return mySocket.isClientInstalled();
      }
   ////////////////////startClient///////////////////////////
   /* start djingle client application */
   /* return true if start success otherwise false*/
   self.Start = function() {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      return mySocket.startClient();
      }
   ////////////////////startClient///////////////////////////
   /* stop djingle client application */
   /* return true if stop success otherwise false*/
   self.Stop = function() {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      return mySocket.stopClient();
      }
   ////////////////////DownloadContent///////////////////////////
   self.DownloadContent = function(serviceId, content_id, is_extern_id ) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      return mySocket.DownloadContent(serviceId, content_id, is_extern_id);
      }
   /////////////////////connect////////////////////////////
   /* this function try to connect to client application and return the state of client */
   /*return values :
   -10 if client not installed
   -1 if instance not installed
   -2 if client not runnig
   1 if client running
   remark :
  
   */
   self.Connect = function(inst) {
      if(this.isClientInstalled() != "TRUE") {
         return - 10;
         }
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
 
      this.instance_id = inst;
      mySocket.connect( this.url, this.port);
      var req = "{\"instance_id\":\"" + inst + "\"}";
      var taille = getLength(req);
      var str = mySocket.sendLine( ID_Connect + taille + req);
      arParams = str.split( " " );
      var retVal = parseInt(arParams[1]);
      return retVal;
      }
   /////////////////////GetContentList////////////////////////////
   self.GetContentList = function(format) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port);
      var req = "{\"instance_id\":\"" + this.instance_id + "\"" + ",\"format\":\"" + format + "\"}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_GetContentList + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   /////////////////////GetServiceList////////////////////////////
   self.GetServiceList = function(service_id, format) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port);
      var req = "{\"instance_id\":" + this.instance_id + "" + ",\"service_id\":" + service_id + ",\"format\":" + format + "}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_GetServiceList + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   /////////////////////GetPendingList////////////////////////////
   self.GetPendingList = function(service_id, format) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port);
      var req = "{\"instance_id\":" + this.instance_id + "" + ",\"service_id\":" + service_id + ",\"format\":" + format + "}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_GetPendingList + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   /////////////////////AddContent////////////////////////////
   self.AddContent = function(serviceId, content_info) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port);
      var req = "{\"instance_id\":" + this.instance_id + "" + ",\"service_id\":" + service_id + ",\"content_info\":" + content_info + "}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_AddContent + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   /////////////////////UpdateDlParams////////////////////////////
   self.UpdateDlParams = function(service_id, content_id, dlparams_info) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port);
      var req = "{\"instance_id\":" + this.instance_id + "" + ",\"service_id\":" + service_id + ",\"content_id\":" + content_id + ",\"dlparams_info\":" + dlparams_info + "}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_UpdateDlParams + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   /////////////////////PauseDownload////////////////////////////
   self.PauseDownload = function(service_id, content_id, pause) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port);
      var isPause = "false";
      if(pause == 0) {
         isPause = "true";
         }
      else if(pause == 1) {
         isPause = "false";
         }
      var req = "{\"instance_id\":" + this.instance_id + "" + ",\"service_id\":" + service_id + ",\"content_id\":" + content_id + ",\"pause\":" + isPause + "}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_PauseDownload + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   /////////////////////DisablePending////////////////////////////
   self.DisablePending = function(service_id, content_id, disable) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port);
      var isDisable = "false";
      if(disable == 0) {
         var isDisable = "true";
         }
      else {
         var isDisable = "false";
         }
      var req = "{\"instance_id\":" + this.instance_id + "" + ",\"service_id\":" + service_id + ",\"content_id\":" + content_id + ",\"disable\":" + isDisable + "}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_DisablePending + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   //////////////////////AddService////////////////////
   self.AddService = function(service_info) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port );
      var req = "{\"instance_id\":\"" + this.instance_id + "\"" + ",\"service_info\":\"" + service_info + "\"}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_AddService + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   //////////////////////GetContent////////////////////
   self.GetContent = function(service_id, content_id, format) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port );
      var req = "{\"instance_id\":" + this.instance_id + "" + ",\"service_id\":" + service_id + ",\"content_id\":" + content_id + ",\"format\":" + format + "}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_GetContent + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   //////////////////////DeleteContent////////////////////
   self.DeleteContent = function(service_id, content_id) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port );
      var req = "{\"instance_id\":" + this.instance_id + "" + ",\"service_id\":" + service_id + ",\"content_id\":" + content_id + "}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_DeleteContent + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   //////////////////////GetDlParams////////////////////
   self.GetDlParams = function(service_id, content_id, format) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port );
      var req = "{\"instance_id\":" + this.instance_id + "" + ",\"service_id\":" + service_id + ",\"content_id\":" + content_id + ",\"format\":" + format + "}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_GetDlParams + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   /////////////////////DeleteService////////////////////////////
   self.DeleteService = function(service_id) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port );
      var req = "{\"instance_id\":\"" + this.instance_id + "\"" + ",\"service_id\":\"" + service_id + "\"}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_DeleteService + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   /////////////////////UpdateService////////////////////////////
   self.UpdateService = function(service_id, service_info) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port );
      var req = "{\"instance_id\":\"" + this.instance_id + "\"" + ",\"service_id\":\"" + service_id + "\",\"service_info\":\"" + service_info + "\"}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_UpdateService + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   /////////////////////openInterface////////////////////////////
   self.OpenInterface = function(name, params) {
      var mySocket = new AsyncLineSocket(this.DJPLUGIN);
      mySocket.connect( this.url, this.port );
      var req = "{\"name\":\"" + name + "\"" + ",\"params\":\"" + params + "\"}";
      var taille = getLength(req);
      var str = mySocket.sendLine(ID_OpenInterface + taille + req);
      arParams = str.split( " " );
      return arParams[1];
      }
   }
var retVAlue ;
getLength = function(str) {
   var result = "" + str.length;
   var ret = result;
   for(i = 0; i < (10 - result.length); i++) {
      ret = "0" + ret;
      }
   return ret;
   }