/**
 * doRequest
 * function __unescapeString
 *
 *
 * @param  url : string - url to be connected
 * @param  paramObj : CParameterObject
 *
 */

function doRequest(parameterObj)
{
    var xmlhttp = null;
    if (navigator.appName == "Netscape")
        xmlhttp = new XMLHttpRequest();
    else
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");

    xmlhttp.open("GET", parameterObj.getUrl() ,true);
    xmlhttp.onreadystatechange = function() { parseResult(xmlhttp,parameterObj); }
    xmlhttp.setRequestHeader('If-Modified-Since','Wed, 15 Nov 1995 04:58:08 GMT');
    xmlhttp.send(null);
}//end of function

function parseResult(xmlhttp,parameterObj)
{

    if (xmlhttp.readyState==4)
    {

        if(xmlhttp.status==200){
        
            var xmlResponse = xmlhttp.responseText;
           
            if (xmlResponse == null||xmlResponse == "")
            {
                //response is null
                //alert("Response is null !! Not sure where it went wrong ! ") ;
                return ;
            }
            else
            {
				if(parameterObj.getAction() == IActionConstants.GET_PHOTO_BOOK_DETAILS)
                {
                    __updatePhotoBookAction(xmlhttp , parameterObj) ;
					return;
                }
                if (parameterObj.getAction() == IActionConstants.GET_PROMO_GROUP_USER_DETAILS)
                {               
                    __getPromoGroupUserDetails(xmlResponse);
                    return;
                }

				if(parameterObj.getAction() == IActionConstants.GET_CALENDAR_DETAILS)
                {
                    __updateCalendarAction(xmlhttp , parameterObj) ;
					return;
                }
                var parser = new DOMImplementation();
                if(xmlhttp.responseText.indexOf("<html>") == -1)
                {
                    gobjDatabaseDom = parser.loadXML(xmlhttp.responseText);                    

                }else
                {
                    //alert("Did not got the XML !!" );
                    //gobjDatabaseDom = parser.loadXML("<?xml version='1.0' encoding='UTF-8'?>");
                    // this should never come
                    return;
                }
                gobjDatabaseDomTree = gobjDatabaseDom.getDocumentElement();

                // differs for each data structure ( XML file )
                if(parameterObj.getAction() == IActionConstants.STATE)
                {
                    __stateParser ( gobjDatabaseDomTree , parameterObj) ;
                }//end of if
                else if(parameterObj.getAction() == IActionConstants.REGION)
                {
                    __regionParser ( gobjDatabaseDomTree , parameterObj) ;
                }//end of if
                else if(parameterObj.getAction() == IActionConstants.WAREHOUSE)
                {
                    __wareHouseParser ( gobjDatabaseDomTree , parameterObj) ;
                }//end of if
                else if(parameterObj.getAction() == IActionConstants.UPDATE_PIXACO_ACTION)
                {
                    __updatePixacoAction(gobjDatabaseDomTree , parameterObj) ;
                }
                else if(parameterObj.getAction() == IActionConstants.GET_PICTURES)
                {
                    __getPicturesAction(gobjDatabaseDomTree, parameterObj);
                }
                else if(parameterObj.getAction() == IActionConstants.TOGGLE_FAVORITE)
                {
                    __toggleFavoriteAction(gobjDatabaseDomTree, parameterObj);
                }
                else if(parameterObj.getAction() == IActionConstants.DELETE_PICTURE)
                {
                    __deletePictureAction(gobjDatabaseDomTree, parameterObj);
                }
                else if(parameterObj.getAction() == IActionConstants.GET_CONTEST_ENTRIES)
                {
                    __getContestEntriesAction(gobjDatabaseDomTree, parameterObj);
                }
                else if(parameterObj.getAction() == IActionConstants.VOTE_FOR_PICTURE)
                {
                    __voteForPictureAction(gobjDatabaseDomTree, parameterObj);
                }
                else if(parameterObj.getAction() == IActionConstants.MARK_ENTRY_INAPPROPRIATE)
                {
                    __markEntryInappropriateAction(gobjDatabaseDomTree, parameterObj);
                }
                else if(parameterObj.getAction() == IActionConstants.CONTEST_REMOVE_PHOTO)
                {
                    __removePictureFromContest(gobjDatabaseDomTree, parameterObj);
                }
                else if(parameterObj.getAction() == IActionConstants.CONTEST_SELECT_WINNERS)
                {
                    __selectWinnersAction(gobjDatabaseDomTree, parameterObj);
                }
                else if(parameterObj.getAction() == IActionConstants.CONTEST_ENTRY_DETAILS)
                {
                    __entryDetailsAction(gobjDatabaseDomTree, parameterObj);
                }
                else if(parameterObj.getAction() == IActionConstants.CONTEST_REMOVE_PHOTO)
                {
                    __removePictureFromContest(gobjDatabaseDomTree, parameterObj);
                }
                else if(parameterObj.getAction() == IActionConstants.CONTEST_MODIFY_RATE_BY_SUPER_JUDGE)
                {
                    __modifyRateBySuperJudge(gobjDatabaseDomTree, parameterObj);
                }else if(parameterObj.getAction() == IActionConstants.GET_PHOTO_BOOK_DETAILS)
                {
                    __updatePhotoBookAction(gobjDatabaseDomTree , parameterObj) ;
                }else if(parameterObj.getAction() == IActionConstants.GET_CALENDAR_DETAILS)
                {
                    __updateCalendarAction(gobjDatabaseDomTree , parameterObj) ;
                }else if (parameterObj.getAction() == IActionConstants.GET_GIFT_CARD_DETAILS)
                { 
                    __getGiftCardsAction(gobjDatabaseDomTree, parameterObj);
                }
                else if (parameterObj.getAction() == IActionConstants.GET_COUPON_CODE)
                { 
                    __validateCouponAction(gobjDatabaseDomTree, parameterObj);
                }

                /**/
                return ;
            }
        }else{  //response status not ok

            //should not reach this block
            //alert("Status Code Not 200");
            return;
        }
    }


}

function __stateParser( gobjDatabaseDomTree , parameterObj  )
{
    if(gobjDatabaseDomTree)
    {
        //state XML
        stateNodeset = gobjDatabaseDomTree.getChildNodes() ;
        if(stateNodeset)
        {
            for(i=0;i<stateNodeset.getLength();i++)
            {
                stateNode =  stateNodeset.item( i ) ;
                if(stateNode &&
                   (stateNode.getNodeType() == DOMNode.ELEMENT_NODE))
                {
                    stateId = stateNode.getAttribute("id") ;
                    stateChilds = stateNode.getChildNodes();
                    if(stateChilds && stateChilds.getLength() > 0)
                    {
                        for (q=0;q<stateChilds.getLength();q++)
                        {
                            var stateChild =  stateChilds.item( q ) ;
                            if(stateChild &&
                                (stateChild.getNodeType() == DOMNode.ELEMENT_NODE))
                            {
                                //alert("Name : "+stateChild.getNodeName());
                                var stateName = stateChild.getFirstChild().getNodeValue() ;
                                var stateObj = CState.getInstance(stateId , stateName , null ) ;
                                hStates.put(stateId,stateObj);
                                break;
                            }
                        }
                    }
                }//end of if(stateNode)
            }//end of for loop
            //call back method
            parameterObj.executeCallbackMethod( parameterObj ) ;

        }//end of if(stateNodeset)
    }//end of if(gobjDatabaseDomTree)
}//end of __stateParser()

function __regionParser ( gobjDatabaseDomTree , parameterObj )
{
    if(gobjDatabaseDomTree)
    {
        //state XML
        regionNodeSet = gobjDatabaseDomTree.getChildNodes() ;
        stateId =  gobjDatabaseDomTree.getAttribute("stateid") ;
        if(regionNodeSet)
        {
            var vRegions  = Vector.getInstance() ;
            for(i=0;i<regionNodeSet.getLength();i++)
            {
                regionNode =  regionNodeSet.item( i ) ;
                if(regionNode &&
                        (regionNode.getNodeType() == DOMNode.ELEMENT_NODE) )
                {
                    regionId = regionNode.getAttribute("id") ;
                    var regionChilds = regionNode.getChildNodes() ;
                    if(regionChilds && regionChilds.getLength() > 0)
                    {
                        for(q=0;q<regionChilds.getLength();q++)
                        {
                            var regionChild = regionChilds.item(q);
                            if(regionChild && (regionChild.getNodeType() == DOMNode.ELEMENT_NODE) )
                            {
                                var regionName = regionChild.getFirstChild().getNodeValue() ;
                                var regionObj = CRegion.getInstance(regionId , regionName , stateId, null ) ;
                                vRegions.add( regionObj ) ;
                                break;
                            }
                        }
                    }
                    //hStates.put(stateId,stateObj);
                }//end of if(stateNode)
            }//end of for loop
            stateObj = hStates.get( stateId ) ;
            if( stateObj )
            {
                stateObj.setRegions( vRegions ) ;
            }
        }//end of if(regionNodeSet)
    }//end of if(gobjDatabaseDomTree)

    //call back method
    parameterObj.executeCallbackMethod( parameterObj ) ;

}//end of __regionParser ( gobjDatabaseDomTree , parameterObj)

function __wareHouseParser ( gobjDatabaseDomTree , parameterObj )
{
    if(gobjDatabaseDomTree)
    {
        //warehouse XML
        wareHouseNodeSet = gobjDatabaseDomTree.getChildNodes() ;
        stateId =  gobjDatabaseDomTree.getAttribute("stateid") ;
        regionId =  gobjDatabaseDomTree.getAttribute("regionid ") ;


        if( wareHouseNodeSet )
        {
            vWareHouses = Vector.getInstance() ;
            for (i=0;i<wareHouseNodeSet.getLength();i++)
            {
                warehouseNode =  wareHouseNodeSet.item( i ) ;
                if(warehouseNode &&
                        (warehouseNode.getNodeType() == DOMNode.ELEMENT_NODE) )
                {
                    var warehouseChilds = warehouseNode.getChildNodes() ;
                    if( warehouseChilds  && warehouseChilds.getLength() > 0)
                    {
                        for(q=0;q<warehouseChilds.getLength();q++)
                        {
                            var warehouseChild = warehouseChilds.item(q);

                            if(warehouseChild &&
                               (warehouseChild.getNodeType() == DOMNode.ELEMENT_NODE) )
                            {
                                var warehouseId = warehouseNode.getAttribute("id") ;
                                var warehouseName = warehouseNode.getAttribute("name") ;
                                var isActive =  warehouseNode.getAttribute("isactive") ;
                                var fujiFlag =  warehouseNode.getAttribute("hasfuji") ;
                                var warehouseStatus = (isActive=="true")?true:false ;
                                var hasFuji = (fujiFlag=="true")?true:false ;
                                var warehouseDesc = warehouseChild.getFirstChild().getNodeValue() ;
                                var wareHouseObj = CWareHouse.getInstance(warehouseId ,warehouseDesc , regionId , stateId , warehouseStatus , hasFuji) ;
                                if(warehouseStatus == false)
                                    vUnavailableWarehouses.add(warehouseId) ;

                                if(hasFuji == true)
                                    vFujiStores.add(warehouseId) ;

                                vWareHouses.add( wareHouseObj ) ;
                                //break;
                            }
                        }
                    }
                }//end if(warehouseNode)
            }//end of for

            stateObj = hStates.get( stateId ) ;

            if( stateObj )
            {
                vRegions = stateObj.getRegions() ;
                if( vRegions )
                {
                    for (i=0;i<vRegions.size();i++)
                    {
                        regionObj = vRegions.elementAt(i);
                        if( regionObj )
                        {
                            if(regionObj.getRegionID() == parameterObj.getRegionID() )
                            {
                                regionObj.setWareHouses (  vWareHouses ) ;
                                break ;
                            }//end of if(regionObj.getRegionID() == regionId )
                        }//end of if( regionObj )
                    }//end of for
                }//end of
            }//end of if( stateObj )
        }//end of if( wareHouseNodeSet )
    }//end of  if(gobjDatabaseDomTree)

    //call back method
    parameterObj.executeCallbackMethod( parameterObj ) ;
}//end of __regionParser ( gobjDatabaseDomTree , parameterObj)

function generateAndShowOptions(hOptions , selectElement , defaultValue)
{
    if( hOptions )
    {
        var eKeys = hOptions.keys() ;
        var optionsArray = new Array ( ) ;
        if(hOptions.get(IActionConstants.STATE) &&
            (hOptions.get(IActionConstants.STATE) == "CA"))
        {
            optionsArray[0] = new Option("-","") ;
            i = 1 ;
        }else
        {
            i = 0 ;

        }
        if(selectElement.name == "warehouse")
        {
        optionsArray[0] = new Option("-","") ;
        i = 1 ;
        }

        hOptions.remove( IActionConstants.STATE ) ;
        while (eKeys.hasMoreElements())
        {
            var key = eKeys.nextElement() ;
            var value = hOptions.get( key );
            optionsArray[i] = new Option(value , key ) ;
            i++ ;
            //hOptions.put(stateKey , stateObj.getStateName() )  ;
        }//end of while (eStates.hasMoreElements())


    }//end of if( hOptions )


    showOptions( selectElement ,optionsArray , defaultValue)  ;
}//end of generateOptions()


function showOptions(selectElement, options ,defaultValue)
{

    if(selectElement.type != "hidden")
    {
        selectElement.length = options.length ;
        var isAnyItemSelected = false ;

        for(var i=0; i<options.length;  i++)
        {
            selectElement.options[i] = options[i] ;
            if(options[i].value == defaultValue)
            {
                options[i].selected = true ;
            }

            if(options[i].selected){
                isAnyItemSelected = true ;
            }

        }   //end of if

        if( !isAnyItemSelected && selectElement.options[0] ){

            selectElement.options[0].selected = true ;
        }
    }
}   //end of showOptions(SelectElement, OptionsArray)



/*****************************************************************************************************/
/******************************** CParameterObject ************************************************************/
/*****************************************************************************************************/

var CParameterObject = new _CParameterObject(null,null) ;

_CParameterObject.prototype.getInstance = _CParameterObject_getInstance ;
_CParameterObject.prototype.getAction = _CParameterObject_getAction ;
_CParameterObject.prototype.getUrl = _CParameterObject_getUrl ;
_CParameterObject.prototype.getControllerHandler = _CParameterObject_getControllerHandler ;

_CParameterObject.prototype.setControllerHandler = function(controllerHandler)
{
    this.controllerHandler = controllerHandler;
}

//callback method api
_CParameterObject.prototype.executeCallbackMethod = function(parameterObj)
{
    if( typeof this.controllerHandler != "undefined" )
    {
        eval(this.controllerHandler + "(parameterObj)");


    }//end of if

}//end of reflectionfunction

/*
* Constructor of _CParameterObject object
* @author Ganesh
*/
function _CParameterObject(url,action)
{
    this.m_action = action ;
    this.m_url = url ;
    return this ;
}   //end of _CParameterObject() ;


function _CParameterObject_getControllerHandler(url,action)
{
    return this.controllerHandler;
}   //end of _CParameterObject_getInstance


function _CParameterObject_getInstance(url,action)
{
    return new _CParameterObject(url,action) ;
}   //end of _CParameterObject_getInstance


function _CParameterObject_getAction()
{
    return this.m_action ;
}   //end of _CParameterObject_getAction()

function _CParameterObject_getUrl()
{
    return this.m_url ;
}   //end of _CParameterObject_getUrl()



var IActionConstants = new _IActionConstants();

function _IActionConstants()
{
    this.WAREHOUSE = "warehouse" ;
    this.REGION = "region" ;
    this.STATE = "state" ;
    this.UPDATE_PIXACO_ACTION = "update_pixcao_action" ;
    this.GET_PICTURES = "get_pictures";
    this.TOGGLE_FAVORITE= "toggle_favorite";
    this.GET_CONTEST_ENTRIES = "get_contest_entries";
    this.VOTE_FOR_PICTURE = "vote_for_picture";
    this.MARK_ENTRY_INAPPROPRIATE = "mark_entry_inappropriate";
    this.CONTEST_REMOVE_PHOTO = "contest_remove_photo";
    this.CONTEST_SELECT_WINNERS = "contest_select_winners";
    this.CONTEST_ENTRY_DETAILS = "contest_entry_details";
    this.GET_PHOTO_BOOK_DETAILS = "get_photobook_details";
    this.GET_CALENDAR_DETAILS = "get_calendar_details";
    this.GET_GIFT_CARD_DETAILS="get_gift_card_details";
    this.GET_COUPON_CODE="get_coupon_code";
    this.GET_PROMO_GROUP_USER_DETAILS="get_promo_group_users_details";
    this.SAVE_NAME_TAG="save_name_tag";
    
    return this;
}

